Vim: 編集ポイントではなく、前のカーソル位置にジャンプする

Vim: 編集ポイントではなく、前のカーソル位置にジャンプする

現在の行 (A;) の末尾に ; を追加し、マクロを実行する前にジャンプしたカーソル位置に戻る小さなマクロを記述しようとしています。

Co と Ci は必要なものではなく、編集ポイントを操作する '' と `` も必要なものではありません。マーカーを配置せずにこれを行う方法はありませんか?

答え1

小さなマクロではなく小さな関数を作成しても問題ない場合は、次のことを提案します。

function! AppendString(string)
  if getline('.') !~ a:string.'$'
    let original_cursor_position = getpos('.')
    exec("s/$/".a:string."/")
    call setpos('.', original_cursor_position)
  endif
endfunction

カーソルの位置は を使用して取得されgetpos()、後で を使用して回復されますsetpos()

この関数は、任意の文字列を追加できます。また、行の最後に目的の文字列がすでに含まれているかどうかをチェックし、含まれている場合は何も行いません。

さまざまな言語に役立つ、この機能を使用するキーマップを定義できます。

" in ftplugin/cpp.vim
nnoremap <silent> <LocalLeader>; :call AppendString(";")<CR>

または

" in ftplugin/python.vim
nnoremap <silent> <LocalLeader>: :call AppendString(":")<CR>

答え2

setpos()の代わりに低レベルを使用すると:substitute(パターンを検索履歴に追加するなどの他の望ましくない副作用があります)、カーソルの位置は自動的に保持されます。

:nnoremap <silent> <leader>; :call setline('.', getline('.') . ';')<CR>

答え3

`` の動作と「ジャンプ」と見なされるものについては、ドキュメントで明確に説明されています。

から:help jump-motions

「ジャンプ」とは、以下のコマンドのいずれかです: 「'」、「`」、「G」、「/」、「?」、「n」、「N」、「%」、「(」、「)」、「[[」、「]]」、「{」、「}」、「:s」、「:tag」、「L」、「M」、「H」、および新しいファイルの編集を開始するコマンド。これらのコマンドのいずれかを使用してカーソルを「ジャンプ」させると、ジャンプ前のカーソルの位置が記憶されます。その位置を含む行が変更または削除されていない限り、「''」および「``」コマンドを使用してその位置に戻ることができます。

A明らかにリストにないので、ゲイリー・バーンハートが言うように「ティック・ティック・バック」は「そのままでは」機能しません。それでも良いアプローチですが、バックティックマークを明示的に配置する必要があります。前にあなたがやるA;

nnoremap <key> m`A;<Esc>``

答え4

最終的に、あなたが投稿したものよりも柔軟性は劣るものの、よりコンパクトなバージョンの小さな関数を作成しました。

キーバインド:

nnoremap <leader>; :call AppendSC()<CR>

関数:

fun! AppendSC()
  let pos = getpos('.')
  s/.*/&;/
  call setpos('.', pos)
endf

関連情報