web-dev-qa-db-ja.com

Vim:次のメソッドの開始/終了に移動

次のメソッドの最初/最後にカーソルを移動できるVimのネイティブ機能はありますか? [[]][]、および][についてはすでに知っていますが、これらは列0にある中括弧でのみ機能するため、仕事を削減しません。したがって、これらは、たとえばC++コードのナビゲートにはほとんど役に立ちません。すでにVimに組み込まれているそのようなコマンドはありますか?そうでない場合は、それを実装するプラグインをお勧めしますか?

ご協力いただきありがとうございます!

編集:[{}]は常に機能するとは限りません。これは、{}のあるブロック内にいる必要があるためです(そのブロック内のより深いスコープ内ではありません)。その後、右側の{または}になります。

編集2:これは[mとその友達が機能しないコードリストです。

namespace foo {

#define define_foo         \
    template <class T>     \
    struct foo_traits<X>   \
    {                      \
        using foo = X;     \
    };

template <class T>
struct foo_traits;

define_bar(T*, T*, T*);

template <class T>
struct baz;

template <class T>
struct baz<T&>
{
    static T* apply(T& t) { return &t; }
};

template <class T>
inline T a(T t) { return t; }

}
24
void-pointer

Vimには[m/]m「for Javaまたは同様の構造化言語」」に組み込まれています。

Vim関数VBScriptバッチファイル などを処理するカスタムバージョンを作成しました。これらはすべて私の CountJumpプラグイン を利用しており、正規表現に基づいてカスタムジャンプ関数を作成するために使用できます。

55
Ingo Karkat

次の複製のように見えます: Vim [m motion with c#

たとえば、この汚いトリックを試してみることができます:9]}。これは9番目にジャンプします}現在の場所から(ネストしすぎていない場合は、機能するはずです...)

4
user765572

私はこのパターンを作るのに何時間も費やしました:/^\s*\(\i\+\_[ \t\*]\+\)\+\i\+\_s*(\_[^)]*)\_s*{、それは私にとってはうまくいきます。

[〜#〜]編集[〜#〜]:より良いパターン(バージョン2):/\(\(if\|for\|while\|switch\|catch\)\_s*\)\@64<!(\_[^)]*)\_[^;{}()]*\zs{

ここで効果を確認してください:enter image description hereenter image description here

次のような便利なバインディングを.vimrcにマッピングできます。

" jump to the previous function
nnoremap <silent> [f :call search('^\s*\(\i\+\_[ \t\*]\+\)\+\i\+\_s*(\_[^)]*)\_s*{', "bw")<CR>
" jump to the next function
nnoremap <silent> ]f :call search('^\s*\(\i\+\_[ \t\*]\+\)\+\i\+\_s*(\_[^)]*)\_s*{', "w")<CR>

[〜#〜]編集[〜#〜]:より良いパターン(バージョン2):

" jump to the previous function
nnoremap <silent> [f :call
\ search('\(\(if\\|for\\|while\\|switch\\|catch\)\_s*\)\@64<!(\_[^)]*)\_[^;{}()]*\zs{', "bw")<CR>
" jump to the next function
nnoremap <silent> ]f :call
\ search('\(\(if\\|for\\|while\\|switch\\|catch\)\_s*\)\@64<!(\_[^)]*)\_[^;{}()]*\zs{', "w")<CR>
4
zhou lin