Delisious のブックマークをインクリメンタルサーチする vimperator プラグイン書いた

概要

vimperator に`:deliciousincsearch`コマンドを追加します。
次のプログラムのリスペクトです:

次のプログラムがインストールされている必要があります:

使い方

コマンドを入力すれば,delisious のブックマークリストが vimperator の補完領域に表示されます。コマンドの後に続けて ― 引数として ― 文字列を入力すれば,補完領域のリストがその文字列の AND で絞り込まれます。このプラグインは,この絞込みにより,目的のブックマークを探し出すことを可能にします。
絞込みを続けて,ちょうど良い頃合の所で,やカーソルキーで補完をすれば,コマンドラインにそのブックマークのサイトタイトル及びサイトアドレスが入力されます。この状態ででコマンドを実行すれば,新しいタブで目的のサイトが開かれます。

技術的な何か

  • ブックマークリストは,firefox の add-on である「Delicious Bookmarks :: Add-ons for Firefox」が使うデータベースファイル`ybookmarks.splite`から習得します
    • ブックマークリストと delisious 本家のブックマークデータとの同期精度は,この add-on の同期精度に依存します
  • 作者は,javascriptSQLite も良く理解してなかったので,javascript のコードを書くことに集中するために,遺憾ながら SQL文は簡易的なものになっています^^;
    • 絞込みの際,SQLiteデータベースからブックマークを単に全て読み込み,文字列の検索は javascriptRegExp で行います

コード

現在行の前にインデントした行を挿入する

いままでこうしていたけど:

C-a C-o TAB

これなら2ストロークでいけるみたい:

M-m C-M-o
M-m back-to-indentation
C-M-o split-line

emacs には知らないコマンドが多い…使いこなせる気がしない…

Firefox の SQLite 最適化

vimperatorの補完がクソ早くなる
windows環境でfirefox の *.sqlite を最適化するには:

  1. SQLite Download Pageからsqliteをダウンロードしてきて
  2. プロファイルフォルダに sqlite3.exe を置く
  3. プロファイルフォルダで次のコマンドを実行

プロファイルフォルダに在る全ての SQLite データベースを最適化する:

for %a in (*.sqlite) do (sqlite3 %a vacuum && sqlite3 %a reindex)

emacs をはじめよう

概要

emacs の操作に慣れてきたので基本的なコマンドをまとめてみた。

emacs とは

emacs は僕らの仕事の生産性を押し上げてくれる最高のエディタだ。
emacs はどんなテキストでも高速に編集できる:例えば,コードを書いたり,マニュアルを読んだり,メールを書いたり,学校が請求する忌々しいレポートを作成したり,自慢のブログを更新したり...とかね。何だって処理できるし,下記の基本的なコマンドはそのどんな場合でも使える。つまり,それぞれの用途に合わせてアプリケーションを立ち上げる必要なんてないんだ。emacs を使えばいい。emacs のコマンドはどんな場合でも一貫して使えるから,新しいアプリの使い方を覚えるよりずっと楽だ。そして,コマンドを用いたテキスト編集は仕事を早く終わらせられる。emacs は天才だ。

用語定義

  • C-f は Ctrl と f を同時に押すことを意味する。M-f は Alt と f を同時押しだ。C-u 3 は Ctrl と u を同時に押した後 3 を 押すことを意味する
  • SPC はスペース,RET はエンター

基本的な編集コマンド

まず覚えておいて欲しいのは C-g だ。このコマンドは emacs の実行中の処理をキャンセルする。つまり,間違えてコマンドを打ってしまったときや,emacs の挙動が分からなくなってしまった場合は,C-g を連打しよう。慣れないうちはこのコマンドを最も頻繁に利用する。

C-g キャンセル

emacs の高速なテキスト編集はカーソル移動やテキスト処理をする高度なコマンドによってもたらされる。そのコマンドは文字,単語,行,文,項,頁などを単位にして作用する。

テキスト(バッファ:buffer)内を動き回る

行や文字を単位にカーソルを動かす基本的なコマンド:

C-f 次の文字へ(→) C-b 前の文字へ(←)
C-n 次の行へ(↓) C-p 前の行へ(↑)

もう少し大きな単位で動かすコマンド:

C-a 行頭へ C-e 行末へ
M-f 次の単語へ M-b 前の単語へ
M-a 文頭へ M-e 文末へ
C-v 一画面下へ M-v 一画面上へ
M- バッファの先頭へ M-> バッファの末尾へ

これらのコマンドに慣れれば,タイピングする位置から手を動かす必要が無いので,普段のアプリケーションの似たようなコマンド(Home,End等)やマウスを使用するより遥かに早くカーソルを動かせる。

これらの移動コマンドはカーソルの位置を基準に作用するから,繰り返して使える(例えば,C-p C-p C-p と打うてばカーソルが三行分進む)。この様な面倒な繰り返しは前置引数(prefix argument)を用いて回避できる:C-u に続けて数字とコマンドを入力すれば,その数字分コマンドが繰り返される。C-u 数字 の代わりに M-数字 と入力してもいい。もし,C-u の後の数字を省略するなら,デフォルトで 4 が入力されたとして動作する。これは正確に何回繰り返せば分からないときに有用だ。次に使用例を示す:

C-u 3 C-p 三行前の行へ
M-3 C-p
C-u C-n 四行次の行へ
C-u C-u C-n 四×四行次の行へ
C-u C-u C-u C-n 四×四×四行次の行へ

具体的な行番号を用いてジャンプすることも出来る:

M-g g 行を指定してジャンプ

テキストを検索することはバッファを動き回るのに便利な方法だ。検索はカーソルの移動のためだけの機能だと考えると良い。或る特定の文字列を見つけようとしているなら,何頁も見る代わりに前方・後方インクリメンタルサーチ(Incremental search forward/backward)を用いて,その文字列の位置へピッタリと移動できる。

C-s 前方を検索
C-r 後方を検索

また,移動にマークを使う方法がある:

マーク

emacs は以前のカーソル位置である,マークと呼ばれるものを覚えられる。或る特定の場所でマークを設定すれば,後で容易にその位置へ移動できる。C-x C-x と入力すれば設定したマークへカーソルを移動でき,もう一度 C-x C-x と入力すれば元の位置へ戻る。

C-SPC マークをセット
C-x C-x マークへジャンプ

上記のコマンドで明示的にマークを設定できるけど,或るコマンドは暗黙のうちにマークを設定する:

こんなときに こんなマークを設定する
C-SPC と打つ 現在の位置
M-< や M-> 等でジャンプする ジャンプ前の位置
検索を終了する 検索を始めた位置
テキストをヤンク(Yank)する ヤンク直前の位置
テキストを挿入(insert)する 挿入直前の位置

これを見て分かるように,emacs はとても気が利く奴だ:カーソルを大きく移動するであろうコマンドはマークを設定してくれるから,C-x C-x と打てば直前に居た位置へ移動できる。もし,当てが外れても,もう一度 C-x C-x と打てば元の位置へ戻ってこれる。このお掛けで,バッファ内で迷子になることは殆ど無い。

マークは新しい順に 16個記録されていて,記録されたマークをサイクルできる:

C-u C-SPC マークをサイクル

リージョン

またマークは違う目的にも使用される:マークとカーソルはお互いが挟んだ領域を表す。この領域はリージョンと呼ばれ,多くのコマンドがこの領域だけに作用する(例えば,C-w でリージョンを切り取り,C-y で切り取ったリージョンを貼り付ける)。リージョンの選択にはその方法以外に,マウスで或る領域をなぞってもいいし,コマンドを使うことも出来る。例えば:

C-x h 現在のバッファを全て選択
M-h 項を選択

気を付けなければならないことは,emacs の標準設定では,このリージョンは他のエディタの選択領域のように,反転したり,目立ったりはしないという事だ。これは,マークが移動のためにも使われるためで,反転してしまうと移動に目障りだからね。この見た目は,好みに応じて emacs の設定ファイルを弄って変更できる。

emacs は表示・編集範囲をリージョンだけに制限する事ができる。この状態をナローイングと呼び,ちょっとした部分だけを編集する場合に便利だ。例えば,文章の項だけを編集するとかね。

C-x n n 表示・編集領域を制限する(ナローイング:narrowing)
C-x n w 元の状態へ戻す(ワイディング:widening)

カット(キル:Kill)

下記で紹介するコマンドに限らず,テキストを削除する殆どのコマンドはキル(テキストを削除し emacs にそれを保存する)される。これは削除した文字列は後で貼り付けられる事を意味する。つまり,キルは削除とカットの両方の役割を果たす。

C-k はカーソル位置から行末までをキルする。また,カーソルが行末にあれば後方の行をキルする。複数行をキルしたければ,もちろん,前置引数が使える:

C-k 行をキルする
C-u 5 C-k 五行キルする

一般にカット&ペーストと呼ばれるソリューションは, emacs ではリジョーンに作用する次のコマンドで提供される:

C-w リージョンをキル(カット)
M-w リージョンを削除せずキル(コピー)

また,次のコマンドも良く使う:

M-d 次の単語をキル
M-k 文末までキル

ペースト(ヤンク:Yank)

或るテキストをキルしたとき,そのテキストはクリップボードのようなもの(キルリング:kill ring)に保存される。このキルリングに保存されたテキストは C-y でヤンクできる。また,キルリングは一般的なクリップボードとは異なり複数のテキストを記憶できる。C-y と打ってヤンクされたテキストが目的のもので無ければ,続けて,M-y を必要に応じて繰り返し打つことで,ヤンクされたテキストを置換して,以前にキルした全てのテキストを巡回できる。

C-y 最後にキルしたテキストをヤンクする
M-y ヤンクしたテキストをより以前にキルされたテキストに置換する

ここで,emacs 上で削除した殆どのテキストがキルされる(つまり,キルリングに保存される)ことを思い出そう。つまり,emacs では或るテキストを紛失してしまう事は殆ど無い:単なるクリップボードを持つエディタでは,間違えてテキストを削除してしまうか,または,間違えてクリップボードを上書きしてしまう事で,テキストを紛失してしまうが,emacs であれば,そのどちらの場合においてもキルリングから容易にテキストを救出できる。

元に戻す(Undo)

emacs の”元に戻す”は他のエディタより高機能だ。大抵のエディタは編集を何回か戻した後,何回か編集を行えば,戻す以前のテキストは失われてしまう。
emacs はこの欠点の無い”元に戻す”モデルを採用していて,どんな状態にも戻すことがきる。
ただ,この機能は複雑すぎるから,単純な”元に戻す”コマンドだけを紹介するにとどめる。(詳しくは,マニュアルを参考にしよう)
”元に戻す”コマンドにはいくつかのエイリアスがある:

C-/ 元に戻す
C-_
C-x u

インクリメンタルサーチ(Incremental search)

C-s と打つことで前方のテキスト(前方:進む方向。つまり,カーソル位置からの右の行末までと下の全ての行のテキスト)の中から特定の文字列をインクリメンタルサーチできる。もう一度 C-s と打てば検索したテキストにマッチした次のテキストへカーソルを移動できる。また,後方への検索は C-r だ。

C-s 前方検索
C-r 後方検索

目的の文字列が見つかれば単に RET(いわゆるエンター)して検索を終了し,見つからなければ C-g(キャンセル)としてカーソルを元の位置へ戻す。目的の文字列が在る場所へ移動した場合,検索コマンドが親切にも以前の位置にマークを設定するから,C-x C-x で検索を始めた位置へ戻ってこれる。

検索の際に毎回文字列を打ち込む必要無くて,次のコマンドで以前に検索した結果を再利用できる:

C-s C-s 最後に検索した文字列で検索
C-s M-p 検索履歴を戻る
C-s M-n 検索履歴を進む

文字列の検索・置換

M-% RET 検索文字列 RET 置換文字列 対話的置換

M-% と打ち,検索文字列を打ち,置換文字列を打つと,対話的置換が開始される。検索文字列にマッチしたそれぞれの文字列に対して,どのような処理をすれば良いのか emacs がユーザに尋ねてくるので,オプションを入力し,目的に応じて処理を変更できる。よく使うオプションは次の通り:

y この文字列を置換し対話を続ける
n この文字列を置換せず対話を続ける
q 対話を終了する
. この文字列を置換したら,対話を終了する
! 対話なしに,全ての文字列を置換する

正規表記検索

emacs は正規表記検索だってできる。
…でも,そろそろこの記事を書くのにも飽きてきたから,割愛しよう。

emacs 解説サイトへのポインタ

この記事の作成に当たり下記のサイトを大いに参考にした。また,この記事は emacs を満足に使える最低限のコマンド紹介するもので,それに,途中から解説も適当になってしまったから,emacs が提供する膨大なコマンド群の内のほんの少しのコマンドしか記載されていない。そこで,完全な emacs のマニュアルへのリンクも下記に含めておこう。