ключ bash home / end / delete вставляет тильду или, если ему предшествует escape-клавиша, [1 ~ [3 ~


20

В bash ключ home/ end/ deleteвставляет тильду или, если ему предшествует escape-ключ:[1~

Поэтому я печатаю echo hellp, перемещаю курсор hel|lpи печатаю delete, и bam, я получил~tilde

Кроме того, я печатаю echo hellp, перемещаю курсор hel|lpи набираю esc, затем удаляю, и bam, я получил[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:

  1. Я хочу, чтобы Esc очищала текущую строку / буфер
  2. Я хочу, чтобы Home переместил курсор в начало строки перед первым символом
  3. Я хочу, чтобы End переместил курсор в конец строки перед первым символом
  4. Я хочу удалить, чтобы удалить следующий символ (справа от курсора) из текущей строки / буфера

Что мне нужно отредактировать, чтобы это исправить? Это по умолчанию на вашем Bash?

обновление: я на машине с Windows, на которой запущена программа для Windows, sh.exe (как вы можете видеть выше, GNU bash), скомпилированная с mingw для msys:

$ uname -s -m -o
MINGW32_NT-5.1 i686 Msys

Windows, без эмулятора терминала, msys.bat, если бы я знал, как сообщить о настройке, я бы не спрашивал, как их установить
необязательно

Ответы:


22

Вы настраиваете 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 с левой стороны (управляющий код, так как он может варьироваться в зависимости от ноутбука / рабочего стола ...), введите в командной строке, 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#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029

Вы можете просмотреть существующие сочетания клавиш / привязки с 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


find / -name 'inputrc.default'ничего не находит на моей машине. Мой дом и конец работали ... :( Кроме того, к вашему сведению: для перезагрузки файла .inputrc используйте bind -f ~/.inputrc.
aliteralmind

Ах! Исправление: я использовал ваш .inputrc, кроме $if mode=emacsблока. Я добавил эти две строки, и они снова работают !! : D "\e[1~": beginning-of-line ... "\e[4~": end-of-line.
aliteralmind

на БРЗ - файл по умолчанию в / etc / inputrc
Deian

к сожалению, у меня нет прав на запись в этот файл на компьютере кластера.
Герман Тутрот

5

Ну, так как вы говорите, что работаете в Windows и не используете подходящий эмулятор терминала, такой как PuTTY (с mintty , puttycyg и др. ), Я бы порекомендовал вам обратиться к документации по readline и изучить ярлыки для readline. Это будет лучше в долгосрочной перспективе.

Если бы вы использовали эмулятор терминала вместо окна консоли (не говоря уже о интерпретаторе / оболочке), который поставляется с Windows, вы бы получили более настраиваемую альтернативу. Когда вы попытаетесь использовать другие программы, такие как Vim, все будет только хуже.

Суть: используйте подходящий эмулятор терминала, даже в Windows, или изучите ярлыки readline. Я проверил те, которые я использую больше всего сейчас, и они работают с msys.bat.

mingw-get install mintty && mintty

Файл для редактирования будет иметь /usr/share/terminfo(который не существует в MinGW) - использование ticдля «компиляции» правил (которые даже не включено , потому что все знают , что поддержка будет сильно подорваны). Тем не менее, я не видел никакой полезной разработки, чтобы сделать это даже почти пригодным для использования в Windows. Вот почему вы должны использовать правильный эмулятор терминала в первую очередь. Но я уверен, что хирург сможет использовать кухонный нож для операции, так почему бы вам не использовать встроенные окна консоли Windows. Удачи.


4

Проверьте установку Readline

Когда это происходит при минимальной установке последней версии Debian / Ubuntu, возможно, это потому, что вы не установили readline-commonпакет. Простая установка пакета решит это.

Например, в Docker с использованием Debian Stretch ls HOME:

$ 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 это повлияет только на новые оболочки входа в систему.


exec bashэто способ замены текущего экземпляра bash новым без выхода из терминала (что может потребоваться при воспроизведении в контейнере pTTY).
Кевин

@Kevin Хотя это правильное утверждение, какое отношение это имеет к контексту вопросов и ответов здесь?
gertvdijk

1
именно поэтому я оставил это как комментарий вместо того, чтобы предложить это как изменение к вашему ответу. Вы отметили необходимость в новой оболочке для использования недавно установленной readline-common и показали, что фиксация контейнера в качестве образа является одним из способов достижения этого. Тем более, что вы использовали Docker в качестве своего примера, я подумал, что мой комментарий актуален.
Кевин

@ Кевин А, ладно, тогда я неправильно понял вашу точку зрения. Существует много способов получить новую оболочку для входа, ваш - один из них. :)
gertvdijk

2

Я также нашел следующее полезное: 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.