Vim - Viクローン
| Table of Contents |
解説
VIM - Vi IMitaion
読み方は「ヴィム」。Bram Moolenaar氏によって開発された Vi Clone です。
Viは存在は知っていても使える人は少ないようなので、使ってると周りから「おぉ」と驚かれることがあります。*1
基本的にはUNIX標準エディタとしてViが搭載されていますが、近年ではコンピュータの性能が向上していることからVimのほうが増えています。
% vim
Viとの違い
あまりに違いすぎてリストするのも大変なので、ざっくりと。
- 現在進行形で開発が続いている
- マルチバッファに対応している
- マルチバイト文字が扱える
- プログラミング言語のハイライト(カラー)表示が可能かつ大量
- マクロ,マップ, 置換が標準搭載
- 有志によって様々な機能を持つ高機能なPluginが開発されている
などなど。オリジナルのViと比べると異様な程に高機能です。
操作方法
基本操作
基本的な操作方法はViと同様です。*2
基本操作はviのページを参照下さい。
より詳細を知りたい場合はVim上で
:help hoge
としてください。
バッファ操作
| コマンド | 意味 |
| :e ファイル名 | 指定したファイルを開きます |
| :bnext | 複数のファイルを開いている場合、次のバッファを表示します |
| :bprev | 複数のファイルを開いている場合、前のバッファを表示します |
| :bdel | 現在のバッファを閉じます |
| :buffers | 開いているバッファをリストします |
| :buffer n | n番目のバッファを表示します(番号は:buffersで左に表示されている数字) |
便利なコマンド
| コマンド | 意味 |
| :help | 上記にもあるようにヘルプを表示します |
| :tutorial | チュートリアルを表示します |
簡単な設定
| 設定 | 意味 |
| :set number | 行番号を表示します |
| :set encoding=utf-8 | マルチバイト文字を正しく扱えます*3 |
| :set showmode | 現在のモードを表示します(INSERT or VISUAL) |
| :set autoindent | プログラミングの際に適当にインデントをしてくれます |
| :set smartindent | プログラミングの際にカッコを閉じた時に左にインデントをしてくれます |
vimの技
検索
ASCII, 2byet文字(日本語)のどちらでも検索できます。検索文字にはsedと同等の正規表現が使えます。
| キー | 意味 |
| /(検索文字) Enter | 前方検索 |
| \(検索文字) Enter | 後方検索 |
| n | 検索文字の次にマッチする個所を順方向に検索 |
| N | 検索文字の次のマッチする個所を逆方法に検索 |
置換
sedと同等の正規表現による置換をサポートします。
| コマンド | 意味 |
| :s/[元のテキスト]/[置換後のテキスト]/ | カーソル上の行の最初にマッチしたテキストを置換する |
| :s/[元のテキスト]/[置換後のテキスト]/g | カーソル上の全てのマッチしたテキストを置換する |
| :%s/[元のテキスト]/[置換後のテキスト]g/ | 全てのマッチしたテキストを置換する |
sedと同等、ということでグルーピングや、正規表現が使えます。
key: ValueをKey = Valueに置換する場合はこんな感じになります。
:s/^\(.*\):\s*\(.*\)$/\1 = \2/
Undo, Redo
| キー | 意味 |
| u | Undo |
| U | Redo |
画面分割
| キー | 意味 |
| C-wC-v | 縦に画面を分割します |
| C-wC-s | 横に画面を分割します |
| C-wC-w | 分割されている次の画面へ移動します |
| C-wC-h | 分割されている右の画面へ移動します |
| C-wC-j | 分割されている下の画面へ移動します |
| C-wC-k | 分割されている上の画面へ移動します |
| C-wC-l | 分割されている左の画面へ移動します |
| C-wC-q | 現在の画面を閉じます |
| C-wC-o | 現在の画面以外の分割されている画面を閉じます |
英大文字、英小文字変換
| キー | 意味 |
| ~ | カーソル上の英字の大小文字を変換します |
| g~w | カーソル上の一単語の大小文字を変換します |
| g~$ | カーソルから行末までの英字の大小文字を変換します |
カラー表示
キーワードなどに色を付けて表示します。カラー表示はshell, java, C/C++, perlなどに対応しています。
基本的にはコマンド':syntax on'で色が付きます。しかし、VIMは環境変数TERMを識別して色付けを行い、環境変数の値が'kterm'では色がつきません。文字がボールドになってしまい、むしろ見通しが悪くなります。正しく色を付けるには、環境変数を'xterm-color'と指定してVIMを起動します。
もしくは、起動時の引数に、環境変数TERMの値を指定します。以下は、引数のオプションに設定した方が簡単なのでそれをお勧めします。
オプションで指定
% vim -T xterm-color [filename]
csh系
% (setenv TERM xterm-color; vim [filename] )
sh系
% (TERM=xterm-color; vim [filename])
そのあと、コマンドを入力します。
:syntax on
これで正しく色が付きます。aliasやfunctionで適当に対応しましょう。
| コマンド | 意味 |
| :syntax on | カラー表示を有効にします |
| :syntax off | カラー表示を無効にします |
タブ
VIMのデフォルトのタブ数は'8'です。以下のコマンドでタブ数を変更できます。
| コマンド | 意味 |
| :set tabstop=N | TABキーのタブ数をNに指定します |
| :set shiftwidth=N | <<、>>のタブ数をNに指定します |
タブ'\t'を半角スペース' 'にすることもできます。スペースの数はtabstop, shifttabで指定したタブ数と同じだけのスペースを取ります。
| コマンド | 意味 |
| :set expandtab | タブ'\t'を複数の半角スペース' 'で入力します |
既存のテキストファイルにスペースとタブが混在している場合、スペース(タブ)のみに統一したくなる場合があります。
| コマンド | 意味 |
| :%retab | 全ての行のタブを半角スペースに変換する |
入力補完
辞書ファイルを予め用意しておき、文字入力モードで途中まで入力した後にC-xC-kと押すと文字が補完されます。変換候補が複数存在する場合はC-n、C-pで変更します。
辞書ファイルは1行1単語でリストします。辞書ファイルは以下のコマンドで指定します。
:set dictionary=[dictionary file]
Cのプリミティブ型の辞書は以下のようになります。
char short int long float double long
sh
と入力した所で入力モードのままC-xC-kと入力すると
short
と文字列が補完されます。
| コマンド | 意味 |
| :set dictionary=file | fileの辞書ファイルを読み込みます |
| C-xC-k | 入力途中の文字を辞書ファイルから補完します |
| C-n | 次の補完候補を表示します |
| C-p | 前の補完候補を表示します |
| :help dictionary | 辞書機能のヘルプ表示 |
テキスト暗号
起動オプションに-xを指定すると、パスワードを正しく入力した者だけが編集できるファイルが生成されます。
% vim -x [filename]
プロセスが起動すると、まず最初にパスワードが問われます。二回同じフレーズを入力すると、編集画面に移行します。編集は普通に行えますが、ファイルは暗号化されて保存されます。以降、そのファイルを開くときに、最初に入力したフレーズを入力する必要があります。間違ったフレーズを入力した場合でも開くことはできますが、テキストが正しく復元されず文字化けて表示されます。
600にするほどではないけど見せたくない・・・みたいな微妙な時に使ってやってください。ファイルを644で保存した上で、特定の人にだけ見せたい場合などに有効かも知れません。
文字エンコーディング関係
以下の設定を.vimrcに追加します。
encodingを使用するとVim内部で通常使用する文字エンコーディングを設定することができます。
fileencodingsではファイルを開く際に先に指定した文字コード順(左から右)に開くのを試みて、正しく開けたエンコードで表示してくれます。
大抵のVimには付いていると思いますが+multi_byte機能が無いと使用出来ません。
set encoding=utf-8 set fileencodings=utf-8,sjis,cp932,euc-jp
Shift_JISのファイルはエンコードをeuc-jpとして開こうとするため、文字化けます。Shift_JISのファイルを開くときに、引数に以下のオプションを付けることで文字化けすることなく開くことができます。
vim -c ":e ++enc=sjis" [filename]
++encは編集するエンコードを強制するコマンドです。応用で、UTF-8のファイルを開く場合はこんな感じにします。
vim -c ":e ++enc=utf-8" [filename]
コード整形
muleなんかでもよくあるソースコードの整形機能はvimにもあったりします。そこそこ賢いので普通に使えます。ウェブのコードをコピペした場合に使ってください。
| コマンド | 意味 |
| == | 現在の行のソースコードを整形する |
| =G | 現在の行から最後の行までのソースコードを整形する |
| v(カーソル移動)= | 選択した範囲のソースコードを整形する |
標準出力取り込み
shellの実行結果を編集中のバッファに出力します。dateコマンドやcatコマンドの出力張り付けなどに利用できます。
| コマンド | 意味 |
| :r ![shell command] | shell commandの標準出力をバッファに張り付ける |
日付の入力
:r !date
テキストファイルの入力
:r !cat ~/sample.txt
map (ショートカット)
指定した一連のキー操作を特定の入力に割り当てる機能map。
| コマンド | 意味 |
| :map [ショートカット] [元のコマンド] | 元のコマンドをショートカットキーに割り当てる |
Enter, Escなどの特別なキーは<?>のフォーマットで記述します。
| コマンド | 意味 |
| <CR> | Enterキーの入力 |
| <ESC> | Escキーの入力 |
例えば、現在の日付を入力するコマンドを',d'に割り当てるとする場合は、以下のようになります。
:map ,d :r !date<CR>
メール
取り敢えず、mnewsをメーラーとして使っている場合の話です。
.mnews_setupに以下の行を追加します。mnewsから利用するエディタが全てvimになるので、newsやmailの編集エディタがvimになります。*4
edit_command: vim -T xterm-color
スペルチェック
vim7よりスペルチェック機能が組み込まれています。
| コマンド | 意味 |
| :spell | スペルチェックを開始する |
| :set spelllgn=en_us | スペルチェックの言語を指定する |
ワードカウント
テキスト中に英単語が何単語存在しているか調べる。wcコマンドと同じような動作です。 バッファの下部に行数/文字数/byte数が表示されます。
| コマンド | 意味 |
| gC-g | バッファの英単語数を調べる |
.vimrc
vimコマンドを設定ファイル.vimrcに記述しておくと、起動毎に毎回設定する必要がなくなります。
設定ファイル
個人の設定は以下のファイルに記述します。
~/.vimrc
記述形式
1行1コマンドでvimコマンドを記述します。vimコマンドはエディット中に使う":〜"の"〜"の部分です。例えば":syntax on"の場合は"syntax on"となります。また、"以降に記述したテキストはコメントとして扱われます。
" any comment syntax on
サンプル
適当にプログラミングに使えそうなサンプルです。
" " .vimrc " " Japanese Words set encoding=japan set fileencodings=utf-8,shift_jis,latin1,default,euc-jp " display mode, if it is insert mode set showmode " display line numbers on left side set number " auto indent set autoindent set smartindent " tabs set expandtab " a tab to many white spaces set tabstop=8 set shiftwidth=4 " mark up the closing brace set showmatch " color " if you use, please run the vim by this command, 'vim -T xterm-color' syntax on
*1 加えて、極めて不毛なEmacs vs Vi論争にVi側として参加出来ます。
*2 最初の開発目標は ViのCloneなので
*3 +multi_byteが必須になります
*4 '-T xterm-color'はオマケみたいなものなので、気に入らなかったら消してください。


