繁体   English   中英

你如何让 Vim 像 Visual Studio 一样突出显示 C++ 语法错误?

[英]How do you get Vim to highlight C++ syntax errors like Visual Studio?

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

简短的回答:是的,但它不会像在IDE中那么顺利/直接。

答案很好:虽然IDE有一套(通常非常有限的)编程语言的内置支持(和解析器等),但Vim是一个通用的编辑器,因此必须依靠外部工具来进行语法检查。 内置方法是执行:makequickfix列表中 :make和接收(语法或编译器)错误列表 有插件可以自动化; Syntastic是一个非常受欢迎的,支持多种语言。

但是,由于Vim必须调用外部可执行文件并且几乎不支持异步运行任务,因此在看到错误之前会有更多延迟。 如果您不能没有IDE的功能,可以根据自己的优势使用它们:Vim用于超高效的文本编辑,以及用于代码导航,调试和编译的IDE。

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,那么"shell":true就是说sublime应该运行一个shell命令。 2.调用构建时将执行cmd 您可以使用g ++或其他任何东西而不是make。 我在这里放置的这个构建配置是一个起点,你可以修改它并让它做你想做的。 3. selector告诉sublime哪些文件将自动使用此构建(在本例中为所有c ++文件) workig_dir我将其设置为当前目录以使其更容易5. syntax在构建文件时输出将显示在输出视图中作为纯文本,没有语法高亮。 在这里,我将使用C++output.tmLanguage文件,我将在后面解释,它可以帮助您获得更好的突出显示输出,以便于调试。 6. file_regex匹配输出中的错误行,如果有错误,双击错误会将您带到相应的文件。

添加新语法

有各种方法可以将新语法高亮显示添加到sublime。 您可以使用JSON然后将其转换为PList,您可以直接使用PList。 为简单起见,只需将以下内容复制到名为c++output.tmLanguage的文件中。 在启动应用程序时,Sublime Text将自动选取tmLanguage文件以突出显示文件。

内容应如下:

<?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中的$SUBLIME_CONFIG_DIR/Default (Linux).sublime-keymap中添加了这个快捷方式,其中说:

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

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

错误行没有包裹

使用YAML

您还可以使用YAML来描述语法突出显示规则,这些规则更简洁,更易于修改。 但是,您需要在PackageDev安装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
...

您可以在此处找到颜色名称列表

这是方式 ,我用来解决这个问题,它可能不是最好的,但它有很大帮助,如果您有大量模板的C ++代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM