在当前缓冲区上运行AStyle,保存并恢复光标位置

时间:2015-04-22 04:23:57

标签: emacs elisp code-formatting

我正在寻找一种解决方案,在c ++模式下对当前缓冲区的内容应用代码格式化和静态代码分析。我打算使用AStyleCppCheck。这两个工具都需要在当前代码上执行。例如,如果我正在编辑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移动该行。

1 个答案:

答案 0 :(得分:1)

在我看来,像astyle这样的重新格式化工具会修改空白,但大概没有别的。 (这可能是轻微的错误,就像他们重新格式化C宏一样,他们也必须修改反斜杠 - 但这也可以考虑在内。)

所以,我接近这个的方法是计算在(point)之前出现多少个非空格字符,调用astyle,还原缓冲区(或其他),最后,从缓冲区的开始,向前移动那么多非空白字符。

这并不总是"相同的",例如,如果点在某个被修改的空白中 - 但我认为它应该相当接近。

如果您真的只想记录当前行号并返回到该行号,可以使用line-number-at-pos获取当前行号,然后使用(goto-char (point-min))并使用forward-line回到线上。

相关问题