使用邪恶键绑定时,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-kC-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的主要内容,如果未能解决你的问题,请参考以下文章

为啥是 Ctrl+.当我将它绑定到 Emacs 中的命令时不起作用?

Emacs Chrome键绑定

Mac OS X Leopard 上的 Emacs 键绑定

Mac OS X Leopard 上的 Emacs 键绑定

为什么 Emacs 和 Vi 的学习曲线非常陡峭

如何定义键绑定以在 emacs 中的次要模式之间切换?