如何找到行为随前缀arg(`C-u`)而变化的所有Emacs命令

时间:2017-11-03 14:06:04

标签: emacs elisp

我在阅读dired-mode的文档时遇到过这个问题:

  

C-u s SWITCHES <RET> 可让您为其指定新值   dired-listing-switches

当您使用前缀参数(C-u)时,如何找到行为不同的所有Emacs命令?

4 个答案:

答案 0 :(得分:3)

其他答案让您知道C-u 为其后面的密钥序列提供了前缀参数。他们已经向您指出了doc(手册)和有关前缀参数的其他信息。

问题的其他部分是如何知道哪些命令受前缀参数影响,以及前缀参数如何影响每个此类命令。

  1. 无法知道哪些命令受前缀arg的影响。事实上,所有命令原则上都是,但是无论你是否使用前缀arg,许多命令都没有什么不同。

  2. 因为利用前缀参数的每个命令都可以对其进行不同的解释,所以使用 C-h f 表示该命令名称或 { {1}} 表示调用的键序列。 显示的帮助将告诉您前缀参数如何控制命令行为。

  3. 已更新,以回应@ aartist建议让Emacs检查所有命令定义

    如果您使用Icicles,则可以轻松找到当前定义的文档字符串提及的所有命令&#34; 前缀arg &#34;。

    使用Icicles执行此操作的一种方法是使用命令 C-h k

    • 在这种情况下,您要匹配其文档的功能是命令,因此您在完成期间使用 icicle-fundoc 来过滤掉非互动功能。

    • 您希望在文档字符串的任意位置匹配C-$,以便通过转换 prefix arg 在您的迷你缓冲输入中输入以匹配任何字符,包括换行符。您可以使用 . (在普通点和任意字符点之间切换)来执行此操作。

    • C-M-.的迷你缓冲输入为multi-completion,有两个部分(两种模式):

      • 第一个模式与函数名称匹配。
      • 第二个模式匹配函数的doc字符串。
    • 在这种情况下,您希望匹配所有函数名称,因此您可以提供一个空的第一个模式。

    • 您使用 icicle-fundoc 分隔这两种模式。

    这就是你所做的:

    C-M-j 以调用命令

    M-x icicle-fundoc 过滤掉非命令功能

    C-$ 切换 C-M-. 以便与任何字符匹配,包括换行符

    . 跳过功能名称模式(以匹配所有功能名称)

    C-M-j ,以便在任何文档字符串行的任何位置匹配字符串.*prefix arg

    (要记录文档字符串,其中prefix arg位于一行的末尾且prefix位于下一行的开头,您可以使用 arg 。)

    .*prefix[[:space:]]+arg 以显示缓冲区S-TAB中的匹配项(*Completions* apropos completion}

    (几乎所有提及S-TAB的文档字符串也提到了C-u,但如果你想确定找到那些可能没有的文字字符串,你可以{strong} widen the set of matches使用 prefix arg 并输入M-+(后跟C-u)。)

    enter image description here

    您可以通过提供当前候选人必须匹配的更多模式来进一步过滤匹配集。这是progressive completion。例如,如果您只想查看其文档提到RETprefix arg以及单词C-u的命令,则可以使用 frame

    enter image description here

答案 1 :(得分:2)

在Lisp代码中搜索明显的迹象,例如 (defun ...&#34; ...前缀arg ...&#34;(互动&#34; N&#34;)...... 其中交互式代码字母N,p,P和Z都是指 current-prefix-arg 变量,同样在C代码中搜索 Vcurrent_prefix_arg 但在一般情况下不可能,例如,

(symbol-value (intern (mapconcat #'symbol-name (reverse '(arg prefix current)) "-")))
(symbol-value (intern (reverse "gra-xiferp-tnerruc")))

都会计算 current-prefix-arg 值,但会避开大多数搜索。 load-path 变量列出 *。el 文件的目录; src 目录(如果包含在您的发行版中)具有 *。c 文件。 在没有加载太多的新鲜Emacs中,M-x commands-with-prefix-arg Ret报告Emacs version 26.0.90: 3422 with, 7921 without.内存搜索

(defun commands-with-prefix-arg ()
  "List of two lists: loaded lisp commands that refer to `current-prefix-arg' and those that don't appear to."
  (interactive)
  (let ((with '())
        (without '())
        (buffer (get-buffer-create "*Disassemble*"))
        (case-fold-search nil)
        (debug-on-error nil))
    (mapatoms (lambda (symbol)
                (cond ((not (commandp symbol)))
                      ((or (ignore-errors
                             (string-match "\\(^\\|\n\\)[NpPZ]" (cadr (interactive-form symbol))))
                           (ignore-errors
                             (string-match "prefix[ \t\n\f]*arg\\|universal-argument" (documentation symbol t)))
                           (ignore-errors
                             (with-current-buffer buffer
                               (erase-buffer)
                               (print (symbol-function symbol) buffer)
                               (goto-char (point-min))
                               (search-forward "\\<current-prefix-arg\\>"))))
                       (push symbol with))
                      (t
                       (push symbol without)))))
    (message "Emacs version %s: %d with, %d without."
             emacs-version
             (length with)
             (length without))
    (list with
          without)))

将此代码粘贴到*scratch*缓冲区中,然后键入C-j字符,即Control-J。 输入(mapcar #'print (car (commands-with-prefix-arg))) C-j 对于第一个列表 - 带有前缀arg的命令。对于其他人, 输入(mapcar #'print (cadr (commands-with-prefix-arg))) C-j

答案 2 :(得分:1)

C-u "universal prefix argument"而不是实际命令。

IOW,它以与该命令特殊的方式修改 s 调用的命令的行为。

答案 3 :(得分:1)

C-u绑定到universal-argument命令,该命令处理Emacs命令的前缀规范。它们可用于所有命令,但命令可能无法处理它或更改行为。

您可以在Emacs WikiEmacs manual

中找到更多信息