LINUX.ORG.RU

emacs и горячие клавиши. Только у меня???

 


0

3

Подскажите емаксеры, так как гугление этой проблемы ни к чему не приводит, что наводит на психиатрические мысли...

В файле .emacs настраиваю горячие клавиши через global-set-key

Все работает отлично, но до тех пор, пока не ставится какой-то модуль, например для python или php

После чего некоторые клавиши перестают работать.

Я так понимаю занимаются клавиши, которые выставлены по умолчанию в модуле.

Соответственно как решать данный вопрос?


Ответ на: комментарий от Hertz

Так и делается, хоткеи последние идут в файле, предварительный ансет тоже ничего не дает, видимо при загрузке файла .php он подгружает php-mode и перекрывает все пользовательские настройки, что выглядит как какой-то саботаж...

Причем использует M-j как enter (я делаю из него backward-char)

До этого у меня python-mode также перекрывал C-j

Сколько не пытаюсь пересесть на emacs эта затычка с хоткеями меня убивает... пользовательские настройки должны быть приоритетнее системных, что за **** такое в emacs'е?

vpn0
() автор топика
Ответ на: комментарий от vpn0

А попробуй добавить обратное переопределение в хуки для проблемных режимов. Костыль, конечно, но может сработать.

PS. сам с подобными проблемами не сталкивался.

feofan ★★★★★
()
Последнее исправление: feofan (всего исправлений: 1)
Ответ на: комментарий от vpn0

http://www.emacswiki.org/emacs/ModeHooks

Попробуй поколдовать с хуками. Типа:

(defun hotkeys-declare
... )

(add-hook 'python-mode-hook (lambda () (hotkeys-declare)))

Точно сейчас не вспомню, приеду домой пошебуршу свой конфиг.

Hertz ★★★★★
()

ИМХО, не стоит пытаться починить проблему через изменение порядка команд. Это нарушает общую идеологию keymap-ов Emacs: по умолчанию используется global keymap, потом при загрузке major mode / minor mode поверх этого keymap накладывается один или несколько keymap-ов, используемых режимом, и их приоритет выше чем у global keymap.

Поэтому нужно делать одним из 2 способов:
1) Отменить биндинг этой клавиши в php-mode-map (это значит, что будет действовать биндинг из карты с более низким приоритетом, т.е из global-mode-map): (define-key php-mode-map «\M-j» nil)
2) Повторить биндинг этой клавиши для php-mode-map: (define-key php-mode-map «\M-j» 'backward-char)

Более правильный из этих способов - первый.
NB: у меня php-mode не стоит, мб я неверно указал название mode map - т.е. просто говорю общую идеологию.
NB: Изначально надо просто вставить указанную команду в конфиг (пока что не в хук, см. ниже) и посмотреть, сработает ли. Но в комментах уже сказали, что иногда режим использует hook для инициализации клавиатурных комбинаций. (В 99% случаев со стороны разрабов режима так поступать плохо, тк это нарушает всё ту же самую идеологию - делать всё унифицированно через объявление mode maps). При этом ни способ 1, ни способ 2, очевидно, действовать не будут, если указать команду просто в конфиге. Решение - надо будет указать команду в своём hook и вызывать его после всех hook'ов от авторов режима.

Cheater
()
Ответ на: комментарий от Cheater

На данный момент помогло

(define-key php-mode-map (kbd «M-j») nil)

Получается что теперь нужно все такие клавиши выискивать в каждом модуле и отменять? Очень сомнительная система...

vpn0
() автор топика

emacs и горячие клавиши. Только у меня???

нет, я тоже обжёгся. но я не знал, что это из-за emacs

buratino ★★★★★
()
Ответ на: комментарий от vpn0

Получается что теперь нужно все такие клавиши выискивать в каждом модуле и отменять? Очень сомнительная система...

Похоже, что да, только так.
Альтернативный способ: создать свой keymap и заставить его грузиться после загрузки любого режима. Вообще, реализация по ссылке далека от совершенства, но идея примерно такая.

Cheater
()

Я добавляю клавиши в свой глобальный minor mode:

(defvar exd
    (make-keymap) "extended editing commands key bindings")

...

(define-key exd (kbd "C-M-d") 'delete-trailing-whitespace)

...

(define-minor-mode exd-mm
    "exd minor mode"
    t
    " exd"
    exd)

(exd-mm t)
gv
()
Ответ на: комментарий от gv

Я добавляю клавиши в свой глобальный minor mode

Я тоже так делаю.

Puzan ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.