fake-accept - 履歴に登録するだけ

http://journal.mycom.co.jp/column/zsh/003/index.html

もはや漢のスクリプトはコマンド履歴の中にあるものだ。

に触発されて編集中のコマンドの内容(Emacs同様バッファと言う)を履歴に登録するだけのZLE widgetを作ってみた。ソフトウェアのコンパイルなど、試行錯誤の末に正解を発見した場合に、一連のコマンドをまとめたものを履歴に登録したくなる。そうすることで次回同じことをする場合はC-rで履歴検索をすることで自動化された形で取り出すことが可能だ。
history-menuと併用するとテキパキと履歴の内容をバッファに挿入できる。C-M-jかC-M-mかM-RETで改行をバッファに挿入する。
ちなみに名前については「実行するふりをする」意味でfake-acceptだ。コマンドを実行するwidget(RET)の名前はaccept-lineなので、acceptだ。以下を.zshrcに登録しよう。

fake-accept () {
    print -s "$BUFFER"
    print "
[added to history]"
    zle send-break
}
zle -N fake-accept
bindkey "^[m" fake-accept

以下が2行のコマンドを履歴に登録した後に、C-pで履歴を呼出している様子だ。カーソルは[*]の位置にある。

$ echo foo
echo bar
[added to history]

$ echo foo
echo bar[*]

anything.elの記事

http://dev.ariel-networks.com/Members/matsuyama/open-anything-emacs

おお、anything.elについて詳しい記事を書いてくれてる。気付いた点のみちょっとツッコミ。

・ 候補数を絞るのが難しい(特に locate )

俺の場合はホームディレクトリのみのlocatedbを作っているので候補数は限られてくる。いつも選択するファイルは必然的にホームディレクトリ内になることが圧倒的に多い。d:id:rubikitch:20070727#1186048110 参照。

locateのおかげでファイルを開く手間が大幅に省けて幸せだ。

ちなみにanythingで入力するのは実は正規表現。だから正規表現を書き換えてしまばいいかと。

絞り込み検索がしたいならば、iciclesを入れてみるのもテかな。

・ 機能ごとの次と前がない

ありますよ。anything-next-source, anything-previous-source。俺はM-N, M-Pに割り当てている。

・ 結構重い

まぁelisp自体が激遅というのもあるけれど、どういう目的でanythingを使うかに依存してくるだろう。俺の場合はswitch-to-buffer系(switch-to-buffer, find-file, locate, file-cache, bookmark)ばかりだからたいして重くはない。おかげでiswitchbを捨てることができた。

Occurはisearch-occurを使っている。isearchからOccurのほうが俺的には自然な流れなので。


まだ実験していないけれど、用途ごとのanythingを用意したほうがいいかもしれない。たとえばfind-file系統と検索系統に分けるとか。

(defun anything-for-search ()
  (interactive)
  (let ((anything-sources anything-sources-for-search))
    (anything)))

zshのコマンドラインをエディタで編集・日本語入力

コマンドラインをエディタで編集

zshコマンドラインはエディタで編集できる。環境変数VISUALかEDITORに使いたいエディタを指定しておこう。Emacsな人は

  • M-x server-start してから EDITOR=emacsclient
  • M-x gnuserv-start してから EDITOR=gnuclient

のいずれかをしておくといい。
以下の設定を.zshrcに加える。

autoload -U edit-command-line
zle -N edit-command-line
bindkey "^O" edit-command-line

zshコマンドラインEmacsで日本語入力

俺の場合、この機能を使うとしたら日本語入力がメインなので以下の設定を.emacsに入れている。ファイル名(バッファ名)が「zshecl数字」なので一致した場合にskkを起動する設定だ。

(defun zsh-edit-command-line-hook ()
  (when (string-match "^zshecl" (buffer-name))
    (skk-mode 1)))
(add-hook 'find-file-hook 'zsh-edit-command-line-hook)

最新版MozEx(1.9.5)ならば日本語も編集できる

MozExの最新版ならばエディタで日本語を書くこともできる。

ただし、文字コードUTF-8にしないと
http://www.rubyist.net/~rubikitch/images/mozex.error.jpg
のようなエラーが出るので注意!!

ていうか、textareaではなくてinput type=textな行編集もしたいんだけどどうすればいいんだよ。