我经常在一个区域使用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。我做错了什么?
答案 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-*\\)"
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)))