LINUX.ORG.RU

Сочетания клавиш в Midnight Commander

 , ,


0

1

В mcedit настроены следующие сочетания клавиш: home в верх файла end в низ файла ctrl+home в начало строки ctrl+end в конец строки

echo $TERM
linux

В программе konsole при наборе команды cat и нажатии этих клавиш выдаёт следующие коды:

home и ctrl+home  ^[[1~
end и ctrl+end    ^[[4~

При этом в mcedit они работают как надо. В программе kitty при наборе команды cat и нажатии этих клавиш выдаёт следующие коды:

home ^[[1~
end  ^[[4~
ctrl+home ^[[1;5H
ctrl+end ^[[1;5F

Коды такие как надо - правильные в отличии от тех что были в konsole, но при этом курсор при нажатии на ctrl+home или ctrl+end не двигается вообще, хотя так как коды правильные должен перемещаться в начало или конец строки, а при нажатии home и end перемещается вверх или вниз файла так как и надо. Не могу понять почему не работает ctrl+home и ctrl+end, а в программе konsole наоборот эти сочетания работают хотя коды клавиш не те?

Перемещено hobbit из general

★★

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

@dmitry237

После установки kitty, конфига у него не было и коды для home и end были неправильные, соответственно в mcedit они не работали, как и F1-F4, а вот для ctrl+home и ctrl+end были правильные, но они - правильные не работают, хотя в неправильные а вернее сказать один и тот же код, в konsole работают.

Вот какие были в kitty без конфига:

home ^[[H
end  ^[[F
ctrl+home ^[[1;5H
ctrl+end ^[[1;5F

Вот мой конфиг ~/.config/kitty/kitty.conf

font_family Fira Mono
font_size 20.0

map home send_text all \x1b[1~
map end send_text all \x1b[4~
map f1 send_text all \x1b[[A
map f2 send_text all \x1b[[B
map f3 send_text all \x1b[[C
map f4 send_text all \x1b[[D

После создания конфига коды для home и end стали правильные и они заработали.

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

Дал для home и ctrl+home и для end - ctrl+end одинаковые коды, и стало как в konsole, вот конфиг:

font_family Fira Mono
font_size 20.0

map home send_text all \x1b[1~
map end send_text all \x1b[4~
map ctrl+home send_text all \x1b[1~
map ctrl+end send_text all \x1b[4~
map f1 send_text all \x1b[[A
map f2 send_text all \x1b[[B
map f3 send_text all \x1b[[C
map f4 send_text all \x1b[[D

И как в konsole всё правильно заработало. Как mcedit различает нажатие home и ctrl+home коды ведь одинаковые и если сделать вот такой конфиг, вроде как правильный - коды разные:

font_family Fira Mono
font_size 20.0

map home send_text all \x1b[1~
map end send_text all \x1b[4~
map ctrl+home send_text all \x1b[1;5H
map ctrl+end send_text all \x1b[1;5F
map f1 send_text all \x1b[[A
map f2 send_text all \x1b[[B
map f3 send_text all \x1b[[C
map f4 send_text all \x1b[[D

то ctrl+home и ctrl+end уже не работают, курсор стоит на месте. Я не пойму почему так?

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

Не знаю насчёт ctrl+home, но есть другая история - с ctrl-enter. Насколько все знают, для операции «вставить имя выбранного файла в командную строку» в каноничном norton commander-е была комбинация как раз ctrl-enter. Однако в unix-терминалах, по стандарту, ctrl-enter генерит ровно тот же символ что enter - '\r', который из-за ядерных настроек терминала tcsetattr() превращается в '\n'. Так вот, в mc для того чтобы, тем не менее, поддерживать этот хоткей, устроены костыли, которые однако не работают через ssh, поэтому по ssh для той же функции есть alt-enter. Костыли такие: в ядерной консоли он опрашивает состояние клавиатуры каким-то отдельным сисколлом, в иксах - коннектится к искам по их гуи-протоколу и опрашивает состояние кнопки ctrl через них.

Возможно, у тебя то же самое.

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

Ну ты спрашивал как он их отличает при одинаковых кодах - я и ответил как это можно сделать.

Почему не работают ^[[1;5H - другой вопрос.

У меня в xfce4-terminal кстати такие

^[[H
^[[F
^[[1;5H
^[[1;5F
TERM=xterm-256color

В mc работают. Если поставить TERM=xterm тоже работают, а если поставить TERM=linux то перестают работать и эти и даже F1-F5 (F6-F10 работают).

А откуда у тебя TERM=linux взялся?

И с чего ты решил что ^[[1~ - правильный код для Home? Я такого нигде не видел.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Никогда не устанавливай $TERM в значения, которые не поддерживаются эмулятором терминала явно. Значение linux вообще вряд ли где-то будет корректно работать, кроме «ядерной консоли». Konsole, вероятно, эмулирует xterm, так что там должны работать xterm и xterm-256color.

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

@firkax

@anonymous

В mc работают. Если поставить TERM=xterm тоже работают, а если поставить TERM=linux то перестают работать и эти и даже F1-F5 (F6-F10 работают).

У меня наоборот в xterm F1-F4 не работают, а в linux работают.

А откуда у тебя TERM=linux взялся?

В ~/.bashrc сам прописал, так как в xterm не работают F1-F4.

И с чего ты решил что ^[[1~ - правильный код для Home? Я такого нигде не видел.

Могу ошибаться но помоему он в terminfo для linux прописан. Позже гляну. И он работает, ^[[H проверю.

И откуда ты для F1-F4 такие странные коды взял?

Опять же по моему в terminfo для linux и из cat нажимал и проверял.

Никогда не устанавливай $TERM в значения, которые не поддерживаются эмулятором терминала явно. Значение linux вообще вряд ли где-то будет корректно работать, кроме «ядерной консоли». Konsole, вероятно, эмулирует xterm, так что там должны работать xterm и xterm-256color.

Попробую ещё более чщательней поэкпериментировать с $TERM в konsole и kitty.

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

@firkax

Мне так и не понятно почему в mcedit, ^[[1;5H и ^[[1;5F не работает, если он не использует коды клавиш, а работает насколько я понял со скан-кодами клавиш?

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

Попробую ещё более чщательней поэкпериментировать с $TERM в konsole и kitty.

С ними не надо экспериментировать. Если ты ставишь левое значение TERM, то просто добавляешь вредную степень свободы в ситуацию. Просто убери любые манипуляции с этой переменной отовсюду, где они есть. Я в курсе, что интернет полон рекомендаций поменять TERM, но это никогда не является хорошей идеей, и годится только для временного обхода какой-то проблемы.

Какие у тебя версии mc и kitty?

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

Сканкодов у него нет, у него есть только эти последовательности. Распознавание нажатого ctrl-а (и только его), да ещё и асинхронное - отдельный костыль поверх них.

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

Убери TERM= из bashrc и убери кастомные бинды из конфига kitty. В mc запусти learn keys (это пункт в меню настроек) и покажи ему все кнопки, возможно после этого всё станет работать как надо.

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

и из cat нажимал и проверял.

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

Надо будет добавить эту вариацию в свой парсер tty-кнопок чтобы понимал их тоже.

Попробую ещё более чщательней поэкпериментировать с $TERM в konsole и kitty.

Не надо. Они сами ставят правильный $TERM, соответствующий их таблицам кнопок, ты можешь только сменить его на неправильный и всё сломать. Просто не трогай его.

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

@anonymous

Никогда не устанавливай $TERM в значения, которые не поддерживаются эмулятором терминала явно. Значение linux вообще вряд ли где-то будет корректно работать, кроме «ядерной консоли». Konsole, вероятно, эмулирует xterm, так что там должны работать xterm и xterm-256color.

В графическом интерфейсе настроек программы konsole, в настройках профиля -> Клавиатура -> Схема привязок клавиш, нет консоли xterm. Там есть следующие консоли:

macOS

Консоль Linux

Консоль Solaris

По умолчанию (XFree 4)

и всё.

Может это я так в конфиге сделал,я уже не помню, а во время обновления просто нажимал оставить старые настройки вот всё так и осталось после обновления.

Какие у тебя версии mc и kitty?

mc --version
GNU Midnight Commander, версия 4.8.29
Скомпилирован с библиотекой GLib версии 2.74.5
С библиотекой S-Lang 2.3.3 и с базой данных terminfo
Скомпилирован с библиотекой libssh2 версии 1.10.0
Со встроенным редактором и поддержкой Aspell
C поддержкой внутренней командной оболочки
С поддержкой фоновых операций
С поддержкой мыши в xterm и консоли Linux
С поддержкой событий X11
С поддержкой интернационализации
С поддержкой многих кодировок
С поддержкой ext2fs атрибутов
Виртуальная файловая система:
 cpiofs, tarfs, sfs, extfs, ext2undelfs, ftpfs, sftpfs, fish
Тип данных:
 char: 8; int: 32; long: 64; void *: 64; size_t: 64; off_t: 64;
kitty --version
kitty 0.26.5 created by Kovid Goyal
v4567 ★★
() автор топика
Последнее исправление: v4567 (всего исправлений: 1)
Ответ на: комментарий от v4567

Дело уже не во всех этих консолях и терминалах. Мне просто хочется выяснить как mc распознаёт нажатия клавиш?

Если это на уровне скан-кодов, тогда всё логично при одинаковых кодах клавиш он видит что был нажат в начале ctrl, а потом home и знает из настроек что при нажатии этих двух клавиш надо производить следующие действия - перемещаться в начало строки, хотя код такой же как и при нажатии просто клавиши Home. Но почему тогда когда коды разные ctrl+home уже не работает?

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

Kitty 0.41.1, MC 4.8.33. В редакторе Home/End переходят в начало/конец строки, Ctrl+Home/Ctrl+End — в начало/конец файла. Никаких специальных настроек не делалось (я вообще не пользуюсь kitty). В TERM — «xterm-kitty».

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

В графическом интерфейсе настроек программы konsole, в настройках профиля -> Клавиатура -> Схема привязок клавиш, нет консоли xterm. Там есть следующие консоли:

Я ещё раз повторю, эмуляторы терминала (и kitty скорее всего тоже) сами ставят правильное значение $TERM для запускаемых в них прог, и любые замены его на что-то другое могут сделать только хуже, не надо таким заниматься.

Может это я так в конфиге сделал,я уже не помню, а во время обновления просто нажимал оставить старые настройки вот всё так и осталось после обновления.

Создай нового пустого юзера, запусти в нём всё с дефолтными настройками и проверь кнопки. Подозреваю, что всё магически починится.

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

Мне просто хочется выяснить как mc распознаёт нажатия клавиш?

Я тебе выше уже писал. Что там непонятного было? Повторю: никаких сканкодов он не знает и не может знать, клавиши читает так же как и все остальные консольные проги. Для клавиши ctrl (и только для неё) есть отдельный и не всегда работающий костыль чтобы распознавать ctrl+enter и, возможно, ещё какие-то ctrl+кнопки. Чтобы проверить как mc работает без этого костыля, запусти его через ssh.

firkax ★★★★★
()