11

Vimセッションで頻繁にいくつかのバッファを開いています。これは、私のジャンプリストがいくつかのバッファからの場所を保存することを意味します。ただし、Ctrl+Oキーボードショートカットを使用して前の場所にジャンプする場合、バッファを離れたくないので、現在のバッファの「ローカル」にある前の場所にジャンプしたいことがよくあります。どうすればよいですか?

たとえば、ジャンプリストが次のようになっているとします。

4   10   1 ~/aaa.m
3   20   1 ~/aaa.m
2   12   2 ~/xxx.m
1   15   1 ~/aaa.m

aaa.m初めてCtrl+を押したときに、ファイルの15行目にジャンプしたいO。重要なのは、次にCtrl+を押したときにO、ファイルにジャンプしたくないということです xxx.maaa.mむしろ、ファイルの20行目、つまり「現在の」バッファー内の以前の場所にジャンプしたいと思います 。ただし、デフォルトのVimの動作では、ファイルの12行目に移動します xxx.m

これをどのように達成できるかについてのアイデアはありますか?

4

2 に答える 2

10

次のジャンプリストトラバース機能を試してください。ジャンプリストの場所から別の場所に連続して移動し(引数に指定された値に応じてCtrl+O またはCtrl+を使用)、現在の場所が開始元のバッファーと同じバッファーにある場合は停止します。現在のバッファーに属するジャンプリストの場所を見つけることができない場合、関数は、関数が呼び出される前の現在のジャンプリスト内の位置に戻ります。Ibackforw

function! JumpWithinFile(back, forw)
    let [n, i] = [bufnr('%'), 1]
    let p = [n] + getpos('.')[1:]
    sil! exe 'norm!1' . a:forw
    while 1
        let p1 = [bufnr('%')] + getpos('.')[1:]
        if n == p1[0] | break | endif
        if p == p1
            sil! exe 'norm!' . (i-1) . a:back
            break
        endif
        let [p, i] = [p1, i+1]
        sil! exe 'norm!1' . a:forw
    endwhile
endfunction

この関数を 現在のバッファーにロックされた++置換として使用するには、以下に示すようにマッピングを作成CtrlOますCtrlI

nnoremap <silent> <c-k> :call JumpWithinFile("\<c-i>", "\<c-o>")<cr>
nnoremap <silent> <c-j> :call JumpWithinFile("\<c-o>", "\<c-i>")<cr>
于 2011-08-16T07:50:53.187 に答える
1

たぶん、EnhancedJumpsプラグインが役立つでしょう。

このプラグインをインストールすると、別のバッファへのジャンプは、同じジャンプコマンドが直後にもう一度繰り返された場合にのみ実行されます。

于 2013-04-17T05:11:43.927 に答える