Emacs Auto Conlete Paren, отступ и новая строка - как? - PullRequest
4 голосов
/ 04 марта 2011

В C - я хочу, чтобы при вводе {и затем} emacs вставлял между ними новую строку, а затем устанавливал курсор между ними.Например:

int main() {

теперь я печатаю}, и происходит следующее:

int main() 
{
    //cursor is here
}

Редактировать: забыл упомянуть - я хочу, чтобы emacs знал, что при определении функции, которую он должен делатьчто было описано выше, но когда я выполняю цикл for или, например, оператор if, я хочу, чтобы он делал следующее:

if (bla bla) {

type} и ...:

if (bla bla) {
     //cursor here
}

Ответы [ 2 ]

4 голосов
/ 05 марта 2011

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

(c-toggle-auto-newline 1)

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

Вам также необходимо установить правильный стиль CC Mode. Стиль "cc-mode", кажется, определяет вещи так, как вы это описали. Вы можете активировать его с помощью комбинации клавиш C-c . и затем выбрать cc-mode или строку .emacs

(c-set-style "cc-mode")

Функции c-mode загружаются автоматически и поэтому обычно не будут доступны при загрузке файла .emacs. Поэтому вы должны обернуть их в ловушку для c-режима, как это

(add-hook 'c-mode-hook
          (lambda ()
            (c-toggle-auto-newline 1)
            (c-set-style "cc-mode")))
3 голосов
/ 04 марта 2011

Что касается { материала:

(define-minor-mode c-helpers-minor-mode
  "This mode contains little helpers for C developement"
  nil
  ""
  '(((kbd "{") . insert-c-block-parentheses))
)

(defun insert-c-block-parentheses ()
  (interactive)
  (insert "{")
  (newline)
  (newline)
  (insert "}")
  (indent-for-tab-command)
  (previous-line)
  (indent-for-tab-command)
  )

Вставьте вышеперечисленное в ваш .emacs.Вы можете активировать его с помощью c-helpers-minor-mode.

Редактировать: Выше все вставляется простым нажатием {.Приведенный ниже сценарий должен сделать это, если вы наберете {}:

(defun insert-latex-brackets (opening closing)                      ; prototype function for all enclosing things
  (interactive)
  (insert opening)
  (insert "  ")
  (insert closing)
  (backward-char (+ 1 (length closing )))
  )

(defun check-char-and-insert (char opening closing)
  (interactive)
  (if (equal char (char-to-string (char-before (point))))
      (progn (delete-backward-char 1)
         (insert-latex-brackets opening closing))
    (insert char)
  )
)

(local-set-key (kbd "}") 'check-char-and-insert)

Последнее замечание: вы можете попробовать использовать yasnippet , который может быть правильно использован в режиме реального времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...