Emacs 中的前缀参数有什么作用和用途?

5
正如我在这里所询问的那样,我可以选择用前缀参数(C-u)来运行SLIME中的LISP,并且在这里我看到C-u是将输出插入当前缓冲区的一种方式。
我使用'C-u 10 SOMETHING'来运行SOMETHING 10次。
使用前缀参数(C-u)的用途是什么? C-u是唯一的前缀参数吗?
3个回答

8

请记住,单独使用C-u作为前缀时,默认将'(4)'作为参数传递,每个在命令之前插入的C-u都会将其乘以4。

因此,您可以通过使用ctrl-u前缀快速编写一些简单选择,例如:

(defun insert-date (prefix)
  "Insert the current date. With prefix-argument, use ISO format. With
   two prefix arguments, write out the day and month name."
  (interactive "P")
  (let ((format (cond
                 ((not prefix) "%A, %d %B %Y %H:%M %Z" )
                 ((equal prefix '(4)) "%d/%m/%Y %H:%M")
                 ((equal prefix '(16)) "%d/%m/%Y")
                 ((equal prefix '(64)) "%H:%M:%S")
                 ))
        (system-time-locale "en_GB"))
    (insert (format-time-string format))))

(global-set-key (kbd "C-c d") 'insert-date)

(以上elisp生成一个函数,该函数在键(在本例中为C-c d)上插入长格式日期,在C-u C-c d上插入短格式日期+时间,在C-u C-u C-c d上插入短格式日期,在C-u C-u C-u C-c d上插入短格式时间)
你可以使用这个技巧来制作一个“start-slime”替换程序,默认情况下使用clojure,但是如果在按下键绑定之前按下C-u,则使用sbcl。

1
现在我终于明白了“两个前缀参数”是什么意思(例如,在 magit 命令 magit-pull 中看到)。顺便提一下,Xah Lee 在 http://ergoemacs.org/emacs/elisp_universal_argument.html 上写了这个和其他可能的prefix值。例如,没有数字的 C-u - 使 prefix 等于符号“-”。 - echristopherson
请注意以这个例子为例检查前缀参数会导致令人惊讶的不一致性:没有数字的前缀参数,比如C-u可以工作,但是显式编号的前缀,例如C-u 4将被忽略,就好像没有前缀一样。据我所知,最佳实践是首先解开前缀,如果它是一个列表:(when (listp prefix (setq prefix (car prefix))))。就我个人而言,当只有前缀参数的增量是重要的时候,我还会考虑使用<=而不是equal来进行比较,这样介于4的幂之间的显式编号前缀也能直观地工作。 - mtraceur

6

请查看前缀命令参数文档了解更多信息。

简而言之,它是一种交互式提供命令更多信息的方式。

  • 对于字母数字键,通常绑定到'self-insert,它告诉它们要插入多少个相同字符。
  • 对于某些命令(M-x comment-region),它意味着将该命令反转,即C-u M-x comment-region取消注释区域。
  • 对于某些命令,它只是微调行为,C-u C-s会执行'isearch-forward-regexp而不是正常的'isearch-forward

因此,它完全取决于命令如何使用前缀参数。

至于其他“前缀参数”,有C--M--M-3(或任何其他数字)和其他一些。


0

另一种看待它的方式是,前缀参数让您将两个或多个不同但相似/相关的命令合并为一个,并将它们放在相似但相关的键上。

  • 将最常用的命令放在某个KEYKEY上。
  • 将另一个命令放在C-u KEY上。
  • 将另一个命令放在C-- KEY上。
  • 将另一个命令放在C-+ KEY上。

或者将它们中的许多命令放在不同的数字前缀上:...,C-u -2 KEYC-u -1 KEYC-u 0 KEYC-u 1 KEYC-u 2 KEY,...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接