(Emacs)カーソル位置の単語を取得するマクロ

とうとう、我が部屋は、日光が入らないようにカーテンを閉めてエアコンを付けっ放しにしても、35℃を下回らなくなった。
この部屋がアパートの最上階の西の端の部屋で、建物がコンクリート造りのため、部屋自体が熱を持ってしまっているらしい。床や壁を触ると、ぬくいのである。天井は触っていないが、おそらくヒーターと化しているであろう。
クーラーを動かしっ放しにしてやっと外と同じくらいの気温である。どちらかというと、殺す気かという感じである。
いや、元々殺さない気はないのであろう。一般論として、建物というものが人の生命を守るとは限らない。部屋も凶器になり得るはずである。

従って、頭が働かず、材料が揃わないので、ブログが更新できない。
でも何か書きたくなったので、軽めに、最近やったEmacsのカスタマイズについて書くことにする。

Emacs Lispを書くようになって、C-h fのdescribe-function(関数の説明を見るコマンド)やC-h vのdescribe-variable(変数の説明を見るコマンド)をよく使うようになった。カーソルをelispの関数名や変数名の上に置いてC-h fとすると、デフォルトのでその関数名や変数名が候補になるのが便利である。それに慣れると、カーソル位置にある単語をキルリング(Xで言うセレクション、Windowsで言うクリップボード)にコピーするキー操作が無いことに気付いた。
WindowsやMacだと大抵マウスのダブルクリックでそれができるので、結構無意識にやりたくなる操作である。

単語の先頭に移動するキーはあるので、
M-b (単語の先頭にジャンプ)
C-SPC (マークセット)
M-f (単語の末尾にジャンプ)
M-w (コピー)
とすると一応できるのだが、この8キーは結構打ちにくい。

筆者はこれをよく行うので、そういうことをする関数をキーに割り当てようとしたのだが、そういう関数が見つからなかった。そんな訳で、次のような設定を追加した。

(defun kill-ring-save-current-word ()
"Save current word to kill ring as if killed, but don't kill it."
(interactive)
(save-excursion
(forward-char)
(backward-sexp)
(let ((pos (point)))
(forward-sexp)
(kill-ring-save pos (point)))
))
(global-set-key "\C-xw" 'kill-ring-save-current-word)
これで、C-x wでその位置にある単語をコピーできるようになる。
カーソルが移動することもないので、例えば、これをコピーして別の所に貼り付けたいが、コピーした後に今のカーソル位置で少し編集したい、という時にも邪魔にならない。


(current-word)
でカーソル位置にある単語が得られるので、それを使えばもっと簡単なマクロになるような気がするのだが、elisp上の変数や値をキルリングにコピーする手段が見当たらなかった。kill-ring-saveやcopy-region-as-killは、バッファ上の位置しか受け取れない。

(forward-char)してるのは、カーソルが単語の先頭にある時に1つ前の単語をコピーしてしまうのを防ぐためである。


【2012/8/16 追記】
kill-newという関数でキルリングに保存できるらしいことを知った。
なので、上のは

(defun kill-ring-save-current-word ()
"Save current word to kill ring as if killed, but don't kill it."
(interactive)
(kill-new (current-word)))
(global-set-key "\C-xw" 'kill-ring-save-current-word)
で済む話だったようだ。
kill-ring-*じゃなくてkill-*だったか…