VisualStudioのようにリアルタイムでgVimにC++構文エラー(下の赤い波線)を強調表示させることは可能ですか?
簡単な答え:はい。ただし、IDEほどスムーズ/即時ではありません。
長い答え:IDEには(通常は非常に限られた)プログラミング言語のセットに対する組み込みのサポート(およびパーサーなど)がありますが、Vimは汎用エディターであるため、構文チェックを行うには外部ツールに依存する必要があります。組み込みの方法は、:make
を実行し、クイックフィックスリストで(構文またはコンパイラ)エラーのリストを受け取ることです。それを自動化するプラグインがあります。 Syntastic は、多くの言語をサポートする非常に人気のあるものです。
ただし、それでも、Vimは外部実行可能ファイルを呼び出す必要があり、タスクを非同期で実行することはほとんどサポートされていないため、エラーが表示されるまでさらに遅延が発生します。 IDEの機能なしでは実行できない場合は、その長所に応じて両方を使用することをお勧めします。Vimは超効率的なテキスト編集用で、IDEはコードナビゲーション、デバッグ、およびコンパイル。
VIMは私にとって何年もの間良かったのですが、このエディターがいかに便利で、このエディターをより多くの機能で拡張するのがいかに簡単であるかを知ったとき、Sublime Text3に移行しました。
今、私は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
_は、ファイルに対してビルドを呼び出す場合、昇華はシェルコマンドを実行する必要があることを単に示しています。 2. cmd
は、ビルドが呼び出されたときに実行されます。 makeの代わりにg ++などを使用できます。私がここに置いたこのビルド構成は出発点です、あなたはそれを修正してあなたが望むことをするようにすることができます。 3. selector
は、このビルドを自動的に使用するファイル(この場合はすべてのc ++ファイル)を崇高に伝えます。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(文字列)を一意の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言語を使用できるようにするには、崇高なものにPackageDev
をインストールする必要があります。次のファイルを_$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
...
_
色の名前のリストは ここ にあります。
これは 方法 私がこの問題を解決するために使用したものです。これは最善ではないかもしれませんが、テンプレートの多いC++コードがある場合は非常に役立ちます。