Добавить привязку клавиатуры к существующему режиму Emacs - PullRequest
7 голосов
/ 12 марта 2010

Я пытаюсь сделать мою первую модификацию Emacs. Я записал небольшой макрос клавиатуры, и Emacs выплюнул его как elisp, в результате чего:

(setq add-docstring
    "\C-rdef\C-n\C-a\C-m\C-p\C-i\C-u6\"\C-u3\C-b")
(global-set-key "\C-c\C-d" 'add-docstring)

Поиск ссылки на Emacs показал, что C-c C-d уже связан в режиме diff. Я не планирую использовать режим сравнения, но будущее неизвестно, и я бы не хотел ставить ловушку для себя. Поэтому я хотел бы, чтобы эта привязка клавиш работала только в режиме Python, где она пытается помочь мне добавить строки документов.

В моем /usr/share/emacs/23.whatever/list/progmodes я нашел python.elc и python.el.gz. Я распаковал python.el.gz и получил читаемую версию файла elisp. Теперь, однако, документация становится непрозрачной для меня.

Как я могу добавить свою привязку ключа в режим Python вместо глобально?

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

Ответы [ 2 ]

15 голосов
/ 12 марта 2010

Оказывается, C-c C-d уже связан в python-mode ('python-pdbtrack-toggle-stack-tracking), поэтому вы можете захотеть вернуться к выбору привязки ключей.

Примечание: если вы просто хотите вырезать / вставить решение, перейдите к концу ответа. Прочтите объяснение того, как туда добраться - на случай, если вы захотите сделать это снова.

Макрос - хорошее начало, но то, что у вас есть, не совсем работает. Чтобы получить что-то, что вы можете привязать к ключу, попробуйте M-x insert-kbd-macro для этого макроса, и вы получите:

(fset 'add-docstring
   (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ("def ...unprintable characters...6\"3" 0 "%d")) arg)))

(хм .... непечатные символы, я не могу вырезать / вставить в SO, но вы можете сделать это самостоятельно, чтобы получить правильную вещь). С небольшим обманом, то, что вы получаете, эквивалентно этому:

(fset 'add-docstring
      (lambda (&optional arg)
        "Keyboard macro."
        (interactive "p")
        (kmacro-exec-ring-item `(,(kbd "C-r def C-n C-a C-m C-p C-i C-u 6 \" C-u 3 C-b") 0 "%d")
                               arg)))

Это первый шаг. С помощью вышеописанного вы можете выполнить M-x add-docstring и получить желаемое поведение.

Следующим шагом является то, что вы спросили - как связать ключи локально. Документация для сочетаний клавиш начинается здесь , и вас интересует раздел Local Keymaps , который приводит к следующему:

(add-hook 'python-mode-hook
          (lambda () (define-key python-mode-map (kbd "C-c C-d") 'add-docstring)))

Это устанавливает анонимную функцию, которая будет вызываться при включении python-mode, и эта функция делает одно - она ​​устанавливает желаемую привязку клавиш в таблице ключей специально для режима python.

Если вы внимательно прочитаете раздел Keymaps , вы увидите, что Emacs следует соглашению, согласно которому только пользователи должны привязывать запятые к Cc a , где a является любой строчной или заглавной буквой (например, Cc d Cc T Cc p все доступны), и пакеты ограничивают привязки, зависящие от режима, Cc% , где % - любой знак пунктуации или управляющая клавиша (например, Cc Cc Cc [ Cc Cz ).

Итак, если вы измените свою привязку на C-c d , то вы гарантированно не будете конфликтовать с какими-либо пакетами. python.el, поставляемый с Emacs, следует этим соглашениям, как и большинство (все?) Пакетов, поставляемых с Emacs.

Вы заметите, что я использую kbd для чтения последовательностей клавиш. Это портативное устройство, и мне его намного легче читать.

Есть и другие вещи, которые вы можете сделать, чтобы убрать это:

  1. помещает настройки в именованную функцию
  2. переписать макрос в elisp
  3. используйте eval-after-load вместо крючка (см. Этот вопрос)

Вот что я бы сделал для # 1, что дает вам удобное место для размещения других настроек:

(add-hook 'python-mode-hook 'my-python-customizations)
(defun my-python-customizations ()
  "set up my personal customizations for python mode"
  ;; put other customizations in here
  (define-key python-mode-map (kbd "C-c C-d") 'add-docstring))
(defun add-docstring (&optional arg)
  "Keyboard macro."
  (interactive "p")
  (kmacro-exec-ring-item `(,(kbd "C-r def C-n C-a C-m C-p C-i C-u 6 \" C-u 3 C-b") 0 "%d")
                         arg))

Использование именованной функции немного чище, так как позже вы можете сделать (remove-hook 'python-mode-hook 'my-python-customizations), если захотите. Кроме того, если вы посмотрите на значение для ловушки ( C-h v python-mode-hook-RET ), становится очевидным, что вызывается (анонимная функция длиннее и сложнее для чтения).

Для бонусных баллов, после того, как вы вставили код в ваш .emacs do M-x eval-region , который скажет Emacs оценить код в регионе. Чтобы увидеть изменения в ваших существующих буферах Python, вам просто нужно открыть новый файл / буфер Python, который вызовет изменение привязки клавиш - что является общим для всех буферов Python.

Счастливого взлома.

4 голосов
/ 12 марта 2010

Во-первых, не связывайтесь с python.el. То, что вы хотите сделать, это создать свою собственную привязку для режима Python. Обычно это делается в файле .emacs в вашем домашнем каталоге.

В этот файл добавьте что-то вроде следующего (я не проверял это - поэтому может быть некоторая ошибка в синтаксисе, и я сам не использую python)

(add-hook 'python-mode-hook
     '(lambda () (define-key python-mode-map "\C-c\C-d" 'add-doc-string)))

Это использует крюковый механизм. Это функция, которая вызывается каждый раз, когда вы вызываете режим Python. Эта функция связывает C-c C-d только с вашей add-doc-string функцией.

Этот ответ очень краткий. Прочтите о файле .emacs, настройках и хуках в документации по emacs.

...