web-dev-qa-db-ja.com

VisualStudioのようなC ++構文エラーをVimに強調表示するにはどうすればよいですか?

VisualStudioのようにリアルタイムでgVimにC++構文エラー(下の赤い波線)を強調表示させることは可能ですか?

19
teknix

簡単な答え:はい。ただし、IDEほどスムーズ/即時ではありません。

長い答え:IDEには(通常は非常に限られた)プログラミング言語のセットに対する組み込みのサポート(およびパーサーなど)がありますが、Vimは汎用エディターであるため、構文チェックを行うには外部ツールに依存する必要があります。組み込みの方法は、:makeを実行し、クイックフィックスリストで(構文またはコンパイラ)エラーのリストを受け取ることです。それを自動化するプラグインがあります。 Syntastic は、多くの言語をサポートする非常に人気のあるものです。

ただし、それでも、Vimは外部実行可能ファイルを呼び出す必要があり、タスクを非同期で実行することはほとんどサポートされていないため、エラーが表示されるまでさらに遅延が発生します。 IDEの機能なしでは実行できない場合は、その長所に応じて両方を使用することをお勧めします。Vimは超効率的なテキスト編集用で、IDEはコードナビゲーション、デバッグ、およびコンパイル。

18
Ingo Karkat

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テーマを使用しています)。

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を使用して、構文の強調表示ルールを記述し、より簡潔で変更しやすくすることもできます。ただし、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
...
_

色の名前のリストは ここ にあります。

5
Mani Zandifar

これは 方法 私がこの問題を解決するために使用したものです。これは最善ではないかもしれませんが、テンプレートの多いC++コードがある場合は非常に役立ちます。

2
Mani Zandifar