我正在尝试使用不同的键绑定来进行emacs中的基本移动和删除。 我想使用的是以下键绑定:
我在大多数情况下成功完成了工作。然而,我仍然面临两个问题:
所以我的问题是,如何创建一个包含所有其他键绑定的次要模式,该模式将在所有其他模式的键绑定之前,并且可以执行以下操作: Cn :“请将 Ck (我喜欢向下移动)绑定到任何命令 Cn 意味着在此模式下绑定”
我想我必须为此创建一个次要模式,可能必须在每个主要模式之前通过钩子加载它,并使用一些emacs函数返回绑定到给定键绑定的函数。
关于如何做到这一点的任何想法?
答案 0 :(得分:1)
首先,您应该看一下evil mode,它为Emacs带来了许多Vim风格的键盘快捷键,其中许多都符合您自己的偏好。
如果您仍然想要一个通用次要模式,它将动态重新绑定任何给定的主要或次要模式的函数,您可能希望使用find-function-on-key
之类的函数来嗅出你的绑定然后可以根据需要重新绑定。
一种不太雄心勃勃的方法可能是定义个人键盘映射并将其绑定到一个键。这样可以节省每次切换模式时重新绑定密钥的麻烦。例如,我使用以下内容:
(define-prefix-command 'ty-keymap)
(global-set-key "\M- " ty-keymap)
(define-key ty-keymap " " 'just-one-space)
重新绑定M-<space>
供我自己使用,然后将just-one-space
重新绑定到M-<space><space>
。这让我很自由地做了这样奇怪的事情:
(define-key ty-keymap "j" #'(lambda () (interactive) (ty-move-mode ?j)))
(define-key ty-keymap ";" #'(lambda () (interactive) (ty-move-mode ?\;)))
(define-key ty-keymap "k" #'(lambda () (interactive) (ty-move-mode ?k)))
(define-key ty-keymap "l" #'(lambda () (interactive) (ty-move-mode ?l)))
(defun ty-move-mode (mv)
"Move over windows with right homerow keys."
(interactive "k")
(case mv
(?j (windmove-left)
(ty-move-mode (read-event)))
(?; (windmove-right)
(ty-move-mode (read-event)))
(?k (windmove-down)
(ty-move-mode (read-event)))
(?l (windmove-up)
(ty-move-mode (read-event)))
(?\r (message "done!"))
(t (push last-input-event unread-command-events))))
这使我可以访问j,k,l和;在我的窗户周围定向移动。修改它可以很容易地为你提供一个单个字符移动的迷你模式:
(defun ty-move-mode (mv)
"Move over windows with right homerow keys."
(interactive "k")
(case mv
(?j (backward-char 1)
(ty-move-mode (read-event)))
(?; (forward-char 1)
(ty-move-mode (read-event)))
(?k (previous-line 1)
(ty-move-mode (read-event)))
(?l (next-line 1)
(ty-move-mode (read-event)))
(?\r (message "done!"))
(t (push last-input-event unread-command-events))))
也许其他人会更好地了解如何做到你想要的。