マークを以前の値に設定します


9

マークを使用してmAmB... 'A'B... 、...を使用してさまざまなファイル間を簡単に移動できます

そして、いつか(私が認めたいよりも頻繁に)、不注意のため、または理由が何であれ、m[LETTER]私がしたくないときに以前の値を消去する既存のマークを使用します。たいていの場合、最初にマークがポイントしているファイルを開きません。

この場合、自分が間違いを犯したことにすぐに気づいたとき、マークがどこを指していたかを覚えて、この場所に移動して再度設定する以外に、以前のマークの値を取得できますか?

私はそのようなコマンドをドキュメントで見つけていませんので、それが存在しない場合、あなたがこの状況で使用する賢い回避策はありますか?


1
:また、あなたは、より詳細な情報については、この記事を見て可能性がありsuperuser.com/questions/687441/...
nobe4

@ Nobe4リンクを見つけられなかったことに感謝しますが、それを簡単に行うことは実際には不可能であることを確認しているようです。
statox

ジャンプコマンド(ctrl-octrl-iおよび:jumps)を自分の個人的な記憶とともに使用します:)
VanLaser 2015

回答:


5

大まかにあなたが望むことをするいくつかの基本的なVimScriptはここにあります。

実際のマークを設定するために元のコードを呼び出す前に、現在の値を格納するためにmaスルーmzマッピングをオーバーライドします。また、定義して言ったマークの履歴を表示します。g:previous_marksm<Leader>ma<Leader>mz

情報をg:previous_marksより整理された方法で保存し、(場所を表示するだけでなく)マークをすばやく復元する機能を追加することをお勧めしますが、この例ではその方法を示しています。読者へ;-)

let g:previous_marks = {}
fun! MyMark(mark)
    let l:marks = ''
    redir => l:marks
        try
            silent! execute 'marks ' . a:mark
        catch
        endtry
    redir END

    if l:marks != ''
        if !has_key(g:previous_marks, a:mark)
            let g:previous_marks[a:mark] = []
        endif
        call add(g:previous_marks[a:mark], split(l:marks, "\n")[1])
    endif

    execute 'normal! m' . a:mark
endfun

fun! ShowHistory(mark)
    if !has_key(g:previous_marks, a:mark)
        echoerr 'No history for ' . a:mark
        return
    endif

    for l:line in g:previous_marks[a:mark]
        echo l:line
    endfor
endfun

fun! MakeMappings()
    for l:char in range(97, 122)
        let l:char = nr2char(l:char)

        execute 'nnoremap <silent> m' . l:char . ' :call MyMark("' . l:char . '")<CR>'
        execute 'nnoremap <silent> <Leader>m' . l:char . ' :call ShowHistory("' . l:char . '")<CR>'
    endfor
endfun

call MakeMappings()

いつものように素晴らしい答え!私は今週末、読者のための練習問題を実装するために時間を取ってみます;)
statox

2

まさにあなたが望むものではありませんが、おそらくもっと便利です:署名プラグイン。現在のマークをガターマージンの記号として表示し、編集するための簡単なショートカットがあります。また、標識のリストをロケーションリストに配置して、すばやくアクセスすることもできます。


私はマージンの目に見えるマークの大ファンではありませんが、それを見てみると、いくつかの興味深い機能があるようです。
statox

@statox同じように、ショーマークあります。文字通りすべてのマーク(上記のプラグインはアルファベットのマークのみを扱います)を表示し、キーで切り替えることができます。時々役に立ちます。
佐藤桂

はい、私は(署名とは異なり)ショーマークを数回使用してきました。そのため、マージンのマークのファンではないと言いましたが、今すぐ署名して、気に入っているかどうか確認しています:-)
statox

2

実際の問題は複数のファイル/位置の間のナビゲーションにあるようなので、Uniteプラグインに基づく次の簡単な解決策をお勧めします。

:Unite jump -auto-preview

(のようなものにマッピングすることができます。このコマンドは<leader>j、ジャンプリストが表示されます例えば)のプレビュー:あなたがリストをナビゲートするたびにj/ k、そのファイル内のカーソル位置の周りのいくつかの行が表示されます。

ここに画像の説明を入力してください


代替:

デフォルトのマークは非常に簡単に上書きできます。たとえば、simple_bookmarksプラグインを使用すると、名前付きブックマークがユースケースに適している可能性があります。


私は問題がこのタイプのナビゲーションであるとは本当に言えません。これらのマークをたまに使用することが多く、ほとんどの場合、ファイル内を別の方法でナビゲートするからです。それでも、長い間、ジャンプリストをより頻繁に使用する必要があると考えていました。
statox

vimセッション間で保存できたとしても、マークを上書きするのは簡単です。代替ソリューションを追加しました。
VanLaser 2015

確かにあなたの代わりの解決策は試してみる価値があるようです!
statox
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.