nvi お役立ちメモ

nkf と組み合わせて UFT-8 なファイルを編集する

ソースファイルが UTF-8 だったりすることが多くなってきた。苦痛だ。 nvi-m17n は EUC/SJIS/JIS は簡単に扱えるのに UTF-8 はわからんちんだからだ。 そもそも個人的には Unicode など信じていないし、 実際上もソースコード程度の文書に UTF-8 を用いる積極的な理由はないと思っている。

それでも UTF-8 なのだ、世の中的には。哀しいことだ。 UTF-8 を強制されるのは今のところ極私的には Java なプロジェクトが多いので Eclipse でも使っていればよいのだが、それでも vi エディタのパワーを必要とする 編集を行いたいケースもあるし、ファイルをちょっとだけ変更したい時にわざわざ Eclipse を起動するのは牛刀を通り越して愚かなことである。

というわけで、nvi の wrapper を作ってみた。

#!/bin/sh
guess=`nkf -g $1`
case $guess in
"UTF-8")
  tmpfile=/tmp/viutf.$$
  chkfile=/tmp/viutf.$$.chk
  nkf -e $1 > $tmpfile
  touch $chkfile
  $EDITOR $tmpfile
  if [ $tmpfile -nt $chkfile ]; then
    nkf -w $tmpfile > $1
  fi
  rm $tmpfile $chkfile
  ;;
*)
  $EDITOR $1
  ;;
esac

このスクリプト自身を EDITOR に設定すると悲しいことになるので要注意だ。

m17n 版で使える tips

autodetect=jp+
nvi-m17n の何が便利って、この漢字コードの自動判定。 (C-g) すれば現在のファイルのエンコーディングがモード行に表示される。 編集中のファイルのエンコーディングを変更するには、 set fileencoding=encoding を使用する。encoding には、 EUC, SJIS, JIS それぞれ euc-jp, sjis, iso-2022-jp を指定できる。 編集中のバッファを簡単に切り替えるためには、map を定義してしまうと便利。
" change japanese encoding for current editing buffer
map ^K^E :set fileencoding=euc-jp^M^G
map ^K^M :set fileencoding=sjis^M^G
map ^K^T :set fileencoding=iso-2022-jp^M^G
canna / cannakey
nvi が直接 Canna とお話しすることを指定。 つまり、X 環境(kinput2 & kterm とか)が必須じゃなくなる、ということ。 急ぎなら kon でも十分。 cannakey を set すると Canna モードへの切替えキーを設定できる。
gtagsmode
タグジャンプを gtags モードにする。 gtags は c, c++, yacc, assembler, java のソースコードに対して タグを付けられるもので、gtagsmode にしておくことで C-](:rta) でタグジャンプ、 C-t(:tagp) でタグポップできる。 70 以上ものパッケージに別れた 700 もの .java ファイルの中をさまよう時も、 これなら多少は安心だ。

通常の nvi で使える tips

showmatch / matchtime=1
showmatch は ) や } を入力したときに 対応する ( や { の箇所を表示してくれる機能。 デフォルト vi では 1拍遅く感じるが、matchtime=1 とすることで 1/10 秒だけ showmatch するようになる。つまり、 :set matchtime=n で showmatch する時間を 1/10 秒単位で設定できる。
ファイル名補完
:set filec=\[TAB] に設定しておくと :r:w のファイル名を tab で補完できるようになる。

:e /tmp で新規名無しファイル (scratch?) の編集を開始できる。

:source SettingFileName で設定ファイルを追加読み込みできる。

:script で nvi の中で shell が起動する。

:E で画面を上下分割できる。Ctrl-W で切替える。

:set leftright で「右端を折り返さない」表示になり、横スクロールするようになる。

:set sidescroll=n で横スクロール量の調整ができる。

Q でいきなり ex モードに移行できる。: が遠い時に便利?

:; で ex コマンドの履歴編集ができる。

:set searchincr でインクリメンタルサーチができる。

Ctrl-A でカーソル位置の単語を検索できる。そのまま n で進んでいける。

C-x に続けて 16 進数で入力すると、バイナリ入力ができる。

#+ でカーソル位置の数字がインクリメントされる。

#- でカーソル位置の数字がデクリメントされる。

## でもインクリメントされる。100## なら 100 インクリメントされる。

:# で今何行目かわかる。これは…、正直、Ctrl-G の方が速いし楽。

:viusage で vi コマンドの超簡単ヘルプが出せる。

:exusage で ex コマンドの超簡単ヘルプが出せる。

:help で超簡単ヘルプが出せる。

:version でバージョン情報が表示される。

素の vi で使える tips

:args で引数に指定されたファイルの一覧を確認できる。

:rewind で引数の最初のファイルに戻ることができる。

z[Enter] でカーソル位置が画面の最上段になるよう調整される。

z. でカーソル位置が画面のまんなかになるよう調整される。

:g/regexp/p がいわゆる grep。

:g/regexp/d がマッチ行の削除。:g/^$/d なら空行削除。

:g/regexp1/s/regexp2/somethingnew/g regexp1 にマッチする行の全ての regexp2 について somethingnew に置き換える。

:shell でログインシェルが起動する。

:!command でコマンドが実行される。 :!shなら sh が起動する。

:!% でバッファ全体を実行できる。% はファイル名と見なされる。

:!command % でバッファ全体を command で実行できる。% はファイル名と見なされる。command は javac とか cc とか perl とか awk とかでウマー。

:選択範囲!command で選択範囲を command に与えて実行できる。 選択範囲は実行結果で置き換えられる。 例えば :%!sort ではバッファ全体が sort される。

:n,m!command とすれば n 行めから m 行めが command に与えられ、 指定範囲が実行結果に置き換えられる。これも部分的な sort などに便利。

:.,.!command でカレント行が command に与えられ、 カレント行が実行結果に置き換えられる。 数式を書いて :.,.!bc すれば計算結果となるので便利。

:visual でヴィジュアルモードに戻る。

tips 応用編

「現在行をコマンドに与え、その結果を受け取る」という原理だけで、 かなりの応用が考えられる。 要は発想次第なわけだが、よく使っているいくつかを紹介しておく。

一行電卓
:n,m!command とすれば n 行めから m 行めが command に与えられ、 指定範囲が実行結果に置き換えられる。 これを使えば、超簡易電卓ができる。
例えば以下のように、ある行に数式が書いてあるとしよう。
1 + 1
ここで この行を bc コマンドに喰わせれば、計算ができるじゃないか。 「この行」を「カーソルのある行」ということにして範囲指定で表すと、 「.,.」となる。カレント行からカレント行まで、という指定だ。 その範囲指定に対して、「!」を使ってコマンドを実行する。
:.,.!bc
すると、以下のような結果が得られるだろう。
2
「.,.!bc」は長いので、適当なキーに :map しておくとよい。
辞書
単語を与えると ndtp で辞書サーバに問い合わせを行って結果を表示してくれる、 ndtpc というスクリプトがある。このスクリプトの wrapper スクリプトを
#!/bin/sh
ndtpc -b 1,2 "$*"
のように用意しておく。仮にこれを ndtpcwrapper としよう。
pinklady
と書いておいて
:.,.!ndtpcwrapper
とするだけで
DICT: 英辞郎
<c091:61a>pinklady
pink lady
[1] ピンクレディー◆カクテルの一種
[2] 〈米俗〉バルビツール酸系催眠鎮静剤
DICT: 和英辞郎
という具合に辞書を引くことができる。
[$Revision: 1.5 $ $Date: 2009.02.17 12:11:57 $]
[EOF]