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のリリースがまた一週間伸びたようです。まぁ気長に待ちましょう。



2009年5月28日木曜日

PSP F/W アップデート

PSP-2000にUSBワンセグ・チューナを使って録画をしているのだが、F/WがVer.4.05でワンセグ録画機能が強化されているのを最近知った。



個人的に期待できる機能は以下かなぁ。

・電源OFF録画待機: 今まではスリープ状態にしておかなければならず電力のムダ
・日時指定録画予約: EPGが数時間後までしかないのでそれより先の時間の予約は出来なかった
・サイレント録画: 録画中も画面や音声が出ており通常視聴と同じ状態になりウザかった(電力もムダ)
・複数予約: 今までは一つしか予約できなかったもんで

これらで快適さが増したけど、日時指定での録画予約は面倒なので、あとはEPGが数日先までのリストを取得できれば良いなぁ(ケータイにワンセグ付いてないんで比較できないけどワンセグのEPGってこういうものなのかな?)。
それと、録画後にスリープではなくシャットダウンしてくれんと、見ようと思ったときバッテリー切れとかあるんで改善して貰いたいところ。

最近はHDDレコーダで録画したのをSDカードからケータイで見れるようになったみたいだけど同じメーカー同士の製品という限定的なので、規格ができないと手を出す気にはなれない。
でもHDDレコーダなら安定して録画できるし、そもそもモバイル機器で録画ってのが間違ってる?(自分もPSP録画は家に置いてしている)


ファームウェア・アップデート

一年ちょい前に2000系を買ったときのままなので現在のF/WはVer.3.80で、最新版はVer.5.50になっていた。

Fedora PCとUSB接続して(Mini-Bタイプはデジカメ付属のを流用)。Ver.3.80ではこのままでは自動マントされない、と言うかUSBストレージとして認識しない(デバイスリクエストに応答していない為?)

なので、PSPをUSB接続モードにすると内部のメモリスティック(MS)が自動マントされる。
※最新のVer.5.50ではこの操作は不要

$ lsusb -v
すると、Mass Storageデバイスとなっていることが分かる。
つまりPSPはPCからはMSカードリーダとして認識される。

ここにあるようにeboot.pbpってのをマウント先のpsp/game/updateに配置後、
アンマウントして取り外し、gameディレクトリに配置したんでゲームからアップデートを選択し実行。
1分位で完了。

このようにOSに依存しないアップデート方法は好感が持てる。
また、ネットワーク接続が当たり前になった現在ではソフトウェアのバグなら製品回収をしなくてもアップデートで修正可能だし、製品リリース時は最低限の機能だけに留めることにより早く市場に投入できるメリットもある。ネットワーク様様ですな。


PSPってUSB-OTG?

この様に、USBワンセグ・チューナと繋がったときはUSBホストに、Mini-BケーブルでPCと繋がったときはUSBデバイスとして振る舞うPSPはUSB-OTGってやつ?
正確にはUSBホストならデジカメとかが接続しに来てもきちんとホストの役割を果たすのはもちろん、PSP同士が繋がってもお話しできないとUSB-OTGとならないらしい。
さて、どうでしょう? まぁWi-Fi接続が一般なんで必要性はないですが。


[今日の一言]

gconf-editorで設定したEmacs風キーバインドが使えなくなっている。(テキストフィールドでCtrl-A/Eで行頭/末に移動できないとストレスが溜まる)
何かのアップデートでリセットされたのか?

$ rpm -qa --last |head -50 |view -
ん~、xkeyboard-config-1.4-8.fc10 辺りが犯人かなぁ。。
犯人はハイバネーションでした。。ハイバネート復帰後にgconfの変更を反映していないっぽい。

毎日シャットダウンしている職場PCは再設定すれば復活したんだけど、ハイバネートして使い続けている自宅PCは再起動をしないと戻らんかった。
(どの道カーネルのアップデートもあったんで久々に再起動したけど、自宅PCは起動が遅くてハイバネートじゃなきゃダメだ!!)