WedX - журнал о программировании и компьютерных науках

Умная замена сочетаний клавиш для emacs

Я пытаюсь использовать разные сочетания клавиш для базового перемещения и удаления в emacs. Я бы хотел использовать следующие сочетания клавиш:

  • Ctrl + i / k / j / l: вверх / вниз / влево /правильно
  • Ctrl + u / o: назад / вперед слово
  • Ctrl + d / f: удалить влево / вправо
  • Ctrl + e / r: удалить слово слева / справа
  • Ctrl + Alt + e / r: удалить до начала / конца строки
  • Ctrl + c / x / v: копировать / вырезать / вставить
  • Ctrl + m Alt + m: история поиска назад / вперед
  • и т.д

Что мне удавалось заставить работать в большинстве случаев. Тем не менее, я все еще сталкиваюсь с двумя проблемами:

  • Привязка клавиш к некоторым основным режимам имеет приоритет над моими настройками. Например, в каком-то режиме Python C-j может быть установлено значение newline-and-indent, и мне нужно выяснить каждую проблему для каждого второстепенного режима, который я использую, найти правильную раскладку клавиатуры и освободить мой ключ. Скучный.
  • В некоторых основных режимах используются слегка измененные команды для основных движений. Например, org-mode может использовать org-end-of-line для C-e вместо end-of-line. Это позволяет перейти в конец строки, не учитывая теги справа. Или какой-то режим изменит команду удаления назад на настраиваемую, более подходящую для желаемой задачи. То же самое для C-n и C-p, которые часто меняют значение через режимы. Это некоторые синусоидальные функции, которые я хотел бы использовать без их явного поиска, поиска их имен команд, повторной привязки их для каждого основного режима, который я использую. Я хочу, чтобы мой C-k работал так же, как C-n в каждом используемом мной режиме, без необходимости что-либо делать.

Итак, мой вопрос: как я могу создать второстепенный режим, содержащий все мои привязки клавиш, который предшествовал бы привязкам клавиш всех других режимов, и который делал бы что-то вроде:
Cn: "пожалуйста, привяжите Ck (я предпочитаю движение вниз) любой команде Cn, которая должна быть привязана в этом режиме "

Я предполагаю, что мне нужно создать для этого второстепенный режим, возможно, придется загружать его через перехватчик перед каждым основным режимом и использовать некоторую функцию emacs, которая возвращает функцию, привязанную к заданной привязке клавиш.

Есть идеи, как это сделать?

07.07.2014

Ответы:


1
  1. Во-первых, вам, вероятно, стоит взглянуть на злой режим, в котором много клавиатуры в стиле Vim. ярлыки для Emacs, многие из которых отражают ваши собственные предпочтения.

  2. Если вам все еще нужен универсальный второстепенный режим, который будет динамически повторно связывать функции из любого заданного основного или второстепенного режима, вы, вероятно, захотите работать с такими функциями, как find-function-on-key, чтобы вынюхивать привязки, которые вы затем можете повторно привязать по мере необходимости.

  3. Менее амбициозный подход может заключаться в определении персональной раскладки клавиатуры и привязке ее к одной клавише. Это избавляет вас от необходимости повторно связывать клавиши каждый раз при переключении режимов. Например, я использую следующее:

    (define-prefix-command 'ty-keymap)
    (global-set-key "\M- " ty-keymap)
    (define-key ty-keymap " " 'just-one-space) 
    

Это повторно связывает M-<space> для моего собственного использования, а затем повторно связывает just-one-space с M-<space><space>. Это позволяет мне делать такие странные вещи, как это:

(define-key ty-keymap "j" #'(lambda () (interactive) (ty-move-mode ?j)))
(define-key ty-keymap ";" #'(lambda () (interactive) (ty-move-mode ?\;)))
(define-key ty-keymap "k" #'(lambda () (interactive) (ty-move-mode ?k)))
(define-key ty-keymap "l" #'(lambda () (interactive) (ty-move-mode ?l)))

(defun ty-move-mode (mv)
  "Move over windows with right homerow keys."
  (interactive "k")
  (case mv
    (?j (windmove-left)
        (ty-move-mode (read-event)))
    (?; (windmove-right)
        (ty-move-mode (read-event)))
    (?k (windmove-down)
        (ty-move-mode (read-event)))
    (?l (windmove-up)
        (ty-move-mode (read-event)))
    (?\r (message "done!"))
    (t (push last-input-event unread-command-events))))

Это дает мне доступ к j, k, l и; для направленного движения вокруг моих окон. Было бы достаточно легко изменить это, чтобы дать вам мини-режим для передвижения отдельных персонажей:

(defun ty-move-mode (mv)
  "Move over windows with right homerow keys."
  (interactive "k")
  (case mv
    (?j (backward-char 1)
        (ty-move-mode (read-event)))
    (?; (forward-char 1)
        (ty-move-mode (read-event)))
    (?k (previous-line 1)
        (ty-move-mode (read-event)))
    (?l (next-line 1)
        (ty-move-mode (read-event)))
    (?\r (message "done!"))
    (t (push last-input-event unread-command-events))))

Возможно, кто-то другой лучше поймет, как делать именно то, что вы хотите.

07.07.2014
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]