Как программно создать новый фрейм Emacs с заданным именем?

863
gsl

Мне нужно уметь создавать фреймы и обращаться к ним программно.

Как можно создать новый фрейм Emacs с заданным именем, чтобы он мог ссылаться на него позже?

Я знаю, как создавать новые фреймы в интерактивном или программном режиме: https://www.gnu.org/software/emacs/manual/html_node/emacs/Creating-Frames.html

Заголовок кадра можно отобразить по-разному: http://www.emacswiki.org/emacs/FrameTitle, но я не смог найти, как установить и сослаться на имя кадра.

Достаточно указателя кода или точного поиска в поисковых системах.

Заранее спасибо.

2
@lawlist Спасибо за вашу ссылку на `set-frame-name`, это помогает прояснить проблему. С этим и всей помощью я придумал правильную функцию, которая делает то, что мне нужно. Я перечислил это как ответ, если все в порядке. gsl 10 лет назад 0

3 ответа на вопрос

1
Drew

Похоже, вы хотите получить кадр, учитывая его имя. Используйте функцию get-a-frameв библиотеке, frame-fns.elчтобы сделать это.

И если вы хотите получить имя фрейма из фрейма, используйте функцию get-frame-nameиз той же библиотеки.

(См. Также библиотека frame-cmds.el.)

Спасибо за ответ. И спасибо за все очень хорошие библиотеки, действительно вдохновляющие. gsl 10 лет назад 0
Обе ссылки 404. Chris Stryczynski 6 лет назад 0
@ChrisStryczynski: Спасибо. Исправлено (Emacs wiki изменено с использования http на использование https. Drew 6 лет назад 1
0
choroba

См select-frame-set-input-focusна http://www.gnu.org/software/emacs/manual/html_node/elisp/Input-Focus.html . Например, попробуйте

(select-frame-set-input-focus (second (frame-list))) 
Спасибо, это работает. Emacs назначает внутренний код при создании нового фрейма. В моем случае вторым был `#`. Итак, `(frame-list)` возвращал `(# #)`. Затем ваш фрагмент кода позволит мне переключиться на второй кадр в этом списке. Я полагаю, кто-то использовал бы последний элемент этого списка? Это будет самый последний кадр? gsl 10 лет назад 0
0
gsl

Спасибо всем за ссылки и код. Я многому научился!

После изучения этих страниц кажется, что Emacs не позволяет назначать пользовательский идентификатор новому фрейму.

Таким образом, чтобы уникально ссылаться на вновь созданный фрейм, нужно поймать идентификатор, назначенный Emacs во время создания.

Теперь я могу лучше выразить то, что я искал, с помощью такой функции:

(defun my/frame-create (&optional title) "Create a new frame returning its internal id, optionally setting TITLE as title" (interactive "sNew frame name: ") (progn (setq my/frame-id (make-frame-command)) (set-frame-name title)) my/frame-id) 

Эта функция создает новый кадр и возвращает его идентификатор, чтобы этот кадр можно было вызвать в любое время.

Я был бы признателен за любые комментарии, чтобы написать эту или аналогичную функцию с надлежащей идиомы elisp.

Спасибо еще раз всем за совет.

`(Selected-frame)` возвращает то, что вы ищете ?: http://www.gnu.org/software/emacs/manual/html_node/elisp/Input-Focus.html Однако это значение не сохраняется как часть `(frame-parameters)`: https://www.gnu.org/software/emacs/manual/html_node/elisp/Parameter-Access.html#Parameter-Access lawlist 10 лет назад 0
Да, `(selected-frame)` возвращает идентификатор кадра. Это мог бы быть другой способ сделать это, вызвав `selected-frame` сразу после` make-frame-command`. Спасибо. gsl 10 лет назад 0

Похожие вопросы