18176


次の8行だけのvimrcを書きました。

[code]

    set expandtab
    set tabstop=4
    set shiftwidth=4
    set softtabstop=4
    function! F()
        >>
    endfunction
    nmap z :<C-u>call F()<CR>
    
[/code]

zキーを押すと、半角スペース4個分インデントされる事を期待したいのですが、結果は2倍の8個分インデントされてしまいました。

ノーマルモードで>>やインサートモードでtabキーを押すと、半角スペース4個分インデントされました。  
vimrcで定義したF関数の>>でインデントする時のみ、shiftwidthの2倍の幅でインデントされてしまいます。

shiftwidthに設定した幅でインデントさせる方法を教えてください。


CC BY-SA 3.0
2015-10-28T12:22:59.413
18173
2015-10-29T00:17:39.223
2015-10-28T12:34:38.127
10022
10022
question
vim
vim scriptでインデントがしたい


`:h vimrc`すると以下の記述があります。

[code]

    vimrcファイルは一行ずつExコマンドとして実行される。
    
[/code]

`:h Ex`すると以下の記述があります。

[code]

    このモードは ":" コマンドを続けて入力するようなもの...
    
[/code]

つまり`.vimrc`は各行に ":" が暗黙的についていることになります。  
これを踏まえると `>>` という行は `:>`を2回おこなうという指示になります。(`:h :>`)  
ですので'shiftwidth' 2個分右にズレるのです。  
ノーマルコマンドの`>>`とは異なります。(`:h >>`)  
ノーマルコマンドを実行させたい場合は明示的に`normal!`を指定します。(`:h normal`)  
(`!`を付けているのは他でmapされた`>>`を使わず本来の`>>`を使うようにするためです)

[code]

    normal! >>
    
[/code]

これで'shiftwidth' 1個分インデントされます。  
もちろんExコマンドとして

[code]

    >
    
[/code]

でも構いません。


CC BY-SA 3.0
2015-10-28T13:11:48.337
18176
2015-10-29T00:17:39.223
2015-10-29T00:17:39.223
2687
2687
18173
answer