Alt-Left для пропуска слов не работает в эмуляторах терминала


16

На предыдущей работе на компьютере с Debian Wheezy я привык к Alt + Left и Alt + Right, чтобы пропустить слова в активной командной строке (в bash).

Однако, поскольку дома я обновился до Jessie (Debian 8.0, тестирующая ветвь), это больше не работает: вместо перехода к предыдущему слову, Alt-Left печатает что-то вроде Dили [D. OTOH, если я открою ssh и подключусь к своему безголовому Debian Wheezy, он отлично работает.

Кроме того, я только что установил Fedora 20 на своей новой работе, и здесь поведение такое же. Это относится к bash, csh и ksh (началось с env -i), а также к rxvt-unicode и xfce4-терминал, поэтому он должен быть чем-то за пределами этого уровня.

Где еще в стеке я должен искать разницу?


4
Я бы предложил попробовать alt-b и alt-f (а также остальные ключи readline), так как они более универсальны, и довольно много программ командной строки поддерживают привязки readline.
скромно

Ответы:


21

Возможно, вы определили локальный ~/.inputrcили глобальный /etc/inputrcфайл, который был потерян при обновлении. Простое решение - создать ~/.inputrcфайл со следующими строками:

## enable Alt-arrows 
"\e[1;3D": backward-word ### Alt left
"\e[1;3C": forward-word ### Alt right

Те будут работать с xtermи terminatorи, gnome-terminalно, возможно, должны быть настроены для других терминалов. К сожалению, каждый эмулятор терминала может использовать свой синтаксис. Для более подробной информации, смотрите мой ответ здесь .


Я действительно имел в виду Alt, и он все еще работает на удаленной машине. Ctrl + Left / Right уже используется в Rxvt для перемещения вкладок влево и вправо (Shift + Left / Right переключает вкладки, а Shift + Down открывает новую).
Алоис Махдал

1
Кстати, в то время как Ctrl + Left / Right распространен в графических редакторах, терминалы - это совершенно другой мир, где я еще не видел эту комбинацию.
Алоис Махдал

10

Тердон направил меня в правильном направлении: файл inputrc .

Преступник заключается в том, что readline6 на самом деле использует ~ / .inputrc вместо / etc / inputrc, что readline (3) не подчеркивает и не опровергает:

Имя этого файла берется из значения переменной среды INPUTRC. Если эта переменная не установлена, по умолчанию используется ~ / .inputrc. Если этот файл не существует или не может быть прочитан, по умолчанию используется файл / etc / inputrc.

Таким образом , в то время как на обеих машинах Debian / и т.д. / INPUTRC идентична обеспеченному libreadline6 пакета (версия та же, а), на новой машине ~ / .inputrc существует с одной строкой: set bell-style none. Когда этот файл удален, все работает нормально (см. Примечания ниже).

Я не могу проверить Fedora до завтра, но я думаю, что это та же проблема. Обновление: в Fedora ~ / .inputrc не существовало, здесь / etc / inputrc просто отличается, поэтому может не определять это. В качестве исправления я просто сохранил inputrc Debian как мой ~ / .inputrc.


Примечания:

Тайна, как это изменилось во время обновления 7> 8, остается нерешенной, но отчасти это можно объяснить моей плохой памятью и манипуляциями с некоторыми непреднамеренными точечными файлами. (Кстати, это было не обновление APT, а переустановка и перемещение точечного файла вручную, так что, возможно, ~ .inputrc каким-то образом помешал.)

Кроме того, когда я говорю «ОК», я имею в виду, что он работает с Ctrl везде, кроме Rxvt (ОК, я проверил только xfce4-терминал, но мы знаем, что Rxvt - обычный бунтарь), где это переназначается на Alt, по-видимому, потому что Ctrl берется Rxvt -специфичная функциональность - переместить активную вкладку в список.

Как упоминает man-страница, в bash вы можете использовать встроенную команду bind, чтобы выяснить, что у вас есть в данный момент.


Хороший улов +1. На самом деле, это более интуитивно, чем вы думаете. Поведение по умолчанию для пользовательских точечных файлов имеет приоритет над общесистемными значениями по умолчанию. В противном случае пользователи не смогут изменить свои настройки.
Terdon

Смотрите обновленный ответ о том, как конкретно включить Alt + стрелки.
Terdon

2
Это нормально, вам нужно быть $include /etc/inputrcнаверху, ~/.inputrcесли вы тоже хотите это прочитать.
Крис Даун

@terdon Совершенно разумно предпочесть пользовательские настройки перед общесистемными, но то, что я считаю более интуитивно понятным, это то, что ~ / .initrc будет «объединен» с / etc / initrc (т.е. / etc / initrc будет $included по умолчанию).
Алоис Махдал

1
Смотрите: 1. жестко запрограммированные параметры, 2. / etc / initrc, 3. ~ / .initrc --vs-- 1. жестко запрограммированные параметры 2. / etc / initrc ИЛИ ~ / .initrc. Первый способ гораздо более гибкий, поскольку его можно легко расширить до более низкого уровня (например, для проекта, я допускаю, что этот пример не имеет особого смысла в readline, но вы понимаете, в чем дело).
Алоис Махдал
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.