Как я могу заставить emacs автоматически вставлять закрывающие скобки - PullRequest
6 голосов
/ 27 сентября 2010

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

void foo()<cursor>

Я хотел бы ввести «{», чтобы это произошло

void foo(){
    <cursor>
}

Я хотел бы, чтобы это происходило только в режиме cc и только в конце строки, когда нет в строке / comment / etc

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

Любые намеки приветствуются.

Ответы [ 7 ]

9 голосов
/ 28 сентября 2010

в последних версиях 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)

5 голосов
/ 28 сентября 2010

Это сделает это:

(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)
3 голосов
/ 27 сентября 2010

От всей души рекомендую вам попробовать отличный autopair вспомогательный режим - он намного больше, чем просто вставка скобок, и делает Emacs намного более интегрированной средой разработки, как в этой области. Я полагаю, что в сочетании с настройкой электрических брекетов в режиме cc-режима вы получите более или менее желаемое поведение.

2 голосов
/ 27 ноября 2015

включить режим электрических пар в emacs 24 или более новой версии.

(electric-pair-mode 1)
2 голосов
/ 27 сентября 2010

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

1 голос
/ 30 июня 2015

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

  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)
    
1 голос
/ 27 сентября 2010

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

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

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

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

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

Кроме того, я обнаружил, что autopair.el делает это достаточно хорошо для меня, и я делаю переводы строк самостоятельно;)

...