【问题标题】:How do you get Vim to highlight C++ syntax errors like Visual Studio?如何让 Vim 突出显示 Visual Studio 等 C++ 语法错误?
【发布时间】:2016-05-05 11:35:41
【问题描述】:

是否可以让 gVim 像 Visual Studio 一样实时突出显示 C++ 语法错误(下面的红色曲线)?

【问题讨论】:

    标签: c++ vim syntax-error syntax-highlighting


    【解决方案1】:

    简短回答:是的,但它不会像在 IDE 中那样流畅/直接。

    长答案:虽然 IDE 对一组(通常非常有限的)编程语言具有内置支持(和解析器等),但 Vim 是一个通用编辑器,因此必须依赖外部工具来完成语法检查。内置方法是执行:make 并在快速修复列表 中接收(语法或编译器)错误列表。有插件可以自动化; Syntastic 是一款非常受欢迎的软件,支持多种语言。

    但是,由于 Vim 必须调用外部可执行文件并且几乎不支持异步运行任务,所以在您看到错误之前会有更多延迟。如果你离不开 IDE 的特性,那么两者都可以根据各自的长处使用:Vim 用于超高效的文本编辑,IDE 用于代码导航、调试和编译。

    【讨论】:

      【解决方案2】:

      多年来,VIM 对我来说一直很好,但当我意识到这个编辑器有多么有用,以及用更多功能扩展这个编辑器是多么容易时,我转向了 Sublime Text 3。

      现在,我在 Sublime Text 中编辑并在同一个应用程序中编译。我制作了一个语法高亮,以更好的方式显示错误,如果您单击错误,它会将您带到错误发生的地方。

      按照这些步骤,用 c++ 编写代码会比以前简单得多。

      所以在安装 sublime_text 并运行它之后,一旦你得到一个文件夹 ~/HOME/.config/sublime-text-3/。如果您不熟悉 sublime_text,可以说您可以将修改添加到此文件夹中 ~/HOME/.config/sublime-text-3/Packages/User。从现在开始,我们将此文件夹称为$SUBLIME_CONFIG_DIR。我将在这里向您展示的是如何为 C++ 添加构建系统以及如何语法高亮输出。

      设置构建系统

      通过将名为 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 简单地说,如果你在文件上调用 build,sublime 应该运行一个 shell 命令。 2.cmd会在build被调用时执行。您可以使用 g++ 或其他任何东西来代替 make。我放在这里的这个构建配置是一个起点,你可以修改它并让它做你想做的事。 3. selector 告诉 sublime 哪些文件会自动使用这个构建(在这种情况下是所有 c++ 文件) 4.workig_dir我设置为当前目录更方便 5. syntax 当您构建文件时,输出将在输出视图中显示为纯文本,没有语法突出显示。在这里,我将使用C++output.tmLanguage 文件,稍后我将解释它可以帮助您获得更好的突出显示的输出,以便于调试。 6.file_regex匹配输出中的错误行,如果有错误,你双击错误,它会把你带到相应的文件。

      添加新语法

      有多种方法可以向 sublime 添加新的语法高亮。你可以使用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 替换上面的 uuid(字符串)。但是你怎么得到一个。打开 sublime-console 并输入以下内容:

      import uuid
      uuid.uuid4()
      

      现在你基本上完成了。打开你的 c++ 文件,调用 build ,你应该可以看到错误突出显示并且可以点击如下(我使用 Dawn 主题)。

      我个人更喜欢将输出错误的行打包并快速解包,因此我在$SUBLIME_CONFIG_DIR/Default (Linux).sublime-keymap 的键盘映射中添加了此快捷方式,上面写着:

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

      现在,如果您按下 ctrl+shift+l,您可以简单地包装/解包输出 这在大多数错误很长且信息无用的情况下更有用。上面没有包装的例子看起来像:

      使用 YAML

      你也可以使用 YAML 来描述你的语法高亮规则,这样更简洁,更容易修改。但是,您需要在您的 sublime 上安装 PackageDev 才能使用 YAML 语言。将以下文件放入您的$HOME/.config/sublime-text-3/Packages/User 并用 sublime 打开它。按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
      ...
      

      您可以在here中找到颜色名称列表

      【讨论】:

      • 这没有回答这个问题,这是专门关于 Vim 的。
      • 虽然这个答案很有启发性,但我同意它根本没有回答这个问题。
      • vim 提供了类似的构建和错误亮点
      猜你喜欢
      • 2015-11-26
      • 2021-04-24
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2014-10-11
      • 2011-01-10
      相关资源
      最近更新 更多