2007年8月11日から2007年8月7日までの日記を表示中

2007年 8月11日 (土)

休み

とりあえず夏コミ前後に風邪ひかないように気をつけよう・・・.

uim.el 〜undoの謎

Emacsで半角英数字をゴゴゴっと連続入力すると20文字単位でundoリストに切れ目が入りますよね.uim.elをONにしてアルファベットを入力したときももちろん同じようになるんですが,これ,実はuim.elが自前で20文字連続入力したら切れ目を入れるような処理をわざわざやってます (確かjun0さんにご指摘頂いて追加した機能だったかと).本当はEmacsに任せてしまいたいんですがそういうの無いみたいなんで・・・.

で,最初にこの機能を追加したときから気になってたんですが,この「20」というのは一体どこで設定されているのか・・・.Emacsのデフォルトの挙動を確認したら20だったので,それに合わせてuim.elでも決め打ちで20にしたわけなんですが,やっぱどっかの変数参照してるんだったら,uim.elもそれを参照するようにした方がいいですよねぇ.というわけでちょっと探してみました.

まあ,self-insert-command から辿っていけばそのうち辿りつくだろうということで探してみたら,cmds.cに internal_self_insert という関数があって,コメントでこいつの戻り値について「A value of 2 means this did things that call for an undo boundary.」とか書いてあります.よしよし.んで,これを呼び出して戻り値を使ってる keyboard.c の command_loop_1 を見ると・・・.

  if (!nonundocount || nonundocount >= 20)
    {
      Fundo_boundary ();
      nonundocount = 0;
    }
  nonundocount++;

( ゜д゜)

(つд⊂)ゴシゴシ

(;゜д゜)

まさかの決め打ち.おそるべし FSF Emacs.ちなみにXEmacsの方も見てみたら,event-stream.c にそれっぽいのが書いてありました(ちゃんと確認してないんでもしかしたら違うかも).こっちの方がまだいいかな.

  int magic_undo = 0;
  int magic_undo_count = 20;

uim.el 〜zmacs-region-stays

そんなわけで,uim.elをいじくってたら,ターミナル上で上げたXEmacs内での挙動がおかしくなってしまいました.C-spaceでマークして,カーソルを移動してM-wしようとすると,「どこも選択されてないよ」とエラーが出ます.あれー,今まではどうだったっけ・・・?

多分,FSF Emacsの方でいうdeactivate-mark 絡みと関連する問題だと思うんですが,XEmacsにはこの変数,無いんですよね.ていうかどこいじったのがきっかけで発生したのかさっぱりわからん・・・.

とりあえずどの変数を見ればいいのか,XEmacsとかdeactivate-markとか,その辺をキーワードにググってみたところ,emacs-w3mのログを発見しました.ぬぅっ・・・って読んでもよくわかんねー.ひとまず FSF Emacsと XEmacs とで挙動が逆ということなのか.

よくわかんないからemacs-w3mのソースを見てみることに.w3m-util.elのw3m-keep-region-activeってのがそれっぽいなぁ.あー,なるほど・・・.しかし,zmacs-region-stays って気持ち悪い変数名っすね(;´д`)

とりあえずこれを突っ込んでみたら回避できました.ありがとうございました.・・・ってこんなことばっかやってるからuim.elとuim-key.elはどんどんカオスになるんだよなぁ(;´д`).ちなみに,これは1.4.1でも出る模様.

uim.el 〜function-key-map

uim.elのキーマップ処理にも色々問題が.キーマップ眺めて,ソース眺めて,「あれ,この場合どうすんのが正しいんだ?」とリファレンスを読んで,今までfunction-key-mapの扱い方を微妙に間違えてたことを知りました.

たとえば,Emacs22だと,function-key-map には [M-return] がデフォルトで設定されてて,「(lookup-key function-key-map [M-return])」とやると 「[134217741]」 が返ってきます.なので,Altキーを押しながらEnterを押すと,まず「[134217741]」に変換されて,その上で 「[134217741] 」で global-map とかの探索が行われます.

ただ,デフォルトで 「[134217741]」 にはキーが設定されてないので,Alt+Enterで何もおきません.そこで,たとえば以下のような設定をしてやると,C-eを押したときと同じような動きになります.

(define-key global-map [134217741] `move-end-of-line)

まあ,ここまではいいんですが,ここで,以下のように,global-mapで M-return 自体にもコマンドを設定するとどうなるかといいますと・・・

(define-key global-map [M-return] `move-beginning-of-line)

入力されたキー列は,まず function-key-map で変換されることになるので,結局 「[134217741]」 になって move-end-of-line が実行される・・・と思ってたんですが,実は違いました.global-mapとかに同じキーバインドが設定されている場合は,function-key-map で変換されないそうで.この場合は move-beginning-of-line が走ります.uim.elは,これを知らず,この場合も move-end-of-line を走らせてました(´・ω・`).ああ,直さなきゃこれ・・・でも・・・なんかもう・・・

2007年 8月10日 (金)

uim.el続き

昨日の問題の解決方法はどうもスッキリしないのでもっといい手はないかと考えてみたんですが,イマイチどうにもならん感じ・・・.例えば↓なのを考えてみましたが,ad-do-it を呼ばない場合,keyvecじゃなくてnilが返ってしまうようで使えず.

 (defadvice this-command-keys (around uim-this-command-keys-advice activate)
    (if (and (boundp 'keyvec) keyvec)
	keyvec
      ad-do-it))

まあ,とりあえずEmacsがおかしくなるよりははるかによいので,昨日のでいいか.さっさと最新の環境でテストして,1.5が出ちゃう前にcommitしないと・・・.

2007年 8月 9日 (木)

引っ越してから

気がついたら1ヶ月をちょっと過ぎていました.・・・何か書くことがあるかと思ってここまで書いたんですが,特に何もないことに気づきました.ここまで読んだ人ゴメン.

弾幕型

つながらないッ・・・と思っていたらなんと消されてしまったとのこと(´・ω・`)

uim.el

これを組み込んだところ,たまに this-command-keys の実体が keyvec のまま残ってしまい,Emacsがまともに操作できなくなって (゜д゜)マズー な現象が時々発生するようになってました(これとかこれとか).

再現条件がよくわからない上に忙しいときに限って出先で出たりするもんで,なかなか手をつけることができず放置してたんですが,たまたま一昨日くらいに家のT60で発生.これはチャンスとそのままおかしくなったEmacsを安置し,本日uim.elのデバッグメッセージを回収して調査してみました.

とりあえず,いきなりフォーカスが「*Backtrace*」に移っているポイントを見て,どの辺で発生したのか当たりをつけ,そのちょっと前を詳細に見てみたところ,「M-x」とか「C-x o」を押しつつ,途中別のアプリにフォーカスが移って,uim-helper-agentからフォーカスが外れたことを示すメッセージを受け取って発生しているような雰囲気です.ふーむ.

これを元に,まず同じことをやって見たところ,再現することを確認.よし.で,これならどうだ,と絞り込んでいった結果,最終的にこんだけで発生することが確認されました.

  1. Emacsを起動して C-o で uim.elをONにする
  2. M-x を押す
  3. C-o でミニバッファ内でuim.elをOn
  4. C-a を押す
  5. C-g を押す

ここまでやった状態で, C-s を押してインクリメンタルサーチにして C-aを押したりすると, this-command-keys に設定されてる keyvec なんてないぞとか言われて引っかかります.

「何かキーが押されて,uim-el-agentにキーを渡したけど,uimがスルーした」場合,戻ってきたキーをuim.elがどうにかして処理しているわけですが,C-x C-h みたいなヘンテコなのに対応するために,戻ってきたキーにバインドされているコマンドを実行する前に,this-command-keys 関数をすり替える処理を行っています.

が,M-x に バインドされている execute-extended-command のような,ユーザからの入力を待つタイプのコマンドの場合,呼び出すと,ユーザの入力が終わるまで関数が返ってきません.そのため,this-command-keys 関数がすり替えられたままの状態で,再度「何かキーが押されて,uim-el-agentにキーを渡したけど,uimがスルーした」という状況が発生してしまいます.M-x を押した後,C-o を押して C-aを押したのがまさにこの状態.

これが起こると,偽物にすり替えられている this-command-keys を,本物だと思って更に偽物にすり替えることになります.で,ここからは,本当かどうか怪しいところなんですが,多分,そうなると,2回目にすり替えた際に本物だと思って大事に確保した偽物が,1回目に確保した本物を上書きしてしまう模様.これにより,execute-extended-command とかから戻ってきたところで,this-command-keys には偽物が戻されてしまうことになり,上記のようなエラーが生じてしまう,と・・・.

さて,どうやって直したものか.とりあえず本物の退避先をローカル束縛(使い慣れない言葉で恐怖を感じる)な変数にしないで,リストにして,スタックっぽい使い方してみたんですが,うまく動かず(´・ω・`).仕方ないので,退避は最初の1回だけに限るようにして,多重で呼ばれたときは,どんどん偽物で上書きするだけにしたら直りました.が,何か違和感を感じます.何か微妙な.まあ,そもそもfsetで一時的にすり替えてること自体が相当微妙なわけですが・・・.

2007年 8月 8日 (水)

アンデフ

もうすぐプレー時間が8時間になろうかというところで,ようやく通しで3ボス撃破.超無理やりですが.今んとこ後ろに回られたらもうどうしようもない感じです.で,なぜかそのまま4面初プレーで4ボスまで到達.開幕と同時に端っこに押し込まれて終了しましたがorz.いや,よく頑張ったよ.なんか雷出てびびったし.集中力とボムのスレッショルドの問題なんでしょうけど,大概最初が一番よく進めるんですよね.というわけで,次もう一度ここにたどり着くまでには,かなり時間がかかるかと.

ちなみに,こんなところにもリプレイ動画があったりするんですなー.3面のリプレイは後ろに回られた後の対処が参考になります.2面のリプレイは,何かいきなり死んだりしてて,なかなか(^^;

ドラキュラ

血の輪廻,とりあえず8,000円に誰も手を出さなかったようで.PSP版効果で下がるのかなぁ.ていうかSELECTY21,さくっといっときゃよかったよ(´・ω・`)

2007年 8月 7日 (火)

アンデフ

通しで3ボスまで行けるようになりましたが未だ勝てず.2面まではボム使わずに抜けたいなぁ.

2007年8月11日から2007年8月7日までの日記を表示中

中の人情報

名前:
nosuke (のすけ)
メール:
sasugaanijaのgmail.com
「の」は「@」みたいな
関連リンク:

カレンダー

2007年8月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

<<先月分

翌月分>>

最新の10件のエントリ

最近の10件のコメント

過去ログ