Автоматическое закрытие скобок в Emacs-режиме и автоматическая вставка точки с запятой после двоеточия (аля Textmate) - PullRequest
2 голосов
/ 10 декабря 2010

Я ищу способ имитировать поведение редактирования Textmate в Emacs.

В Textmate, при добавлении свойства CSS:

#element {}  <-- Braces auto close.
#element {background: ;}  <-- after typing the colon, the semi-colon is automatically inserted and the cursor is placed between them.

Я посмотрел на несколько css-режимов (и textmate.el), но не вижу, чтобы кто-нибудь реализовал это.

У меня абсолютно нулевые знания о emacs-lisp, я бы хотел попробовать и написать что-нибудь сам, но кто-нибудь знает, если это уже сделано?

Ответы [ 2 ]

3 голосов
/ 11 декабря 2010

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

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

cc-mode имеет несколько примеров. Основной подход выглядит так:

(define-key c-mode-base-map "{" 'c-electric-brace)

(defun c-electric-brace (arg)
  (interactive "*P")
  ;; [...]
  (self-insert-command (prefix-numeric-value arg))
  ;; [...]
  )

По общему признанию, c-electric-brace - гораздо более сложная функция, чем вы могли бы ожидать, но было бы тривиально иметь функцию, которая просто вставляла бы то же число } s после вставки { s.

(defun my-electric-brace (arg)
  "Automatically add a closing '}' for every '{' inserted."
  (interactive "*P")
  (let ((count (prefix-numeric-value arg)))
    (self-insert-command count)
    (save-excursion
      (insert-char ?} count))))

(defun my-css-mode-hook ()
  (local-set-key (kbd "{") 'my-electric-brace))

(add-hook 'css-mode-hook 'my-css-mode-hook)

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

Ваше требование к электрическому двоеточию также менее тривиально, чем скобка, так как оно должно происходить только в правильном контексте (хотя на практике вам может не понравиться наивная реализация, поскольку я не думаю, что вы будете вводить двоеточия в Файл CSS, который не был в правильном контексте.)

Надеюсь, это направит вас в правильном направлении, если вы решите написать свои собственные решения.

Очевидно, что вы захотите прочитать некоторые учебные пособия по elisp, но для понимания приведенного выше кода просто отметьте, что вы можете использовать Ch f (describe-function), чтобы прочитать документацию по любой функции elisp (или Mx find-function для просмотра кода).

1 голос
/ 11 декабря 2010

Для общего назначения всех видов скобок и т. Д. Вы можете взглянуть на autopair-mode .

...