`o` とか `O` した時のカーソルのことを考えたんだ
実は個人的にずっと気になっていた振る舞いがありまして.
今回はこれに向き合いました,と言うお話です.
それは,行挿入/追加の o
および O
コマンド.
o
でカウント指定で行挿入した後のカーソル位置がどうも...
o
でカウント指定,つまり [count]o
で複数の行を挿入すると,カーソルがカウントの数だけ下に移動します.
このように.
これは仕様です.
なのですが,この振る舞い,実は,情弱の自分にとって,ちょいちょいストレスフルだったりするのです.
結局,[count]
の分だけ,上方向へカーソルを持っていくのです.
[count]o
しても,カーソル位置はそのままでいて欲しいんだ
今度こそ自分ひとりで何とか出来ないものかと,ボンヤリ考えてみたのですが...伏orz
という事で調べてみるのですが, あまりに基本的な操作ですし,話題としても色気のない内容なのもあってか,なかなか焦点の合う情報に巡り合う事ができず.
十中八九諦めかけた中で,やっとこさ出会えたのがこちら.
すごい,さすが 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>
このように振る舞います.
ご覧いただけるとお分かりになるかと思いますが,[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>
こんなんで良いのでしょうか.
スクリプトでのインサート(挿入)モードって,startinsert
なんだ
今回の作業で学んだ,もうひとつのことがこれ.
execute ":normal i"
な文献を目にし,なるほどと思って試してみたら,インサートモードに入ってくれない.
:h normal
で見てみると,こういう事らしいです.;
(挿入モードを開始するには:startinsert を参照)
via. :h normal
:startinsert
なのだそうです.;
このコマンドの実行直後に挿入モードを開始する。ノーマルモードで "i" をタイプしたように働く。
via. :h startinsert
リファレンスとしてこちらも.:
» Vim: why doesn't “:normal! i” enter insert mode? - Stack Overflow
はいおしまい.