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