Переверните цифры для нормального режима во зло

Можно ли перегруппировать цифры. Это, например, "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 все еще не ведет себя как 5, то же самое верно для 8. Можно ли исправить это для конфигурации выше?

То же самое означает решение @tarblet.

В качестве теста я использую последовательность Shift-5, G.

Ответ 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 (без перехода в начало строки, только работая как digit arg), вы также можете установить его.

Ответ 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 функцию. Эта функция связывает символы с соответствующими цифрами.

Update:

Как упоминалось в @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"))