如何使用' home'创建emacs按键和弦。键

时间:2014-08-29 16:35:55

标签: emacs

我想按两次'home'将我带到缓冲区的开头。我无法正确理解语法。以下不起作用,我无法用谷歌找到答案......

;; 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)

更新:我已经切换到了key-combo包,它可以使用多个按键,包括主页键。

4 个答案:

答案 0 :(得分:3)

<home>。要了解emacs如何调用特定密钥 - 可以按下该密钥,然后M-x view-lossage

修改

抱歉,首先误解了你的问题。 M-x key-chord-define-global不接受home密钥。所以我认为目前无法做到这一点。

答案 1 :(得分:3)

听起来key-chord在这种情况下无效,因为<home>不在其支持的字符范围内。

我相信以下内容应该可以满足您的需求,并且相同的模式可以轻松用于其他不受支持的密钥 1

(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-last-call-time符号上设置my-home属性,从而整齐地避免维护一个单独的变量,用于记住上次调用此函数的时间,这使得函数很好地自包含和可重用:要创建另一个类似的函数,您只需要更改(beginning-of-buffer)(move-beginning-of-line nil)

1 显而易见的警告是,如果触发双键行为,两个命令会连续执行,所以不要将此方法与命令一起使用是个问题。

(相反,优势是我们没有弄乱计时器。)

答案 2 :(得分:1)

没有必要使用key-chord。从key-chord-define-global文件中删除对.emacs的来电,然后添加以下行:

(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的所需绑定添加到全局键映射。

答案 3 :(得分:1)

另一种使用smartrep.el的解决方案,它具有以非hacky方式处理此类事物的优点。当然,缺点是对库的依赖。

(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)