如何在emacs中为特定的正则表达式包装align-regexp

时间:2012-02-14 18:52:33

标签: emacs elisp

我经常在一个区域使用align-regexp和regexp“[^] + _”。所以我想我会为它定义一个函数,所以我可以将它绑定到一个键:

(defun align-members ()
  (interactive)
  (align-regexp " [^ ]+_"))

但emacs抱怨align-regexp需要三个参数。看看文档,我看到它需要BEG和END。我不确定(interactive)内容如何在emacs中起作用,但是通过阅读我收集的文档,我应该这样做:

(defun align-members (BEG END)
  (interactive "r")
  (align-regexp BEG END " [^ ]+_"))

但是emacs然后在align-regexp的调用堆栈深处抱怨它预期integer-or-marker-p而不是nil。我做错了什么?

4 个答案:

答案 0 :(得分:4)

你应该写如下

(defun align-members (BEG END)
  (interactive "r")
  (align-regexp BEG END (concat "\\(\\s-*\\)" " [^ ]+_") 1 1))

或更简单

(defun align-members (BEG END)
  (interactive "r")
  (align-regexp BEG END "\\(\\s-*\\) [^ ]+_" 1 1))

要了解它,请查看align-regexp来源,此处有一部分内容。

(interactive
 (append
  (list (region-beginning) (region-end))
  (if current-prefix-arg
      (list (read-string "Complex align using regexp: "
                         "\\(\\s-*\\)")
            (string-to-number
             (read-string
              "Parenthesis group to modify (justify if negative): " "1"))
            (string-to-number
             (read-string "Amount of spacing (or column if negative): "
                          (number-to-string align-default-spacing)))
            (y-or-n-p "Repeat throughout line? "))
    (list (concat "\\(\\s-*\\)"
                  (read-string "Align regexp: "))
          1 align-default-spacing nil))))

如你所见:

  • 它会在您的正则表达式
  • 中添加一个字符串"\\(\\s-*\\)"
  • 将1和align-default-spacing设置为可选参数

答案 1 :(得分:2)

奥列格的答案很好。

align-regexp在调用时为您填写详细信息的原因 交互式的是你应该能够用as做最有用的事情 尽可能少的击键。如果你需要断言更多控制,那么使用 C-u 前缀。

这是Emacs命令的常见设计主题。

现在,当您以编程方式调用align-regexp时,无需提供 你是一个捷径,因为大概是程序员想要完全控制 默认值。

将来,当您将任务转换为交互式defun时,请使用 C-x esc esc 以查看命令后如何接收输入 浏览了互动表格。

在这种情况下,您应该看到类似的内容:

(align-regexp 185 320 "\\(\\s-*\\)" [^ ]+_" 1 1 nil)

答案 2 :(得分:0)

align-regexp的文档说

  

如果指定了前缀arg,则使用带括号的完整正则表达式   应该提供空白

所以我将你的正则表达式中的空格括起来,这似乎使它工作:

(defun align-members (beg end)
  (interactive "r")
  (align-regexp beg end "\\( \\)[^ ]+_"))

答案 3 :(得分:0)

从我的角度来看,我在你的正则表达式中找不到任何group。你缺乏测试模式,我只是举例说明。

尝试对齐代码:

bit [4:0] a;
bit [16:0] b;

致:

bit [  4:0] a;
bit [ 16:0] b;

我有group这样的工作函数:

(defun try-align ()
  (interactive)
  (let ((BEG (region-beginning))
        (END (region-end)))
    (align-regexp BEG END "\\[\\(.*:\\)" -1 1 0)))

如果您删除group,如下所示,则无效:

(defun try-align ()
  (interactive)
  (let ((BEG (region-beginning))
        (END (region-end)))
    (align-regexp BEG END "\\[.*:" -1 1 0)))