Vim:Dev Basics/Keyword
Vimは、古くからUNIX系統のOSで使われてきた「vi」というテキストエディタの系譜に属するプログラマーの手によくなじむテキストエディタだ。
Vimは、古くからUNIX系統のOSで使われてきた「vi」というテキストエディタの系譜に属するテキストエディタ。現在の「Vim」という名称の由来は「Vi IMproved」であり、viに比べるとはるかに多くの機能を持っている。多くのプラットフォームに移植されているので、Vimをマスターすることで、さまざまなOS上で同一の操作性でコードやテキストの編集ができるようになる。
Vimの特徴:モード
Windowsのメモ帳のような一般的なエディタでは、[Ctrl]キーなどの「修飾キー」と何かのキーの組み合わせでカーソル移動、文字や行の削除、カット&ペーストなどを行い、修飾キーなしでキーボードから入力した文字は現在編集中のファイルに対する入力となる。
このようなテキストエディタとVimの大きな違いは「Vimでは修飾キーなしで入力したからといって、それが編集中のファイルの内容となるとは限らない」点だ。というのは、Vimにはさまざまな「モード」があり、それらのモードを切り替えながら編集を進めていくからだ。モードによっては、入力した文字がVimに対する指示(コマンド)となり、それに応じてカーソルが移動したり、文字が削除されたりする。別のモードでは、一般的なエディタと同様にキーボードからの入力が現在編集中のファイルの内容となる。
Vimにはさまざまなモードがあるが、中でも基本的なものが以下の3つだ。
- ノーマルモード
- 挿入モード
- コマンドラインモード
「ノーマルモード」は上で述べた「入力した文字がVimに対する指示」となるモードだ。つまり、このモードではVimの画面上でカーソル移動、文字の削除、カット&ペーストなどを行う。一方の「挿入モード」は上で述べた「キーボードからの入力が現在編集中のファイルの内容となる」モードだ。「コマンドラインモード」では、Vimの画面の最下行で、ファイルのオープン、Vimの終了、語句の検索、Vimの動作設定などを行う。
ノーマルモードから挿入モードに移行するには、小文字の[i]キー(「insert」コマンド)や[a]キー(「append」コマンド)などを入力する。前者は挿入モードに移動してカーソルの前にテキストを挿入するように、後者も同様だがカーソルの後ろに文字を追加するようになる(大文字の[I]キーと[A]キーはそれぞれ「行頭」にテキストを挿入、「行末」を追加するような状態となる)。以下に、キー入力とそれに対応した挿入箇所を示す(緑色の部分がカーソル位置だ)。
挿入モードからノーマルモードに移行するには[ESC]キー(もしくは[Ctrl]+[[]キー)を入力する。
ノーマルモードからコマンドラインモードに移行するには、以下のいずれかを入力する。
- [:]キー: ファイルのオープン、Vimの終了など
- [/]キー/[?]キー: 語句の前方検索、後方検索
- [!]キー: 指定した範囲のテキストに対して、外部コマンドを実行し、その結果でその範囲を置き換える(フィルター)
最も頻繁に使うのは「:q」コマンドによるVimの終了(「:q!」でファイルを保存せずに終了、「:wq」でファイルを保存して終了)、「:e ファイル名」コマンドによるファイルオープンだろう。「/検索語」で「検索語」を前方検索(ファイル末尾に向かって検索)し、「?検索語」では後方検索(ファイル先頭に向かって検索)する。[!]コマンドによるフィルタリングは最初のうちは使わないかもしれないが、マスターすると便利に使えるはずだ。
この他にもビジュアルモード(ノーマルモードと同様なキー操作により、任意の範囲のテキストを選択して、何らかの処理を行うモード)など、多くのモードがVimにはあり、ユーザーは(今のモードを意識しながら、あるいは難しいことは考えることなく)モード間を渡り歩きながら、編集作業を進めていく。
このとき、モードによって、キーボード入力の解釈のされ方が異なること、特にノーマルモードと挿入モードという基本中の基本の2つモードで解釈のされ方が全く異なることから、使い慣れないうちは「Vim難しい」となることがよくある。だが、以下に挙げるようなコマンド群を覚えてしまえば(!)、プログラマーのみならず多くのユーザーにとって便利に使えるツールとなる。
Vim(vi)のコマンド
Vimのノーマルモードでは現在編集のファイルに対して、さまざまな操作を行える。以下に基本となるカーソル移動コマンドを示す。以下では[]で囲まずにアルファベットや記号類を表記するが、これはその文字をそのまま入力することを意味する。例えば、「gg」というのは[g]キーを2回連続して入力することを意味し、「G」は[Shift]キーを押しながら[g]キーを押す(つまり[G]キーを押す)ことを意味する。また、「<文字>」には任意の文字/記号/数字などを入力することを意味する。
操作 | コマンド |
---|---|
1行下/1行上 | j/k |
1文字左/1文字右 | h/l |
行頭/行末 | 0もしくは^/$(0は空白を含む行頭に、^は空白を含まない行頭に移動する。プログラムコードを編集しているときにはインデントがあるので^コマンドは意外に便利に使える) |
ファイル先頭/ファイル末尾 | gg/G |
次の単語の語頭 | w(「w」は「word」を意味する) |
前の単語の語頭 | b(「b」は「backward」を意味する) |
次にくる単語の末尾 | e(「e」は「end of word」を意味する) |
次の「文字」の直前 | t<文字>(「t」は「to」を意味する) |
直前にある「文字」の直後 | T<文字>(t<文字>を逆方向に行う) |
次の「文字」 | f<文字>(「f」は「find」を意味する) |
「文字」を前方検索 | F<文字>(f<文字>を逆方向に行う) |
基本となるカーソル移動コマンド |
これらのコマンドは直前に数字(カウント)を入力することで、繰り返し実行できる。例えば、「10l」としたら10文字右に移動するといった具合だ。また、Gコマンドにカウントを指定した場合、カウントで示される行に移動する(例えば、「1G」コマンドはファイル先頭に移動する)。
挿入モードに移行するコマンドは上でも述べたが、以下にまとめておこう。なお大文字の[I]キーを入力した場合には「行頭」とあるが、インデントを考慮して最初にある空白文字以外の文字の直前が挿入箇所となる。
操作 | コマンド |
---|---|
カーソルの直前に入力 | i(「i」は「insert」を意味する) |
カーソルの直後に入力 | a(「a」は「append」を意味する) |
行頭に入力 | I |
行末に入力 | A |
カーソル行の下に空行を挿入 | o |
カーソル行の上に空行を挿入 | O |
テキストを入力するためのコマンド |
なお、上で見たカーソル移動のことを「モーション」といい、下で見るdコマンド(テキストを削除するコマンド)などと組み合わせて利用できる。このテキストに対して何らかの処理を行うコマンドのことを「オペレーター」と呼ぶ。
テキストを削除したり変更したりするには以下のコマンドを使う。
操作 | コマンド |
---|---|
カーソル位置の1文字を削除 | x |
カーソル行を削除 | dd |
カーソル行を書き換え | cc |
カーソル位置から行末までを削除 | D |
カーソル位置から行末までを書き換え | C |
基本となる削除コマンド |
これらのコマンドも直前にカウントを入力することで、繰り返し実行できる。例えば、「10x」コマンドは10文字を削除する。
上で述べた通り、dコマンドはモーション(カーソル移動コマンド)と組み合わせて使用できる。dコマンドや指定した範囲を変更するcコマンドなどのことをオペレーターと呼ぶのは上でも述べた通りだ。オペレーターに続けてカーソル移動コマンドを入力することで、さまざまな処理を行える。以下に例を示す。
操作 | コマンド |
---|---|
1単語を削除 | dw(delete word) |
1単語を書き換え | cw(change word) |
次の閉じかっこ(の直前)までを削除 | dt) |
次の閉じかっこ(の直前)までを書き換え | ct) |
現在行から行末までを削除 | dG |
オペレーターとモーションの組み合わせの例 |
オペレーターにはモーションだけではなく「テキストオブジェクト」と呼ばれる特殊なオブジェクトを指定できる。例えば、「i)」というテキストオブジェクトは「カーソルを囲む最小のかっこの範囲」を表すテキストオブジェクトだ。そのため、「console.log("hello");」という行の引数"hello"の「e」にカーソルがあるときに「ci)」と入力すると、「()」内のテキストが削除されて挿入モードに移行する(「di)」なら「()」内のテキストが削除される)。以下に「ct)」と「ci)」との挙動の違いを示す(簡単にいうと、かっこの内側にカーソルがありさえすれば、「ci)」でかっこ内を一発で書き換えられるということだ)。
これらの組み合わせにもカウントを適用できる。例えば、「2dw」コマンドは単語削除を2回行う(対して「d2w」コマンドは2単語移動した分を削除する。結果は同じだ)。
オペレーターには削除を行うdコマンド、書き換えを行うcコマンド以外にも、コピー&ペースト用のバッファー(「レジスタ」)にテキストの内容をヤンク(コピー)するyコマンド、インデントを付ける>コマンド、インデントを戻す<コマンドなどがある。
削除したテキストや、ヤンクした内容はpコマンドやPコマンドで貼り付けられる(前者はカーソルの直後に、後者はカーソルの直前に貼り付けを行う)。やり直しはuコマンド(undoコマンド)だ。
このようにオペレーターとモーションやテキストオブジェクト、カウントを組み合わせることで、短いコマンドで非常に多くのことを実現できるのが、Vimの大きな特徴だ。特にプログラマーにとっては便利に使える機能が満載のエディタだといえる。
Vimは、古くからUNIX系統のOSで使われてきた「vi」というテキストエディタの系譜に属するテキストエディタ。とっつきは悪いのだが、慣れてくると手放せなくなる人も多いことだろう。また、現在では肥大化したVimを作り直そうとする「Neovim」プロジェクトも行われている。
参考資料
- vim online: Vim公式サイトのトップページ
- vim-jp: コミュニティーサイト(日本語)
- help - Vim日本語ドキュメント: vim-jp内で提供されているVimのドキュメント(ヘルプ)を日本語化したもの
- 香り屋: Windows用にコンパイルしたVimを配布しているサイト
- いまさら聞けないVim: @IT内のvi入門連載記事
Copyright© Digital Advantage Corp. All Rights Reserved.