English 中文(简体)
Emacs M-x 命令用于调用“ GUI 风格”菜单。
原标题:
  • 时间:2008-12-24 01:48:42
  •  标签:

问题:在我的 Emacs 变型中使用 OS 特定桌面功能的情况下,如何找到执行基于 GUI 操作的 M-x 等效命令?

背景:传统理解认为,Emacs 中的所有内容都是命令,并且只要您知道命令的名称,就可以通过 M-x 调用命令。假设这个声明是正确的,那么在基于“桌面”的 Emacs 变体中,如何找到用于触发“GUI 样式”菜单的命令名称?

例如,如果我要用鼠标选择文件菜单来打开文件,特定于操作系统的“GUI”风格的文件打开对话框就会弹出来,等待我的输入。

我该如何找到相应的 M-x 命令来执行完全相同的操作?

我原以为describe-key会告诉我我需要知道的信息,但实际上它的指示是使用:

M-x menu-find-file-existing

不使用“GUI”风格的文件打开对话框,而是使用Emacs内部的非GUI-OS中性变体。

最佳回答

你需要欺骗 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))

测试于WinXP上的Emacs 22.2.1。我相信这个范例已经存在一段时间了,所以它应该能够在旧版本的Emacs上运行。不确定XEmacs是否也能类似地工作。

问题回答

哇,我很高兴你问了。我一直想自己查一下这个。

跟着菜单选择后按下 C-h k 将会告诉您这个信息。例如,选择菜单/编辑/粘贴会得到以下结果:

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

如果你想要细节,请跟随链接进入LISP源代码查看menu-bar-el

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




相关问题
热门标签