Emacs Evil模式 - 如何重新映射'hjkl'?

3

我使用Colemak键盘布局,传统的Vim“hjkl”键不太舒适。在我的.vimrc文件中,我已经添加了以下内容来替换'hjkl'为'neio'(反之亦然)。

noremap n h
noremap e j
noremap i k
noremap o l

noremap h n
noremap j e
noremap k i
noremap l o

noremap N H
noremap E J
noremap I K
noremap O l

noremap H N
noremap J E
noremap K I
noremap L O

如果可能的话,我该怎么在Spacemacs中使用Emacs完成这个任务?
3个回答

4
以下是翻译的结果:

这里展示了evil-maps.el中如何绑定hjkl:

(define-key evil-motion-state-map "h" 'evil-backward-char)
(define-key evil-motion-state-map "j" 'evil-next-line)
(define-key evil-motion-state-map "k" 'evil-previous-line)
(define-key evil-motion-state-map "l" 'evil-forward-char)

你可以在你自己的init.el中添加类似的行,将方向键绑定到任何你想要的按键上。同时,你还需要重新绑定hjkl,假设你不想让它们保留原来的方向绑定。
编辑:如果要用neio替换hjkl,我认为你需要取消evil-normal-state-mapio的绑定。
(define-key evil-normal-state-map "i" nil)
(define-key evil-normal-state-map "o" nil)

我首先将修改后的'hjkl'和'neio'添加到init.el中,但没有起作用。然后我撤销了在init.el中的更改,并直接在evil-maps.el中更改了键位。结果相同。其他映射似乎可以工作,但'i'和'o'仍然无法用于移动。无论如何,谢谢! - lillemets

2
在qwerty键盘上,hjkl对应的是colemak键盘上的hnei,而不是neio。我知道你为什么想使用neio,因为这样可以将所有箭头都放在手指下方(而不是向左移动一个位置),但这并不一定是好事情:上/下(在qwerty键盘上是jk)经常使用,并且使用最强的两个手指。

qwerty键盘上的hjkl(colemak键盘上的hnei)实际上非常符合人体工程学,所以对我来说,在使用colemak键盘时保持这个布局是有意义的。当然,放弃多年的肌肉记忆是坚持使用它的另一个原因。

使用我的evil-colemak-basics包,可以保留hnei用于导航,并合理地处理后果。你可能想查看它的文档,因为它有关于设计的广泛介绍。也许你最终会使用它。 :)


1
很好的观点。我最近也得出了相同的结论:只要有上/下箭头,就没有必要让所有箭头都在手指下。我可能会尝试使用hnei - lillemets

1
你也可以在.spacemacs中进行这些更改。我找不到evil-maps.el,但FAQ建议在user-config中更改它们。
(defun dotspacemacs/user-config ()
;; colemak config
;; Make evil-mode up/down operate in screen lines instead of logical lines
(define-key evil-normal-state-map "i" nil)
(define-key evil-normal-state-map "o" nil)   ;;neio back,up,down,next
(define-key evil-motion-state-map "i" 'evil-next-visual-line)
(define-key evil-motion-state-map "e" 'evil-previous-visual-line)
(define-key evil-motion-state-map "n" 'evil-backward-char)
(define-key evil-motion-state-map "o" 'evil-forward-char)
;; Also in visual mode
(define-key evil-visual-state-map "i" 'evil-next-visual-line)
(define-key evil-visual-state-map "e" 'evil-previous-visual-line)

等等!这太糟糕了。现在你不能使用带有“i”的插入状态。你打算怎么办,总是使用追加状态“a”吗?Colemak动作很好,但似乎有一个小问题。 - בנימן הגלילי
2
这个重新映射也由evil-colemak-basics包处理。https://github.com/syl20bnr/spacemacs/pull/7178 - בנימן הגלילי
不完全相同,但接近:evil-colemak-basics使用一种变体:保留箭头的“hnei”,并旨在实现“肌肉记忆兼容性”。 - wouter bolsterlee
@wouterbolsterlee,在合并后,您可以通过选择colemak-neio、colemak-hnei或colemak-jkhl之一,并将其添加到.spacemacs的层列表中来启用它吗?我猜我不是一个很长时间的vim用户。我想我希望像一些旧的DOS游戏一样在j i k l上进行导航。 - בנימן הגלילי
我不使用Spacemacs,只用纯Emacs+Evil。我怀疑Spacemacs没有我的evil-colemak-basics包集成。你可以仍然用它进行普通的vim风格编辑,如删除/复制/导航等等,只是不能用于“SPC-…”命令。 - wouter bolsterlee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接