作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我每天都在 emacs 中使用 verilg-mode,但代码对齐对我来说不太好。所以想添加一些东西,比如垂直对齐。
首先,我希望像这样对齐声明行:
bit [1:0] a;
bit [3254:0] b;
bit unsigned [P_DWIDTH-1:0] c;
bit unsigned [P_DWIDTH-1:P_DWIDTH-4] d;
int e;
至:
bit [ 1:0 ] a;
bit [ 3254:0 ] b;
bit unsigned [P_DWIDTH-1:0 ] c;
bit unsigned [P_DWIDTH-1:P_DWIDTH-4] d;
int e;
我没有太多 Elisp 经验。我不确定像 align-regexp
这样的东西是否值得一看?或者任何人请为我指出正确的开始方向。
最佳答案
根据@homeless的回复,我做了修改:使用narrow-to-region
来避免区域边界变化。
(defun align-decl-vertically ()
"Align verilog declarations."
(interactive)
(save-excursion
(save-restriction
(narrow-to-region (region-beginning) (region-end))
;; remove spaces around ":"
(goto-char (point-min))
(while (re-search-forward "\\s-*:\\s-*" (point-max) t)
(replace-match ":"))
;; align "["
(align-regexp (point-min) (point-max) "\\(\\s-*\\)\\[" -1 1 0)
;; align ":"
(align-regexp (point-min) (point-max) "\\[\\(.+:\\)" -1 0 0)
;; align "]"
(align-regexp (point-min) (point-max) "\\s-*\\(\\]\\)" -1 0 0)
;; align variable name
(align-regexp (point-min) (point-max) "\\(\\s-+\\)\\S-+;" -1 1 0)
(widen))))
还找到另一种方法来更新 align
规则以实现此目的(这并不完全按照我的预期工作,但只是在这里列出,也许有些方法可以帮助我修复它):
(add-to-list 'align-mode-rules-list
'(declaration-range-field-alignment
(regexp . "\\(\\s-*\\[\\)\\(.*:\\).*\\S-+\\(\\s-*\\]\\)\\(.*\\)")
(group . (1 2 3 4))
(modes . '(verilog-mode))
(tab-stop . nil)
(spacing . (1 0 0 1))
(repeat . nil)
(justify . t)))
(add-to-list 'align-mode-rules-list
'(declaration-variable-name-alignment
(regexp . "\\(\\s-*\\S-*\\s-*;\\)")
(group . 1)
(modes . '(verilog-mode))
(repeat . nil)
(tab-stop . nil)
(spacing . 1)
(justify . t)))
但有时可能需要多次运行 align
才能得到最终结果。我还没弄清楚为什么。
关于emacs - 如何向 Emacs 主模式添加垂直对齐功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28515100/
我是一名优秀的程序员,十分优秀!