我想按两次'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包,它可以使用多个按键,包括主页键。
答案 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)