【问题标题】:Rebind digits for normal mode in evil在邪恶中为正常模式重新绑定数字
【发布时间】:2015-07-27 18:48:35
【问题描述】:

是否可以重新绑定数字。比如“5”就是“$”,“%”就是“5”?

evil-maps.el 中的数字是这样定义的。

(define-key evil-motion-state-map "1" 'digit-argument)
(define-key evil-motion-state-map "2" 'digit-argument)
...

我尝试了@ChillarAnand 的答案

(add-hook 'evil-mode-hook 'evil-mode-bindings)

(defun evil-mode-bindings ()
  "Bind symbols to digits."
  (define-key key-translation-map (kbd "%") "5")
  (define-key key-translation-map (kbd "*") "8")
  )
(define-key evil-normal-state-map "5" 'evil-beginning-of-line)
(define-key evil-normal-state-map "8" 'evil-end-of-line)

但是Shift-5 的行为仍然不像58 也是如此。 是否可以针对上述配置修复它?

@tarblet 解决方案也是如此。

我用作测试的是一个序列Shift-5G

【问题讨论】:

  • 所以您希望% 映射到值为5 的digit-argument
  • 是的,我想是的。当我按下Shift-5 时,编辑器的行为就像我在默认配置中按下5
  • 忘记添加到 sn-p。
  • 我认为你的键绑定在这一步之后会被修改,你能运行C-h k Shift-5C-h k G并确保它们分别绑定到evil-beginning-of-lineevil-goto-line &optional COUNT吗?
  • @user14416 我的解决方案似乎有什么问题?更新后的版本测试了吗(运动状态→正常状态)?

标签: emacs text-editor key-bindings evil-mode


【解决方案1】:

相当老套的解决方案,但它应该做你想做的事:

(defun capslock-digit-argument-fn (digit)
  `(lambda (arg)
     (interactive "P")
     (setq last-command-event (+ ,digit ?0))
     (digit-argument arg)))

(define-key evil-motion-state-map "!" (capslock-digit-argument-fn 1))
(define-key evil-motion-state-map "@" (capslock-digit-argument-fn 2))
(define-key evil-motion-state-map "#" (capslock-digit-argument-fn 3))
(define-key evil-motion-state-map "$" (capslock-digit-argument-fn 4))
(define-key evil-motion-state-map "%" (capslock-digit-argument-fn 5))
(define-key evil-motion-state-map "^" (capslock-digit-argument-fn 6))
(define-key evil-motion-state-map "&" (capslock-digit-argument-fn 7))
(define-key evil-motion-state-map "*" (capslock-digit-argument-fn 8))
(define-key evil-motion-state-map "(" (capslock-digit-argument-fn 9))

它重新绑定digit-argument 在试图确定按下哪个键时查看的变量。如果您不介意 ) 的行为与 0 不完全相同(不跳到行首,仅作为数字 arg 工作),您也可以设置它。

【讨论】:

  • 您的解决方案不适用于例如Shift-5G 的序列。
  • 抱歉,刚刚注意到您要求的是普通模式,而不仅仅是运动模式。请尝试将上述代码中的evil-motion-state-map 替换为evil-normal-state-map
【解决方案2】:

当然,在 emacs 中一切皆有可能:)

将这段代码添加到您的配置中。

(add-hook 'evil-mode-hook 'evil-mode-bindings)

(defun evil-mode-bindings ()
  "Bind symbols to digits."
  (define-key key-translation-map (kbd "!") (kbd "1"))
  (define-key key-translation-map (kbd "@") (kbd "2"))
  (define-key key-translation-map (kbd "#") (kbd "3"))
  (define-key key-translation-map (kbd "$") (kbd "4"))
  (define-key key-translation-map (kbd "%") (kbd "5"))
  (define-key key-translation-map (kbd "^") (kbd "6"))
  (define-key key-translation-map (kbd "&") (kbd "7"))
  (define-key key-translation-map (kbd "*") (kbd "8"))
  (define-key key-translation-map (kbd "(") (kbd "9"))
  (define-key key-translation-map (kbd ")") (kbd "0")))

每当你进入邪恶模式时,evil-mode-hook 运行evil-mode-bindings 函数。此函数将符号绑定到相应的数字。

更新:

正如@npostavs 提到的,你也可以使用这个

(add-hook 'evil-mode-hook 'evil-mode-bindings)

(defun evil-mode-bindings ()
  "Bind symbols to digits."
  (define-key key-translation-map (kbd "!") "1")
  (define-key key-translation-map (kbd "@") "2")
  (define-key key-translation-map (kbd "#") "3")
  (define-key key-translation-map (kbd "$") "4")
  (define-key key-translation-map (kbd "%") "5")
  (define-key key-translation-map (kbd "^") "6")
  (define-key key-translation-map (kbd "&") "7")
  (define-key key-translation-map (kbd "*") "8")
  (define-key key-translation-map (kbd "(") "9")
  (define-key key-translation-map (kbd ")") "0"))

【讨论】:

  • @npostavs 谢谢。以前的代码无法正常工作。更新代码。
  • @npostavs 明白了。根据您的 cmets 更新答案。非常感谢。
  • 谢谢你们。你能看看更新的问题吗?
  • "你不能把任何键绑定放在最后一个位置,只有简单的字符串。" - 哎呀,其实我很困惑,key-translation-map 很特别,你实际上可以将任何键绑定作为定义。
  • 对不起,我没听明白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多