115

Клавиши Home, End, PageUp, PageDown все вводят ~ в моем сеансе bash вместо перемещения курсора / вида вокруг. Почему это происходит и какие настройки мне нужно изменить?

GNU bash, version 4.0.28(1)-release (x86_64--netbsd)
PuTTY v0.60

Вопрос изначально читал:

Почему в PuTTY нажатие клавиши "Home" на оболочке (bash) набирает «~»? Или, скорее, как заставить его переместить курсор в начало набранной мной команды?

(Я думал, что причина в том, что ~ является домашним каталогом, но ответы говорят, что это не так.)

7 ответов7

141

Измените строку типа терминала на вкладке «Соединение> Данные» со значения по умолчанию «xterm» на «linux». Это сработало для меня.

41

Это происходит потому, что у вас неверно установлен тип терминала PuTTY или на вашем сервере не установлены правильные определения terminfo.

В системах Debian основы, тот Ncurses срок пакет (версия 5.7+20081213-1) включает в себя Terminfo файлов определения для шпаклевки, замазки-и типов 256 - цветных клеммной замазки VT100. Если у вас установлен этот пакет, вы можете установить "строку типа терминала" в "putty" вместо значения по умолчанию "xterm" в конфигурации сеанса Putty (Соединение -> Данные).

Стивен Айронс также упоминает "linux" как еще один тип терминала, который работает; Я верю, что это верно из предыдущего опыта, но недавно не проверял.

В моих системах это позволяет Home и End работать правильно, хотя PageUp/PageDown не прокручивают окно консоли. (Они работают правильно в приложениях ncurses, таких как aptitude, и Shift-PgUp/Shift-PgDn прокручивают окно консоли.)

18

Если вы хотите проверить, какой код отправляется PuTTY на ваш терминал, когда вы нажимаете клавишу или комбинацию клавиш, вам просто нужно нажать Ctrl+V а затем нажать нужную клавишу.

Например, на моем ящике нажатие клавиши Home создаст следующую строку на моем терминале:

^[[1~

Это означает, что PuTTY отправляет escape-символ ^ [, за которым следует строка [1 ~.

Вы можете создать файл ~/.inputrc в папке $HOME или, альтернативно, файл /etc/inputrc зависимости от вашей системы. Затем заполните этот файл кодами PuTTY и соответствующими действиями Bash, которые вы хотите запустить Bash.

Примечание. Замените каждый символ ^ [ эквивалентной строкой \e

В моем примере я добавлю строку с моим кодом ключа Home и действием начала строки (которое по умолчанию связано с Ctrl+A в Bash):

"\e[1~": beginning-of-line

К вашему сведению, мой файл inputrc имеет следующее содержимое:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
"\e[1~": beginning-of-line     # Home key
"\e[4~": end-of-line           # End key
"\e[5~": beginning-of-history  # PageUp key
"\e[6~": end-of-history        # PageDown key
"\e[3~": delete-char           # Delete key
"\e[2~": quoted-insert         # Insert key
"\eOD": backward-word          # Ctrl + Left Arrow key
"\eOC": forward-word           # Ctrl + Right Arrow key

От @Cimbali: Более привязываемые команды (например, предыдущая история: Переместить «вверх» по списку истории) доступны на этой странице ссылок.

13

Crtl+A ведет вас к началу линии

Вот список сочетаний клавиш Bash

9

На самом деле он отправляет ^[[1~ который является escape-последовательностью терминала, состоящей из:

  • ^ [- побег
  • [- левая квадратная скобка
  • 1 - один
  • ~ - тильда

Вы можете увидеть это, нажав Ctrl+V, а затем Home.

Возможно, вам удастся решить вашу проблему, изменив настройку клавиатуры PuTTY для клавиш Home и End на rxvt (что делает escape-последовательность ^[[H или изменив используемый вами $ TERM (или отредактировав ~/.inputrc),

Между прочим, нет никакой связи между тильдой, которую вы получаете при нажатии Home, и тильдой, которая представляет домашний каталог. Например, в моей настройке Page-Down выдает ^[[6~ который также печатал бы тильду, если ее неправильно интерпретировать.

2

Ни один из этих вариантов не работал для меня. Я использую старую систему AIX. Я должен был добавить следующие псевдонимы в мой .profile

alias __A=$(print '\0020') # ^P = up = previous command
alias __B=$(print '\0016') # ^N = down = next command
alias __C=$(print '\0006') # ^F = right = forward a character
alias __D=$(print '\0002') # ^B = left = back a character
1

Я не мог заставить его работать с другими методами. Однако я создал этот скрипт AutoHotkey, который работает, если ваша оболочка - Bash:

#IfWinActive ahk_class PuTTY
PgUp::Send +{PgUp}
PgDn::Send +{PgDn}
Home::Send ^a   ; beginning of line
End::Send ^e    ; end of line
+^Del::Send ^k  ; delete whole line after cursor
+End::Send ^k   ; delete whole line after cursor
+Home::Send ^u  ; delete whole line before cursor
^Del::Send !d   ; delete word after cursor
^BS::Send ^w    ; delete word before cursor
^Left::Send !b  ; jump word left
^Right::Send !f ; jump word right
#IfWinActive

Однако используйте с осторожностью , поскольку не все эти горячие клавиши bash работают в других программах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .