`o` とか `O` した時のカーソルのことを考えたんだ

実は個人的にずっと気になっていた振る舞いがありまして.

今回はこれに向き合いました,と言うお話です.

それは,行挿入/追加の o および O コマンド.

o でカウント指定で行挿入した後のカーソル位置がどうも...

o でカウント指定,つまり [count]o で複数の行を挿入すると,カーソルがカウントの数だけ下に移動します.

このように.

f:id:wooweezoowee:20181019195512g:plain

これは仕様です.

なのですが,この振る舞い,実は,情弱の自分にとって,ちょいちょいストレスフルだったりするのです.

結局,[count] の分だけ,上方向へカーソルを持っていくのです.



[count]o しても,カーソル位置はそのままでいて欲しいんだ

今度こそ自分ひとりで何とか出来ないものかと,ボンヤリ考えてみたのですが...伏orz

という事で調べてみるのですが, あまりに基本的な操作ですし,話題としても色気のない内容なのもあってか,なかなか焦点の合う情報に巡り合う事ができず.

十中八九諦めかけた中で,やっとこさ出会えたのがこちら.

» 空行を挿入する+α - derisの日記

すごい,さすが deris さん. 有り難い.

って,2013 年ですって...はい,いつもの周回遅れ(溜息

結果こちらをパクって参考にさせていただき,.vimrc にこんな定義を追加しました.;

nnoremap <silent> o  :<C-u>for i in range(1, v:count1) \| call append(line('.'), '') \| endfor \| call cursor(line('.')+1, 0)<CR>

このように振る舞います.

f:id:wooweezoowee:20181019195630g:plain

ご覧いただけるとお分かりになるかと思いますが,[count] の分,カーソルが持って行かれるということはなくなります.

個人的な好みで,カーソルの位置はコマンドを実行した行 +1 に持って行きたいので,そのようにしてます.

数日この設定で過ごし, 自分的には,コマンド実行後,インサートモードになっていて欲しいことに気づいたので,以下のように変更を加えました.

合わせて O,大文字の o の場合についても考えて見てます.;

nnoremap <silent> o   :<C-u>for i in range(1, v:count1) \| call append(line('.'), '') \| endfor \| call cursor(line('.')+1, 0) \| execute 'startinsert'<CR>
nnoremap <silent> O   :<C-u>for i in range(1, v:count1) \| call append(line('.')-1, '') \| endfor \| call cursor(line('.')-1, 0) \| execute 'startinsert'<CR>

こんなんで良いのでしょうか.

f:id:wooweezoowee:20181019200531g:plain

スクリプトでのインサート(挿入)モードって,startinsert なんだ

今回の作業で学んだ,もうひとつのことがこれ.

execute ":normal i"文献を目にし,なるほどと思って試してみたら,インサートモードに入ってくれない.

:h normal で見てみると,こういう事らしいです.;

(挿入モードを開始するには:startinsert を参照)

:startinsert なのだそうです.;

このコマンドの実行直後に挿入モードを開始する。ノーマルモードで "i" をタイプしたように働く。

リファレンスとしてこちらも.:

» Vim: why doesn't “:normal! i” enter insert mode? - Stack Overflow

はいおしまい.