Vim: Insert mode completionの終了方法

2007-05-27T03:00:00 / vim / comment

VimのInsert mode completion (:help ins-completion) の終了方法は次の通り:

pumvisible()か?
<C-y>
!pumvisible()か?
<Space><BS> (<Space>は一例。これ以外のキーでも大抵問題ない)

いやー、はまったはまった。常に<C-y>でOKだと思っていたのですが、これだと!pumvisible()のときに別の動作 (直前の行にある文字を挿入する) になってしまいます。結果として補完は終了するものの、意図しない文字が挿入されてしまう場合があります。以前作成した入力補助のkey mappingsがしばしば妙な挙動をするので不思議に思っていたのですが、原因はこれだったか……

という訳で次のように対処しました:

inoremap foobar  foo<C-x><C-o><C-r>=
              \    <SID>KeysToStopInsertModeCompletion()
              \  <Return>bar
function! s:KeysToStopInsertModeCompletion()
  if pumvisible()
    return "\<C-y>"
  else
    return "\<Space>\<BS>"
  endif
endfunction

TTYShare始めました

2007-05-17T23:36:00 / diary, vim / comment

TTYShare始めました (my profile on TTYShare)。Vimに関する色々なデモを公開する予定です。目標はvimを一番人気のタグに持ち上げること (当面のライバルはgameとtypespeedの模様。nethackも怪しいな)。

いやー、もっと早く知ってればなぁ。端末上のデモならYouTubeよりこっちの方が良いに決まってます (ttyrecの録画データを公開することも考えていたのですが、その場で再生できないのと意味がないので止めていました)。ただ、現状だとttyrecの録画データを完璧に再生できない場合が多いのが難点です。その辺は今後に期待しています。個人的には、再生の一時停止、早送り/巻き戻し、再生位置等の状態表示、ttyplayの-nオプション相当の機能が実装されたらなー、と思っています。でも巻き戻しはかなり難しいか。

ところで、アカウントの各種設定項目の中にfavorite shellとfavorite terminalという項目があるのですが、一体どこで使われているのか凄く気になってます (まあちょっとしたジョークなのでしょうけどね)。

Twitter始めました

2007-05-17T23:14:00 / diary / comment

Twitter始めました (my profile on Twitter)。適当にfollowしたりされたりしてください。なお、発言は全て英語のみの縛りを入れてます。特に深い理由はないのですけど、最初の数回を英語でしたのがきっかけで何となくそのままに。

Twitterでは自分がfollowしているユーザーを「friend」と呼ぶのですが、一方的にfollowしてても「friend」と呼ばれるため、何か違和感を感じます。相互にfollowしているのであればそう呼んでもいいと思うのですけど。最初はこの「friend」の違和感からfollowするのに躊躇してました。

しかし、もっと早く始めれば良かったかなぁ……アカウント名のkanaが既に取られていました。こういうときにこのハンドルは不便なのですよね。次点としてYouTubeのアカウント名と同じwhileimautomatonを取ろうとしたのですが、これは字数制限オーバーで却下されました。今思えば、ここはxcezxさんに倣ってxkanaxとすべきだったのかも。

Web-based RSS reader、どれがいいか

2007-05-13T13:45:00 / web / comment

Web-based RSS reader、どれがいいんでしょうね? 自分の試した範囲だと:

Bloglines
(+) 今使ってるから慣れきってしまった。
(+) そこそこ速い。あるいはまだ我慢できる遅さ。
(+) 「戻る」「進む」ができる。
(-) ショートカットキーが今一。正しく動作しないものもある。
(-) 過去の記事を見るのにちょっと手間がかかる。
(-) Old-fashionedなフォルダーによる分類。
(-) フィードのパースがへぼい。
(-) (個人的に) 名前が嫌い。
(?) 次の未読フィードに移るたび左ペインがスムーススクロールするのを止めれないかなぁ。
(?) フィード単位で既読扱いされる。
Google Reader
(+) タグ (呼称はフォルダー) による分類が出来る。
(+) 記事単位での既読消化。
(-) かなりトロい。
(-) 「戻る」「進む」ができない。
(-) 独自のキー操作を強制される。
はてなRSS
(+) アカウント管理が楽。
(+) 外観の設定が自由に弄れる。
(+) はてなの他のサービスとの連携。
(-) なんかトロい。
(-) 既読/未読処理が意味不明。
(-) Old-fashionedなフォルダー (呼称はグループ) による分類。
(?) 邪魔なアイコン等が一杯 (消せるけど)。

Opera: 現状の駄目なところ

2007-05-13T01:39:00 / opera / comment

Operaを使用していて駄目だと感じるところは次の2点:

プラグインにフォーカスが移っていると、キーボード/マウスの入力のほとんどがプラグインに奪われてしまう
マウスジェスチャーを行う際にカーソルの位置がプラグインの領域に含まれていると、マウス入力が全てプラグインに奪われてしまうため、マウスジェスチャーの入力が出来ない。わざわざ合間を縫って入力を開始しければならないのは不便。
ショートカットキーも同様に九分九厘使用できなくなる (とはいえ、使用できたらできたで弊害があるので、これは仕方がない)。使うためにはフォーカスをプラグインから外さなければならないが、その手段が標準では存在しない (一応、WindowsであればAltを2回押すことで可能)。
Site Preferencesの各項目の選択肢に「デフォルト値を使う」がない
例えばCookieの設定項目には「Accept cookies」、「Accept only cookies from the site I visit」、「Never accept cookies」の3つの選択肢があるが、現在選択されている項目が明示的に設定されたものかデフォルト値なのかが全く区別できない。

もう一個、各種設定の保存/適用が完了するまで異様に時間がかかる (5秒以上かかる) 点が気になるのですが、これは恐らく自分の環境が原因なので何とも言えません (クリーンインストール直後だと一瞬で終わりますから)。でもどこが原因だろう……

他にもありますが、書く気力がなくなったので取り敢えずここまで。

Vim: buffuzzy 0.0.1

2007-05-11T02:26:00 / vim, release / comment

buffuzzy 0.0.1をリリースしました。修正事項は次の通り:

Vim: xml_move 0.0.1

2007-05-10T23:31:00 / vim, release / comment

xml_move 0.0.1をリリースしました。修正事項は次の通り:

余談ですが、どの移動コマンドもexclusiveです。つまり、operatorの範囲指定に使用した場合、移動後のカーソル位置の文字は範囲に含まれません。

Vim: xml_autons 0.0.1

2007-05-10T23:30:00 / vim, release / comment

xml_autons 0.0.1をリリースしました。修正事項は次の通り:

Opera: 自分用設定 for version 9.20

2007-05-07T22:10:00 / opera / comment
キーボード
ベースとなっているのはOpera6のデフォルト (何故ならversion 6から使い始めたから)。それにvi/Vimライクな設定をあれこれ追加している。Operaでn-stroke keyが使えることに気付いてからw ctrl, c ctrl等のキーバインドも追加してみたものの、1ストロークでないと「遅い」と感じる操作が多いので滅多に使っていない (追加も最初の数個だけで後は全然)。ところどころ全く由来のないキーバインドもある (pでQuick preferencesの表示等)。
バージョンアップに応じてデフォルトのキーバインドを適宜マージしているものの、気に食わないところは全然取り込んでいないので、Opera9のデフォルトとは大分異なる……というか古いバージョンのデフォルトのままであるところが多い。
メニュー
使わない項目はばっさり削って、必要に応じてところどころ追加している。主に変更しているのはメニューの各項目へのショートカットキー。特にQuick preferencesは (表示も含めて) p cのような2ストロークで各項目を選択できるようにしている。
ただメニューへの変更のほとんどはユーザーインターフェースの言語を英語にしてないと辻褄が合わない。何故なら変更よりも追加分が多く、追加分に関しては言語ファイル (.lng) の変更では対応できないからだ (厳密には対応できなくはないが、バージョンアップの際の作業量を考慮すると面倒なだけ)。
ツールバー
ツールバーはversion 7からかなり自由に弄れるようになったので、色々と弄ってあの形に落ち着いた。デフォルトだとアドレスバーに「戻る」等のボタンがあって物凄く邪魔なので削除。ステータスバーは下にあると見辛いので上へ移動。ついでにQuick preferencesの状態確認のためのチェックボックスを追加 (これで切り替えることはない。あくまで確認のためだけ)。
最初は全然
スキン
Windows Nativeに細かい色の調整を施している。特にタブの文字色はシステムの設定に追従しきれないので適宜変えなければならない。
マウスジェスチャー
これだけデフォルトのまま。使用頻度はともかく、追加/変更しようという箇所がこれといってないから。
サーチエンジン
使用頻度順に並べると次のような感じ (サーチエンジンの追加は検索フォームのコンテキストメニューから簡単にできるので、.iniは省略):
g
Google
h
Google - I'm Feeling Lucky
m
MSDN (with Google)
n
MSDN (with Google - I'm Feeling Lucky)
e
英日辞書
j
日英辞書
w
weと同じ
we
Wikipedia (英語版)
wj
Wikipedia (日本語版)
y
YouTube (Relevance)
yd
YouTube (Date Added)
a
Amazon.co.jp
s
Sofmap.com
v
vim online (with Google)
でもw以下は全然使ってない気がする。

こんな感じなのでデフォルトの状態だと作業効率がガタ落ちになる (特にキーボード的な意味で)。

Opera: Bloglinesのショートカットキーをカスタマイズ

2007-05-05T19:02:00 / opera, web, prog / comment

OperaのUser JavaScriptの練習にと、取り敢えずBloglinesのショートカットキーをカスタマイズできるようなコードを書いてみました。JavaScriptはリファレンス首っ引きで適当に書いたので突っ込み歓迎。

// 変更したい機能名の一覧。
// 一覧にない機能のショートカットキーはデフォルトのまま。
// 機能名は次のどれか:
//   allunread
//   collapse
//   foldercollapse
//   keepnew
//   nextfolder
//   nextsub
//   opennew
//   openthis
//   refresh
//   scrolldown
//   scrollup
var my_features = ['refresh'];

// 上記の機能に割り当てるキーの値の一覧。
var my_hotkey_refresh = [0x72, 0x71];  // rとqの両方でrefreshできるようにする。


function my_containsp(a, c) {
  for (i in a) {
    if (c == a[i]) {
      return true;
    }
  }
  return false;
}

window.opera.addEventListener('BeforeScript',
  function (e) {
    for (i in my_features) {
      e.element.text = e.element.text.replace(
        new RegExp('whichCode == g_hoe?tkey_'+my_features[i]),
        'my_containsp(my_hotkey_'+my_features[i]+', whichCode)'
      );
    }
  },
  false
)

変数と関数がグローバルなので座りが悪いのですが、何か良い方法はないかなぁ。該当ソースコードの書き換えで実現している以上、ローカルにすると書き換えたコードから参照する方法がない……はず。

余談: BloglinesのJavaScriptのコードを見てみると、openthisのキーを表す定数の名前がg_hoetkey_openthisで吹きました。だって「ほえっとキー」ですよ。

はてなRSSのundocumentedなショートカットキー

2007-05-05T17:50:00 / web, prog / comment

記事の未読/既読管理を考えるとRSSリーダーを使った方が比較的便利かと思って、少し前からBloglinesを使ってみているのですが、アカウントの管理が面倒なのではてなRSSの方にしようかなと思ったりもします。

でもはてなRSSはショートカットキーがOperaのもの (のうち、自分が設定したもののほとんど) とかなり被るのでほとんど使えません。どうにかできないものかとOperaのUser JavaScriptのチュートリアルを眺めつつ、オーバーライドする手段を考えていたのですが……

var addKeybind = Navigation.addKeybind;
addKeybind('j', notRepeated(countable(Entry.goNext)));
addKeybind('k', notRepeated(countable(Entry.goPrevious)));
addKeybind('m', Entry.readMore);
addKeybind('b', Entry.toggleBookmarkComments);
addKeybind('a', notRepeated(Entry.goTop));
addKeybind('e', notRepeated(Entry.goBottom));
addKeybind('n', notRepeated(countable(Group.goNext)));
addKeybind('p', notRepeated(countable(Group.goPrevious)));
addKeybind('i', notRepeated(Entry.focusBookmarkCommentInput));
if (Hatena.RSS.displayMode != 'antenna') {
    addKeybind('d', countable(Entry.deleteActiveItem));
    addKeybind('u', countable(Entry.undoItemDeletion));
    addKeybind('x', notRepeated(Entry.togglePin));
    addKeybind('o', Entry.openPinned);
}
addKeybind('q', Navigation.recordMacro);
addKeybind('@', notRecoreded(countable(Navigation.executeMacro)));
addKeybind('.', notRepeated(countable(Navigation.repeatLastCommand)));

何だそれは。特にcountable。時々挙動がおかしいと思ったら原因はそれか……

Vim: モードを区別する理由

2007-05-05T01:38:00 / vim / comment

Vim (vi) においてモードを区別する理由は大体次のようなところだろう: