emacs: переключить привязку строки чисел к эквиваленту <shift>

В emacs я хотел бы перепривязать верхний ряд моей клавиатуры [1...0], чтобы при нажатии неизмененной клавиши получился ее смещенный эквивалент. То есть ввод 1234567890 приведет к вставке в буфер!"£$%^&*().

Я использую emacs 24.1.1 в Windows Vista с включенным режимом viper. Я занимаюсь программированием на Common Lisp с использованием slime. Я использую viper, чтобы избежать слишком частого использования Ctrl и Shift, так как могу получить немного emacs pinkie (RSI). Начав программировать на lisp, я обнаружил, что нажатие клавиш S-9 ​​и S-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).

Есть ли способ сделать это, или я все это неправильно?

Спасибо

В

1 ответ

Решение

Вот пример, который я быстро взломал вместе, протестировал его в Emacs24 для Linux:

(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 переключает раскладку клавиатуры с обычного на обычное.

Другие вопросы по тегам