Home About Contact
Emacs , Emacs Lisp

新規バッファを作成して Hello, World! 文字列をそこに挿入する (Emacs Lisp)

たとえばネットからダウンロードしたテキストを新しいバッファーに 貼り付けるにはどうしたらいいか?ということを考えた。

それを実現するための個々の関数を試していく

単に現在のバッファに Hello という文字列を挿入するだけならば

(insert "Hello")

とすればよい。

このままでは現在のバッファに Hello 文字列が挿入されるので、 これを別のバッファに挿入するには get-buffer-createwith-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 などを使って取得した上で、 別バッファにコピペなどということも容易く実現できそう。