我在Haskell工作,经常遇到类似以下的代码:
func i j | i == j = i
| otherwise = j
我想使用align-regexp对齐'='字符,但没有elisp技巧。我试过只做“=”而没有引号,但这会在每个'='之前插入一个不需要的空格字符。我找到了一个建议的解决方案here,但我似乎无法做到这一点。
请帮我写一个函数或硬编码的宏,这样我就可以设置一个键绑定。
答案 0 :(得分:18)
Cu Mx align-regexp
RET \(\s-*\) =
RET 1
RET 0
RET n
(n.b。'='之后有一个空格,但不是很明显。)
这就是说......
使用前缀参数告诉align-regexp
要求您提供比默认情况下更多的参数。
有关详细信息,请参阅 C-h f align-regexp
和 C-h v align-rules-list
,但简而言之:
\(\s-*\)
是删除/扩展的默认“组”。我们将我们的模式添加到结尾:'='。 (请注意,\s-
是空格的Emacs regexp语法。)
1
只是指带括号的第1组(如上所述)。这是默认值。
0
表示在线的两个部分之间使用的间距。默认情况下,这是1,这就是为什么你最后会有一个额外的空间。
n
在每行第一个之后不对齐任何后续模式匹配。
编辑:实际上,您链接到的Q& A几乎相同,并且在Emacs 23.2.1上可以正常使用,因此 是重复的,但要继续并回答密钥 - 绑定方面:
您可以通过键盘宏绑定该(或任何)序列。这是最终结果,您可以将其添加到您的init文件中,但我建议您自己完成此过程。使用您喜欢的任何代替C-c a
的密钥。 C-c (letter)
和F5-F9保留给最终用户随意绑定,因此其中一个将不会被模式的键映射破坏。
(global-set-key (kbd "C-c a") (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([21 134217848 97 108 105 103 110 45 114 101 103 101 120 112 return 32 61 32 return return backspace 48 return 110] 0 "%d")) arg)))
我是通过以下方式做到的:
align-regexp
(小心逐字输入所有内容,不要使用迷你缓冲区历史记录或yanking)。 1 align-single-equals
RET 给宏命名insert-kbd-macro
RET align-single-equals
RET 获取lisp。(lambda)
包装(global-set-key)
表达式来绑定它。 (尽管您也可以使用提供的(fset 'align-single-equals ...)
代码,然后将密钥绑定到该符号。1 如果在录制复杂的宏时出错,请不要担心 - Emacs提供了一个非常好的宏编辑器,您可以使用它来修复录制后的任何错误(只需键入< kbd> Cx Ck e ),所以你不需要完美。
编辑2:也可以根据评论添加一个函数示例。
(defun my-align-single-equals ()
"Align on a single equals sign (with a space either side)."
(interactive)
(align-regexp
(region-beginning) (region-end)
"\\(\\s-*\\) = " 1 0 nil))
(global-set-key (kbd "C-c a") 'my-align-single-equals)