我正在寻找一种解决方案,在c ++模式下对当前缓冲区的内容应用代码格式化和静态代码分析。我打算使用AStyle
和CppCheck
。这两个工具都需要在当前代码上执行。例如,如果我正在编辑foo.cpp
,则该函数应该运行
astyle --arg1 --argn foo.cpp
并且
cppcheck --arg1 --arg2 foo.cpp
我已经尝试过的是here中的一个简单函数,它不起作用:
(defun astyle-this-buffer (pmin pmax)
(interactive "r")
(shell-command-on-region pmin pmax
"astyle" ;; add options here...
(current-buffer) t
(get-buffer-create "*Astyle Errors*") t))
更新
我发现上面的代码与Emacs23兼容,而我正在使用24.所以我用了这个代码:
(defun reformat-code ()
(interactive)
(shell-command-on-region (point-min) (point-max)
"astyle --options=~/.astylerc" t t))
(global-set-key (kbd "C-x C-a") 'reformat-code)
现在它可以工作并格式化代码,但我无法找到如何保存光标的位置并告诉emacs移动该行。
答案 0 :(得分:1)
在我看来,像astyle
这样的重新格式化工具会修改空白,但大概没有别的。 (这可能是轻微的错误,就像他们重新格式化C宏一样,他们也必须修改反斜杠 - 但这也可以考虑在内。)
所以,我接近这个的方法是计算在(point)
之前出现多少个非空格字符,调用astyle
,还原缓冲区(或其他),最后,从缓冲区的开始,向前移动那么多非空白字符。
这并不总是"相同的",例如,如果点在某个被修改的空白中 - 但我认为它应该相当接近。
如果您真的只想记录当前行号并返回到该行号,可以使用line-number-at-pos
获取当前行号,然后使用(goto-char (point-min))
并使用forward-line
回到线上。