ключ bash home / end / delete - це вставлення тильду або, якщо йому передує клавіша escape, [1 ~ [3 ~


20

У баші клавіша home/ end/ deleteвставляє тильду, або якщо їй передує клавіша втечі:[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. Я хочу, щоб Головна перемістила курсор на початок рядка перед першим символом
  3. Я хочу, щоб Кінець перемістив курсор до кінця рядка перед першим символом
  4. Я хочу видалити, щоб видалити наступний символ (праворуч від курсору) з поточного рядка / буфера

Що мені потрібно відредагувати, щоб це виправити? Це за замовчуванням у вашому базі?

оновлення: я на машині 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'нічого не знаходить на моїй машині. Мій дім і кінець раніше працювали ... :( Також FYI для інших: Щоб перезавантажити .inputrc файл, використовуйте bind -f ~/.inputrc.
aliteralmind

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

on RHL - файл за замовчуванням у / etc / inputrc
Deian

на жаль, у мене немає доступу на запис до цього файлу на кластерній машині.
Зубний Герман

5

Ну, оскільки ви говорите, що ви працюєте в Windows і не використовуєте належний емулятор терміналів, наприклад PuTTY (з м'ятою , puttycyg та ін. ), Я рекомендую вам ознайомитися з документацією про перегляд рядків та вивчити ярлики для лінії перегляду. Краще буде в перспективі.

Якби ви використовували термінальний емулятор замість вікна консолі (тут не йдеться про інтерпретатор / оболонку), що постачається з Windows, ви отримаєте більш настроювану альтернативу. Після спроби використання інших програм, таких як Vim, все буде тільки гірше.

Суть: використовуйте належний емулятор терміналу навіть у Windows або вивчіть ярлики для читання. Я перевірив ті, якими я зараз користуюсь, і з якими вони працюють msys.bat.

mingw-get install mintty && mintty

Файл для редагування був би /usr/share/terminfo(якого немає в MinGW) - використовуйте ticдля "компіляції" правил (які навіть не включені, тому що всі знають, що підтримка була сильно скалічена). Однак я не бачив жодної корисної розробки, щоб зробити це навіть поруч із можливістю використання в Windows. Ось чому в першу чергу слід використовувати належний емулятор терміналу. Але я впевнений, що хірург зможе використовувати кухонний ніж для операції, то чому б вам не скористатися вбудованими вікнами консолі Windows. Удачі.


4

Перевірте встановлення Readline

Коли це відбувається при мінімальній установці останніх Debian / Ubuntu, це, мабуть, тому, що ви не встановили readline-commonпакет. Просто встановлення пакета вирішить його.

Напр. На Докер з набором тексту 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", і показали створення контейнера як зображення як одного із засобів для досягнення цього. Тим більше, що ви використовували Докера як свій приклад, я вважав, що мій коментар є релевантним.
Кевін

@ Кевін Ах, гаразд, тоді добре зрозумів свою думку. Існує багато способів отримання нової оболонки для входу, ваш - один із них. :)
gertvdijk

2

Також мені було корисно наступне: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working

Конкретно:

Якщо ваші ключі не працюють, це може бути через те, що ваш конкретний термінал надсилає коди евакуації, які не в цьому списку. Спочатку потрібно дізнатися, які коди евакуації надсилаються. Щоб побачити їх, ви можете скористатися командою Readline під назвою "quoted-insert" або запустити команду showkey --scancodes, яка виводить значення ключа дослівно. За замовчуванням прив’язка для котирувальної вставки - Ctrl + V.

Наприклад, ви можете дати наступні серії входів у своєму терміналі:

Ctrl+V
Home
Spacebar
Ctrl+V
End

І отримати як вихід

$ ^ [[1 ~ ^ [[4 ~

^ [Вказує символ утечі у вашій оболонці, тому це означає, що ваш домашній ключ має код евакуації [1 ~, а у вас клавіша End має код евакуації [4 ~. Оскільки ці коди евакуації не вказані у конфігурації Readline за замовчуванням, вам потрібно буде додати їх:

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

Зауважте, що Readline використовує \ e для позначення символу втечі.

Відповідна частина для мене вкладала це в inputrc:

"\e[1~": beginning-of-line
"\e[4~": end-of-line
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.