たとえばネットからダウンロードしたテキストを新しいバッファーに 貼り付けるにはどうしたらいいか?ということを考えた。
単に現在のバッファに Hello という文字列を挿入するだけならば
(insert "Hello")
とすればよい。
このままでは現在のバッファに Hello 文字列が挿入されるので、 これを別のバッファに挿入するには get-buffer-create と with-current-buffer をつかって次のようにする:
(with-current-buffer (get-buffer-create "*hello*")
(insert "Hello"))
*hello* という名前のバッファをつくってそこに Hello 文字列を挿入しています。
これを C-x C-e して実行してみると、ミニバッファに nil と表示された以外は、見た目上は何も変化がない。 しかし、C-x C-b してバッファを確認すればわかるように、 裏で *hello* バッファが生成されている。 果たしてそのバッファを見てみると Hello という文字列が挿入されている。
それでは、実行したときにそのバッファ( *hello* バッファ)に移動するには?
(switch-to-buffer "*hello*")
これでよい。そのままでとてもわかりやすい。
しかし、カーソル位置が挿入された文字列 Hello の末尾にある。 もし複数行の長い文字列を挿入した場合、カーソルはバッファの末尾ではなく先頭にあった方がよいだろう。 それは beginning-of-buffer 関数を使う。
(beginning-of-buffer)
あとはこれを全部組み合わせて自分用の my-hello 関数として登録しておけばよい。
やり方は Emacs でカーソル行にあるURL文字列を取得してブラウザで開くに書いた。
(defun my-hello ()
"insert Hello, World! into the *hello* buffer"
(interactive)
(with-current-buffer (get-buffer-create "*hello*")
(insert "Hello, World!"))
(switch-to-buffer "*hello*")
(beginning-of-buffer))
複数の操作を逐次実行させるにはどうしたらよいのだろうか?と思ったが、単に順に列挙していけば逐次実行してくれる。
これを ~/.emacs.d/foo/my-hello.el などパスの通った場所に配置しておけば、 M-x my-hello でいつでも実行できる。
たぶん、ショートカットキーの割り当てもできると思う。そのうち調べる。
以前のポストでカレント行にあるURL文字列を取得する emacs lisp を書いた。 それと組み合わせることで、カレント行にあるURLのテキスト内容を curl とか w3m などを使って取得した上で、 別バッファにコピペなどということも容易く実現できそう。