0

我正在尝试定义一个命令来自定义我在 emacs 中的 C/C++ 函数定义。

我想要获得的是自动重新格式化代码,如下所示:

type func(type arg1,
          type arg2,
          ...
          type argN) {

从通用声明开始,例如:

type func(type arg1, type arg2, ..., type argN) {

我的想法是搜索一个函数定义的具体模式,并在每个逗号后用新行替换它,然后调整缩进。

我用正则表达式等搞砸了一段时间,但我想不出任何东西。

我无法弄清楚如何在使用我的正则表达式获得的字符串中正确执行替换。

接下来是我到目前为止得到的一切,基本上什么都没有。

(defun fix-arg-definition ()
  (interactive)
  (goto-char (point-min))
  (replace-regexp "([^,()]+\\([,][^,()]+\\)+)[ ]*{" "WHAT TO PUT HERE?")
)

我对在 emacs 中自定义编码风格的世界完全陌生,事实证明这比我想象的要困难。任何帮助表示赞赏。

更新

我设法得到了一些似乎有效的东西,尽管我仍然必须尝试彻底测试它。

(defun fix-args ()
  (interactive)
  (goto-char 1)
     (while (search-forward-regexp "\\(([^,()]+\\([,][^,()]+\\)+)[ ]*{\\)" nil t) 
     (replace-match (replace-commas) t nil)))

(defun replace-commas ()
   (let (matchedText newText)
       (setq matchedText
       (buffer-substring-no-properties
       (match-beginning 1) (match-end 1)))
   (setq newText
   (replace-regexp-in-string "," ",\n" matchedText) )
 newText))

我可以忍受这个,然后用另一个命令手动调整缩进,至少现在是这样。

4

1 回答 1

1

您可以通过录制键盘宏轻松做到这一点:

这是我之前准备的一个edit-named-kbd-macro

;; Keyboard Macro Editor.  Press C-c C-c to finish; press C-x k RET to cancel.
;; Original keys: M-C-a C-SPC M-C-n <<replace-regexp>> , RET , C-q LFD RET M-C-a C-SPC M-C-n TAB

Command: c-split-formal-params 
Key: none

Macro:

M-C-a           ;; c-beginning-of-defun
C-SPC           ;; set-mark-command
M-C-n           ;; forward-list
<<replace-regexp>>  ;; replace-regexp
,           ;; c-electric-semi&comma
RET         ;; newline
,           ;; c-electric-semi&comma
C-q         ;; quoted-insert
LFD         ;; newline-and-indent
RET         ;; newline
M-C-a           ;; c-beginning-of-defun
C-SPC           ;; set-mark-command
M-C-n           ;; forward-list
TAB         ;; c-indent-line-or-region

更好地理解结构导航命令(例如 beginning-of-defun和)forward-list也会对您有所帮助。

有关键盘宏的更深入讨论,请参阅手册和我以前的答案。

于 2012-07-17T00:29:57.940 回答