0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Emacs LispAdvent Calendar 2024

Day 18

Emacs Lisp 超初心者がコマンドを作ってみる 〜 別フレーム結果表示の実験 既存フレーム再利用〜

Posted at

はじめに

前回はフレームを作成してみました。幾らでも同名のフレームが出来てしまうのは困るので、これをなんとかしたい。

実験 指定の名前のフレームがあるかどうか調べる

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)
  )

今日はここまで。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?