Добавьте клавиатурную привязку к существующему режиму Emacs

Я делаю попытку своей первой модификации 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 уже связывается в различном режиме. Я не планирую использование различного режима, но будущее непостижимо, и я хотел бы не положить прерывание для меня. Таким образом, я хотел бы, чтобы эта привязка клавиш только работала в режиме Python, где это пытается помочь мне добавить docstrings.

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

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

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

8
задан Trey Jackson 12 March 2010 в 16:16
поделиться

2 ответа

Оказывается, 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)))

(hm.... непечатные символы, я не могу вырезать/вставить в 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 и получить желаемое поведение.

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

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

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

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

Таким образом, если вы измените привязку на 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, сделайте M-x eval-region, что укажет Emacs оценить код в регионе. Чтобы увидеть изменения в существующих буферах python, вам нужно будет просто открыть новый файл/буфер python, что вызовет изменение привязки клавиш - общее для всех буферов python.

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

16
ответ дан 5 December 2019 в 08:23
поделиться

Во-первых, не связывайтесь с 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.

4
ответ дан 5 December 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: