web-dev-qa-db-ja.com

vim関数内の移動コマンド

現在の行が属するC関数を表示したい。マシンの機能と構成が異なる複数のオペレーティングシステムで作業しているため、プラグインを使用したくない。私はほとんどのプラグインを試しましたが、何らかの理由でうまくいきません。私は非常に基本的で最小限のものを書かなければならず、それは非常に基本的なvim機能で動作します。

現在の解決策:

関数名の先頭に一致する正規表現を本質的に検索する同僚からvim関数をコピーしました。画面下部に名前が数秒間表示され、消えます

fun! ShowFuncName()
        let lnum = line(".")
        let col = col(".")
        echohl ModeMsg
        echo getline(search("^[^ \t#/]\\{2}.*[^:]\s*$", 'bW'))
        echohl None
        call search("\\%" . lnum . "l" . "\\%" . col . "c")
    endfun

問題

問題は、これがラベルでは機能しないことです。関数定義と現在の行の間の行にラベルが存在する場合、スクリプトは関数名の代わりにラベル名を表示します。

それ以外の場合、スクリプトは機能します。これは、コードベースでは常に関数定義を列1から開始し、中括弧を2行目以降で開始することが難しいためです。

提案された修正

正規表現を検索する代わりに、vim移動キーを使用してみませんか。それは次のことです:

  1. 現在の行番号、列番号を保存します
  2. 移動キー '[['でジャンプして、関数定義に移動します
  3. このすぐ上の行にはC関数があります。 (これはコーディングガイドラインで厳密に実施されています)
  4. 行を印刷する
  5. 手順1で保存した行番号、列番号にジャンプします。

上記のステップ2の方法がわかりません。

2
thequark

私はあなたがこれが欲しいと信じています

_function! ShowFuncName()
    let cursor_pos = getpos('.')
    echohl ModeMsg
    normal! [[k
    echo getline('.')
    echohl None
    call setpos('.', cursor_pos)
endfunction
_

normalコマンドは、通常モードで_[[k_を実行し、カーソルを関数定義に移動します。次に、カーソルが置かれている行を印刷します。

カーソル位置は、getpos()およびsetpos()関数を使用して元の位置に復元されます。

5
FDinoff