2014-08-29 40 views
2

我想按'home'兩次以帶我到緩衝區的開始處。我無法獲得正確的語法。以下不工作,我無法找到與谷歌的答案...如何用'home'鍵創建一個emacs鍵和絃

;; key chords 
(require 'key-chord) 
(key-chord-mode 1) 
;(setq key-chord-two-keys-delay 0.2) 
;(key-chord-define-global "(home)(home)" 'beginning-of-buffer) 
;(key-chord-define-global "[(home)(home)]" 'beginning-of-buffer) 
;(key-chord-define-global (home)(home) 'beginning-of-buffer) 
;(key-chord-define-global [home][home] 'beginning-of-buffer) 

更新:我已經切換到按鍵組合包,並有多個按鍵事件,包括Home鍵工作。

回答

3

聽起來像key-chord不會在這種情況下幫助,因爲<home>不在其支持的字符範圍內。

我認爲以下應做你想要什麼,並可以很容易地用於其它支持的按鍵相同的模式:

(defvar my-double-key-timeout 0.25 
    "The number of seconds to wait for a second key press.") 

(defun my-home() 
    "Move to the beginning of the current line on the first key stroke, 
and to the beginning of the buffer if there is a second key stroke 
within `my-double-key-timeout' seconds." 
    (interactive) 
    (let ((last-called (get this-command 'my-last-call-time))) 
    (if (and (eq last-command this-command) 
      last-called 
      (<= (time-to-seconds (time-since last-called)) 
       my-double-key-timeout)) 
     (beginning-of-buffer) 
     (move-beginning-of-line nil))) 
    (put this-command 'my-last-call-time (current-time))) 

(global-set-key (kbd "<home>") 'my-home) 

注意this-command將評估爲my-home功能運行時,因此我們在my-home符號上設置my-last-call-time屬性,因此整潔地避免了在上次調用該函數時需要維護用於記憶的單獨變量,這使該函數具有良好的自包含性和可重用性:可以創建另一個類似的函數,您只需更改(beginning-of-buffer)(move-beginning-of-line nil)

明顯需要注意的是命令陸續執行,如果你觸發雙鍵行爲,所以不要使用與該會是一個問題,命令這一做法。

(相反,優勢是,我們不與定時器搞亂。)

+0

輝煌。這正是我所期待的。 – 2014-09-01 03:41:14

3

它是<home>。要了解emacs如何調用特定的密鑰 - 可以按下該密鑰,然後再按M-x view-lossage

編輯

對不起,誤會首先你的問題。 M-x key-chord-define-global不接受home鍵。所以我認爲目前這是無法完成的。

+0

謝謝澄清。 – 2014-08-29 22:00:52

+1

'view-lossage'很好,但對於檢查單個鍵我總是推薦'C-h k'或'C-h c'。 – phils 2014-08-29 23:49:49

+2

是的,'key-chord-define-global'說:「KEYS可以是一個字符串或兩個元素的向量,目前只能使用與32到126範圍內的ascii代碼相對應的元素。 – phils 2014-08-30 23:06:30

1

爲此,無需使用key-chord。從.emacs文件刪除到key-chord-define-global呼叫並添加以下行來代替:

(global-unset-key (kbd "<home>")) 
(global-set-key (kbd "<home> <home>") 'beginning-of-buffer) 

說明

<home>默認綁定到move-beginning-of-line。如果您希望能夠設置由兩臺<home>組成的密鑰綁定,您首先必須使用global-unset-key刪除默認綁定。然後,您可以將所需的beginning-of-buffer綁定添加到全局鍵盤映射。

+0

我懷疑的意圖是'' *繼續*移動到當前行的開始位置,但''將移動到緩衝區的開始位置。如果這是正確的,那麼這個解決方案將無濟於事。 – phils 2014-08-30 23:25:48

1

使用smartrep.el其中有以非哈克的方式處理這種事情的優勢,另一個解決方案。當然,缺點是依賴於圖書館。

(require 'smartrep) 

(defun beginning-of-line-or-buffer() 
    (interactive) 
    (move-beginning-of-line nil) 
    (run-at-time 0.2 nil #'keyboard-quit) 
    (condition-case err 
    (smartrep-read-event-loop 
     '(("<home>" . beginning-of-buffer))) 
    (quit nil))) 

(global-set-key (kbd "<home>") #'beginning-of-line-or-buffer)