Emacs align regexp on=但不是==

Emacs align regexp on=但不是==,emacs,haskell,elisp,alignment,Emacs,Haskell,Elisp,Alignment,我在Haskell工作,经常遇到类似以下代码: func i j | i == j = i | otherwise = j 我想使用align regexp对齐“=”字符,但没有elisp专有技术。我尝试过只做“=”而不加引号,但这会在每个“=”之前插入一个不需要的空格字符。我已经找到了一个建议的解决方案,但我似乎什么都做不了 请帮助我编写一个函数或硬编码宏,允许我为此设置键绑定。

我在Haskell工作,经常遇到类似以下代码:

func i j | i == j = i
         | otherwise = j
我想使用align regexp对齐“=”字符,但没有elisp专有技术。我尝试过只做“=”而不加引号,但这会在每个“=”之前插入一个不需要的空格字符。我已经找到了一个建议的解决方案,但我似乎什么都做不了

请帮助我编写一个函数或硬编码宏,允许我为此设置键绑定。

align regexpRET
\(\s-*\)=
RET
1
RET
0
RET
n

(注意,“=”后面有一个空格,但不是很明显。)

也就是说

使用前缀参数告诉
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-ca
来代替钥匙
C-C(字母)
和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)))
我是这样做的:

  • 选择文本
  • F3开始录制
  • 如上所述执行
    align regexp
    (注意逐字键入所有内容,不要使用minibuffer history或yanking)。1
  • F4停止录制
  • C-x C-k n
    align single equals
    RET为宏命名
  • M-x
    insert kbd宏
    RET
    align single equals
    RET以获取lisp
  • (全局设置键)
    包装
    (lambda)
    表达式以绑定它。(尽管您也可以使用提供的
    (fset'align single equals…)
    代码,然后将密钥绑定到该符号
  • 1如果您在录制复杂的宏时出错,请不要烦恼-Emacs提供了一个非常好的宏编辑器,您可以在完成录制后使用它来修复任何错误(只需键入C-x C-k 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)
    

    谢谢。我可以使用你的解决方案,但是创建了一个函数而不是宏,因为它对我来说更可读。那就更好了:)如果你喜欢编写lisp,函数肯定是更好的选择,但是如果你不喜欢的话,宏是非常方便的。聚会有点晚了,但解决这个问题的标准方法是在“对齐规则列表”中添加一个规则,而不是编写自己的函数。