動機
bashのエイリアス/関数定義ファイルに追加する際、テンプレートを追加してから編集したい。
あるいは、下記記事でサラッと使ったオプションの補足。
環境はMac。
Vimの起動オプション
Vimは、起動時に+
(-c
)オプションを追加することで、起動直後に指定のEXコマンドを実行させることができる。
これを利用して、バッファにテンプレートを書き込む。
使用するEXコマンド
$
最終行に移動。
:$
+(数字)/-(数字)
(数字)行下/上に移動。
:+1
:-10
" これだと10行目に移動
:10
a
続けて入力したテキストをカレント行の下に追加。
EXモードでは同じ方法は使えないが、起動オプションではパイプを使ってワンライナーで表現できる。
$ vim hoge.txt +"a|aaa"
EXモードで実行すると、入力を求められた後、'aaa'コマンドが実行される(エラーになる)。
なお、EXモードでaコマンド(iコマンド)でテキストを挿入するには、コマンド実行後にテキストを入力してから、⌃+cを押す。
:a|aaa
bashで改行すれば複数行のテキストも挿入できる。ただし、関数またはシェルスクリプトでインデントすると、インデントごと挿入される。
# >はヒアドキュメントのプロンプトであり入力テキストではない
$ vim hoge.txt +"a|aaa
> bbb # この行はインデントされる
> ccc"
normal/norm
引数をノーマルモードのコマンドとして実行。行内の移動や、空行の挿入に便利。
" 行末に移動
:normal $
" ;の位置に移動
:normal f;
" 空行を挿入
:norm o
ただし、この方法で挿入モードに変更することはできない。
" 何も起こらない(0文字を挿入する)
:normal i
" hogeを挿入する
:normal ihoge
! (コマンド)
シェルを起動し、外部プログラムを実行する。
いくらでも使い道があるが、自動的に挿入モードに移行するのにも使える。
silent
によって、シェルを表示せず実行結果のみを得る。
" AppleScriptで'i'キーを押下し挿入モードに移行
:silent ! osascript -e 'tell application "System Events" to keystroke "i"'
Vimの構文としては!
とコマンドの間のスペースを省略することも適正であるが、それをやるとbashでエラーになる。
$ vim sample.txt +"silent !ls" # 右のダブルクォートがコマンドの一部と見なされている
bash: !ls": event not found
$ vim sample.txt +"silent ! ls" # Vimを終了すると、シェルでlsコマンドが実行されている
sample.txt hoge.txt fuga.txt
なお、r ! (コマンド)
とすると、プログラムの実行結果をバッファに挿入することができる。
bashの関数定義ファイルに雛形を追加、挿入モードに移行する例
# in ~/.bashrc
# export bash_function=~/.bash/conf/function-init.bash
# source "$bash_function"
afunc () {
vim "$bash_function" +$ +"a|$1 () {" +"a| " +"a|}" +-1 +"normal $" +"silent ! osascript -e 'tell application \"System Events\" to keystroke \"i\"'"
source "$bash_function"
}
$ afunc somefunc
AppleScriptを使わずにコマンドラインで挿入モードに入る方法を探しているが、どうも見つからない。