2010-09-27 53 views
6

我剛開始使用emacs,並且有一個功能我真的很喜歡,而且四處搜尋都沒有結果。我希望別人做到這一點,因爲我現在不想學習elisp。我如何才能讓emacs自動插入右括號

void foo()<cursor> 

我想鍵入一個「{」,以使這種情況發生

void foo(){ 
    <cursor> 
} 

我想這僅在CC模式發生,並且僅在一個行的末尾時不一個字符串/評論/等

首先想到的是重新綁定「{」總是這樣做(我可以弄清楚如何做到這一點),但它很難讓它只發生在合適的時間。

任何提示將不勝感激。

+0

我認爲這是重複http://stackoverflow.com/questions/1023770/automatically-closing-braces-in-emacs – 2010-09-27 04:46:25

+0

我看了看這個問題的,但它只是有關添加右括號/梅開二度的/ etc。我希望它換行兩次,縮進,並將光標重新定位到空行 – Bwmat 2010-09-27 04:55:21

回答

5

這將做到這一點:

(defun my-c-mode-insert-lcurly() 
    (interactive) 
    (insert "{") 
    (let ((pps (syntax-ppss))) 
    (when (and (eolp) (not (or (nth 3 pps) (nth 4 pps)))) ;; EOL and not in string or comment 
     (c-indent-line) 
     (insert "\n\n}") 
     (c-indent-line) 
     (forward-line -1) 
     (c-indent-line)))) 

(define-key c-mode-base-map "{" 'my-c-mode-insert-lcurly) 
+0

謝謝,這個工作很好。 – Bwmat 2010-09-28 03:07:23

2

嘗試yasnippet(或在Emacs Wiki頁面yasnippet)。 Emacs有很多支持這種功能的軟件包,但yasnippet目前看起來有動力,並且具有很強的可擴展性。看看視頻。

+0

這看起來非常酷,我會研究它 – Bwmat 2010-09-27 05:35:13

+0

這似乎並不理想,我需要按tab來展開它並如果「{」之前和之前沒有空格,則不起作用。 – Bwmat 2010-09-27 06:07:45

+0

您可以修改模板以刪除空格。修改/創建模板非常簡單。 – 2010-09-27 14:55:54

1

您需要深入研究emacs-lisp才能完全按照您的意願執行此操作,因爲YASnippet會爲您做一些很好的事情,但不完全符合您的要求。

我認爲最簡單的方法就是在cc模式鍵盤映射中將函數綁定到RET鍵。

功能應該檢查前一個字符是一個{如果是的話,執行所需RETRETTAB}截至TAB得到光標所在位置並關閉}已插入。

您可以通過檢查平衡關閉功能來使該功能更加強大,但這會更加複雜,並且我建議您在不使用此附加拋光功能的情況下查看它的感覺。

如果您喜歡,我可以爲您編寫函數和鍵盤映射綁定,但是由於您要求瞭解如何完成該操作,因此如果您需要它,我會請您提供更多幫助。

另外,我發現autopair.el做到這一點很好地夠我了,我做我自己換行;)

+0

這就是我的想法。有沒有一種簡單的方法可以在lisp函數中檢查我是否在註釋/字符串中以及我是否在行尾?我知道cc-mode在內部執行此操作,如果我可以使用它,它會變得非常簡單。 – Bwmat 2010-09-27 07:59:53

+0

你可以用點對點的方式來確定你所處的環境。 – ocodo 2010-09-27 08:07:58

3

我衷心建議你嘗試的出色autopair未成年人模式 - 它做了很多不僅僅是簡單地插入大括號,而且使Emacs在該領域擁有更多的IDE。我想將它與cc模式下的電子括號設置相結合會給你帶來或多或少的你所尋求的行爲。

8

上最新的emacs,你可以使用:

electric-pair-mode is an interactive compiled Lisp function. 

(electric-pair-mode &optional ARG) 

Automatically pair-up parens when inserting an open paren. 

這是集成在Emacs 24.1(實際上CVS)

1

你可能想保留選項的空函數體,在這種情況下,您會希望右大括號保持在同一行上。如果是這種情況,那麼你可以嘗試這種替代解決方案:

  1. 依靠在前面的答覆中提到的包自動添加結束括號。
  2. 當您想要添加語句到函數體時,您按下Return鍵(而自動添加的右大括號仍在光標下方)。的「返回」鍵被綁定如下:

    ;; automatic first line in function            
    (defun my-c-mode-insert-funline() 
        (interactive) 
        (newline-and-indent) 
        (when (looking-at "}") 
        (newline-and-indent) 
        (forward-line -1) 
        (c-indent-line))) 
    (global-set-key (kbd "RET") 'my-c-mode-insert-funline) 
    
2

在emacs中24或更新的版本接通電對的模式。

(electric-pair-mode 1) 
相關問題