Команды Emacs M-x для вызова меню "GUI-style" - PullRequest
9 голосов
/ 24 декабря 2008

Вопрос: Как я могу найти эквивалентные команды M-x для выполнения операций на основе графического интерфейса в Emacs, в тех случаях, когда мой вариант Emacs использует функциональные возможности рабочего стола для ОС?

Справочная информация: Традиционное понимание гласит, что все в Emacs является командой, и что команды могут вызываться через M-x, если вы знаете имя команды. Предполагая, что это утверждение верно, как найти имя команд, используемых для запуска меню "GUI-style" в варианте Emacs на "рабочем столе"?

Например, если я должен был щелкнуть мышью по меню «Файл», чтобы открыть файл, появится диалоговое окно открытия файла в стиле «GUI», специфичное для ОС, ожидая ввода.

Как я могу найти эквивалентную команду M-x для выполнения точно такой же вещи?

Я думал, , что ключ описания скажет мне то, что мне нужно было знать, но это указание на использование:

M-x menu-find-file-existing

не вызывает диалог открытия файла в стиле «GUI». Вместо этого он использует внутренний не-GUI-OS-нейтральный вариант Emacs.

Ответы [ 2 ]

7 голосов
/ 24 декабря 2008

Вам нужно обмануть Emacs, думая, что клавиатура не использовалась, что не так интуитивно понятно, как обмануть ее, заставляя думать, что мышь была . :)

(defadvice find-file-read-args (around find-file-read-args-always-use-dialog-box act)
  "Simulate invoking menu item as if by the mouse; see `use-dialog-box'."
  (let ((last-nonmenu-event nil))
    ad-do-it))

Проверено на Emacs 22.2.1 на WinXP. Я полагаю, что парадигма существует уже некоторое время, поэтому она должна работать на старых Emacs. Понятия не имею, работает ли XEmacs аналогично или нет.

3 голосов
/ 24 декабря 2008

Ух ты, я рад, что ты это спросил. Некоторое время я хотел найти это сам.

C-h k с последующим выбором меню скажет вам об этом. Вот, например, что вы получаете, выбирая menu / edit / paste:

<menu-bar> <edit> <paste> runs the command clipboard-yank
  which is an interactive compiled Lisp function in `menu-bar.el'.
It is bound to <paste>, <f18>, <menu-bar> <edit> <paste>.
(clipboard-yank)
Insert the clipboard contents, or the last stretch of killed text.

Если вам нужны подробности, перейдите по ссылке для menu-bar-el на источник LISP:

(defun menu-find-file-existing ()
  "Edit the existing file FILENAME."
  (interactive)
  (let* ((mustmatch (not (and (fboundp 'x-uses-old-gtk-dialog)
                  (x-uses-old-gtk-dialog))))
     (filename (car (find-file-read-args "Find file: " mustmatch))))
    (if mustmatch
    (find-file-existing filename)
      (find-file filename))))
...