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: 和英辞郎
という具合に辞書を引くことができる。