【问题标题】:Emacs align-regexp on = but not ==Emacs align-regexp on = 但不是 ==
【发布时间】:2011-06-06 22:00:40
【问题描述】:

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

func i j | i == j = i
         | otherwise = j

我想使用 align-regexp 对齐 '=' 字符,但没有 elisp 专业知识。我试过只做“=”而不带引号,但这会在每个“=”之前插入一个不需要的空格字符。我找到了一个建议的解决方案here,但我似乎无法让它做任何事情。

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

【问题讨论】:

    标签: emacs haskell elisp alignment


    【解决方案1】:

    Cu Mx align-regexp RET \(\s-*\) = RET 1 RET 0 RET n

    (n.b. '=' 后面有一个空格,但不是很明显。)

    也就是说……

    使用前缀参数告诉align-regexp 要求您提供比默认更多的参数。

    请参阅 C-h f align-regexpC-h v align-rules-list 了解详细信息,但简而言之:

    \(\s-*\) 是删除/扩展的默认“组”。我们将我们的模式附加到它的末尾:'='。 (请注意,\s- 是 Emacs 用于空格的正则表达式语法。)

    1 仅指带括号的组 1(如上)。这是默认设置。

    0 用于在行的两个部分之间使用的间距。默认情况下这是 1,这就是为什么你最终会得到一个额外的空间。

    n 在每行的第一个之后不对齐任何后续模式匹配。

    编辑:实际上,您链接到的问答几乎相同,并且在 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)))
    

    我是这样做的:

    1. 选择文本。
    2. F3 开始录制。
    3. 如上所述执行align-regexp(注意逐字输入所有内容,不要使用迷你缓冲区历史记录或拉动)。1
    4. F4 停止录制。
    5. C-x C-k n align-single-equals RET 给宏起个名字
    6. M-x insert-kbd-macro RET align-single-equals RET 获取 lisp。
    7. (global-set-key) 包装(lambda) 表达式以绑定它。 (尽管您也可以使用提供的(fset 'align-single-equals ...) 代码,然后将密钥绑定到该符号。

    1 如果您在录制复杂的宏时出错,请不要担心 — Emacs 提供了一个非常好的宏编辑器,您可以在录制完成后使用它来修复任何错误(只需键入 Cx Ck e),所以你不需要完美。

    编辑 2:也可以根据 cmets 添加一个函数示例。

    (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,函数肯定是更可取的,但如果你不喜欢,宏也很方便。
    • 有点晚了,但解决这个问题的规范方法是向 `align-rules-list' 添加规则,而不是编写自己的函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多