2014-09-20 75 views
4

剛剛開始使用yasnippet for emacs,並且非常喜歡它的工作方式,但是我遇到了一些小麻煩,如果可能的話,我想要一些幫助來解決。不同編碼風格的Emacs Yasnippet

一個片段我特別喜歡的是「爲」 -snippet,即:

# -*- mode: snippet -*- 
# name: for 
# key: for 
# -- 
for (${1:i = 0}; ${2:i < N}; ${3:i++}) { 
    $0 
} 

但是最近,我開始在一個項目上,我們有不同的編碼風格的工作。簡單地把片段上方將被改變以將起始撐位置:

# -*- mode: snippet -*- 
# name: for 
# key: for 
# -- 
for (${1:i = 0}; ${2:i < N}; ${3:i++}) 
{ 
    $0 
} 

但是我想容易地在不同的編碼風格之間不同的項目,並因此之間切換,而不必手動地改變片段或創建很多重複。所以我認爲應該可以在代碼片段中編寫一些elisp代碼來自動適應當前活動的編碼風格。

環顧一下Emacs/elisp文檔,我發現了所謂的c-hanging-brace-alist(GNU doc),我覺得我應該可以用某種方式使用它。然而,我從來沒有真正在elisp上做過任何編程,我也不確定如何完成這個任務。任何幫助或建議,將不勝感激!

回答

1

這裏有一個建議:

  1. 定義一個變量來保存當前的編碼風格:

    (setq current-coding-style 'default) 
    
  2. 定義命令的默認樣式和新使用的樣式之間切換項目,並將其綁定到您選擇的按鍵序列上:

    (defun toggle-coding-style() 
        (interactive) 
        (if (eq current-coding-style 'default) 
         (setq current-coding-style 'special) 
        (setq current-coding-style 'default))) 
    
    (global-set-key (kbd "C-c t") 'toggle-coding-style) ;; Replace C-c t 
                    ;; with another binding 
                    ;; if you like 
    
  3. (defun place-brace() 
        (if (eq current-coding-style 'default) " {" "\n{")) 
    
  4. 與該函數的調用替換在for片斷的開括號(如解釋here,隨心所欲的elisp:按照編碼風格,是當前「活動」定義是放在左括號功能代碼可以通過反引號括起來)被嵌入到片段:

    # -*- mode: snippet -*- 
    # name: for 
    # key: for 
    # -- 
    for (${1:i = 0}; ${2:i < N}; ${3:i++})`(place-brace)` 
        $0 
    } 
    

有了這個到位,所有你需要做的編碼風格(以及相應的片段膨脹之間切換)是按C-c t

+0

這是一個相當不錯的解決方案,但有一些可能的改進: 使用elisp cond而不是if來支持更多樣式。 http://www.gnu.org/software/emacs/manual/html_node/elisp/Conditionals.html 然而,在接受答案之前,我會再等一會兒,看看是否還有其他建議。 – Xaldew 2014-09-22 16:59:31

+0

@Xaldew只要你知道,你可以隨時[改變接受的答案](https://stackoverflow.com/help/someone-answers)... – itsjeyd 2014-10-07 09:35:59