質問: 次の8行だけのvimrcを書きました。 ``` set expandtab set tabstop=4 set shiftwidth=4 set softtabstop=4 function! F() >> endfunction nmap z :call F() ``` zキーを押すと、半角スペース4個分インデントされる事を期待したいのですが、結果は2倍の8個分インデントされてしまいました。 ノーマルモードで>>やインサートモードでtabキーを押すと、半角スペース4個分インデントされました。 vimrcで定義したF関数の>>でインデントする時のみ、shiftwidthの2倍の幅でインデントされてしまいます。 shiftwidthに設定した幅でインデントさせる方法を教えてください。
回答: `:h vimrc`すると以下の記述があります。 ``` vimrcファイルは一行ずつExコマンドとして実行される。 ``` `:h Ex`すると以下の記述があります。 ``` このモードは ":" コマンドを続けて入力するようなもの... ``` つまり`.vimrc`は各行に ":" が暗黙的についていることになります。 これを踏まえると `>>` という行は `:>`を2回おこなうという指示になります。(`:h :>`) ですので'shiftwidth' 2個分右にズレるのです。 ノーマルコマンドの`>>`とは異なります。(`:h >>`) ノーマルコマンドを実行させたい場合は明示的に`normal!`を指定します。(`:h normal`) (`!`を付けているのは他でmapされた`>>`を使わず本来の`>>`を使うようにするためです) ``` normal! >> ``` これで'shiftwidth' 1個分インデントされます。 もちろんExコマンドとして ``` > ``` でも構いません。