Vimでバッファ切り替えを行うプラグインを作成しました (実際に作ったのは2月頃)。切り替えたいバッファ名を表すパターンを入力する形。候補となるバッファはインクリメンタルに更新されます。パターンマッチングはそれなりにいい加減なので注意。
作った後でlookupfileの存在を知って凹んだのですが、個人的には (1) 使わない機能が多く (:LUBufs以外要らない)、(2) パターンがVimの正規表現であり (バッファを表すには機能過多で入力が面倒)、(3) キーバインドが何となく気に食わないので、結局buffuzzyの方を使い続けています。(1) 以外はどうにかできなくはないのですが、調整のための作業量を考えると面倒で。
試しにbuffuzzyの動作デモを作成してみました。リサイズされると文字がほとんど見えなくなるため、320*240の範囲に収める必要があるのですが、フォントを小さくしても結構狭いので困りました。
このサイトのRSSをBloglinesで表示させた場合、何故か設定に関わらず要約 (<rss:description>) が全文 (<content:encoded>) より優先されてしまいます。はてなRSSでは正しく表示されるため、RSS自体に問題はないはずです。何故かと疑問に思っていたのですが、ようやく原因が分かりました。
原因はタグのプレフィックスでした。他の語彙と区別するためにxmlns:rss="http://purl.org/rss/1.0/"としていたのですが、これをxmlns="http://purl.org/rss/1.0/"にすれば正しく表示されるようになりました。
しかし、これが原因だなんて、一体どういう実装をしてるのか……まあBloglinesはこれ以外にも色々と詰めの甘い所があるのですけどね。例えば"で括られた属性値中の"を\"とエスケープしている等。
全文が見れないのは不便なので変更した方がいいのですが、私としてはこのプレフィックスを変えたくありません。サイト関連のXML文書では空のプレフィックスをXHTMLに割り当てているので、RSSでだけ変えるのは統一性が崩れます。それに<content:encoded>の内容との整合性も崩れます。
一応、後で上記のエスケープの件も含めて報告しておくかな。
報告しました。受理のメールも返ってきたので、取り敢えず様子見。
cereja 0.0a5をリリースしました。主な変更点はモジュールシステムの変更で、Lua標準のものを使用するようにしました。
修正すべき点はまだ色々とあるのですが、取り敢えずこれで一区切りといったところ。アレとかコレとか追加したいものはあるのですが、問題点を全て潰してからでないと取り掛かるのが怖くて……
Vimでバッファの内容から自動的に:XMLnsを実行するXML用filetype pluginを作成しました。Vimにデフォルトで同梱されているXML用のomni completionは適宜:XMLnsを実行しないと有効になりません。これを手動で実行するのはかなり面倒なので、自動的に実行するようにしました。
作成していて思ったのですが、デフォルトのアレは何故自動的に:XMLnsしないのでしょうか? でないとほとんど使い物にならない気が……と思って調べてみたら、filetype=htmlかfiletype=xhtmlなら自動で設定されていました (使用するのはhtmlcompleteの方ですが)。素のHTML/XHTMLは滅多に編集しないので気付きませんでした。個人的には複数の語彙が混在してるXML文書を編集する機会の方が多いので、まあいいや。
VimでXML文書中の各種オブジェクトへのカーソル移動を行うfiletype pluginを作成しました。開始タグ (空要素タグ、各種宣言等も含む)、終了タグ、テキストノード (空文字列や空白のみのものは除外)、属性単位での移動が可能になります。
作ったはいいもののキーバインドでかなり悩みました。取り敢えず全部<LocalLeader>fのような2ストロークに割り当てたのですが、何となく今一な感じがします。3ストロークにすれば割とすっきりするのですが、カーソル移動系のコマンドにそれは嫌です。そもそも使いそうにない移動コマンドまで作成したのが悪いかなぁ。「終了タグの末尾へ移動」なんて使わない気がします。
そういえばOperaの通知ウィンドウ (画面隅に「にょろっ」と出てくるアレ) はカスタマイズ可能なんでしょうか? 通知内容に応じてアイコンが違うので多分できるだろうと思うのですが。できたらできたで少々遊ぶかな。
M2 (Opera内蔵MUA) でspamと判定された新着メールの通知は抑制できないのでしょうか? ブロックされたポップアップ、ダウンロード終了、新着メッセージ (メールも含まれる) の通知の有無は設定できるのですが、細かい条件は指定できません。そのままではspamを受信した場合でも通知されてしまい、五月蝿くて仕方がありません。かといって通知しないようにすると中々気付きませんし……
今のところ、spamのみISPのメールサーバーで止めて、受信は明示的に行うようにしているのですが、これはこれで少々問題があります。一番ダメなのはspam判定基準がM2とISP側で別々になることです。九分九厘同じ結果なので今のところ問題ないのですけどね (今までの誤判定はZoneLabsのニュースレターだけ)。
以前、メール送受信不可能状態に気付かなかったドジから数ヶ月。ようやく気が向いたので、送信できるように設定しなおしました。
いやー、改めて考えてみると凄く単純なことだったので凹みました。通常はMUAが直接メールサーバーと通信しますが、AVGを通す場合、MUAからAVGへ、AVGからメールサーバーへ通信が行われることになります。そして、メールサーバーとの通信に関わる事項 (IPアドレス、ポート番号、認証方式等々) は直接メールサーバーと接続するAVGに関係することであって、MUAとAVGの間の通信とは全然関係がありません。
私の場合、何故かそこを勘違いしていて、両者の設定 (特に認証方式とTLS使用の有無) を同じにしようとしていました。今回の場合、メールサーバーとの通信にTLSを使いますが、AVGとの通信には使いません (むしろ使えないと考えた方が適切か)。このことに気付かなかったらどれだけの組み合わせを虱潰しに試そうとしてたか……もう二度とこんなボケしないぞー……
これまでVimの<LocalLeader>を全くと言っていいほど使っていなかったのですが、近いうちに使いそうな気配がするので設定することにしました。デフォルトは\で遠いのですが、かといって都合良く他に空いてるキーはありません。色々と悩んだ結果、次のように割り当てました:
let mapleader = ','
let maplocalleader = '.'
nnoremap \ .
nnoremap <Space>w :<C-u>call s:ToggleOption('wrap')'wrap'のトグルに割り当てられていたので、それを<Space>wに移動しました。Lispのマクロを他の言語に導入できないかどうか考えていたところ、Metaluaなるものを発見しました。これはマクロありのLuaソースを普通のLuaのバイトコードにコンパイルする形。自分の考えていたことがそのまんま実装されてて吹きました。
でも、やはりLispの方がいいなぁ。他の言語ではソースコードと構文のデータ構造の外部表現が一致していないため、同一のものを扱うために2つの表現方法を使い分けなければなりません。特にquasiquoteなんて書いてて嫌になりそう。
Lispのマクロを他の言語 (特に構文がS式でないもの) で使えるようにする場合、次のような問題がある。
まず、構文をファーストクラスのオブジェクトとして扱えるようにしなければならない。Lispの場合、構文は全てS式で表され、S式はリストとして扱える。そしてリストの記述や変換は簡単に行うことが出来る (特にquasiquote)。
これが他の言語の場合、構文をその言語で扱える何らかのデータ構造で表現できるようにしなければならない。例えばLuaならfoo(3 * 2)は
{tag='call',
{tag='symbol', 'foo'},
{tag='op', '*',
{tag='number', 3},
{tag='number', 2}}}と表現できるだろう。しかしこれは記述も変換も面倒である。
また、新たな構文を導入する場合はパーサーの動作を実行時に変更できるようにする必要がある (Lispは構文が全てS式であるためパーサーに手を入れる必要はない)。
これらの点を考えるとLispの「全てがS式」というのがいかに便利かが分かる。逆に、これらの点をどうにかできればLispのマクロと同じものを他の言語に導入することは十分実装可能である (マクロありのソースをプリプロセッサにかけてマクロなしのソースに変換し、その後本来の処理系にかける形になるだろうけど)。
Luaの関数呼び出しにおいて実引数の数が仮引数の数と異なる場合、次のように調整が行われます。
nilで代替される。一応、この点はLua 5.1 Reference Manualの2.5.9節のvararg expressionの例を見れば分かるのですが、関数呼び出しのところに説明がないんですよね。すぐに分からなくて少々困りました。
そういう訳なので、foo(arg1, [arg2='some default value'])な関数は
function foo(arg1, ...) -- (arg1, [arg2='some default value'])
local arg2 = ...
if arg2 == nil then
arg2 = 'some default value'
end
-- ...
endと書かずとも、
function foo(arg1, arg2) -- (arg1, [arg2='some default value']) arg2 = arg2 or 'some default value' -- ... end
と書けますね。
UNLOAD_DLL_DEBUG_EVENT- When a process exits, the system automatically unloads the process's DLLs, but does not generate an
UNLOAD_DLL_DEBUG_EVENTdebugging event.
という訳なので必ずしもFreeLibraryする必要はない……はず……
cereja 0.0a4をリリースしました。情報の通知周りとui.window周りの修正・改善しました。
取り敢えず必要最低限の機能は揃えたので、後は細かいところの修正を繰り返して0.0とする予定です。本当は色々追加したいものがあるのですが、それらは0.1以降で行う予定です。でも弄る時間を取れるどうか怪しいところ。
かなり前からメインPCの時計が電源を入れるたびに大幅に遅れることがあったのですが、もっと妙な事が起こりました。電源が入ってて現在使用中にも関わらず、時計の時刻が20分と3日も巻き戻っているのです。時刻関係の設定を弄ったりした覚えはさっぱりないので、何が原因なのかさっぱり想像がつきません……
「MessageBoxで表示されてるテキストをコピーできないかなぁ」と思って何となくCtrl-Cを押したらコピーできることに気付きました。Ctrl-Cを押しても無効なキーを押したときと同じ警告音が鳴るので、てっきりできていないものだと思っていたのですが、取り敢えずペーストしてみるとコピーできていてびっくりしました。
こういうことはMSDNにきちんと書いておいてよ……と思って調べてみるとWin32 Q&A: Handy Features in Windows, and Interlocked Functions -- MSDN Magazine, July 2000に該当する記述がありました。どうやらWindows 2000からコピー可能らしいです。
そういえばコピー可能かどうか調べたことなんてなかったなぁ。ずっとできないものだと思っていたし、コピーしたいと思った状況が十中八九デバッグ時のちょっとした確認だったからです。その場合はMessageBoxのウィンドウ全体をキャプチャーして画像ビューワーで脇に表示させておけば十分で、別にコピー結果を保存する必要性がありませんでした。
Vimに関数を表すテキストオブジェクトを提供するプラグインを書いてみました (実際に作成したのは二ヶ月ほど前ですけど)。
afで関数全体を、ifで関数内部を選択します。サンプルとしてCとVim script用の設定を同梱しているので、他のファイルへの対応はそれを参考にしてください。
余談: 行単位で選択する際はVaf等と入力するのですが、結構な確率でVAfやVAFのように入力し損なってしまいます。nmap VAf Vaf等とmapすれば解決するのですが、そうするとVだけ入力した場合のvisual modeへの移行に若干のラグが生じます。これはどうしようもないのですが、数瞬遅れるのがどうも我慢できないのでmapしないまま放っています。どうしようかなー。
以前、Vimのタグ関連コマンド用のkey mappingを追加・整理した際、<C-m>/<Return>を<C-]>にmapしたのですが、使っていくうちに少々弊害が出てきました。
前者は+が同じ動作をするのですが、キーの位置が遠いのが問題。後者は、スクリプトの実行に関してはscratchのバッファ固有の操作なので、別に既存のkey mappingを上書きしても構わないと思うのですが、何となく抵抗があります。
タグの参照は<C-m>の他にもkey mappingを定義しているので、<C-m>のmapを削除するのも一つの手なのですが、どちらも使うことが多いですし。うーん、どうしよう。
「おさかなラボ - [vim]矢印キーでコンパイルチェック」に対するコメント (あるバッファの内容を外部プログラムの標準入力へ送り、標準出力を別のバッファに取り込むにはどうすればいいか、という話)。
バッファの内容を指定した外部プログラムの標準入力へ送るなら:write !{cmd}で、外部プログラムの標準出力をバッファに取り込むなら:read !{cmd}でできます。ただし前者の:writeと!{cmd}の間の空白は必ず必要なので注意してください (空白がないと:write! {cmd}として解釈され、バッファの内容を{cmd}に保存してしまいます。しかも:write!なので上書きの確認はありません)。
目的は出力を別のバッファに取り込むことですが、直接的な方法は (多分) ありません。ただし間接的な方法として:
:new):read !perl -c #)が考えられます。元々のバッファが変更されていた場合は事前に保存 (:write) しておく必要があるのですが、これは:set autowriteすれば大分手間が省けます。
ただ、文法チェックやコンパイルについてはquickfixを使う方が便利です (:help quickfixを参照してください)。VimのデフォルトではCとtexくらいしか対応していないのですが、Perl等は探せば対応させるプラグインがあると思います。
ここ一ヶ月ほど全然やる気が起きなかったのですが、何故か昨日から急にやる気が出てきたので、色々と頑張ってみることにします。何を頑張るかは未定。