如何在emacs中包装特定regexp的align regexp

如何在emacs中包装特定regexp的align regexp,emacs,elisp,Emacs,Elisp,我经常在一个区域上使用align regexp和regexp“[^]+\”对齐。所以我想我应该为它定义一个函数,这样我就可以将它绑定到一个键: (defun align-members () (interactive) (align-regexp " [^ ]+_")) 但emacs抱怨align regexp需要三个参数。看看这些文件,我知道这需要一段时间。我不确定(交互式)东西在emacs中是如何工作的,但通过阅读我收集的文档,我应该这样做: (defun align-member

我经常在一个区域上使用align regexp和regexp“[^]+\”对齐。所以我想我应该为它定义一个函数,这样我就可以将它绑定到一个键:

(defun align-members ()
  (interactive)
  (align-regexp " [^ ]+_"))
但emacs抱怨align regexp需要三个参数。看看这些文件,我知道这需要一段时间。我不确定
(交互式)
东西在emacs中是如何工作的,但通过阅读我收集的文档,我应该这样做:

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

但emacs随后抱怨align regexp调用堆栈深处的某个地方,它期望
integer-or-marker-p
,却得到了零。我做错了什么?

align regexp的文档说

如果指定了前缀arg,则使用括号表示完整的regexp 应提供空白

因此,我在regexp中插入了空格,这似乎使它能够工作:

(取消对齐成员(结束)
(交互式“r”)
(对齐regexp beg end“\\(\\)[^]+\”)

您应该编写如下内容

(取消对齐成员(结束)
(交互式“r”)
(对齐regexp BEG END(concat“\\(\\s-*\\)”“[^]+\”)1)
还是简单一点

(取消对齐成员(结束)
(交互式“r”)
(对齐regexp BEG END“\\(\\s-*\\)[^]+\\”1)
要理解它,请查看
align regexp
源代码,这里是它的一部分

(交互式
(附加)
(列表(区域开始)(区域结束))
(如果当前前缀为arg
(列表(读取字符串“使用regexp进行复杂对齐:”
“\\(\\s-*\\)”)
(字符串到数字)
(读取字符串
要修改的括号组(如果为负数,请对齐):“1”)
(字符串到数字)
(读取字符串“间距量(如果为负,则为列)”
(数字与字符串对齐默认间距)))
(y-or-n-p“在整个生产线内重复?”)
(列表(concat“\\(\\s-*\\))
(读取字符串“Align regexp:”)
1对齐默认间距(零)
如你所见:

  • 它将字符串
    “\\(\\s-*\\)”
    添加到正则表达式中
  • 它将1和
    与可选参数对齐默认间距
    • 奥列格的回答很好

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

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

      现在,当您以编程方式调用
      align regexp
      时,不需要提供 您可以选择一条捷径,因为程序员可能希望通过 默认

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

      在这种情况下,您应该看到如下内容:

      (对齐regexp 185 320“\\(\\s-*\\)“[^]+\\”1零)
      
      从我的角度来看,我在您的regexp中找不到任何
      。缺少您提供的测试模式,我只是举个例子

      尝试对齐代码:

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

      我在
      组中有这样一个工作函数:

      (defun try-align ()
        (interactive)
        (let ((BEG (region-beginning))
              (END (region-end)))
          (align-regexp BEG END "\\[\\(.*:\\)" -1 1 0)))
      
      如果按如下方式删除
      ,则该组不起作用:

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

      在调用命令之前,当你做C-u时,前缀参数不是一个数字吗?我没有这样做,那么为什么必须转义空格?@JosephGarvin你是对的,这就是我理解前缀参数的方式。我不知道为什么在这种情况下有必要,我也很好奇。我只是尝试了对函数u的不同修改通常(*)前缀参数是一个函数参数,可以使用交互式
      C-u
      (或类似)机制提供,docstring自然会突出显示任何此类用法,但当然也可以在elisp中直接提供该参数。(*)然而,情况并非总是如此——也可以编写一个交互式声明,在提供前缀arg时更改其行为,但实际上不直接将该值用作函数参数。为什么align regexp在elisp中调用它时仍不能为我这样做?我不明白为什么我必须手动执行它编辑:哦,那个交互式表单是打开的,里面有代码,我不知道你可以这么做。
      (defun try-align ()
        (interactive)
        (let ((BEG (region-beginning))
              (END (region-end)))
          (align-regexp BEG END "\\[.*:" -1 1 0)))