22

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

4

2 に答える 2

24

簡単な答え: はい。ただし、IDE のようにスムーズではありません。

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

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

于 2012-12-03T07:55:39.947 に答える
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はシェルコマンドを実行する必要があると単純に述べています。2.cmdビルドが呼び出されたときに実行されます。make の代わりに g++ などを使用できます。私がここに置いたこのビルド構成は出発点であり、それを変更して、必要に応じて実行することができます。3.このビルドを自動的に使用するファイル (この場合はすべての C++ ファイル)をselector崇高に伝えます。シンタックスハイライトなし。ここでは、後で説明するファイルを使用します。これは、デバッグを容易にするために、より強調された出力を取得するのに役立ちます。6.workig_dirsyntaxC++output.tmLanguagefile_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 を使用して、より簡潔で変更しやすい構文強調表示ルールを記述することもできます。PackageDevただし、 YAML 言語を使用できるようにするには、sublime にインストールする必要があります。次のファイルをあなたに置き、$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
...

色名一覧はこちら

于 2014-02-20T00:46:07.717 に答える