2013-09-24 29 views
2

當我重新縮進C++的緩衝,我想轉換這樣的代碼:可能Emacs轉換C++大括號懸掛而重新縮進緩衝區?

void foo(int a) { 
    try { 
     for (unsigned int i=0; i<10; ++i) { 
      if (++a) { 
       break; 
      } 
      else { 
       continue; 
      } 
     } 
    } 
} catch (...) { 
    ; 
} 

另外,我想這個類的定義和命名空間:

void foo(int a) 
{ 
    try 
    { 
     for (unsigned int i=0; i<10; ++i) 
     { 
      if (++a) 
      { 
       break; 
      } 
      else 
      { 
       continue; 
      } 
     } 
    } catch (...) 
    { 
     ; 
    } 
} 

到這樣的代碼不變。 這個功能是否存在於Emacs中?

我意識到這可以用一堆正則表達式, 來完成,但使用現成的函數可以更好地處理所有邊緣情況和所有邊緣情況。

+1

你可以試試'indent -br'。 http://www.gnu.org/software/indent/manual/indent.html#SEC9 – timrau

+0

謝謝,這看起來很有用。我想我可以通過區域上的命令將它掛起來。 –

回答

0

問題大多與解決的astyle:

(defun cpp-astyle() 
    (interactive) 
    (let (beg end) 
    (if (region-active-p) 
     (setq beg (region-beginning) 
       end (region-end)) 
     (setq beg (point-min) 
      end (point-max))) 
    (shell-command-on-region beg end "astyle -A3 -U -p -k3" nil t))) 

出的,它支持正是我想要的沒有比賽, 但是這一次是非常接近(僅函數實現開括號是錯誤的)12種款式。

0

一個簡單的宏可以做的工作,比如:

(setq last-kbd-macro 
    "\C-s{\336\C-e") 

其次:M-0C-Xë

+0

不處理類和名稱空間。 另外,沒有撤消。 –

0

注意:請參閱下面的我的編輯。

您可以通過兩種不同的方式使用replace-regexp來實現。

1.)要使用elisp執行此操作,請轉到緩衝區的開頭,然後鍵入M- :(允許您提供s表達式進行評估)。然後鍵入

(replace-regexp "\n.*{" " {") 

並按返回。 2.要以交互方式執行此操作,請運行M-x replace-regexp或鍵入M-%(它執行同樣的操作)。當記者問到的數據進行替換,類型C-q C-j其次.*{

當被問及如何處理," {"類型更換它(不帶引號 - 我不得不把它們放在那裏,以顯示大括號前的空格)。

然後按回車鍵運行該功能。

您必須爲換行鍵入C-q C-j的原因是因爲交互式替換正則表達式不允許使用\n

此外,作爲一個附註,如果您試圖找到或找出正則表達式,請使用re-builder。這非常有幫助。

編輯:

正如在評論中指出,如果代碼不匹配給定的輸入例子風格,有可能我的正則表達式來刪除代碼。這是一個不同的版本,有助於避免這種情況。它仍然不完美,但不應該盲目使用任何正則表達式。

(replace-regexp "\n\s *{" " {") 

這將確保只匹配和刪除空格。

+0

感謝您的嘗試,但這是一個非常弱的正則表達式。 它實際上刪除了代碼。除非經過至少5年的測試,否則我不會將我珍貴的代碼提供給 正則表達式:)。 –

+0

有趣。它完全適用於我的emacs和你的確切代碼示例。我確保兩次嘗試這兩種方法,只是爲了確定它的工作。我不知道這是如何刪除任何代碼。 – echosa

+0

這是我的建議。在緩衝區中打開您的代碼,然後運行M-x rebuilder。給它「\ n。* {」並查看匹配。我很想知道結果。 – echosa