1

在 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 所以它可能有内置的东西?

4

3 回答 3

0

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

如果需要不同的东西,请在 let 中编辑 `this-regexp'。也许 concat 形式的硬编码开头“(”也需要编辑。

(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))))
于 2013-05-09T07:59:37.890 回答
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 是否会覆盖这些对齐规则......或者我只是没有正确地做某事?

于 2013-05-10T03:28:31.353 回答
0

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

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

于 2013-05-09T03:48:41.047 回答