紹介 *

UNIXの世界でよく使われるテキストエディタ。vi乃至viクローン(viの操作体系を踏襲したエディタ)はほぼ全てのUNIXシステムに標準で搭載され、その軽快な動作からちょっとした設定変更などによく用いられる一方で操作方法が独特であるため、敬遠されることも多い(開発者でさえ「viを開発したのは失敗だった」と言っているらしい)ようだが、慣れれば非常に効率的に編集を行うことができることから熱狂的なファンが数多く存在するらしい。

使い方 *

VIM *

viクローンの主流。もとより多機能な上にスクリプトによるアドオン等が可能。多数のOSで動作。

link *

私のvimrc *

set laststatus=2 " status bar
set ts=4 sw=4 sts=0 " tab
set viminfo='0,"50,h " disable the restoration of the cursol position
set autowriteall " autosave when change the buffer
set number " line number
syntax on
filetype on
filetype indent on
filetype plugin on

" fortran
let fortran_do_enddo=1
let fortran_free_source=1

" search
set nohlsearch  " disable hilight
set incsearch   " incremental

" minibufexpl.vim
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1
let g:miniBufExplModSelTarget = 1

バッファ間移動 *

素のvimのままだと、複数バッファに対する操作がやや不便と感じる。そんな折に、そういう人用のプラグインを発見した。

一番上にバッファ一覧が表示される。Ctrl-w + k or j で通常バッファと往き来ができる。対応バッファの名前上でEnter押すとバッファが切り替えられる。バッファの名前はTab(順方向)またはShift+Tab(逆方向)で移動可能。

fortran90との相性 *

fortran77からfortran90になったことによって、自由形式によるソースの記述が可能となった。でも、vimのsyntax(/usr/share/vim/vim63/syntax/fortran.vim)では、デフォルトで固定形式のソースを意識しているらしく、自由形式のソースでは度々色分けが悲惨に崩れる。これはvimrcに以下の一文を加えると無くなった。

let fortran_free_source=1

また、fortranのモードだとタブは自動でスペースに変わる(expandtab)みたいだ。

im_custom *

とにかくUNIX系OSというのは日本語入力に悩まされる。でも、大抵emacsはあるのでskkを導入すると殆ど一件落着。しかしもう少しワガママに、(非Xな)vimでもskkする事は可能で、im_customはこれを可能にするパッチ(cannaもOK)。vimのソースを入手し、本家のパッチをあて、そしてim_customのパッチをあてれば準備完了となる。

iconv *

複数の漢字コードの取り扱いのためにiconvなるものが必要となる。vimを使う上ではGNUのlibiconvが何かと良いらしい。もともとiconvはシステムに存在する場合が多いが、それではうまく動作しないという報告がチラチラある。実際、私がvimを導入しようと思ったUNIXマシンではそうで、iso-2022-jpの読み書きができなかった(でもiconv自体は、iso-2022-jpのからむ変換を問題無くこなしていた)。

もともとiconvを有するシステムに、それとは別にGNUのlibiconvを入れた場合、コンパイルの際にどちらが選ばれるかはvimのconfigureで陽に指定できない模様。Vim6 Part3の648氏の発言を基に

env CPPFLAGS=-I/HOME/usr/include/ LDFLAGS="-L/HOME/usr/lib -R/HOME/usr/lib" \ 
./configure --prefix=/HOME/usr --enable-multibyte --enable-skk --disable-canna --disable-pobox --without-x --disable-x

などとやってみた。新しく導入したiconvのライブラリがあるパスは、前もってLD_LIBRARY_PATHに追加した。-Rオプションが意味なさげで、さらに後半のX不要の意思表示も不十分みたいだったが、これでmakeすることができた(--disable-cannaが必要だった)。管理者権限が無くldconfigやld.so.confをいじれないため、LD_LIBRARY_PATHを常に設定せねばならないのが少しイヤ。

Viper *

Emacs Lispの一種で、Emacs上でviの操作を実現する。配布元はよく分からないが、基本的にEmacsの配布パッケージに含まれている模様。

キーバインド *

とてもショボい解説なので、もっといいページを見るべきです。

ノーマルモード(移動) *

k    上
j    下
h    左
l    右
(文字数N)+(kjhl)で、文字数分だけ一気に移動
0    行頭
$    行末

C-f  次頁
C-b  前頁
C-d  半頁(?)
H    画面の最上行
L    画面の最下行
M    画面の中央行
gg   ファイル先頭
G    ファイル末尾

b    前の単語
B    前の単語(空白のみ区切文字と見做す)
w    次の単語
W    次の単語(空白のみ区切文字と見做す)
e    単語の最終文字
E    単語の最終文字(空白のみ区切文字と見做す)
-    前行の先頭
+    次行の先頭
z[enter] 現在のカーソルが一番上に来るように表示

%    対応するカッコ
f    行内検索(順方向)
F    行内検索(逆方向)
;    検索の繰り返し
/    文中検索(下へ)
?    文中検索(上へ)
n    文中検索の繰り返し(順方向)
N    文中検索の繰り返し(逆方向)
C-o  ジャンプ前の場所に戻る

C-]  tagジャンプ
C-T  (tagジャンプの前の場所に)戻る

ノーマルモード(編集) *

i    カーソルの位置から入力開始
a    カーソルの次の位置から入力開始
I    行頭から入力開始
A    行末から入力開始
o    前の行に空白行作り、そこで入力開始
O    次の行に空白行作り、そこで入力開始
r    カーソル位置の一文字を置換
R    カーソル位置から置換開始
s    カーソル位置の一文字を文字列で置換
S    カーソルの行を文字列で置換
x    カーソル位置の文字削除
X    カーソル位置の前の文字削除

移動コマンドと組合せて、
gu   小文字に
gU   大文字に
c    変更
d    削除

C    c$ (行末までを変更)
D    d$ (行末までを削除)

コマンドラインモード(":"で移行) *

:w        保存
:q        終了
:e        新たに開く
:new      ファイル追加
:e#       ファイル間移動

:syn on   構文ハイライトを有効に
:q!    変更を破棄して終了
:%s/before/after/g   置換
                     %はファイル全体を表し、省略すれば現在行が対象。
                     最後のgを省略すれば、同一行の複数置換を行わない。
:he    ヘルプ

ビジュアルモード("v"で移行) *

y  コピー
p  ペースト(カーソルの後)
P  ペースト(カーソルの前)
d  削除

矩形編集モード(Ctrl-v で移行) *

I  挿入(挿入モードを抜けると変更が反映されるみたい)

折り畳み *

バッファ操作 *

:ls   バッファ一覧
:b #  #番目のバッファに移動(名前で指定しても良い)
:bn   次のバッファへ
:bp   前のバッファへ
:bf   最初のバッファへ
:bl   最後のバッファへ

ウィンドウの操作 (Ctrl-W からのキー) *

v     左右分割
s     上下分割
c     現在のウィンドウを閉じる
o     現在のウィンドウ以外を閉じる
hjkl  ウィンドウ間の移動

その他 *

J           行の連結(数字と併せて複数行連結も可)
[行数] dd   行削除
[行数] yy   行コピー
d^          行頭まで削除
df 文字     「文字」まで削除
p           ペースト
u           アンドゥ
.           リドゥ
Ctrl-R      アンドゥのアンドゥ
:%s/hoge/fuga/g  全置換
:%s/hoge/fuga/gc 確認しながら置換