LINUX.ORG.RU

GNU Emacs: readlineish C-h, C-w, C-u everywhere

 , , ,


0

3

Здравствуй, ЛОР.

Я тут решил в новом году серьезно подойти к GNU Emacs’у, который раньше использовал эпизодически только там, где не тянул Vim (для Латеха, иногда для автоматической обработки файлов).

Итак, я временно отключил Evil, и у меня теперь будет куча новичковых вопросов, позволь их задать.

И первое — это привычные мне по emacs-like режимам в GNU Readline и в GTK клавиши C-h, C-w и C-u (стереть символ, слово, строку), какие в самом-то Емаксе и отсутствуют. А точнее означают совсем другое.

Я не буду спрашивать, на что мне переназначить справку, вставку и «универсальный аргумент» (справку, очевидно, ни на что не надо — <F1> и так уже есть, остальное подумаю). А спрошу как, собственно, правильно сделать переназначение.

Если я правильно понял, в разных режимах по ним должны вызываться разные функции. Так сейчас бэкспэйс в минибуфере или буфере с человеческим текстом значит delete-backward-char, но backward-delete-char-untabify буфере с кодом. И это я еще никакие дополнительные пакеты не подключал, а они ведь, если что, именно клавишу бэкспэйс переопределять будут, а не функцию, верно?

Справка подсказывает, что можно сделать низкоуровневое переназначение:

(define-key key-translation-map (kbd "C-h") (kbd "DEL"))
(define-key key-translation-map (kbd "C-w") (kbd "<C-backspace>"))
(define-key key-translation-map (kbd "C-u") (kbd "<C-S-backspace>"))

(К слову, откуда такая неконсистенстность: почему именно DEL, <backspace> нельзя, но <C-backspace>, C-DEL нельзя?)

Но это ведь значит, что какая-нибудь C-c C-w (где бы и что бы она ни значила) перестанет работать, так?

Как же правильно?

★★★★★

Насколько нужно быть альтернативно одаренным, чтобы отказываться от справки (C-h) и от префикса (C-u)? Удачи тебе, больше добавить нечего...

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

Насколько нужно быть альтернативно одаренным, чтобы отказаться...

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

Zmicier ★★★★★
() автор топика
Последнее исправление: Zmicier (всего исправлений: 2)
Ответ на: комментарий от iVS

чтобы отказываться от справки (C-h)

F1,

насколько нужно быть одарённым, чтобы отказываться от консистентности?

lazyklimm ★★★★★
()

у меня, если что, так:

(global-set-key "\C-w" 'backward-kill-word)
(global-set-key "\C-x\C-k" 'kill-region)
(global-set-key "\C-h" 'delete-backward-char)
(define-key isearch-mode-map "\C-h" 'isearch-delete-char)

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

Префикс делается удерживанием META

Не всегда. Некоторые команды ЕМНИП распознают отдельно C-u, и отдельно M-4, т.е. как разные префиксы.

no-such-file ★★★★★
()

какая-нибудь C-c C-w (где бы и что бы она ни значила) перестанет работать, так?

Нет, не так. C-c - это префикс, и все, что идет после него распознается отдельно.

key-translation-map

А вот так действительно не надо. Используй global-set-key, как уже показали.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от pashazz

В смысле? Даже я уже за один день успел узнать команду, для которой C-u ≠ M-4, — C-y (вставка). Полагаю, что чем дальше в лес, тем их будет больше.

Zmicier ★★★★★
() автор топика
Ответ на: комментарий от no-such-file

Нет, не так. C-c - это префикс, и все, что идет после него распознается отдельно.

Как «не так»? Я же проверял.

(local-set-key (kbd "C-c C-w")
               (lambda ()
                 (interactive)
                 (message "ququ")))

C-c C-w
→ "ququ"

(define-key key-translation-map (kbd "C-w") (kbd "<C-backspace>"))

C-c C-w
→ C-c <C-backspace> is undefined

Используй global-set-key, как уже показали.

Показали способ получить вместо умного емаксового бэкпэйса тупой блокнотный.

Zmicier ★★★★★
() автор топика
Ответ на: комментарий от no-such-file

Используй global-set-key

А впрочем... Я написал «на дурака»:

(global-set-key (kbd "C-h") (kbd "DEL"))
...

И кажется, оно работает. Полдела есть.

К слову, как мне можно было узнать, что так можно — писать сочетание клавиш, а не функцию, из справки? (Нет, COMMAND здесь — не ссылка.)

global-set-key is an interactive compiled Lisp function in `subr.el'.

(global-set-key KEY COMMAND)

Give KEY a global binding as COMMAND.
COMMAND is the command definition to use; usually it is
a symbol naming an interactively-callable function.
KEY is a key sequence; noninteractively, it is a string or vector
of characters or event types, and non-ASCII characters with codes
above 127 (such as ISO Latin-1) can be included if you use a vector.

Остались вторые полдела: как быть с режимами, где не DEL означает что-то особенное, а C-h. Пример — вышеприведенный isearch-mode, там это местная справка, и она перебивает глобальную привязку. Вариант «не трогать», возможно и разумен, но пока не принимается.

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

вышеприведенный isearch-mode, там это местная справка, и она перебивает глобальную привязку

Видимо

(define-key isearch-mode-map (kbd "C-h") (kbd "DEL"))

Я же проверял

А я тебе говорил не использовать key-translation-map

no-such-file ★★★★★
()

Я тут решил в новом году серьезно подойти к GNU Emacs’у

Педальку на новый год подарили?

entefeed ☆☆☆
()
Ответ на: комментарий от no-such-file

(define-key isearch-mode-map (kbd "C-h") (kbd "DEL"))

Да это понятно. Но мне так что, все режимы вручную перебирать?

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