Ключи в режиме


Я заметил закономерность в некоторых elisp режимы я собирал:

(let ((map (make-sparse-keymap)))
  (define-key map KEY 'FN)
  ...
  (setq FOO map))

поэтому я написал следующий макрос

(defmacro def-sparse-map (name &rest key/fn-list)
  `(let ((map (make-sparse-keymap)))
     ,@(loop for (key fn) on key/fn-list by #'cddr
         collecting `(define-key map ,key ',fn))
     (setq ,name map)))

что позволяет мне написать

(def-sparse-map FOO
  KEY FN
  ...)

вместо. Все комментарии приветствуются, но какие-то конкретные вопросы

  • Это может быть сделано более аккуратно (и, как правило, это хорошая практика, чтобы использовать портирован ХЛ функций при определении режимов Elisp)?
  • Есть какие-то вопросы я не видеть, что использование пусть/setq?
  • Стоит ли писать в elisp с-gensyms , чтобы сохранить карту от привязки внешне?

и самое главное

  • Есть ли Elisp примитивны, что делает то же самое, или близко к нему?


244
4
задан 6 мая 2011 в 04:05 Источник Поделиться
Комментарии
2 ответа

Общие сведения


  • Стандартные режимы не должны использовать ХЛ. Это на практике приводит к более дублирование кода, чем это экономит память (много стороннего режимах или пользователя инициализации файлов использовать ЦЗ в любом случае). Так что не волнуйтесь об использовании его, если ты действительно придерживаешься своего пакета интегрированных в GNU редактора Emacs.

  • Да, с помощью карты символ таким образом будет вмешиваться в использовании карты за пределами вашего макроса. Вот что gensym для.

Мой подход

Вам не нужен сложный макрос.

(defun inaimathi-make-keymap (&rest bindings)
"Make a sparse keymap containing the specified bindings"
(let ((map (make-sparse-keymap)))
(while (consp bindings)
(define-key map (car bindings) (car (cdr bindings)))
(setq bindings (cdr (cdr bindings))))
map))
(defmacro inaimathi-defmap (symbol docstring &rest bindings)
"Define a keymap called SYMBOL, with a DOCSTRING.
Populate the keymap with BINDINGS by building it with `inaimathi-make-keymap'"
`(progn
(defvar ,symbol nil ,docstring)
(setq map (inaimathi-make-keymap . ,bindings))))
(inaimathi-defmap some-map "Keymap for some mode."
"\C-c\C-a" 'do-something
"\C-c\C-z" 'do-something-else)

3
ответ дан 26 июля 2011 в 12:07 Источник Поделиться

Пусть макрос определить раскладку, действительно ли вы обеспечить ее привязку в момент создания.

(defmacro new-map (mapname &optional doc-string bindings)
"Define keymap MAPNAME, with optional DOC-STRING and BINDINGS."
(let ((map (make-sparse-keymap)))
(dolist (key.cmd bindings)
(define-key map (car key.cmd) (cdr key.cmd)))
`(defvar ,mapname ',map ',doc-string)))

Пример использования:

(new-map my-map "My map." (("\C-cf" . forward-char)
("\C-cb" . backward-char)))

Лучше: сделать добавление привязок к карте отдельная функция, добавить переплетах:

(defun add-bindings (keymap bindings)
"Add BINDINGS to KEYMAP"
(dolist (key.cmd bindings)
(define-key keymap (car key.cmd) (cdr key.cmd))))

(defmacro new-map (mapname &optional doc-string bindings)
"Define keymap MAPNAME, with optional DOC-STRING and BINDINGS."
(let ((map (make-sparse-keymap)))
(add-bindings keymap bindings)
`(defvar ,mapname ',map ',doc-string)))

Таким образом, программа может отделить создание карту от добавления привязки к нему (например, любое количество раз).

Пример использования:

(new-map my-map "My map.")                               ; Create the map
(add-bindings my-map '(("\C-cf" . forward-char) ; Add some bindings
("\C-cb" . backward-char)))
...
(add-bindings my-map '(("\C-ca" . backwardward-sentence) ; Add more bindings
("\C-ce" . forward-sentence)

Определить удаляя некоторые привязки одинаково.

(defun remove-bindings (keymap keys)
"Remove bindings for KEYS from KEYMAP."
(dolist (key keys) (define-key keymap key nil)))

Пример использования:

(remove-bindings my-map '("\C-cb"))

0
ответ дан 31 октября 2013 в 04:10 Источник Поделиться