9775


こんにちは  
[vimでbracketsやbracesをオートインデントを有効にした状態で自動補完する](https://ja.stackoverflow.com/questions/9704/vim%E3%81%A7brackets%E3%82%84braces%E3%82%92%E3%82%AA%E3%83%BC%E3%83%88%E3%82%A4%E3%83%B3%E3%83%87%E3%83%B3%E3%83%88%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%97%E3%81%9F%E7%8A%B6%E6%85%8B%E3%81%A7%E8%87%AA%E5%8B%95%E8%A3%9C%E5%AE%8C%E3%81%99%E3%82%8B)
の質問をした者です。  
vimでautoindentされた行でBackspaceを押したときにその上の行のインデントにカーソルが戻るようにする方法はないのでしょうか?

ひょっとすると、autoindentではスペースが入力されているように見えているだけで、その行に非空白文字が入力されなかった場合は何も入力されていないということになるということなのでしょうか?

図で表すと

（例1)

[code]

    
    {|} //最初の状態。delimitMateによって補完されているためこの状態になる
    
    
[/code]

ここで改行します。delimitMateの設定によって下のようになります。(上記質問のリンク参照)(例2)

[code]

    
    {
        |
    }
    
    
[/code]

もう一度改行するとautoindentを有効にしているため下の例のようになります。(例3)

[code]

    
    {
    
        |
    }
    
    
[/code]

このときにBackSpaceを2回押すと下記のようにカーソルが戻ってしまいます。(例4)

[code]

    
    {
    |
    }
    
    
[/code]

これをAtom.ioのように (例5)

[code]

    
    {
        |
    }
    
    
[/code]

上のようにスペース4文字のところにカーソルが戻るようにするにはどうすればいいのでしょうか?  
ちなみに、vimrcは

[code]

    
    set expandtab 
    set backspace=indent,eol,start 
    set shiftwidth=4
    set tabstop=4
    set autoindent
    
    
[/code]

となっています。


CC BY-SA 3.0
2015-05-02T05:13:04.493
9765
2016-08-16T14:28:20.780
2017-04-13T12:52:38.920
-1
5246
question
vim atom-editor
VimでBackspaceを押したときにインデントにカーソルが戻るようにする


> Vimの使い方としては、インデントとかそんなの気にせず入力を続けてしまう、が正解だったりするんだよ。

<https://twitter.com/kaoriya/status/594429718641815552?lang=ja>

こういうツイートがありました。ご参考になさってみてはいかがですか。


CC BY-SA 3.0
2015-05-02T11:26:50.230
9771
2015-05-02T14:45:40.240
2015-05-02T14:45:40.240
5519
9574
9765
answer


vimrcに以下のコードを追記して試してみてください

[code]

    inoremap <SID>(pre-CR)  X<BS>
    imap <CR> <SID>(pre-CR)<Plug>delimitMateCR
    
[/code]

連続で改行したときにインデントを削除しないマッピングです。

* * *

(以下、2015/05/04追記)

unaristさんのご指摘通り、Vimでautoindentを設定していると、連続で改行したときインデントが削除されます。`:h 'autoindent'`

**<http://vim-jp.org/vimdoc-ja/options.html#>'autoindent' より引用:**

[code]

    新しい行を開始したとき (挿入モードで <CR> を打ち込むか、コマンド "o"
    や "O" を使ったとき)、新しい行のインデントを現在行と同じくする。新しい
    行で <BS> か CTRL-D 以外を打ち込まずに <Esc>、CTRL-O か <CR> を打ち込
    むと、その行のインデントは削除される。'cpoptions' にフラグ 'I' が入っ
    ていないかぎり、カーソルを他の行に移動させても同様である。
    
[/code]

この挙動をオフにするオプションは、現状では存在していないので、連続で改行したときにインデントを残す方法として、以下のようなマッピングが使われています:

[code]

    " 何か一文字入力して、それを消してから<CR>するとインデントが削除されない
    :inoremap <CR>  X<BS><CR>
    
[/code]

※似た設定の例: `:inoremap # X^H#` (`:h 'smartindent'`)

次に、このマッピングをdelimitMateで使うためにいくつか変更を加えます。

**1. 右辺の`<CR>`をdelimiMateが提供する`<Plug>delimitMateCR`に変更する**

[code]

    :inoremap <CR>  X<BS><Plug>delimitMateCR
    
[/code]

...これは動きません。右辺に`<Plug>`がある場合は、再展開させるためにimapを使う必要があるからです。(inoremapのままでは`<Plug>delimitMateCR`という
**文字列** が入力されてしまう)

**2. inoremapをimapに変更する**

[code]

    :imap <CR>  X<BS><Plug>delimitMateCR
    
[/code]

これは動くと思います。これで十分かもしれません。が、`<BS>`もdelimtMateが提供するものに再展開されてしまうため、想定しない動作をするかもしれません。それを防ぐために、再展開後に素の`X<BS>`が呼び出されるキーを定義してそれを使用するように変更します。

**3. 素の`X<BS>`が呼び出されるようにする**

[code]

    :inoremap <SID>(pre-CR)  X<BS>
    :imap <CR>  <SID>(pre-CR)<Plug>delimitMateCR
    
[/code]

出来上がりです。

**関連するヘルプ:**

`<SID>`について: `:h map-<SID>`


CC BY-SA 3.0
2015-05-02T13:00:56.100
9775
2016-08-16T14:28:20.780
2016-08-16T14:28:20.780
9575
9575
9765
answer


インサートモード中に`CTRL-F`を入力するとの現在行のインデントを再調整できます。  
`:h i_CTRL-F`

[code]

    Characters that can precede each key:                           i_CTRL-F
    !       When a '!' precedes the key, Vim will not insert the key but will
            instead reindent the current line.  This allows you to define a
            command key for reindenting the current line.  CTRL-F is the default
            key for this.  Be careful if you define CTRL-I for this because CTRL-I
            is the ASCII code for <Tab>.
    
[/code]

つまり、`(例4)`の状態で`CTRL-F`を入力することで`(例5)`の状態にすることが出来ます。  
私の場合はこれで事足りています。

他にインサートモード中にインデントを調整するスペシャルキーは`i_CTRL-T`と`i_CTRL-D`があります。詳細はヘルプを参照下さい。(`:h
i_CTRL-T` `:h i_CTRL-D`)  
ノーマルモード時は以下のヘルプを参照下さい。(`:h =` `:h <` `:h >`)


CC BY-SA 3.0
2015-05-04T01:44:45.333
9804
2015-05-04T01:44:45.333
2687
9765
answer