2014-09-20 2 views
4

Только что начал использовать yasnippet для 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. Replace открывающей фигурной скобки в 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 вместо того, чтобы поддерживать больше стилей. http://www.gnu.org/software/emacs/manual/html_node/elisp/Conditionals.html Я буду ждать немного дольше, прежде чем принимать ответ, однако, чтобы узнать, есть ли еще предложения. – Xaldew

+0

@Xaldew Просто, чтобы вы знали, вы всегда можете [изменить принятый ответ] (https://stackoverflow.com/help/someone-answers) ... – itsjeyd

Смежные вопросы