読者です 読者をやめる 読者になる 読者になる

Vim:カーソル位置を移動せずにファイル全体を整形する

vim

正確に言うと「ファイル全体を整形した後にもとの位置に戻る」、です。

Vimでファイル全体を整形する場合、例えば次のような操作をします。

gg=G

この場合の不満は最初のggによりカーソルがファイル先頭に移動してしまうことです。
これを解消するには次のような操作にします。

gg=G'' (シングルクオート二つ。ダブルクオート一つではない)

''の意味をヘルプから引用します。
:help ''

                            *''* *``*
''  ``      カーソルがジャンプする直前にいた、もしくは最後の "m'"
            か "m`" コマンドが行われた位置に移動します。
            |:keepjumps| コマンドモディファイヤが使われた場合には
            セットされません。
            |restore-position| も参照。

これでカーソル行は動かずに整形を行えます。
列はその行の先頭に移動します。

列も移動しない場合はC-oを使うといいかもしれません。

gg=G<C-o>(gg=GしてからCtrl + o)

:help CTRL-O

                            *CTRL-O*
CTRL-O      ジャンプリストの中の [count] だけ古いカーソル位置に移
            動します(移動コマンドではありません)。
            {Vi にはありません}
            {|+jumplist| 機能なしのときは使用できない}

「ぼくはVim script」という人は数行で実現できます。

" vimrcに記述
function! s:format_file()
  let view = winsaveview()
  normal gg=G
  silent call winrestview(view)
endfunction
nnoremap <Space>f :call <SID>format_file()<CR>

(この例ではSpace + fマッピングしています)