2013-02-27 1 views
5

Я нахожусь на ранней стадии создания major mode for Emacs для просмотра и взаимодействия с сетью обмена стеками.Emacs keybinding не работает в обычном основном режиме

Участие в нем - несколько основных режимов, все с одним ключом, похожим на dired. Я посмотрел на источник для dired и экстрагируют то, что я думал, что будет работать:

(defvar stack-network-mode-map 
    (let ((map (make-keymap))) 
    (define-key map "n"  'stack-network-next-site) 
    (define-key map "p"  'stack-network-previous-site) 
    (define-key map ","  'stack-network-move-site-up) 
    (define-key map "."  'stack-network-move-site-down) 
    (define-key map "j"  'stack-network-jump-to-bookmarks) 
    (define-key map "\C-m" 'stack-network-do-enter-site) ; ret 
    (define-key map "o"  'stack-network-do-enter-site) 
    (define-key map "u"  'stack-network-do-profile-summary) 
    (define-key map "\C-uu" 'stack-network-do-profile-summary-for-user) 
    (define-key map "i"  'stack-network-do-inbox) 
    (define-key map "b"  'stack-network-toggle-bookmark) 
    (define-key map "?"  'stack-network-list-functions) ; [1] 
    (define-key map "\C-i" 'stack-network-display-details) ; tab 
    map) 
    "Keymap for Stack Exchange: Network Browser major mode") 

, но, к сожалению, это, кажется, не имеет абсолютно никакого эффекта; буфер просто редактируется так же, как и любой другой обычный буфер. Как я могу добиться одноключевых клавиш, если это не так? (Что, кстати, я уверен, что это так. Здесь должно быть что-то еще.)

+0

Нужно больше деталей .... Я загружаю пакет, на который вы ссылаетесь, и он отлично работает. Все основные привязки режимов доступны (хотя и не определены). –

+0

Не определяйте основные режимы с 'defun'. Используйте 'define-производный-режим', который обрабатывает все шаблоны для вас, в том числе убивает локальные переменные, переключает карту ключей, устанавливает основные моды, запускает крючки и т. Д. – lunaryorn

ответ

5

Вы хотите определить stack-network-mode с помощью define-derived-mode (и сделать его вывести из special-mode, например).

Другие комментарии о коде:

  • использовать () вместо nil для пустых списков аргументов.
  • stack-network-next-site должен иметь (interactive) сразу после docstring, чтобы сделать его интерактивной командой, иначе он не будет работать как связывание ключей.

Если вы не хотите использовать special-mode, вы можете вызвать supress-keymap сразу после создания вашего make-keymap.

+0

Это предотвращает редактирование буфера (благодаря' mode', я полагаю), но ключи все еще не связаны :((Кроме того, насколько мне известно, '() === nil'.) –

+0

Если вы хотите увидеть код в его нынешнем виде, это [ здесь] (https://github.com/vermiculus/stack-mode/blob/71fb0081400bf71abf226fc6cb9e0382e2b7009a/elisp/stack-network-mode.el) (конкретная фиксация связана с сохранением использования для дальнейшего использования) –

+0

@vermiculus '() == = nil', но условно использовать '()' для пустых списков аргументов. 'nil' в этом месте выглядит тревожным для большинства программистов Emacs Lisp. – lunaryorn

0

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

(use-local-map stack-network-mode-map) 
2

Перед определением режима переместите определение stack-network-mode-map. В противном случае define-derived-mode неявно определяет эту переменную, а defvar не изменяет значения переменных, отличных от нуля, поэтому на самом деле карта будет пуста.

См Derived Modes:

Новый режим имеет свою собственную разреженную раскладку, названный вариант -map. define-derived-mode делает ключевую карту родительского режима родителем новой карты, если только вариант -map уже установлен и уже имеет родителя.