2009年6月17日水曜日

Vim: 同じ高さのインデントに移動



プロトコルが複雑なデバドラ等のコードの場合、switch-case文が長かったりネストしていたりと一画面に収まらない場面がある。そんな時、同レベルのcase文を追いたい場合、通常なら「case」まで移動して「*」や「#」でジャンプしたりする。
でもこれだと、検索レジスタ「"/」を汚してしまうし、ネストしたcase文には対応できない。

そこで、同じ高さのインデントに移動する術を期待し、Vimの本家で「move same indent」というフレーズで検索したら見事ヒット!
一行でしかもキーマップまで書けてしまうとは。。

このWikiには「Alt-,/.」に割り当てているが、しかしMeta(Alt)キーがうまく動作しない。
原因はここにあるようにgnome-terminalがAltの前にESCを付けてしまうのが問題らしい。


よって、以下の設定にした。
nn <C-k> k:call search ("^". matchstr (getline (line (".")+ 1), '\(\s*\)') ."\\S", 'b')<CR>^
nn <C-j> :call search ("^". matchstr (getline (line (".")), '\(\s*\)') ."\\S")<CR>^
※nnってのは:nn[TAB]で補完されるようにnnoremapの略

j/k」の上下移動にちなんで、「Ctrl-j/k」で同インデントに上下移動でき(カーソルが行頭にある必要もなし)、こっちの方がフィーリング的に合っている。
ちなみに、「Ctrl-j/k」はデフォルトでは大した機能に割り当てられておらず、またその機能には代替キーも用意されているので問題無い。


2009年6月7日日曜日

Vimスクリプト: 2HTML

ソースコードや設定ファイルをtoHTMLしてくれるVimスクリプト。しかも使用中のsyntaxに近い配色で。

Fedora10のvimにも入っている。
$ locate 2html.vim
/usr/share/vim/vim72/syntax/2html.vim
$ rpm -qf `!!`
rpm -qf `locate 2html.vim`
vim-common-7.2.148-1.fc10.i386
$ rpm -ql $(!!) |grep \.vim$ |view -
rpm -ql $(rpm -qf `locate 2html.vim`) |grep \.vim$ |view -
Vim: 標準入力から読込中...

とすると、標準でたくさんのVimスクリプトが入っているのがわかる。
気になるVimスクリプトは「gf」としてその中を覗いてみまっしょう。
「:set hidden」な状態の人は、「C-^」で検索結果に戻れるので他のスクリプトにもどんどん跳んでってください。

で、使い方だが
$ vi hello.c
:%TOhtml
hello.c.htmlという filename.htmlファイルが作成される。

ファイル内の一部分だけtoHTMLしたければ、「%(カレント・ファイル)」の代わりに Shift-Vでその部分に対し行選択してTOhtmlに渡せばよい。
:'<,'>TOhtml

保存して確認する(ファイルに落とさないとFirefox側からは読めないので)
:w |!firefox %

Vim表示に比べてちょいと蛍光色掛かって明る過ぎだけど、使用中のsyntaxに近い配色に仕上がっている。

恥ずかしながら今までは、インデント等の整形やHTMLの特殊文字の変換を一記号ずつ置換していた。。
例えば必要な範囲に対し、Shift-Vで行選択し「:'<,'>s/ /&nbsp;/g」や「:'<,'>s/^I/&nbsp;&nbsp;&nbsp;&nbsp/g」みたいな置換をいちいちしてたけど、流石はVim!そんなのとっくに用意済みで、2HTMLでは「:'<,'>TOhtml」(:TO[Tab]でOK)とするだけ!
しかも色付けまでしてくれる。無知って怖ッ!


2009年6月4日木曜日

sudo設定拡張

ここで設定したsudo設定をもう少し使いやすく拡張。

まずは、毎回パスワードを入力するのは面倒なのでその手間を省く設定。
$ sudo visudo
okap    ALL=(ALL)   ALL
           ↓
okap    ALL=(ALL)   NOPASSWD:ALL
※ちなみにデフォルトでもパスワードを入力して5分間位はパスワードは求められない

これで、「$ sudo -s」でノーパスワードでrootにもなれる。


次に、sudo時にalias設定が引き継がれない問題に対処。
Fedoraデフォルトの一般ユーザのaliasは以下のようになっている。
$ alias
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

でも、sudoをかますとalias設定が引き継がれない。
$ sudo ll
sudo: ll: command not found

なので、vi->vimのaliasも引き継がれず、
「$ sudo vi」としてもvimではなくviが起動してしまう。

そこで以下の様なおまじないをすると、上手くいくようになる。
$ sudo ll
sudo: ll: command not found
$ alias sudo='sudo '
$ sudo ll
...
この設定を~/.bashrcに書いておく。


2009年6月1日月曜日

Vim: ctags

vimでお馴染みなのctags。無いとコードが読めないくい必須のアイテム。しかし、デフォルトでは少々使い辛い部分があるのでカスタマイズ。

タグファイルの配置場所

デフォルトではカレントの「tags」か「TAGS」になっている。
:set tags?
  tags=./tags,./TAGS,tags,TAGS

これでは、階層を持ったソースコード群のトップ・ディレクトリで「ctags -R」と作成した場合、一つ下に潜った状態でviを起動したら当然タグファイルを見つけられなくなる。

かと言って、tags+=../tags,../../tags,… とかするのは現実的ではない。
そこで、~/.vimrcに以下を記述すると親ディレクトリを再帰的に/(ルート)まで探してくれるようになる。
:set tags=tags;
※正確にはタグファイルが見つかってもそのタグファイルに定義が存在しない場合は次(親ディレクトリ)のタグファイルを探しに行く

タグファイル名

上記でだいぶ使い易くなったが、もう一つ不満が。
それはgrepやgrep.vimでワイルドカード(*)指定したときにtagsファイルも検索対象になってしまい、タグ化しているので当然ヒットしてしまい判断の邪魔になる。

そこでタグファイル名をドットファイルにする。
「:set tags=」はタグファイルの場所を指定する以前にタグファイル名を指定するものなので以下のようにする。
:set tags=.tags;

すると今度は、ctagsコマンドがデフォルトで生成するタグファイル名は"tags"なので、毎度
$ ctags -f .tags
とするのは面倒になるから、~/.bashrcに以下のaliasを追加してしまう。
alias ctags='ctags -f .tags'


[今日の一言]

右のリリース・カウンタの値が増えたので、Fedora11のリリースがまた一週間伸びたようです。まぁ気長に待ちましょう。