Ubuntu Weekly Recipe

第34回テキストエディタの活用(3):vi/vim その1

Linux環境でテキストエディタを考える場合、viとEmacsの二大エディタは欠かせないものです。いずれも熱狂的なユーザがおり、それだけで全ての作業を完結させることすら可能なものですが、一方でどちらもキー操作に独特の点が多く、使い始めるにはそれなりの覚悟が必要になります。しかし、一度使い始めてしまえばその豊富な機能に魅了される人も多いことでしょう。

今回は二大エディタのうち、vi/vimに関するレシピをお届けします。

gvimのインストール

viにはオリジナルviの機能を忠実に生かしていているnviや、独自の機能拡張を積極的に実装しているvimなど幾つもの派生実装があり、それぞれで思想が異なります。ただし、これらの多くはターミナル上で利用するものです。

サーバ管理者などには素のviを好む人も多く存在します[1]が、Ubuntuで利用する場合、GUI版のgvimも利用できるvimを中心に利用するのが良いでしょう(vimもターミナル上で利用することができますので、ターミナルで利用できるエディタが必要な場合も問題ありません⁠⁠。

ただしvimには多くの独自拡張が追加されているので、素のviやnviなどとは一部の操作が異なります。

gvimのインストールには次のコマンドを用いるか、Synapticからvim-fullをインストールしてください[2]⁠。

$ sudo apt-get install vim-full

メニューへの登録と起動

vimのインストールを終えても、デフォルト状態ではメニューに表示されません。⁠アプリケーション]メニューで右クリックして[メニューの編集]を選択してメニューの編集画面を表示させ、⁠アクセサリ]⁠GVim Text Editor」を有効にしてください図1⁠。

図1 メニューの編集
図1 メニューの編集

編集後は[アプリケーション⁠⁠→⁠アクセサリ⁠⁠→⁠GVim Text Editor]とたどるか、端末からgvimと入力すればgvimを利用することができます図2⁠。

図2 gvimの初期画面
図2 gvimの初期画面

gvimをインストールすると併せてvimもインストールされていますので、端末でvimとすることでターミナル版を起動することも可能です図3⁠。

図3 端末内で起動されたvim
図3 端末内で起動されたvim

日本語文字コードへの対応

vimはそのまま利用すると、日本語の文字コード周りをうまく扱うことができないことがあります。UTF-8以外の文字コードのテキストファイルを開くと文字化けに遭遇する可能性があります。

次の設定を ~/.vimrc へ加えてください。

:set fenc=utf-8
:set fencs=iso-2022-jp,euc-jp,cp932,utf-8
:set enc=utf-8

cream

viの最大の特徴は独特なキーバインドです。Microsoft Visual StudioやWordなどで利用できるVi互換キーバインドを提供しているwww.viemu.comに、vimの代表的な操作をまとめた良くできたチートシートがありますが、これだけではすぐには何をすればいいのか分からないでしょう。

viやvimは操作にさえ慣れてしまえば複雑な操作をキー操作でこなすことができるのですが、その一方でこの独特のキーバインドに慣れる必要があります。このような特殊なキーバインドに抵抗を感じる人も多いでしょう。

こうしたユーザがとりあえずvimを使い始めるために、Creamという実装があります。Creamはvimスクリプトを利用して、⁠ふつうの」テキストエディタと同じような操作を提供してくれます。

vimに興味があるもののキー操作が複雑で手を出せない、という人は、次のコマンドを用いてCreamをインストールしてみてください。Synapticからcreamパッケージをインストールしても構いません。

$ sudo apt-get install cream

インストール後は、⁠アプリケーション⁠⁠→⁠アクセサリ⁠⁠→⁠Cream]で起動できます。

「ふつうの」テキストエディタに期待される機能、たとえば[Alt]+[f][ファイル]メニューにアクセスし、⁠o]でファイルを開く、といった操作や、⁠Shift]+カーソルキーで範囲選択を行い、⁠Ctrl]+[c]でコピーして[Ctrl]+[V]で貼り付け、といった操作が行えます。

本レシピで紹介している機能はあまり使えませんが、ちょっとした設定ファイルの変更などに、geditなどの代わりに使ってみるといいでしょう図4⁠。

図4 Cream
図4 Cream

なお、Creamによって提供される「ふつうの」テキストエディタとしてのキーバインドはCreamのWebサイトで確認することができます。

viの基本

vi/vimに初めて触る人は、⁠テキストエディタであるのに、キーボードから文字を入力しても画面に反映されない」ということに驚くはずです。アルファベットをいろいろ入力してみると、幾つかのキーでカーソルが動いたりするかもしれませんが、とにかく画面に文字を出すことができないことでしょう。

そこでまず、⁠i]を押してみて、それからキー入力を行ってみてください。入力した文字がそのまま表示されるようになったのではないでしょうか。

これらの背景をざっと説明しておきましょう。まず、vi/vimの操作において特徴的なのは、⁠インプットモードとコマンドモードの2つの状態を切り替えて操作する必要がある」ということです。

「インプットモード」というのは、通常のテキストエディタと同じくテキストを入力するためのモードです。その一方で、⁠コマンドモード」ではカーソルを移動させたり、ファイルを保存したり、といった操作を行います。

通常、起動直後のviはコマンドモードになっていますから、キーボードからキー入力を行っても画面に何も入力されません。そこでコマンド[i]⁠カーソル位置を移動させずにインプットモードへ切り替える)を入力することでモードが切り替わり、文字入力が可能になったわけです。

キーバインドについては良質なドキュメントがWeb上に無数にありますので、Googleで探してみてください

困ったら[ESC]

viの操作は複雑なため、ともするとよく分からないモードに切り替わってしまうことがあります。

自分がどのような操作をしているのか分からなくなった場合、⁠ESC]キーを複数回入力してみましょう。vi/vimでは[ESC]キーを入力し続ければ必ずコマンドモードに戻ります(たいてい、コマンドモードに戻った時点でビープ音や画面のフラッシュなど、何らかの目印があります⁠⁠。

また、自動的にファイルが保存されることもありませんから、コマンドモードにした状態で「:q!」とすればファイルに反映させずに終了させることができます。

vimの活用

vimには知っているだけでテキスト編集がラクになる操作が数多く存在します。

特に設定ファイルのたぐいを操作する場合、vimを使うと大変に便利です。通常のテキスト編集には他のテキストエディタを用いていても、この種の操作のためにvimを使うことを覚えておくと良いでしょう。

フォールド

vimの特徴的な機能として、⁠必要ない部分を隠す(フォールド;fold⁠⁠」ことができます。

ある行から10行を隠したい場合「zf10j」と操作します(zfが「フォールド操作」で、⁠10j」が10行先です。後半部分はviのカーソル移動操作と同じです⁠⁠。これにより図5のように、テキストの一部が「折りたたまれ(fold⁠⁠」ます。

図5 foldを行った状態
図5 foldを行った状態

この部分で「zo」と操作することで元の状態に戻すことができます図6⁠。

図6 foldを開いた状態
図6 foldを開いた状態

再び折りたたみたい場合は「zc」です。これを用いることで必要ない部分を隠すことができます。複数のフォールド範囲を設定した場合、⁠zr」⁠開く)「zm」⁠閉じる)を用いることで一括して折りたたみを操作することができます。

大量の情報が含まれたドキュメントを読む場合、⁠読み飛ばす」と決めた行をフォールドしていくと非常に効率良く作業を進めることができるでしょう。

なお、⁠zf……」コマンドで指定したフォールド箇所は自動的には保存されません。⁠:mkview」で保存を行い、必要に応じて「:loadview」で設定情報を読み出す必要があります。詳しい操作はvimのマニュアルを参照してください。日本語ドキュメントが必要な場合、村岡太郎氏が公開されているVim日本語ドキュメントを見るのが良いでしょう。

また、フォールドはCreamを使っている場合にも利用することができます。テキストを選択して[F9]を押すことでフォールド範囲を設定してみてください。

Creamの場合、何も選択していない状態で[F9]を押すことで、フォールド範囲をトグルする(折りたたんだり開いたりする)ことができます。

自動フォールド

上記で紹介したvimのフォールド機能は、⁠manual」モードのものです。上記のように個別にフォールドすべき箇所を指定するのではなく、特定の条件を満たした文章を自動的にフォールド設定する、といったことも行えるようになっています。

たとえば~/.vimrcに以下のように設定を加えると、空行で区切られた段落が自動的にフォールド範囲として指定されます。この状態で「zc」すると、段落単位でフォールドを制御することができますし、⁠zm」してから特定の段落だけで「zo」することで、特定の段落だけを表示させる、といったことが可能になります。

set foldmethod=expr
set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1

おすすめ記事

記事・ニュース一覧