10

问题:在我的 Emacs 变体使用特定于操作系统的桌面功能的情况下,我如何才能找到在 Emacs 中执行基于 GUI 的操作的 Mx 等效命令?

背景:传统的理解是,Emacs 中的一切都是命令,只要知道命令的名称,就可以通过 Mx 调用命令。假设这个陈述是正确的,那么在基于“桌面”的 Emacs 变体中找到用于触发“GUI 样式”菜单的命令名称的方法是什么?

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

我怎样才能找到做同样事情的 Mx 等效命令?

认为describe-key 会告诉我我需要知道的内容,但它指示使用:

M-x menu-find-file-existing

不调用“GUI”样式的文件打开对话框。相反,它使用 Emacs 内部的非 GUI-OS-neutral 变体。

4

2 回答 2

8

你需要让 Emacs 认为键盘没有被使用,这不如让 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 是否类似地工作。

于 2008-12-24T14:51:06.447 回答
3

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

C-h k后面的菜单选择会告诉你这一点。例如,这里是您从选择菜单/编辑/粘贴中得到的:

<menu-bar> <edit> <paste> 运行命令 clipboard-yank
  这是 `menu-bar.el' 中的一个交互式编译的 Lisp 函数。
它绑定到 <paste>、<f18>、<menu-bar> <edit> <paste>。
(剪贴板猛拉)
插入剪贴板内容,或最后一段被杀死的文本。

如果您想了解详细信息,请点击menu-bar-elLISP 源的链接:

(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))))
于 2008-12-24T01:57:18.490 回答