2010-09-27 5 views
6

Я только начал использовать emacs, и есть одна функция, которая мне действительно понравилась бы, и поиск вокруг был бесплодным. Я надеюсь, что кто-то еще это сделал, потому что я пока не хочу изучать elisp.Как я могу получить emacs, чтобы вставлять закрывающие фигурные скобки автоматически

void foo()<cursor> 

Я хотел бы печатая «{», чтобы вызвать это произойдет

void foo(){ 
    <cursor> 
} 

Я хотел бы, чтобы это произойти только в куб.см режиме, и только в конце строки, когда он не строка/комментарий/и т. д.

Первое, что пришло в голову, - это повторение «{», чтобы делать это всегда (я мог бы выяснить, как это сделать сам), но было бы трудно сделать это только на правильное время.

любые подсказки были бы оценены.

+0

Я думаю, что это дубликат http://stackoverflow.com/questions/1023770/automatically-closing-braces-in-emacs –

+0

я смотрел на этот вопрос, но это было только о добавлении закрывающей скобки/скобка/и т.д.. Я хочу, чтобы он был с новой строкой дважды, отступом и переместил курсор в пустую строку, а также – Bwmat

ответ

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

2

Попробуйте yasnippet (или на странице Emacs Wiki yasnippet). Есть много пакетов для Emacs, которые поддерживают это, но yasnippet, похоже, имеет импульс в настоящее время и очень расширяем. Просмотрите видео.

+0

Это выглядит действительно круто, я посмотрю на него – Bwmat

+0

Это не кажется идеальным, мне нужно нажать вкладку, чтобы развернуть ее и он не работает, если между «{» и всем, что есть до него, нет пробела. – Bwmat

+0

Возможно, вы можете изменить шаблон, чтобы удалить пробел. Изменение/создание шаблонов довольно просто. –

1

Вам нужно будет углубиться в emacs-lisp, чтобы сделать это именно так, как вы хотите, поскольку YASnippet сделает что-то приятное для вас, но не совсем то, о чем вы просите.

Я думаю, что самый простой способ сделать это - связать функцию с ключом RET в ключевой карте cc-mode.

Функция должна проверить, что предыдущий символ является { и если да, то выполнить требуемую RET, RET, TAB, }, Up, TAB, чтобы получить курсор, где вы хотите, и закрытие }.

Вы можете сделать функцию более надежной, проверив ее для сбалансированного закрытия }, но это было бы более сложно, и я бы рекомендовал посмотреть, как он себя чувствует без этой дополнительной функции полировки.

Если вам нравится, я могу написать функцию и привязку ключевой карты для вас, но так как вы попросили идею о том, как это делается, я оставлю это вам, чтобы попросить дополнительную помощь, если вам это нужно ,

Кроме того, я считаю, что autopair.el делает это достаточно хорошо для меня, и я делаю Newlines сам;)

+0

вот что я думал. есть ли простой способ, внутри функции lisp, проверить, есть ли я в комментарии/строке и находится ли я в конце строки? Я знаю, что cc-mode делает это внутренне, и было бы очень легко, если бы я мог просто использовать это. – Bwmat

+0

Вы можете использовать вещь-в-точке, чтобы определить, в каком контексте вы находитесь. – ocodo

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)