はじめに
前回はフレームを作成してみました。幾らでも同名のフレームが出来てしまうのは困るので、これをなんとかしたい。
実験 指定の名前のフレームがあるかどうか調べる
Bing Microsoft Copilot さんに尋ねてみました。
Emacs Lisp で指定の name の frame が存在するかどうか調べる方法
Emacs Lispで特定の名前のフレームが存在するかどうかを確認するには、以下のコードを使用することができます。このコードは、フレームのリストを取得し、それぞれのフレームの名前を確認して、一致する名前のフレームが存在するかどうかを調べます。
(defun frame-exists-p (name)
"Check if a frame with the given NAME exists."
(let ((frames (frame-list))
(found nil))
(dolist (frame frames found)
(when (string= (frame-parameter frame 'name) name)
(setq found t)))))
最低限1つでもあれば、(全部舐めた上で) t を返すようです。
同一名のフレームのリストを返す
前回の実験で同一の名前で複数のフレームが存在することが分かっているので、同一名のフレームのリストを返すようにしましょう。
(defun frame-named-list (name)
"list if a frame with the given NAME exists."
(let ((frames (frame-list))
(result '())
)
(dolist (frame frames)
(when (string= (frame-parameter frame 'name) name)
(push frame result)
)
)
result
)
)
それでは確認してみます。
指定の名前のフレームが無い状態
(frame-exist-list "*pepm-frame*")
nil
指定の名前のフレーム作成1回目
(make-frame '((name . "*pepm-frame*") (width . 640) (height . 480)))
#<frame *pepm-frame* 0x646ba17d46c0>
(frame-exist-list "*pepm-frame*")
(#<frame *pepm-frame* 0x646ba17d46c0>)
指定の名前のフレーム作成2回目
(make-frame '((name . "*pepm-frame*") (width . 640) (height . 480)))
#<frame *pepm-frame* 0x646ba17906e0>
(frame-exist-list "*pepm-frame*")
(#<frame *pepm-frame* 0x646ba17d46c0> #<frame *pepm-frame* 0x646ba17906e0>)
ちゃんとリストが返ってきています。
get-buffer-create な get-frame-crate を作る
get-buffer-create は指定の名前のバッファが既に存在すればそれを返し、無ければ作成する関数です。
同様に、 指定の名前のフレームが存在すればそれを返し、無ければ作成する関数 po-pepm-get-frame-create を作ります。
まずは同名の存在するフレームを得ます
(defun po-popm-frame-named-list (name)
"List if a frame with the given NAME exists."
(let ((frames (frame-list))
(result '())
)
(dolist (frame frames)
(when (string= (frame-parameter frame 'name) name)
(push frame result)
)
)
result
)
)
これを使って po-pepm-get-frame-create を定義します
(defun po-pepm-get-frame-create (name)
"If NAME's frame is exist then return exists list.
Else is not exist then create frame by NAME."
(let ((frames (frames-with-name name))
)
(if frames
frames
(list (make-frame `((name . ,name)))
)
)
)
)
使い方
(let (
(frames (po-pepm-get-frame-create "*pepm-frame*"))
)
(if (> (length frames) 1)
(progn
(ding)
(message "Multiple %s frames exist!" "*pepm-frame*")
)
)
(car frames)
)
今日はここまで。