ボタンをクリック(エンター)するとミニバッファにメッセージを出したり、 所定のURLのページをブラウザに表示させる emacs lisp を書いた。
結論
(with-current-buffer (get-buffer-create "*button*")
(insert-text-button
"say hello button"
'action (lambda (b) (message "Hello"))))
foo.el とか適当な el ファイルをつくって、 そこにこのコードを書く。 その後末尾で C-x C-e するとこの emacs lisp が実行される。
実行内容は、*button* という名前のバッファを新規につくり そこに say hello button というラベルのついたボタンを追加する。
C-x 右矢印キーなどして *button* バッファに移動すると、 say hello button が存在している。 これにカーソルをおいた状態で enter キーを押すと ミニバッファーに Hello と表示される。
action の指定部分がググったり、Gemini にきいても いまひとつ良い例が見つからなくて困った。 自分が emacs lisp 力が低すぎるというのが最大が原因だが。
ならば、 show my blog というラベルの テキストボタンをクリック(というか enter する)と、 https://blog.mindboardapps.com/ を表示するボタンつくることにする。
前の例では次の部分で、ミニバッファに Hello メッセージを出していた。
(message "Hello")
ならば、そこを前つくった shell-command と xdg-open を使って指定URLをブラウザで開くやつに差しかえればよかろう。
(with-current-buffer (get-buffer-create "*button*")
(insert-text-button
"show my blog"
'action
(lambda (b)
(shell-command
(concat "xdg-open " "https://blog.mindboardapps.com/")))))
もちろん、これは外部コマンド xdg-open を使うので、 これが機能するのはそのコマンドが存在する Chromebook Linux 上などに限る。
URL文字列を渡すと xdg-open を使ってブラウザにそのURLを開いてもらう関数 my-open-url を定義:
(defun my-open-url (u)
(shell-command (concat "xdg-open " u)))
これを使って ボタン action を次のように書きかえる。
(with-current-buffer (get-buffer-create "*button5*")
(insert-text-button
"show my blog"
'action
(lambda (b)
( my-open-url "https://blog.mindboardapps.com/") )))
悪くはないが、もし今 show my blog になっている ボタンラベル(にセットしておいたURLを)開くようにすれば もっと自然になる。
該当のドキュメントを見ると ( https://www.gnu.org/software/emacs/manual/html_node/elisp/Manipulating-Buttons.html ) button-label 関数がボタンのテキストラベル値を返すとのこと。 そこにURLを書くことにしたので、 次のように my-open-url 関数にボタンラベルの文字列を渡すようにした。
(lambda (b)
( my-open-url (button-label b) ))
全体では次のように記述した。
(defun my-open-url (u)
(shell-command (concat "xdg-open " u)))
(with-current-buffer (get-buffer-create "*button*")
(insert-text-button
"https://blog.mindboardapps.com/"
'action
(lambda (b)
( my-open-url (button-label b)) )))
これで URLをクリックするとブラウザに表示される ハイパーリンクが Emacs のバッファにつくれることになる。
ちょっと夢が広がる。