2012-03-10 77 views
3

如果具有一個Emacs緩衝這段代碼:Emacs的密切括號跳到編輯Clojure的代碼時,已有近括號

(if (> x 5 
    true 
    false)) 

當我嘗試對其進行編輯,以解決括號,東西很煩人的事情正在發生!當我嘗試向if條件添加右括號時,emacs會在'false'後將光標跳到右括號,而不是在5之後添加新的括號。

這是部分模式的一部分,也許clojure模式?你知道我該如何解決這個問題?這有什麼用?

回答

4

這聽起來像你正在使用paredit。你是否像project page那樣安裝它?

至於它有什麼好處?這對編輯列表很有用。但是你必須購買 進入整個系統,或者你最終會很困惑。請參閱wiki 頁面。

您是否在~/.emacs.el中有此部分?只要刪除它。

;; (require 'paredit) if you didn't install via package.el 
(defun turn-on-paredit() (paredit-mode 1)) 
(add-hook 'clojure-mode-hook 'turn-on-paredit) 
+0

謝謝!我從marmelade el存儲庫安裝了clojure-mode,我通過clojure-jack-in將它與leiningen項目一起使用。稍後我會確認這是否真的是一個信用問題,然後將此答案標記爲正確。 – 2012-03-10 13:19:48

+0

如何在沒有信用的情況下進行clojure模式工作? customizationj組在這裏是什麼? – 2012-03-10 14:39:00

+0

它看起來不像'package.el'自動加載paredit,你必須爲它添加一個自定義。 – 2012-03-10 15:16:40

2

是的,paredit是「不同的」。它總是會確保你的括號平衡。見http://www.emacswiki.org/emacs/PareditCheatsheet

對於您的代碼,將光標放在第一個右括號下方並按C左鍵。重複練習,它會移動到你想要的地方。

切割&粘貼(殺死&在emacs lingo中猛擊)也允許您使用平衡括號手動擰緊,所以直到您習慣於使用paredit,它可能會更容易使用。祝你好運!

+0

如何在沒有信用的情況下進行clojure模式工作? customizationj組在這裏是什麼? – 2012-03-10 14:39:29

1

如何驗證paredit是罪犯

您可以鍵入C-h k)而在你的Lisp緩衝區,看看有什麼)必然。如果它被綁定到paredit-close-round那麼yes paredit是罪犯。

如何禁用paredit,當你不知道是什麼觸發它

嘗試auramo's answer in another thread

,或者如果不工作,試試這個:

(eval-after-load 'paredit 
    '(defalias 'paredit-mode 'ignore)) 

如果你是好奇什麼是在您的Emacs中觸發paredit模式,請使用M-x debug-on-entry RET paredit-mode RET

學習使用paredit

但是我仍然必須鼓勵你繼續使用paredit。讓我們繼續使用paredit,讓我們看看你提出的問題的解決方案。你問:「你知道我該如何解決這個問題嗎?」我只是假設你問如何解決,如果形式。 Marius Kjeldahl給你提供的解決方案,現在使用paredit-forward-barf-sexp,現在一般情況下,如果你有一些Lisp代碼,你會發現一些parens在錯誤的地方,你想解決這個問題,你可以暫時禁用該緩衝區中的paredit模式(通過鍵入M-x paredit-mode),然後修復您的代碼,然後再次啓用paredit模式(再次輸入M-x paredit-mode)。另一件需要考慮的事情是Emacs已經撤消了,所以如果你通過某種行動到達(if (> x 5 true false)),你可以撤消該行動並重新開始。如果使用CUA模式,則撤銷綁定到C-z

不過您可能會發現C-左,C-權的綁定是怪異的,所以你可能需要使用以下設置:「什麼是對這項有益的」

(eval-after-load 'paredit 
    '(progn 
    ;; paredit-forward-barf-sexp is usually bound to <C-left>, C-}. 
    ;; here we unbind it from <C-left> 
    ;; so that one can continue to use <C-left> for movement. 
    (define-key paredit-mode-map (kbd "<C-left>") nil) 

    ;; paredit-forward-slurp-sexp is usually bound to <C-right>, C-). 
    ;; here we unbind it from <C-right> 
    ;; so that one can continue to use <C-right> for movement. 
    (define-key paredit-mode-map (kbd "<C-right>") nil) 

    ;; paredit-backward-kill-word is bound to M-DEL but not to <C-backspace>. 
    ;; here we bind it to <C-backspace> as well 
    ;; because most people prefer <C-backspace> to M-DEL. 
    (define-key paredit-mode-map (kbd "<C-backspace>") 'paredit-backward-kill-word))) 

你問由你可能會問兩兩件事:

    1. 爲什麼paredit-close-round有用嗎?
  • 爲什麼paredit具有結合到paredit-close-round)它可能它勢必更好鍵?想paredit-close-round

最好的辦法是把它作爲一個對口C-M-u。在以下代碼中將點移動到|,然後嘗試按C-M-u幾次以查看會發生什麼,然後再次將點指向|,並嘗試按C-M-- C-M-u(即在控制和Alt打開時鍵入-u)以查看會發生什麼情況。

(when t 
    (when t 
    (blah) 
    (blah)) 
    (when t 
    (blah | blah) 
    (blah)) 
    (when t 
    (blah) 
    (blah))) 

C-M-u用於選擇表達式;爲了選擇一個或多個封閉表格,您幾次按C-M-u,然後C-M-SPC幾次。 C-M-- C-M-u對評估封閉表單很有用;您先按C-M-- C-M-u幾次,然後按C-x C-e來評估封閉表格。

paredit-close-round基本上做什麼C-M-- C-M-u

爲什麼paredit將)綁定到除了簡單插入關閉paren之外的其他操作的命令?因爲你不應該自己插入右括號。每當你插入一個開放的文件,一個關閉的文件也會自動插入。無論何時您想將(blah) (blah)更改爲((blah) (blah)),只需選擇兩個等值表格並按(即可。