75

モーダル入力にハマってしまったので、最近 Textmate から Vim 環境をセットアップしました。

ただし、Vim では構文の強調表示はあまり美しくないようです。私は C++ でコーディングしていますが、関数呼び出しとクラス名を強調表示できないため、コードが読みにくくなっています。ちょっと配色をいじってみましたが、「クラス名」や「関数名」に該当するフィールドが見つかりませんでした。

下の図で、MacVim の右側で と が強調表示されていないDroughtLayer::ことに注意してください。*.size()

Textmate(左)とVim(右)の画像比較
(ソース: ivzhao.com )

これを解決する方法はありますか?私は視覚に敏感な人なので、本当にイライラします。

4

11 に答える 11

134

vimを使い始めたとき、私はこれとまったく同じ問題を抱えていました。解決策は簡単です。vim が使用する c 構文ファイルを編集するだけです。その方法は次のとおりです。

C または C++ ファイルの編集を開始すると、vim は次の場所にあるデフォルトの c 構文ファイルを読み取ります。

$VIMRUNTIME/syntax/c.vim

($VIMRUNTIME は、vim をインストールした場所です。vim を開き、コマンド ":echo $VIMRUNTIME" を使用すると、デフォルト値を確認できます)。

そのファイルを単純に上書きするか、次の場所にカスタム C 構文ファイル (デフォルトの代わりに vim によってロードされる) を作成できます。

$HOME/.vim/syntax/c.vim      (for UNIX)
$HOME/vimfiles/syntax/c.vim  (for PC or OS/2)

(私は Mac を使用したことがないので、どの Mac があなたに適しているかわかりません。詳細については、vim ヘルプの ":help vimfiles" を参照してください)。

今楽しい部分。デフォルトの「$VIMRUNTIME/syntax/c.vim」ファイルを vimfiles ディレクトリ (UNIX の場合は「$HOME/.vim/syntax/c.vim」) にコピーし、次の行を追加して編集します。

" Highlight Class and Function names
syn match    cCustomParen    "(" contains=cParen,cCppParen
syn match    cCustomFunc     "\w\+\s*(" contains=cCustomParen
syn match    cCustomScope    "::"
syn match    cCustomClass    "\w\+\s*::" contains=cCustomScope

hi def link cCustomFunc  Function
hi def link cCustomClass Function

それでおしまい!関数とクラス名は、"Function" ハイライト (":hi Function") で定義された色でハイライトされます。色をカスタマイズしたい場合は、上記の最後の 2 行を次のように変更できます。

hi def cCustomFunc  gui=bold guifg=yellowgreen
hi def cCustomClass gui=reverse guifg=#00FF00

または、C 構文ファイルをそのままにして、vimrc ファイル (":help vimrc") で色を定義することもできます。

hi cCustomFunc  gui=bold guifg=yellowgreen
hi cCustomClass gui=reverse guifg=#00FF00

(「def」キーワードがないことに注意してください。詳細については、「:help highlight-default」を参照してください)。":hi" コマンドで利用可能なパラメータについては、":help :highlight" を参照してください。

Vim 7.2 の完全な c.vim ファイルは、このリンクにあります (注: これは、変更されていない Vim バージョン 7.2 を使用している場合にのみ使用してください)。

http://pastebin.com/f33aeab77

そして必須のスクリーンショット:

ここに画像の説明を入力

于 2009-04-21T16:09:24.963 に答える
36

これはここでの私の最初の投稿であり、観察する方法がわかりませんでした。Eduardoの答えは、「(」と「{」が未加工に見え、構文が折りたたまれているように見えます。これを修正するために少し変更しました。

syn match    cCustomParen    "?=(" contains=cParen,cCppParen
syn match    cCustomFunc     "\w\+\s*(\@=" contains=cCustomParen
syn match    cCustomScope    "::"
syn match    cCustomClass    "\w\+\s*::" contains=cCustomScope
hi def cCustomFunc  gui=bold guifg=yellowgreen
hi def link cCustomClass Function
于 2012-04-13T12:32:09.777 に答える
17

興味深いことに、VIM の構文ハイライターは、識別子または関数名への構文の適用をサポートしていません。少なくとも C および C++ の構文ハイライターはサポートしていません。したがって、たとえそうしても:

:hi Function guifg=red

また

:hi Identifier guifg=red

これらに色はありません。私は、これらの言語のキーワードと定数にすぎないようです。

ここで、誰かがメソッド名をサポートするために cpp 構文ファイルを拡張し始めました。まさかのスタートです。 http://vim.wikia.com/wiki/Highlighting_of_method_names_in_the_definition

于 2009-04-15T15:49:12.663 に答える
11

1つの解決策は、構築されたctagsデータベースを使用することです。したがって、ctagsユーティリティを使用して作成します。次に、「tags」変数を設定し、以下を

~/.vim/after/syntax/c.vim

function! s:highlight()
    let list = taglist('.*')

    for item in list
        let kind = item.kind

        if kind == 'f' || kind == 'c'
            let name = item.name
            exec 'syntax keyword Identifier '.name
        endif
    endfor
endfunction

call s:highlight()

これは非常に大きなctagsデータベースでは非常に遅くなる可能性があることを警告する必要があります。

また、vim.orgには1つの解決策がありますが、私はこれを試しませんでした。それがあなたのために働くかどうか私に知らせてください。

于 2009-04-16T10:43:03.647 に答える
7

編集: color_coded は重すぎるかもしれません。octol/vim-cpp-enhanced-highlight を試してください。C++11/14 をサポートし、@Eduardo の回答を統合します。

セマンティックベースのハイライター: libclang ベースのハイライト用の vim プラグインであるjeaye/color_coded
をお勧め します。試してみたい場合は、その効果を確認してください。:)

長所:

  • 簡単インストール
  • セマンティック ハイライト
  • 上記の Clighter は、.vim でコンパイルする必要がありpython2.7ます。ただし、color_coded は C++ で記述されており、lua バインディング -> C++ を提供します。

短所:

  • それをアクティブにするためにいくつかのvimイベントを作成しない限り、遅延します。
  • カスタマイズは少し難しいです。syntax/color_coded.vim を自分で編集する必要があります。しかし、カスタマイズはそのロードマップに置かれています.

まだ開発中ですが、ますます注目を集めています。

前 後

于 2015-04-03T14:07:10.213 に答える
4

セルゲイ、最初の行をから変更

syn match    cCustomParen    "(" contains=cParen,cCppParen

syn match    cCustomParen    "(" contains=cParen contains=cCppParen

私のためにそれを修正するようです。

于 2009-09-22T06:07:05.657 に答える
2

このプラグインを使用してみてください http://www.vim.org/scripts/script.php?script_id=2646 すべての ctags を非常に効率的に強調表示します

于 2010-04-29T21:20:05.940 に答える
1

Clighterプラグインも考慮することができます。

plugin for c-family semantic source code highlighting, based on Clang

ただし、かなり新しいバージョンとソフトウェアが必要です:vim 7.4.330 +python2およびlibclang.

于 2014-08-13T10:18:20.527 に答える
1

Taglistのような vim のプラグインを使用するか、vim とのセットアップctagsまたはcscope統合を行います ( vim/cscope のチュートリアルはこちらです)。

于 2009-04-10T04:39:54.717 に答える
1

C関数の定義のみを一致させるために、これは私にとってはうまくいきます:

syn match    cCustomFuncDef display /\(\w\+\(\s\|*\)\+\)\@<=\w\+\s*(\@=/ 
hi def cCustomFuncDef ctermfg=lightblue
于 2020-10-08T23:33:35.073 に答える