Jak programowo utworzyć nową ramkę Emacsa o podanej nazwie?

2

Muszę być w stanie tworzyć ramki i programowo się do nich odwoływać.

Jak stworzyć nową ramkę Emacsa o danym imieniu, aby móc się do niej później odwoływać?

Wiem, jak tworzyć nowe ramki, interaktywnie lub programowo: https://www.gnu.org/software/emacs/manual/html_node/emacs/Creating-Frames.html

Możliwe jest wyświetlanie tytułu ramki na różne sposoby: http://www.emacswiki.org/emacs/FrameTitle, ale nie mogłem znaleźć sposobu na ustawienie i odniesienie do nazwy ramki.

Wystarczyłby wskaźnik kodu lub precyzyjne wyszukiwanie w wyszukiwarce.

Z góry dziękuję.

gsl
źródło
@lawlist Dziękujemy za odniesienie do set-frame-name, pomaga wyjaśnić problem. Z tym i całą pomocą wymyśliłem odpowiednią funkcję, która robi to, czego potrzebuję. Wymieniłem to jako odpowiedź, jeśli to w porządku.
gsl

Odpowiedzi:

1

Wygląda na to, że chcesz uzyskać ramkę, biorąc pod uwagę jej nazwę. Aby to zrobić, użyj funkcji get-a-framew bibliotece frame-fns.el.

A jeśli chcesz uzyskać nazwę ramki z ramki, użyj funkcji get-frame-namew tej samej bibliotece.

(Zobacz także bibliotekę frame-cmds.el.)

Drew
źródło
Dziękuję za Twoją odpowiedź. I dziękuję za wszystkie bardzo ładne biblioteki, naprawdę inspirujące.
gsl
Oba linki to 404.
Chris Stryczyński
1
@ChrisStryczynski: Thx. Poprawiono (wiki Emacsa zmieniło się z używania http na używanie https.
Drew
0

Zobacz select-frame-set-input-focusna http://www.gnu.org/software/emacs/manual/html_node/elisp/Input-Focus.html . Na przykład spróbuj

(select-frame-set-input-focus (second (frame-list)))
choroba
źródło
Dziękuję, działa. Emacs przypisuje wewnętrzny kod podczas tworzenia nowej ramki. W moim przypadku drugim był #<frame *scratch* 0x112ec2440>. Więc (frame-list)wracał (#<frame *scratch* 0x112ec2440> #<frame *scratch* 0x105013b98>). Następnie fragment kodu pozwoli mi przejść do drugiej ramki na tej liście. Chyba ktoś użyłby ostatniego elementu tej listy? Czy to byłaby najnowsza ramka?
gsl,
0

Dziękujemy wszystkim za linki i kod. Dużo się nauczyłem!

Po przestudiowaniu tych stron wydaje się, że Emacs nie pozwala przypisać niestandardowego identyfikatora do nowej ramki.

Tak więc, aby jednoznacznie odwoływać się do nowo utworzonej ramki, należy złapać identyfikator przypisany przez Emacsa podczas tworzenia.

Teraz mogę lepiej wyrazić to, czego szukałem za pomocą takiej funkcji:

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

Ta funkcja tworzy nową ramkę i zwraca jej identyfikator, dzięki czemu ramkę można wywołać w dowolnym momencie.

Byłbym wdzięczny za wszelkie komentarze dotyczące napisania tej lub podobnej funkcji z odpowiednim idiomem elisp.

Jeszcze raz dziękuję wszystkim za radę.

gsl
źródło
Czy (selected-frame)zwraca to, czego szukasz ?: gnu.org/software/emacs/manual/html_node/elisp/Input-Focus.html Jednak ta wartość nie jest przechowywana jako część (frame-parameters): gnu.org/software/emacs/manual / html_node / elisp /…
lawlist
Tak, (selected-frame)zwraca identyfikator ramki. To może być inny sposób na zrobienie tego, dzwonienie selected-framezaraz po make-frame-command. Dziękuję Ci.
gsl