Emacs快捷键对齐等号

12

我想在我的 .emacs 文件中加入类似这样的内容:

(local-set-key (kbd "C-c a =") 
  (lambda () (interactive) 
    (align-regexp (region-beginning) (region-end) "=")))

但是每次我运行它时,都会出现错误“Wrong type argument: numberp, nil”。

这个错误是什么意思,我应该如何达到我想要的效果?

3个回答

16

亲爱的朋友,这是你需要的内容。

(defun align-to-equals (begin end)
  "Align region to equal signs"
   (interactive "r")
   (align-regexp begin end "\\(\\s-*\\)=" 1 1 ))

(\s-*) 前缀是由 align-regexp 在内部使用的。

来自 align.el

(list (concat "\\(\\s-*\\)"

John Wiegley只是没有记录它,我猜大多数人都会交互式地使用align-regexp,或者只是记录并保存一个宏!


1
像往常一样,我请求大家使用“rx”,这样阅读你代码的人就不会变疯或瞎:(rx (group (zero-or-more (syntax whitespace))) "=")等价于"\\(\\s-*\\)=" - offby1
@offby1,这很奇怪。我可以理解(\s-*),但那个rx组...零或多次等等的东西...我不知道那是什么。我想我已经是其中一个“受感染”的人了。 - Cheeso
@slomojo - 回答不错,但你在解释中漏掉了一件事 - 为什么我们需要为GROUP和SPACING指定数字?它们被记录为可选项。 OP报告的错误(“Wrong type argument: numberp, nil”)的真正原因是他没有指定GROUP和SPACING。 您为这些参数指定了1和1,从而避免了错误。 看起来这些“可选”的参数实际上并不是可选的。 - Cheeso
@Cheeso,是的,使用任意值暗示了这一点,你说得很对……它们并不是可选项,而是align.el库文档不完善的情况。 - ocodo
@slomojo,不管怎样,非常感谢你的提示。这也帮助了我。 - Cheeso
显示剩余2条评论

2
来自#emacs的“thunk”解决了它:
(local-set-key (kbd "C-c a =") 
  (lambda () (interactive) 
    (align-regexp (region-beginning) (region-end) "\\(\\s-*\\)=" 1 1 nil)))

有人能解释一下"="前面的奇怪前缀吗?

请注意,最后的 nil 是可选的,而 1 1 不是。align.el 的文档需要整理。 - ocodo

0

我分析了align-regexp的源代码(在debian上安装emacs23-el),得到了以下结果:

(local-set-key (kbd "C-c a =") 
  (lambda () (interactive) 
    (align-region (region-beginning)
                  (region-end)
                  'entire
                  (list (list nil
                              (cons 'regexp "\\(\\s-*\\)=")
                              (cons 'group 1)
                              (cons 'bogus nil)
                              (cons 'spacing 1)))
                  nil
                  nil)))

但是毫无疑问,可以在不挖掘align命令的内部情况下完成此任务吗? - qrest
我本以为会的,但是我对align.el并不是很了解。 - Jack Kelly

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