Vim: quickfix用key mappings

2007-02-16T16:56:00 / vim / comment

Vimのquickfix関連のコマンドはデフォルトでどのキーにもマップされていないので適当に追加してみました。quickfixなのでq{action}の形に統一。キーボードマクロqは滅多に使わないのでQへ降格。Ex-mode Qは絶対に使わないので存在しないことにしました。

nnoremap Q q

nnoremap qj  :cnext<Return>
nnoremap qk  :cprevious<Return>
nnoremap qr  :crewind<Return>
nnoremap qK  :cfirst<Return>
nnoremap qJ  :clast<Return>
nnoremap qf  :cnfile<Return>
nnoremap qF  :cpfile<Return>
nnoremap ql  :clist<Return>
nnoremap qq  :cc<Return>
nnoremap qo  :copen<Return>
nnoremap qc  :cclose<Return>
nnoremap qw  :cwindow<Return>
nnoremap qp  :colder<Return>
nnoremap qn  :cnewer<Return>
nnoremap qm  :make<Return>
nnoremap qM  :make<Space>
nnoremap qg  :grep<Space>
nnoremap q   <Nop>

以前は次のように割り当てていたのですが、頻繁かつ連続して使うものではないので削除しました。

nnoremap <C-j>  :cnext<Return>
nnoremap <C-k>  :cprevious<Return>

Vim: ユーザー定義関数の可変長引数関係でSEGVるバグ (2)

2007-02-15T22:59:00 / vim / comment

SEGVを再現するスクリプトは次の通り:

command! Segv  call SegvReady()

function! SegvReady(...)
  let s:saved_args = a:000
endfunction

function! SegvGo()
    " SEGV at this echo.
  echo s:saved_args
endfunction

:Segvを実行した後でSegvGo()を呼び出すとSEGVります。また、SegvReady()を呼び出した後でSegvGo()を呼び出すとechoされる結果が異なるか変な挙動になります。

取り敢えずの回避策はa:000の値はその関数内だけで使うこと。後でバグレポートを出しておこう。いやー、どの辺が原因か分かり易いバグで楽しかった。

Vim: ユーザー定義関数の可変長引数関係でSEGVるバグ

2007-02-15T22:37:00 / vim / comment

Vim 7でユーザー定義関数の可変長引数a:000の使い方によってはSEGVるバグを発見しました。今のところ再現率100%。現在、再現に必要な最小限の条件を調査中です。

Vim: エスケープしないバッファ名補完

2007-02-14T21:14:00 / vim / comment

Vimのバッファ名補完の動作が変なのは仕方がないとして、取り敢えずはエスケープしないバッファ名補完をするようにして問題を回避しました。なお、以下のものはオリジナルの補完と違ってワイルドカードが使えないのですが、バッファ名補完でワイルドカードを使う必要性はないので無視してます (元々、入力内容を名前の一部に含むバッファが補完されるのですから)。

command! -complete=customlist,Complete_UnescapedBufferName -nargs=1
  \ Buffer buffer <args>
cnoremap <expr> b<Space> getcmdtype()==':' && getcmdpos()==1 ? 'Buffer ' : 'b '

function! Complete_UnescapedBufferName(ArgLead, CmdLine, CursorPos)
  let candidates = []
  for name in GetAllListedBufferNames()
    if stridx(toupper(name), toupper(a:ArgLead)) != -1  " case-insensitive
      call add(candidates, name)
    end
  endfor
  return candidates
endfunction

function! GetAllListedBufferNames()
  let names = []
  let i = 1
  while i <= bufnr('$')
    if buflisted(i)
      call add(names, bufname(i))
    endif
    let i = i + 1
  endwhile
  return names
endfunction

通常、:buffer:bと入力するので、それを:Bufferにマッピングしています。こうすると今までの入力パターンはそのままで代替コマンドに置き換えられるのですが、出力の微妙な違いが気になります。この辺はさすがに諦めるしかないかなぁ。

Vim: バッファ名補完の動作が変

2007-02-14T20:44:00 / vim / comment

Vimのバッファ名補完の動作が変です。補完されるバッファ名に特定の文字が含まれている場合、それはバックスラッシュでエスケープされるのですが、不要な文字までエスケープされる場合があります。しかも場合によってはエスケープされないこともあり、よく分かりません。

具体的には以下のような動作になります:

引数なしでVimを起動し、名前にプラスを含むファイルを開いた場合
バッファ名補完でプラスがエスケープされる。
名前にプラスを含まないファイルを開き、その後で名前にプラスを含むファイルを開いた場合
バッファ名補完でプラスがエスケープされない。

プラスがエスケープされてしまうとエラーE64となってしまうのでかなり不便です。というか、何故それまでの状況によって補完結果が変わるのか分かりません。

cereja 0.0a3

2007-02-11T21:59:00 / cereja, release / comment

cereja 0.0a3をリリースしました。主にトレイ関係を修正・改善しました。

Opera: '=Enter access key mode | Leave access key mode

2007-02-11T21:56:00 / opera / comment

Operaで最近追加したショートカットキーその2:

[Application]
'=Enter access key mode | Leave access key mode

viで指定したマークへジャンプするときのイメージに近そうだったので試しに追加してみたのですが、それなりに便利です。これまでaccess keyは全然使っていなかったのですが、これのおかげで使用率がほんのり上がった気がします。

Opera: semicolon=Focus address field | Focus message list

2007-02-11T21:55:00 / opera / comment

Operaで最近追加したショートカットキー:

[Browser Window]
semicolon=Focus address field | Focus message list

viでexコマンドを打つときのイメージに近そうだったので試しに追加してみたのですが、これが案外良い。サーチエンジンの設定をきちんとしておけばなかなか快適です。

よりviっぽくするならセミコロンよりもコロンにした方がいいのですが、今一上手く設定できなかったのでセミコロンにしてます (個人的には~/.vimrcでセミコロンをコロンと等価にしてるのでどちらでもいいのですけどね)。

Hack modeに入るときの癖

2007-02-11T21:50:00 / prog / comment

所謂hack modeに入る前、石鹸を使って丁寧に手を洗うという癖があることに気が付きました。稀にしないときもあるのですが、十中八九はしてます。昔はそんなことはなか……あー……昔からやってる気がする。何時からだろう?

ドジ: 2007年1月頭からメール送受信不可能だった

2007-02-07T23:10:00 / diary / comment

すさまじいドジが発覚しました。2007年1月頭からメールの送受信が不可能でした。多忙で自宅に帰らないこともしばしばあったので存在を半ば忘れていました。いや、最近全然メールが来ないなと多少は感じていたのですが……一ヶ月も経過してるとは。特に重要な連絡がなかったことが不幸中の幸いです。

原因はAVGを7.1から7.5へ更新したことでした。今までPersonal E-mail Scannerの設定の「Type of login」を「Automatic」にしており、問題なく動作していたのですが、7.5に変えてからは正しく動作していなかったようです。受信に関しては「Fixed host」にしてメールクライアントの設定も変えて対処できたのですが、送信に関してはまだできていません。送る用件もないし面倒だし忙しいしで放置中。