1

我在阅读以下文档时遇到了这个问题dired-mode

C-u s SWITCHES <RET>允许您为 指定新值 dired-listing-switches

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

4

4 回答 4

3

其他答案让您知道,C-u 它为后面的键序列提供了一个前缀参数。他们已将您指向文档(手册)和有关前缀参数的其他信息。

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

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

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


更新以响应@aartist 让 Emacs 检查所有命令定义的建议

如果您使用Icicles,那么您可以轻松找到当前定义的所有命令,其文档字符串中提到了“ prefix arg ”。

使用 Icicles 执行此操作的一种方法是使用 command icicle-fundoc

  • 在这种情况下,您要匹配其文档的函数是commands,因此您可以C-$在完成期间使用来过滤掉非交互式函数。

  • 您想匹配prefix arg文档字符串的任何位置、任何行,因此您可以简化用于匹配的正则表达式,方法是.在您的 minibuffer 输入中转换为匹配任何字符,包括换行符。您可以使用C-M-.(在普通点和任意字符点之间切换)。

  • 的 minibuffer 输入icicle-fundoc是一个包含两个部分(两种模式)的多重完成:

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

  • 您使用 . 分隔两种模式C-M-j

所以这就是你要做的:

M-x icicle-fundoc调用命令

C-$过滤掉非命令函数

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

C-M-j跳过函数名模式(匹配所有函数名)

.*prefix argprefix arg在任何文档字符串行的任何地方匹配字符串

prefix(要捕获一行末尾和下一行开头的文档字符串arg,您可以改用.*prefix[[:space:]]+arg.)

S-TAB显示缓冲区中的匹配项*Completions*S-TAB是否完成

(几乎每个提到的文档字符串也都提到了C-uprefix arg但如果您想确保找到那些可能没有的,您可以通过使用和键入来扩大匹配集(后跟)。)M-+C-uRET

在此处输入图像描述

您可以通过提供当前候选集必须匹配的更多模式来进一步过滤匹配集。这是渐进式的完成。例如,如果您只想查看文档中提到prefix argorC-u和单词的命令frame,您可以使用S-SPC frame.

在此处输入图像描述

于 2017-11-03T15:32:09.187 回答
2

在 Lisp 代码中搜索明显的符号,例如 (defun ... "... prefix arg ..." (interactive "N") ... 其中交互式代码字母 N、p、P 和 Z 都指当前-prefix-arg变量,同样在 C 代码中搜索Vcurrent_prefix_arg但在一般情况下是不可能的,例如,

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

两者都计算当前前缀参数值,但会避开大多数搜索。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

于 2017-11-23T04:32:07.283 回答
1

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

您可以在Emacs WikiEmacs 手册中找到更多信息。

于 2017-11-03T14:36:30.140 回答
1

C-u“通用前缀参数”而不是实际命令。

IOW,它以特定于该命令的方式修改了调用的命令的行为s

于 2017-11-03T14:35:18.210 回答