Edited at

Vimの起動オプションでファイルにテンプレートを追記して挿入モードに移行する

More than 3 years have passed since last update.


動機

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の関数定義ファイルに雛形を追加、挿入モードに移行する例


function-init.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を使わずにコマンドラインで挿入モードに入る方法を探しているが、どうも見つからない。