3

在 emacs 中,我想重新绑定键盘的第一行,[1...0]以便按下未修改的键会导致其移位等效项。也就是说,打字1234567890会导致!"£$%^&*()被插入缓冲区。

我在 Windows Vista 中使用 emacs 24.1.1,并启用了 viper 模式。我正在使用 slime 进行一些 Common Lisp 编程。我使用 viper 是为了避免过于频繁地使用 Ctrl 和 Shift,因为我可以获得一些 emacs 小指(RSI)。开始使用 lisp 编程后,我发现点击S-9S-0打开和关闭括号开始产生影响。

通过在我的启动文件中包含以下内容,我可以绑定9(,反之亦然。

(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)。

有什么办法可以做到这一点,还是我完全错了?

4

1 回答 1

3

下面是我快速编写的一个示例,在 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)

当我激活 viper 模式时,按 CTRL-F1 将键盘映射从自定义切换到正常。

于 2012-08-17T18:03:43.887 回答