如何在不同的代码段中自动对齐注释?

时间:2013-11-28 20:33:11

标签: emacs comments alignment text-formatting

我必须做一个非常具体的任务,一遍又一遍地重做,并希望将它永久地放在我的.emacs文件中。但是我对emacs-lisp的管理能力不够:

  • 按键-1,说[F8]
    • 记住当前游标的列位置,例如xtab
  • 按键-2,当光标位于其他行时,说[F9]
    • 在当前行中找到最左边的字符串//,如果没有,则发出蜂鸣声并停止
    • 插入尽可能多的空格,以便//到达之前记住的列xtab,或者如果光标已超出xtab
    • 则不执行任何操作
    • 向前搜索下一个//并将光标放在其上

我设法将其分配给临时键盘宏,但必须为每个不断变化的xtab值重新录制它。

最终目标是我希望从

轻松地将注释与不同的代码对齐
int main() {     // the enty function
    int x = 100; // my new variable
    for(int i=1; i<2012; ++i) { // loop a lot
        x -= i;
    } 
} // end of all things

int main() {                    // the entry function
    int x = 100;                // my new variable
    for(int i=1; i<2012; ++i) { // loop a lot
        x -= i;
    } 
}                               // end of all things

知道如何自动化这个吗?我需要在.emacs - 文件中放置什么来存档 - 或类似的?

4 个答案:

答案 0 :(得分:11)

正如Tungd所说,align-regexp对这类事情有好处。

(defun my-align-comments (beginning end)
  "Align instances of // within marked region."
  (interactive "*r")
  (let (indent-tabs-mode align-to-tab-stop)
    (align-regexp beginning end "\\(\\s-*\\)//")))

这就像互动电话:
M-x align-regexp RET // RET

或者更多与语言无关的版本:

(defun my-align-comments (beginning end)
  "Align comments within marked region."
  (interactive "*r")
  (let (indent-tabs-mode align-to-tab-stop)
    (align-regexp beginning end (concat "\\(\\s-*\\)"
                                        (regexp-quote comment-start)))))

答案 1 :(得分:2)

以下是代码:

(defvar c-current-comment-col 30)
(defun c-set-comment-col ()
  (interactive)
  (setq c-current-comment-col (current-column)))
(defun c-comment-to-col ()
  (interactive)
  (beginning-of-line)
    (when (re-search-forward "//" (line-end-position) t)
      (backward-char 2)
      (let ((delta (- c-current-comment-col
                      (current-column))))
        (if (plusp delta)
            (insert (make-string delta ? ))
          (if (looking-back
               (format "\\( \\{%d\\}\\)" (- delta)))
              (delete-region
               (match-beginning 1)
               (match-end 1))
            (message
             "I'm sorry Dave, I afraid can't do that.")))))
    (next-line 1))
(global-set-key [C-f6] 'c-set-comment-col)
(global-set-key [f6] 'c-comment-to-col)

我在最后加了一个next-line来电。现在你可以做到 C-f6 f3 f6 M-0 f4 对齐直到缓冲区结束。

答案 2 :(得分:2)

不完全是您问题的答案,但要达到预期目标,您只需标记该区域并使用align-regexp

答案 3 :(得分:0)

M-x align非常强大,将自动处理给定的特定示例。

但是,它也会对齐变量声明,这可能超出您的期望。在这种情况下,您将必须自定义align-region-separate或使用align-regexp答案。