Ключ bash home/end/delete вставляет тильду или, если ему предшествует escape-клавиша, [1~ [3~
В bash ключ home / end / delete вставляет тильду или, если ему предшествует escape-ключ: [1~
Так что я печатаю echo hellp
, переместите курсор на hel|lp
и типа удалить, и БАМ, я получил ~tilde
Также я печатаю echo hellp
, переместите курсор на hel|lp
и наберите esc, затем удалите, и БАМ, я получил [3~
$ echo hel~lp
hel~lp
$ echo hell[3~o
hell[3~o
~
Моя версия Bash:
$ bash --version
GNU bash, version 3.1.17(1)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.
То, что я хочу, это как поведение cmd.exe
:
- Я хочу, чтобы Esc очищала текущую строку / буфер
- Я хочу, чтобы Home переместил курсор в начало строки перед первым символом
- Я хочу, чтобы End переместил курсор в конец строки перед первым символом
- Я хочу удалить, чтобы удалить следующий символ (справа от курсора) из текущей строки / буфера
Что мне нужно отредактировать, чтобы это исправить? Это по умолчанию на вашем Bash?
обновление: я на машине с Windows, на которой запущена программа для Windows, sh.exe (как вы можете видеть выше, GNU bash), скомпилированная с mingw для msys:
$ uname -s -m -o
MINGW32_NT-5.1 i686 Msys
4 ответа
Вы настраиваете bash через .inputrc
файл в вашем /home/username
Вы можете скопировать по умолчанию
cp /etc/inputrc.default ~/.inputrc
вот мой (комментарии начинаются с #)
# Key-bindings for the command-line editor.
# Ask before displaying >50 items
# Since $WINDIR $PATH var can be in $PATH, this could list
# all window exectables in C:\WINDOWS
set completion-query-items 50
# Ignore case for the command-line-completion functionality
# on: default to a Windows style console
# off: default to a *nix style console
set completion-ignore-case on
# none, visible or audible
set bell-style audible
# disable/enable 8bit input
set meta-flag on
set input-meta on
set output-meta off
set convert-meta on
# visible-stats
# Append a mark according to the file type in a listing
set visible-stats off
set mark-directories on
# Show all instead of beeping first
set show-all-if-ambiguous off
# MSYSTEM is emacs based
$if mode=emacs
# Common to Console & RXVT
"\C-?": backward-kill-line # Ctrl-BackSpace
"\e[2~": paste-from-clipboard # "Ins. Key"
"\e[5~": beginning-of-history # Page up
"\e[6~": end-of-history # Page down
$if term=msys # RXVT
"\e[7~": beginning-of-line # Home Key
"\e[8~": end-of-line # End Key
"\e[11~": display-shell-version # F1
"\e[15~": re-read-init-file # F5
#$endif
#$if term=cygwin # Console
$else
"\e[1~": beginning-of-line # Home Key
"\e[4~": end-of-line # End Key
"\e[3~": delete-char # Delete Key
#~ "\e\e[D": backward-word # Alt-LeftArrow
#~ "\e\e[C": forward-word # Alt-RightArrow
"\M-\e[D": backward-word # Alt-LeftArrow
"\M-\e[C": forward-word # Alt-RightArrow
`#~` "\C-\E[D": backward-word # Ctrl-LeftArrow, nowork, can't be made to work
#~`enter preformatted text here` "\C-\E[C": forward-word # Ctrl-RightArrow, nowork, can't be made to work
#~ to see current bindings use bind -q backward-kill-line
"\e\e": kill-whole-line # double/triple escape works :) Esc/Escape to delete current line like cmd.exe
$endif
$endif
чтобы узнать, что вам нужно ввести в свой inputrc с левой стороны (escape-код, поскольку он может варьироваться в зависимости от ноутбука / рабочего стола...), в командной строке введите echo '
затем введите Ctrl-V
сопровождаемый ключом, как Home
затем введите '
пример
$ echo ' home key ^[[1~ '
home key
~
$ echo ' end key ^[[4~ '
end key
~
$ echo ' pg up page up ^[[5~ '
pg up page up
~
$ echo ' pg dn page down ^[[6~ '
pg dn page down
~
затем заменить каждый ^[
с \e
добавлять \M-
за Alt
теоретически вы бы использовали \C-
за Ctrl
но в настоящее время это не работает (ограничение Windows)
доступные команды (например, backward-kill-line
) перечислены в http://www.gnu.org/software/bash/manual/bashref.html
Вы можете просмотреть существующие сочетания клавиш / привязки с bind -p
или же
$ bind -q backward-kill-word
backward-kill-word can be invoked via "\M-\C-h", "\M-\C-?".
~
$ bind -q backward-word
backward-word can be invoked via "\M-\M-[D", "\M-b", "\C-\E[[D".
~
$ bind -q beginning-of-line
beginning-of-line can be invoked via "\C-a", "\M-OH", "\M-[1~", "\M-[H".
~
не связывайтесь с TERMCAP
Проверьте установку Readline
Когда это происходит на минимальной установке последних Debian/Ubuntu, это, вероятно, потому что вы не установили readline-common
пакет. Простая установка пакета решит это.
Например, в Docker с использованием Debian Stretch ls
ГЛАВНАЯ:
$ docker run --rm -it debian:stretch
root@6ae7baea9e5a:/# ls~
$ docker run -it --name=debian-stretch-readline-temp debian:stretch
root@2092cb968232:/# apt-get update
root@2092cb968232:/# apt-get install readline-common
$ docker commit debian-stretch-readline-temp debian-stretch-with-readline
$ docker run --rm -it debian-stretch-with-readline
root@53739343e9f7:/# ls
Обратите внимание, что после установки readline-common это повлияет только на новые оболочки входа в систему.
Ну, поскольку вы говорите, что работаете в Windows и не используете подходящий эмулятор терминала, такой как PuTTY (с mintty, puttycyg и др.), Я бы порекомендовал вам обратиться к документации по readline и изучить ярлыки для readline. Это будет лучше в долгосрочной перспективе.
Если бы вы использовали эмулятор терминала вместо окна консоли (не говоря уже о интерпретаторе / оболочке), который поставляется с Windows, вы бы получили более настраиваемую альтернативу. Когда вы попытаетесь использовать другие программы, такие как Vim, все будет только хуже.
Суть: используйте подходящий эмулятор терминала, даже в Windows, или изучите ярлыки readline. Я проверил те, которые я использую больше всего сейчас, и они работают с msys.bat
,
mingw-get install mintty && mintty
Файл для редактирования будет /usr/share/terminfo
(которого нет в MinGW) - используйте tic
"компилировать" правила (которые даже не включены, потому что все знают, что поддержка будет серьезно повреждена). Тем не менее, я не видел никакой полезной разработки, чтобы сделать это даже почти пригодным для использования в Windows. Вот почему вы должны использовать правильный эмулятор терминала в первую очередь. Но я уверен, что хирург сможет использовать кухонный нож для операции, так почему бы вам не использовать встроенные окна консоли Windows. Удачи.
Я также нашел следующее полезное: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working
В частности:
Если ваши ключи не работают, это может быть потому, что ваш конкретный терминал отправляет escape-коды, которых нет в этом списке. Сначала нужно выяснить, какие коды эвакуации отправляются. Чтобы увидеть их, вы можете использовать команду Readline с именем "quoted-insert" или выполнить команду showkey --scancodes, которая дословно выводит значение ключа. Связывание по умолчанию для цитирования-вставки - Ctrl+V.
Например, вы могли бы дать следующую последовательность входов в вашем терминале:
Ctrl+V
Home
Spacebar
Ctrl+V
End
И получить в качестве вывода
$ ^[[1~ ^[[4~
Символ ^ [обозначает escape-символ в вашей оболочке, так что это означает, что ваш ключ Home имеет escape-код [1 ~, а ваш ключ End имеет escape-код [4~. Поскольку эти escape-коды не указаны в конфигурации Readline по умолчанию, вам необходимо добавить их:
"\e[1~": beginning-of-line
"\e[4~": end-of-line
Обратите внимание, что Readline использует \e для обозначения escape-символа.
Для меня соответствующая часть была помещать это в inputrc:
"\e[1~": beginning-of-line
"\e[4~": end-of-line