emacs, python-mode.el определить назначение карты ключей

Когда я загружаю файл python-mode.el в emacs, я не получаю ни одной из указанных привязок клавиш. Я начал играть с файлом и заметил, что при изменении:

(define-key map [(control c)(\#)] 'py-comment-region)

to:

(define-key global-map [(control c)(\#)] 'py-comment-region)

это работает нормально.

Я пошел посмотреть, где определить переменную карты, и увидел:

(defvar py-shell-map nil
  "Keymap used in *Python* shell buffers.")

;; used by py-completion-at-point, the way of python.el
(defvar python-shell-map
  (let ((map (copy-keymap comint-mode-map)))
    (define-key map [tab]   'py-shell-complete)
    (define-key map "\C-c-" 'py-up-exception)
    (define-key map "\C-c=" 'py-down-exception)
    map)
  "Keymap used in *Python* shell buffers.")

Правильно ли определена переменная 'map'? Должен ли я внести некоторые изменения в мой файл инициализации? Я предполагаю, что этот файл работает для всех остальных, так почему мне нужно изменить переменную «карта» на «глобальную карту», ​​чтобы она работала на моем компьютере?

Я запускаю виртуальную машину, если это поможет.


person Eliel Van Hojman    schedule 19.07.2012    source источник


Ответы (2)


Процитированный вами код, в котором, по вашему мнению, определено map, на самом деле не является соответствующей частью кода. Это другая раскладка, используемая для оболочки Python, и она не используется при редактировании файла Python в Emacs.

Строка, которую вы редактируете, появляется в python-mode внутри следующего блока кода:

(defvar python-mode-map)
(setq python-mode-map
      (let ((map (make-sparse-keymap)))
        ;; electric keys
        (define-key map [(:)] 'py-electric-colon)
        (define-key map [(\#)] 'py-electric-comment)
        ...

Как видите, переменная map сначала инициализируется как «разреженная карта клавиш», затем в этой карте определяются определенные привязки клавиш, и, наконец, карта устанавливается как значение python-mode-map. Последняя — это раскладка, используемая в буфере, который находится в python-mode.

Так что привязки клавиш должны работать - но, конечно, только в буфере, который находится в python-mode. Чтобы активировать python-mode в буфере, введите M-x python-mode. Это работает только после загрузки файла python-mode.el.

Вы можете проверить, находится ли ваш текущий буфер в python-mode, двумя способами:

  • ваша строка режима должна отображать буквы «Py»
  • введите M-: ENTER major-mode ENTER -> это должно вывести "python-mode" в минибуфер
person Thomas    schedule 20.07.2012
comment
Спасибо, судя по всему загруженным env для python остался python.el вместо python-mode.el. Я добавил несколько строк в init.el, чтобы изменить это, и теперь все работает нормально. - person Eliel Van Hojman; 20.07.2012

Каждый основной режим и некоторые второстепенные режимы имеют свою собственную раскладку клавиатуры, которая накладывается на глобальную раскладку клавиатуры (то есть global-map). Когда вы нажимаете клавишу, Emacs пытается найти привязку для этой клавиши в наложенных раскладках клавиш, возвращаясь к «более глобальным» картам, пока не доберется до глобальной карты. Вот почему global-map работает, а map нет.

В lisp let используется для привязки локальных переменных. Переменная map не существует вне let (или, может быть, существует, но, вероятно, это не та переменная, которую вы хотите). Прочтите документацию для let и defvar (например, C-h f defvar).

Вам нужно выяснить, какая раскладка используется в основном режиме, и использовать для этого define-key. В этом случае (define-key python-mode-map (kbd "C-c #") 'py-comment-region), вероятно, сработает. Н.Б. Я не использую python-mode.el, но, глядя на источник, кажется, что он использует python-mode-map в качестве переменной раскладки клавиатуры. Остальные раскладки предназначены для вспомогательных буферов.

person jpkotta    schedule 20.07.2012