Home About Contact
Emacs , Emacs Lisp

Emacs Lisp ハイパーリンクの作成 / 新規バッファを作成してそこにボタンをつくり何かアクションを起こす

ボタンをクリック(エンター)するとミニバッファにメッセージを出したり、 所定のURLのページをブラウザに表示させる emacs lisp を書いた。

A Text Button like Hyperlink

結論

(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 ボタンをつくる

ならば、 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 上などに限る。

my-open-url 関数を別定義

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 のバッファにつくれることになる。

A Text Button like Hyperlink

ちょっと夢が広がる。