是否有可能让gVim像Visual Studio一样实时突出显示C ++语法错误(下面的红色曲线)?
答案 0 :(得分:18)
简短回答:是的,但它不像IDE那样顺利/直接。
答案很长:虽然IDE有一套(通常非常有限的)编程语言的内置支持(和解析器等),但Vim是一个通用的编辑器,因此必须依靠外部工具来做语法检查。内置方法是执行:make
并在 quickfix list 中接收(语法或编译器)错误列表。有插件可以自动化; Syntastic非常受欢迎,支持多种语言。
但是,由于Vim必须调用外部可执行文件并且几乎不支持异步运行任务,因此在看到错误之前会有更多延迟。如果您不能没有IDE的功能,可以根据自己的优势使用它们:Vim用于超高效的文本编辑,以及用于代码导航,调试和编译的IDE。
答案 1 :(得分:7)
现在,我在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
。您可以使用g ++或其他任何东西而不是make。我在这里放置的这个构建配置是一个起点,你可以修改它并让它做你想做的。
3. selector
告诉sublime哪些文件将自动使用此版本(在本例中为所有c ++文件)
4. 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
的键映射中添加了这个快捷方式,其中说:
[
{
"keys": ["ctrl+shift+l"], "command": "toggle_setting", "args": {"setting": "word_wrap"}
}
]
现在,如果你预先ctrl+shift+l
,你可以简单地包装/解包输出
在错误很长且信息没有帮助的大多数情况下,这更有用。没有包装的上述示例如下所示:
您还可以使用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
中找到颜色名称列表答案 2 :(得分:2)
这是我用来解决这个问题的the way,它可能不是最好的,但是如果你有很多模板化的C ++代码,它会有很大的帮助。