如何在emacs中包装特定regexp的align regexp
我经常在一个区域上使用align regexp和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
(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)))