使用邪恶键绑定时,emacs 中的 Ctrl+U
Posted
技术标签:
【中文标题】使用邪恶键绑定时,emacs 中的 Ctrl+U【英文标题】:Ctrl+U in emacs when using evil key bindings 【发布时间】:2012-12-27 10:51:20 【问题描述】:我在 emacs 中为 vim 绑定使用了美妙的 evil 包。
不正确的一个键是Ctrl+U。它仍然是 emacs 前缀,而不是 "up"。
有人在我的 .emacs 的一些 lisp 代码中对此有解决方案吗?
谢谢。
【问题讨论】:
那么,你最终使用了什么答案? 查看接受的答案:evil-want-C-u-scroll t 通过 org-mode 和相关包,C-u
具有很多功能。但我明白了,我希望它向上滚动。只是好奇是否有人知道我们应该如何以及将原始 emacs 的 C-u
保存到什么键绑定?
【参考方案1】:
有一个变量可以添加到您的.emacs
(setq evil-want-C-u-scroll t)
它需要出现在调用(require 'evil)
之前。
【讨论】:
C-u 被什么取代了?还是真的不需要邪恶的参数?一些 emacs 命令的行为与 arg 有点不同。 在 (require 'evil) 之前很关键!在加载包管理器之前,我把它放在了我的 emacs 文件的顶部。 如果我使用 emacs 客户端(即使服务器重新启动),这似乎不起作用(gnu-emacs 24.3.1),gist.github.com/vrthra/9999335 @rahul 你找到解决方案了吗?我发现它对我也不起作用 我可以确认这不起作用,Kevin Ushey 的回答是。【参考方案2】:另外,定义您自己的键绑定也很容易,evil
API 足够丰富,非常容易:
(define-key evil-normal-state-map (kbd "C-u") 'evil-scroll-up)
(define-key evil-visual-state-map (kbd "C-u") 'evil-scroll-up)
(define-key evil-insert-state-map (kbd "C-u")
(lambda ()
(interactive)
(evil-delete (point-at-bol) (point))))
我不得不走这条路,因为 evil-want-C-u-scroll
对我来说不能正常工作。
【讨论】:
几乎完美... Vim 中的 C-u 在第一次按下时删除当前缩进,然后在第二次按下时删除缩进。【参考方案3】:为了让 bling 的答案适用于使用 John Wiegley 的 use-package 的任何人,请确保在 :init
部分中定义它,如下所示:
(use-package evil
:ensure t
:init
(setq evil-want-C-u-scroll t)
:config
(evil-mode 1)
;; snip...
)
HTH
【讨论】:
【参考方案4】:Vim 的C-u
是半屏向上翻页。我使用以下方法复制了它,
(define-key evil-normal-state-map (kbd "C-u") 'evil-scroll-up)
来自C-h f evil-scroll-up
,
(邪恶向上滚动 COUNT)
向上滚动窗口和光标 COUNT 行。 默认为半屏。
【讨论】:
我认为这个答案不完整 - 这不会在普通模式以外的模式下启用 C-u。C-u
在可视模式下已经具有此行为。在插入模式下,在 vim 中,它不会向上滚动,它会删除回到行首/插入的入口。我不确定你会如何在 emacs 中复制这种行为。
你说得对,在答案中重新定义C-u
也会影响可视模式。我原以为不会因为evil-visual-state-map
没有更新,但我想出于某种原因这是不必要的。
我认为你猜对了。只是C-u
在可视模式下的默认行为已经正确。无需定义。
我不认为C-u
的默认行为是在可视模式下向上滚动。我在我的.emacs
中禁用了所有键映射和邪恶模式自定义,然后在普通模式和可视模式下尝试了C-u
,在这两种情况下,它都会在迷你缓冲区中显示C-u-
并等待参数。而C-h c C-u
在这两种情况下都显示“C-u
运行命令universal-argument
”。只有在我M-x eval-expression
并粘贴到您的define-key
代码之后,C-u
才会使缓冲区向上滚动。我正在运行最新版本的 Evil 1.0.1。【参考方案5】:
vim 的 C-u
不是“上一行”,它更像是向上翻页。我不知道如何复制确切的行为,但您可以尝试 C-b
(evil-scroll-page-up) 或映射 C-k
、C-j
来上/下 10 行。
(global-set-key (kbd "C-k") (lambda () (interactive) (previous-line 10)))
(global-set-key (kbd "C-j") (lambda () (interactive) (next-line 10)))
C-u
键对 Emacs 也非常重要,因此您可能无论如何都不应该覆盖它。
【讨论】:
【参考方案6】:为了补充melleb的答案,我还定义了evil-want-C-u-scroll时的组合键:
(use-package evil
:ensure t
:init
(setq evil-want-C-u-scroll t)
(when evil-want-C-u-scroll
(define-key evil-insert-state-map (kbd "C-u") 'evil-scroll-up)
(define-key evil-normal-state-map (kbd "C-u") 'evil-scroll-up)
(define-key evil-visual-state-map (kbd "C-u") 'evil-scroll-up)
(define-key evil-motion-state-map (kbd "C-u") 'evil-scroll-up))
:config
(evil-mode 1)
...
)
这适用于 GNU Emacs 24.4.1
【讨论】:
【参考方案7】:首先,回答你的问题:
(define-key evil-insert-state-map "\C-u" 'previous-line)
(define-key evil-normal-state-map "\C-u" 'previous-line)
(define-key evil-replace-state-map "\C-u" 'previous-line)
(define-key evil-visual-state-map "\C-u" 'previous-line)
(define-key evil-motion-state-map "\C-u" 'previous-line)
由于我无法真正测试自己(没有邪恶),如果这些不起作用,请尝试以下方法:
替换
(define-key evil-motion-state-map "\C-u" 'previous-line)
有
(define-key evil-motion-state-map "cu" 'previous-line)
为你想要的任何邪恶模式这样做/这是必要的。
此外,也许有一个“邪恶”版本的 up
,您可能想改为绑定它。
另外,如果我错了,请纠正我,但我很确定邪恶的“船”在这些键绑定的某处带有功能/有用的“向上”,也许在某处阅读它。
【讨论】:
我的意思是“向上”,而不是上一行,就像在默认的 vim/less 功能中一样。 尝试定义 (kbd "C-u") 而不是 "\C-u" 或 "cu" 或其他。以上是关于使用邪恶键绑定时,emacs 中的 Ctrl+U的主要内容,如果未能解决你的问题,请参考以下文章