Help us understand the problem. What is going on with this article?

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away