Подтвердить что ты не робот

Как вы получаете Vim, чтобы выделить синтаксические ошибки С++, такие как Visual Studio?

Можно ли gVim выделить синтаксические ошибки С++ (красные squiggles underneath) в режиме реального времени, например Visual Studio?

4b9b3361

Ответ 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).

This is the sample output for a simple program that fails with the error line wrapped

Я лично предпочитаю обертывать строки выходной ошибки и быстро разворачивать их, поэтому я добавил этот ярлык в мои сопоставления клавиш в $SUBLIME_CONFIG_DIR/Default (Linux).sublime-keymap, который гласит:

[
  {
    "keys": ["ctrl+shift+l"], "command": "toggle_setting", "args": {"setting": "word_wrap"}
  }
]

Теперь, если вы предусмотрели ctrl+shift+l, вы можете просто обернуть/развернуть вывод Это более полезно в большинстве случаев, когда ошибки являются длинными, и информация не является полезной. Вышеприведенный пример без упаковки выглядит следующим образом:

With the error lines not wrapped

Использование 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

Это способ, который я использовал для решения этой проблемы, возможно, он не самый лучший, но он очень помогает, если у вас сильно шаблонный код на С++.