Можно ли gVim выделить синтаксические ошибки С++ (красные squiggles underneath) в режиме реального времени, например Visual Studio?
Как вы получаете Vim, чтобы выделить синтаксические ошибки С++, такие как Visual Studio?
Ответ 1
Короткий ответ: Да, но это будет не так гладко/немедленно, как в IDE.
Длинный ответ: в то время как IDE имеют встроенную поддержку (и парсеров и т.д.) для (обычно очень ограниченного) набора языков программирования, Vim является универсальным редактором и поэтому должен полагаться на внешние инструменты проверка синтаксиса. Встроенный способ состоит в выполнении :make
и получении списка (синтаксиса или компилятора) ошибок в списке quickfix. Есть плагины для автоматизации этого; Syntastic является очень популярным с поддержкой многих языков.
Но все же, поскольку Vim должен вызывать внешний исполняемый файл и мало поддерживает выполнение задач асинхронно, будет больше задержки, пока вы не увидите ошибки. Если вы не можете обойтись без возможностей IDE, то использовать их можно в соответствии с их сильными сторонами: Vim для суперэффективного редактирования текста и IDE для навигации, отладки и компиляции кода.
Ответ 2
VIM был хорош годами для меня, но я перешел в Sublime Text 3, когда понял, насколько полезен этот редактор и насколько просто расширить этот редактор с большей функциональностью.
Теперь я редактирую в Sublime Text и компилирую в том же приложении. Я сделал синтаксический ярлык, который показывает ошибку лучше, и если вы нажмете на ошибку, она приведет вас к месту, где произошла ошибка.
Выполните следующие шаги, и кодирование в С++ будет намного проще, чем раньше для вас.
Итак, после установки sublime_text и запуска его, как только вы получите папку ~/HOME/.config/sublime-text-3/
. Если вы не знакомы с sublime_text, достаточно сказать, что вы можете добавить свои изменения в эту папку
~/HOME/.config/sublime-text-3/Packages/User
. Теперь позвоните в эту папку $SUBLIME_CONFIG_DIR
. Здесь я расскажу вам, как добавить систему сборки для С++ и как выделить синтаксис.
Настройка системы сборки
Создайте свою систему сборки, добавив файл с именем c++build.sublime-build
в $SUBLIME_CONFIG_DIR
со следующим содержимым:
{
"shell" : true,
"cmd": ["make $file_base_name"],
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"selector": "source.c++",
"working_dir": "${file_path}",
"syntax" : "Packages/User/c++output.tmLanguage"
}
Я объясню, что делает каждая строка.
1. "shell":true
просто говорит, что sublime должен запускать команду оболочки, если вы вызываете build на файл.
2. cmd
будет выполняться при вызове сборки. Вы можете использовать g++ или что-нибудь еще вместо make. Эта конфигурация сборки, которую я поставил здесь, является отправной точкой, вы можете изменить ее и заставить ее делать то, что вы хотите.
3. selector
сообщает sublime, какие файлы будут автоматически использовать эту сборку (в данном случае все файлы С++)
4. workig_dir
Я установил его в текущий каталог, чтобы упростить его
5. syntax
Когда вы создадите файл, вывод будет отображаться в виде вывода в виде обычного текста без подсветки синтаксиса. Здесь я собираюсь использовать файл C++output.tmLanguage
, который я объясню позже, что поможет вам получить более выделенный выделенный вывод для более легкой отладки.
6. file_regex
соответствует линиям ошибок на выходе и, если есть ошибка, и вы дважды щелкните по ошибке, она приведет вас к соответствующему файлу.
Добавление нового синтаксиса
Существуют различные способы добавления нового синтаксического маркера к возвышенному. Вы можете использовать JSON, а затем преобразовать его в PList, вы можете использовать PList напрямую. Для простоты просто скопируйте следующее в файл с именем C++output.tmLanguage
. Файлы tmLanguage автоматически выбираются Sublime Text при запуске приложения для выделения файлов.
содержание должно быть следующим:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>fileTypes</key>
<array>
<string>ssraw</string>
</array>
<key>name</key>
<string>Mazanin</string>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\b(error)\b</string>
<key>name</key>
<string>invalid.illegal</string>
</dict>
<dict>
<key>match</key>
<string>(warning|instantiation|note|required|candidate)</string>
<key>name</key>
<string>markup.quote</string>
</dict>
<dict>
<key>match</key>
<string>^.*:[0-9]+</string>
<key>name</key>
<string>support.variable.mazanin</string>
</dict>
<dict>
<key>begin</key>
<string>\[</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.mazanin</string>
</dict>
</dict>
<key>end</key>
<string>\]</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.mazanin</string>
</dict>
</dict>
<key>name</key>
<string>comment.mazanin</string>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\\.</string>
<key>name</key>
<string>source.mazanin</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>\(</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.mazanin</string>
</dict>
</dict>
<key>end</key>
<string>\)</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.mazanin</string>
</dict>
</dict>
<key>name</key>
<string>storage.mazanin</string>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\\.</string>
<key>name</key>
<string>source.mazanin</string>
</dict>
</array>
</dict>
</array>
<key>scopeName</key>
<string>source.cerr</string>
<key>uuid</key>
<string>ca03e751-04ef-4330-9a6b-9b99aae1c418</string>
</dict>
</plist>
Не забудьте заменить uuid (string) выше на уникальный uuid. Но как вы его получите. Откройте sublime-console и введите следующее:
import uuid
uuid.uuid4()
Теперь вы в основном делаете. Откройте ваш файл С++, постройте вызов на нем, и вы должны увидеть, что ошибка выделена и щелкнуть следующим образом (я использую тему Dawn).
Я лично предпочитаю обертывать строки выходной ошибки и быстро разворачивать их, поэтому я добавил этот ярлык в мои сопоставления клавиш в $SUBLIME_CONFIG_DIR/Default (Linux).sublime-keymap
, который гласит:
[
{
"keys": ["ctrl+shift+l"], "command": "toggle_setting", "args": {"setting": "word_wrap"}
}
]
Теперь, если вы предусмотрели ctrl+shift+l
, вы можете просто обернуть/развернуть вывод
Это более полезно в большинстве случаев, когда ошибки являются длинными, и информация не является полезной. Вышеприведенный пример без упаковки выглядит следующим образом:
Использование YAML
Вы также можете использовать YAML, чтобы описать правила подсветки синтаксиса, которые более кратки и понятны для изменения. Тем не менее, вам нужно установить PackageDev
на ваше возвышенное, чтобы использовать язык YAML. Поместите следующий файл в свой $HOME/.config/sublime-text-3/Packages/User
и откройте его с возвышенным. Нажмите F7
, и файл синтаксиса будет создан для вас.
# [PackageDev] target_format: plist, ext: tmLanguage
---
name: C++ Error Output
scopeName: source.boo
fileTypes: [boo]
uuid: 45319b4d-90f8-4ff1-9a66-c56ed5c408a4
patterns:
- include: '#pars'
- include: '#bracs'
- include: '#anglebracs'
- include: '#quotes'
- include: '#curlies'
- match: \b((e|E)rror)\b
name: invalid.illegal
- match: (warning|instantiation|note|required|candidate)
name: markup.quote
- match: ^[^\:\s]*(?=:)
name: support.variable
- match: (?<=:)[0-9]+
name: keyword.control
repository:
bracs:
name: markup.quote
begin: \[
beginCaptures:
'0': {name: keyword}
end: \]
endCaptures:
'0': {name: keyword}
patterns:
- include: $self
- include: anglebracs
- include: pars
pars:
name: variable.parameter
begin: \(
beginCaptures:
'0': {name: keyword}
end: (\)|$)
endCaptures:
'0': {name: keyword}
patterns:
- include: $self
- include: anglebracs
anglebracs:
name: markup.raw
begin: (?<!<)\<(?!\<)
beginCaptures:
'0': {name: keyword}
end: \>
endCaptures:
'0': {name: keyword}
patterns:
- include: $self
- include: pars
quotes:
name: markup.heading
begin: ‘
beginCaptures:
'0': {name: keyword}
end: ’
endCaptures:
'0': {name: keyword}
patterns:
- include: $self
- include: anglebracs
- include: pars
- include: bracs
curlies:
name: markup.list
begin: \{
beginCaptures:
'0': {name: keyword}
end: \}
endCaptures:
'0': {name: keyword}
patterns:
- include: $self
- include: anglebracs
- include: pars
- include: bracs
...
Вы можете найти список имен цветов в здесь
Ответ 3
Это способ, который я использовал для решения этой проблемы, возможно, он не самый лучший, но он очень помогает, если у вас сильно шаблонный код на С++.