在 emacs 中,我想重新绑定(bind)键盘 [1...0]
的第一行,以便按下未修改的键会导致其移位等价。也就是说,键入 1234567890
将导致 !"£$%^&*()
被插入到缓冲区中。
我在 Windows Vista 中使用 emacs 24.1.1,启用了毒蛇模式。我正在使用粘液进行一些 Common Lisp 编程。我使用 viper,这样我就可以避免过于频繁地使用 Ctrl 和 Shift,因为我可以获得一些 emacs pinkie (RSI)。开始使用 lisp 编程后,我发现按 S-9
和 S-0
来打开和关闭括号开始造成损失。
通过在我的启动文件中包含以下内容,我可以将 9
绑定(bind)到 (
,反之亦然。
(defvar my-keymap
(let ((map (make-sparse-keymap)))
(define-key map (kbd "9") '(lambda () (interactive) (insert "(")))
(define-key map (kbd "(") '(lambda () (interactive) (insert "9")))
map))
(viper-modify-major-mode
'lisp-mode
'insert-state
my-key-map)
这很好用并且很容易扩展到行的其余部分,除了我希望能够在两种模式之间切换而不必按住 shift(例如,通过切换 Caps Lock)。
有什么办法可以做到这一点,还是我的做法全错了?
最佳答案
这是我快速组合在一起的示例,在 Linux 上的 Emacs24 中对其进行了测试:
(setq viper-mode-key-mapping "custom")
(defvar custom-viper-keymap
(let ((map (make-sparse-keymap)))
(define-key map (kbd "9") '(lambda () (interactive) (insert "(")))
(define-key map (kbd "(") '(lambda () (interactive) (insert "9")))
map))
(defvar default-viper-keymap
(let ((map (make-sparse-keymap)))
(define-key map (kbd "9") '(lambda () (interactive) (insert "9")))
(define-key map (kbd "(") '(lambda () (interactive) (insert "(")))
map))
(defun switch-viper-mode-custom-keymap ()
(interactive)
(if (string= viper-mode-key-mapping "default")
(progn (setq viper-mode-key-mapping "custom")
(viper-modify-major-mode 'lisp-mode 'insert-state custom-viper-keymap))
(progn (setq viper-mode-key-mapping "default")
(viper-modify-major-mode 'lisp-mode 'insert-state default-viper-keymap))))
(global-set-key [(control f1)] 'switch-viper-mode-custom-keymap)
当我激活毒蛇模式时,按 CTRL-F1 会将键盘映射从自定义切换到正常。
关于emacs:将数字行的绑定(bind)切换为等效的 <shift>-ed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12009422/