如何在emacs vhdl-mode中对齐某些文本

时间:2013-05-09 03:26:00

标签: emacs elisp vhdl emacs24

在Emacs中,我如何对齐一组文字:

signal slv4   : std_logic_vector(3 downto 0);
signal slv16  : std_logic_vector(15 downto 0);
signal slv8   : std_logic_vector(7 downto 0);
signal slv32  : std_logic_vector(32 downto 0);

所以它看起来像这样

signal slv4   : std_logic_vector( 3 downto 0);
signal slv16  : std_logic_vector(15 downto 0);
signal slv8   : std_logic_vector( 7 downto 0);
signal slv32  : std_logic_vector(32 downto 0);

基本上我想在“downto”之前纠正这些数字;另一个副作用是文本是正确的(半冒号排列)。

我将如何实现这一目标?我玩M-x alignM-x align-regexp,但我似乎无法得到我正在寻找的东西。

我也在使用vhdl-mode所以也许它内置了一些内容?

3 个答案:

答案 0 :(得分:0)

我不认为在vhdl模式中存在这样的事情,因为在文本中间需要空格。如果只是正确对齐,您可能会使用tab行为。在这种情况下,您可以使用宏。

http://www.emacswiki.org/emacs/KeyboardMacros

答案 1 :(得分:0)

在第一次运行中,检测到最大填充,而不是在给定填充的情况下递归调用。

如果需要不同的东西,请在里面编辑`this-regexp'。 也许硬编码的开头“(”以连接形式需要编辑而不是。

(defun my-numbers-padded (&optional beg end len)
  "Pad numbers as given in example string "
  (interactive "*")
  (let* ((beg (cond (beg)
                    ((use-region-p)
                     (region-beginning))
                    (t (point-min))))
         (end (cond (end (copy-marker end))
                    ((use-region-p)
                     (copy-marker (region-end)))
                    (t (copy-marker (point-max)))))
         (this-regexp "^\\([^(]+\\)\(\\([0-9]+\\)\\(.+\\)$")
         (len len)
         lenmax
         (var (and len (concat "(format \"%" (number-to-string len) "s\" (match-string-no-properties 2))"))))
    (goto-char beg)
    (if len
        (while (re-search-forward this-regexp  nil t 1)
          (setq erg (eval (car (read-from-string var))))
          (replace-match
           (concat (match-string-no-properties 1) "\("   erg (match-string-no-properties 3))))
      (while (re-search-forward this-regexp  nil t 1)
        (setq current-length (length (match-string-no-properties 2)))
        (if (and lenmax (< lenmax current-length))
            (setq lenmax current-length)
          (unless lenmax (setq lenmax current-length))))
      (my-padding-numbers beg end lenmax))))

答案 2 :(得分:0)

这是我目前使用的(工作正常):

(defun my-align-downto (beg end)
    (interactive "r")
    (align-regexp beg end "\\([0-9]* downto*\\)" -1 0 t))

我想我会更进一步,根据本页最底部的信息创建我自己的'对齐钩子':http://www.emacswiki.org/emacs/AlignCommands#toc8

(add-hook 'align-load-hook (lambda ()
    (add-to-list 'align-rules-list
      '(downto-align
        (regexp  . "\\([0-9]* downto*\\)")
        (group   . -1)
        (spacing . 0)
        (modes   . vhdl-mode)
        (repeat  . t)))))

我没有得到任何结果。 :(

vhdl-mode是否会覆盖这些对齐规则..或者我只是没有正确执行某些操作?