emacs - 在 Emacs 迷你缓冲区中执行命令的简洁方法

标签 emacs elisp

考虑以下示例:我想使用迷你缓冲区中的 ido 读取一个文件,但合并我经常使用的所有目录。我不能只执行

(ido-find-file)
(ido-merge-work-directories)

因为第二个sexp只有在用户选择完文件后才会执行。接下来的问题是:在迷你缓冲区的命令循环中执行命令的最佳/最干净的方法是什么?

我知道的唯一方法是将我想要的命令绑定(bind)到一个键序列,并将该序列添加到 unread-command-events,这样一旦我们进入迷你缓冲区命令循环,键就会运行:

(setq unread-command-events (append (listify-key-sequence (kbd "M-s")) unread-command-events)) ; std key-binding for ido-merge-work-directories
(ido-find-file)

但这很hacky,我想知道是否有更好的解决方案。

谢谢!

编辑:澄清一下,这个问题与 ido 无关。让我解释。当您调用诸如查找文件、切换到缓冲区或任何需要迷你缓冲区交互的功能时,将创建“递归编辑”——即命令循环内的命令循环。

所以,代码:

(message "A")
(recursive-edit) 
(message "B")

打印 A,然后暂停函数的执行并重新进入命令循环。您可以四处移动、打开文件等,直到您离开递归编辑,然后打印“B”。

那么,让我重新表述一下我的问题:如果您创建递归编辑,那么您如何在创建的新命令循环中执行命令(在同一函数中)?如果我必须输入额外的键,这不算数。对于 ido 示例,要合并目录,ido 必须正在运行:在调用 ido 之前执行合并目录不在 ido 的命令循环内。如果您之后执行它,则 ido 会破坏其命令循环。

最佳答案

所以我认为您的问题有三个答案:

  • 您可以在迷你缓冲区映射中绑定(bind)键,就像其他键一样。有several keymaps可能相关。

  • ido 有许多 Hook 可用于更改各种函数的行为,特别是 ido-make-*-hook 变量似乎相关。 (如果您从未使用过它,M-x describe-variable,又名 \C-h v,是您的 friend 。)

  • 如果您想要普遍更改函数的行为并且没有可用的 Hook ,您应该考虑 defadvice。就您而言,我认为您可以使用(未​​经测试!):

    (defadvice ido-find-file (before)
       (ido-merge-work-directories))
    (ad-activate ido-find-file)
    

    您可以将这些行添加到您的 .emacs:

    (when (require 'ido)
      (defadvice ido-find-file (before)
         (ido-merge-work-directories))
      (ad-activate ido-find-file))
    

关于emacs - 在 Emacs 迷你缓冲区中执行命令的简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11380918/

相关文章:

emacs - 如何获得 Emacs 的背景类型?例如 'light or ' 暗

python - 如何突出显示 Emacs 中未使用的 Python 模块

elisp - 从 Emacs 缓冲区中提取 URL?

emacs - 组织模式源 block 可见性循环

windows - Windows 上带有 pscp/plink 的 Emacs Tramp

debugging - 如何以编程方式使用 edebug 触发或检测?

lambda - 为什么要尖锐地引用 lambda 表达式?

emacs - 如何让我的 Emacs 在 X11 上*始终*使用 6x13

emacs - 保存和恢复 elscreen 标签和分帧

xcode - Emacs 与 XCode 对话