2012-07-16 47 views
0

我想定義一個命令來定製我的C/C++函數定義在emacs中。Emacs規則來格式化函數聲明

我想獲得是自動格式化代碼看起來像這樣:

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定製編碼風格的世界,這已經被證明比我想象的更困難。任何幫助表示讚賞。

UPDATE

我已經成功地得到的東西,似乎工作,雖然我還有嘗試對其進行全面測試。

(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)) 

我可以忍受這個,然後用另一個命令手動調整縮進,至少現在是這樣。

+0

對於一些可能有助於查看[this](http://stackoverflow.com/a/1731571/440558)舊的SO答案的外部工具。 – 2012-07-16 13:13:11

回答

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-defunforward-list更好地瞭解結構性導航命令也將幫助你。

有關鍵盤宏的更多深入討論,請參閱手冊和我的previous答案。

+0

謝謝。 我會嘗試進一步調查這個問題。一開始我感覺很迷茫,真的無法弄清楚從哪裏開始。 – c3900 2012-07-17 13:28:19

+0

我添加了一個鏈接到我的答案之一。如果您不確定,請從手冊開始。 – 2012-07-17 16:05:25

+0

我必須澄清:在開始之前,我的意思是在發佈和獲取一些提示之前。 我真的很感激你的幫助,因爲現在我已經有了一個加深我的「知識」的起點。 – c3900 2012-07-17 17:41:43