2013-02-27 81 views
5

我在瀏覽創建major mode for Emacs,並與堆棧交換網絡交互的早期階段,我的工作。Emacs的按鍵綁定沒有定製主要模式

在它涉及到幾種主要模式,全部採用一鍵式按鍵綁定類似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

需要更詳細的....我打開你指的是包,它工作得很好。所有主要的模式綁定都可用(雖然未定義)。 – 2013-02-27 23:58:57

+0

不要用'defun'定義主要模式。使用'定義衍生-mode',負責處理所有的樣板給你,包括殺害局部變量,切換鍵映射,設置主要模式乏,運行鉤等 – lunaryorn 2013-02-28 00:47:53

回答

5

你想使用define-derived-mode定義stack-network-mode(並使其從special-mode獲得,例如)。

你的代碼的其他意見:

  • 使用(),而不是nil空參數列表。
  • 棧網絡下的網站需要有(interactive)文檔字符串之後,使其成爲一個交互式命令,否則它不會作爲重點,結合工作。

如果你不想使用special-mode,您可以創建make-keymap後立即打電話supress-keymap

+0

這確實防止緩衝區編輯(感謝'special- mode',我相信),但關鍵是還沒有被綁定:((而且,據我所知,'()=== nil') – 2013-02-28 08:35:36

+0

如果你想看到的代碼,因爲它主張,這是[這裏](https://github.com/vermiculus/stack-mode/blob/71fb0081400bf71abf226fc6cb9e0382e2b7009a/elisp/stack-network-mode.el)(具體提交鏈接保存以供將來參考使用) – 2013-02-28 08:38:15

+0

@vermiculus'()== = nil'成立,但它是約定使用'()'空參數列表。'nil'在這個地方看起來令人不安大多數的Emacs Lisp編程。 – lunaryorn 2013-02-28 11:54:13

0

您已經定義了一個鍵盤映射,但你還沒有使用過。該變量存在但不捕獲任何關鍵事件。

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

模式的定義之前移動的stack-network-mode-map定義。否則define-derived-mode隱式地定義這個變量,defvar不改變非空變量的值,所以在地圖將是空的實際。

Derived Modes

新模式都有自己稀疏的鍵盤映射,名爲變種-mapdefine-derived-mode使得父模式的鍵盤映射新地圖的父母,除非變種-map已經設置,並且已經有一個父。