#1. 解決したいこと
vimのオプションでexpandtabを設定した際に期待する動作は、「TAB文字がどのような場合でも挿入されない」ことなのに、
rust言語のソースコード(.rc)編集を行おうとすると、以下のような状態になった。
- Insertモード中に<TAB>、autoindentなどで挿入されるインデントに対し、移動/削除などの操作を行うとTAB文字分操作されてしまう(expandtab未設定時みたいな動作)
- Insertモードを抜けてみると挿入されているのは空白文字であり、1字ずつ操作できる。(expandtabが効いてる)
確かに結果的にはTAB文字は挿入されていない。。。が、
そもそも.cppファイルなどではInsertモード中でも1字ずつ空白として操作できるので、ファイルごとに操作が異なるのでは、
単純に編集しづらい。
#2. 解決策
さくっと解決策を書くため、前提となる環境条件などはあとで記載。
拡張子ごとの設定として.rc用の設定ではsofttabstop=4がデフォルトで設定されているが、これを0とすることで所望の操作となることが判明した。
恒久的な設定とするため、以下を.vimrcに記載することで解決。
filetype plugin on
filetype indent on
autocmd FileType rust setlocal sw=4 sts=0 ts=4 et
#3. 調査結果
参考文献の外部サイト2を参照すると、softtabstopの動作について以下の記載があった。
'softtabstop' オプションがゼロではない時、は 'softtabstop' で指定されるタブ位置まで空白を挿入し、
<BS>は 'softtabstop' で指定されるタブ位置までの空白を削除する。
今回の事象はsofttabstopオプションが代入時だけでなく代入個所に対して<BS>による操作に対しても有効となるため、
見た目上、TAB文字操作と変わらない動作となっており、所望の動作となっていなかったことがわかる。
#4. 環境
###4.1 実行環境
CPU:x86系アーキテクチャ(x64)
OS:CentOS Linux release 7.7.1908 (Core)
Vim:Vi IMproved 7.4
###4.2 .vimrc(事象発現時)
set number
set numberwidth=5
set expandtab
set tabstop=4
set shiftwidth=4
set ai
set smartindent
set visualbell
#5. おわりに
Vimのインデント設定は分かりにくい。
#6. 参考文献
外部サイト1:insert - Vim日本語ドキュメント
外部サイト2:Vim の 5 つのタブとスペース関連のややややこしいオプションをできるだけ簡単に解説するよ
Qiita参考記事:Vim: 拡張子ごとにインデントを変更する方法 ~ 初心者 ~