emacs的智能替换密钥绑定

emacs的智能替换密钥绑定,emacs,Emacs,我尝试在emacs中使用不同的键绑定进行基本移动和删除。 我想使用的是以下键绑定: Ctrl+i/k/j/l:上/下/左/右 Ctrl+u/o:向后/向前字 Ctrl+d/f:删除左/右 Ctrl+e/r:删除单词左/右 Ctrl+Alt+e/r:删除到行首/行尾 Ctrl+c/x/v:复制/剪切/粘贴 Ctrl+m Alt+m:向后/向前搜索历史记录 等 在大多数情况下,我都能做到这一点。不过,我仍然面对两个问题: 某些主要模式键绑定优先于我的设置。例如,一些python模式可能会将C-

我尝试在emacs中使用不同的键绑定进行基本移动和删除。 我想使用的是以下键绑定:

  • Ctrl+i/k/j/l:上/下/左/右
  • Ctrl+u/o:向后/向前字
  • Ctrl+d/f:删除左/右
  • Ctrl+e/r:删除单词左/右
  • Ctrl+Alt+e/r:删除到行首/行尾
  • Ctrl+c/x/v:复制/剪切/粘贴
  • Ctrl+m Alt+m:向后/向前搜索历史记录
在大多数情况下,我都能做到这一点。不过,我仍然面对两个问题:

  • 某些主要模式键绑定优先于我的设置。例如,一些python模式可能会将C-j设置为换行和缩进,我必须找出我正在使用的每个次要模式的每个问题,找到正确的键映射并释放我的键。单调乏味
  • 一些主要模式对基本动作使用稍微修改的命令。例如,对于C-e,组织模式可能使用组织行尾,而不是行尾。这允许跳转到行的末尾,而不考虑右侧的标记。或者某些模式会将delete backward命令更改为自定义命令,更适合所需的任务。C-n和C-p也一样,它们经常通过模式改变意义。这些是一些正弦特性,我想使用它们,而不必显式地搜索它们,找到它们的命令名,为我使用的每个主要模式重新绑定它们。我希望我的C-k在我使用的每种模式下都能像C-n一样工作,而不需要做任何事情
所以我的问题是,我如何创建一个次要模式,包含我所有的键绑定,它将位于所有其他模式的键绑定之前,并且可以执行如下操作:
C-n:“请将C-k(我对向下移动的偏好)绑定到C-n在此模式下要绑定到的任何命令”

我想我必须为此创建一个次要模式,可能必须在每个主要模式之前通过一个钩子加载它,并使用一些emacs函数返回绑定到给定keybinding的函数

你知道怎么做吗

  • 首先,您可能应该看看,它为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-
    供我自己使用,然后将
    仅一个空格重新绑定到
    M-
    。这让我可以自由地做这样奇怪的事情:

    (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))))
    
    也许其他人会对如何做你想做的事有更好的想法