我必须做一个非常具体的任务,一遍又一遍地重做,并希望将它永久地放在我的.emacs
文件中。但是我对emacs-lisp的管理能力不够:
[F8]
xtab
[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
- 文件中放置什么来存档 - 或类似的?
答案 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
答案。