経緯
まず $HOME/.virc に次のように書きました。
.virc
:set autoindent
:set shiftwidth=4
:set tabstop=4
これで vi のインデント幅が 4 桁になって Python ファイルなどの編集に具合がよいです。ちなみに、インサート モードで Ctrl + d でインデントが浅くなり Ctrl + t で深くなるのが便利。(コマンド モードでは << と >> 。)
なお、 $HOME/.virc であるのは
$ vi --version
と入力すると
system vimrc file: "/etc/virc"
user vimrc file: "$HOME/.virc"
2nd user vimrc file: "~/.vim/vimrc"
user exrc file: "$HOME/.exrc"
defaults file: "$VIMRUNTIME/defaults.vim"
fall-back for $VIM: "/etc"
f-b for $VIMRUNTIME: "/usr/share/vim/vim82"
と出たからです。
それで、万年初心者らしく The Python Tutorial の fibo.py などを「写経」しました。
ところが、上記 vi の設定だとインデントが tab なのです。 Python のコーディング スタイル では tab でなく 4 つの空白としています。
ファイルの tab を空白に展開する
ファイルの tab を空白に展開するコマンドは expand です。というわけで、 tab を 4 つの空白に展開したいので -t オプションを指定して
expand -t 4 fibo.py
この結果は標準出力に出力されるのでリダイレクションを使ってもとのファイルに書き戻してやればよい……
悪い例
expand -t 4 fibo.py >fibo.py
消してもかまわないファイルで実行してみるとわかるように、この例では fibo.py の内容が消えてファイル サイズが 0 になってしまいます。これは shell がまず > を先に実行するためです。
リダイレクションでファイルを "in place" に編集
というわけで、ふつうは一旦べつのファイルにリダイレクトしてからリネームするなどします。
expand -t 4 fibo.py >temp
mv -f temp fibo.py
しかし、ちょっとだるいです。 GNU の sed には -i (--in-place) オプションがあります。リダイレクションでもファイルを "in place" に編集できないでしょうか。というわけで、ググってみました。
すると、 コマンド置換を巧妙に用いた手法 がありました。
今回の例に即してかくと
echo "$(expand -t 4 fibo.py)" >fibo.py
なるほどこれなら $() のなかをリダイレクトより先に実行するので期待どおりの結果が得られるのですね。
落ち
ところで、はじめの .virc ですが、
:set expandtab
を追加しておけば tab ではなく空白でインデントしてくれるという (爆) 。
↧