🥌
vimでファイルを開いたときにカーソルを戻す+α
初めに
vim helpのrestore-cursor
に書いてあるTips (リンク) は、さまざまな記事で紹介されているため、設定している人も多いと思われます。
これを設定すると、ファイルを開いたときに自動でカーソルが前回あった位置に移動します。
autocmd BufReadPost *
\ if line("'\"") >= 1 && line("'\"") <= line("$")
\ | exe "normal! g`\""
\ | endif
今回はこれをさらに便利にして、カーソルを画面の真ん中に持ってくるようにしました。
やり方
augroup restore-cursor
autocmd!
autocmd BufReadPost *
\ : if line("'\"") >= 1 && line("'\"") <= line("$")
\ | exe "normal! g`\""
\ | endif
autocmd BufWinEnter *
\ : if empty(&buftype) && line('.') > winheight(0) / 2
\ | execute 'normal! zz'
\ | endif
augroup END
:augroup
コマンドでautocommandの再読み込みを防いでいます。
カーソルの位置が画面の半分より下にあったら、normal! zz
でカーソルを画面の真ん中に持ってきています。
BufWinEnter
はバッファ(ファイルの中身)がウィンドウ内に表示された後のタイミングで発生するautocommandです。
筆者はカーソルを画面の真ん中ではなく、上から3分の2の位置におくような設定をしています。
augroup restore-cursor
autocmd!
autocmd BufReadPost *
\ : if line("'\"") >= 1 && line("'\"") <= line("$")
\ | exe "normal! g`\""
\ | endif
autocmd BufWinEnter *
\ : if empty(&buftype) && line('.') > winheight(0) / 3 * 2
\ | execute 'normal! zz' .. repeat("\<C-y>", winheight(0) / 6)
\ | endif
augroup END
欠点として、<C-^>
で代替ファイル間を移動したときにはBufWinEnter
は発生しません。
nnoremap <C-^> <C-^><Cmd>edit<CR>
のようにして再読み込みをすれば良いです。
最後に
編集を始めたときにカーソルが見やすい位置にあると、とても便利です。
皆さんもぜひ使ってみてください。
Discussion