bash 홈 / 종료 / 삭제 키가 물결표를 삽입하거나 이스케이프 키가 앞에 오는 경우 [1 ~ [3 ~


20

bash에서 home/ end/ delete키는 물결표를 삽입하거나 이스케이프 키가 앞에 오는 경우 :[1~

내가 입력 그래서 echo hellp,에 이동 커서 hel|lp및 삭제 입력 한 빵, 내가 가지고~tilde

또한을 입력 echo hellp하고 커서를 이동 hel|lp하고 esc를 입력 한 다음 삭제하고 bam을 얻습니다.[3~

$ echo hel~lp
hel~lp

$ echo hell[3~o
hell[3~o
~

내 배쉬 버전 :

$ 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. 현재 줄 / 버퍼에서 다음 문자 (커서 오른쪽)를 삭제하려면 delete를 원합니다.

이 문제를 해결하려면 무엇을 편집해야합니까? 당신의 배쉬에 이것이 기본값입니까?

업데이트 : 나는 msys 용 mingw로 컴파일 된 Windows 프로그램 sh.exe (GNU bash에서 볼 수 있듯이)를 실행하는 Windows 컴퓨터에 있습니다.

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

Windows, 터미널 에뮬레이터 없음, msys.bat, 설정을보고하는 방법을 알고 있다면 설정 방법을 묻지 않을 것입니다.
선택 사항 인

답변:


22

.inputrc파일을 통해 bash를 사용자 정의 /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있지만 현재 사용하지 않는 작업 (창 제한) 수행

사용 가능한 명령 (예 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

아! 수정 : $if mode=emacs블록을 제외하고 .inputrc를 사용했습니다 . 이 두 줄을 추가했는데 다시 작동합니다 !! : D "\e[1~": beginning-of-line ... "\e[4~": end-of-line.
aliteralmind

RHL에서-/ etc / inputrc의 기본 파일
Deian

불행히도 클러스터 컴퓨터에서 해당 파일에 대한 쓰기 권한이 없습니다.
Herman Toothrot

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 설치 확인

최근 데비안 / 우분투 의 최소 설치 에서 이런 일이 발생 하면 readline-common패키지를 설치하지 않았기 때문일 수 있습니다 . 패키지를 설치하기 만하면 해결됩니다.

예를 들어 데비안 스트레치 입력으로 도커에 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

@Kevin 이것이 올바른 진술이지만 Q & A의 맥락과 어떤 관련이 있습니까?
gertvdijk

1
그렇기 때문에 귀하의 답변에 대한 수정 사항으로 제안하는 대신 의견으로 남겨 두었습니다. 새로 설치된 readline-common을 사용하기 위해 새로운 쉘이 필요하다는 것을 알았으며 컨테이너를 이미지로 커밋하는 것을 하나의 수단으로 보여주었습니다. 특히 Docker를 예로 사용했기 때문에 내 의견이 적절하다고 생각했습니다.
Kevin

@Kevin Ah, 알았어. 그럼 요점을 오해 했어. 새로운 로그인 쉘을 얻는 데는 여러 가지 방법이 있으며 그 중 하나입니다. :)
gertvdijk

2

https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working 도 도움이되었습니다.

구체적으로 특별히:

키가 작동하지 않으면 특정 터미널이이 목록에없는 이스케이프 코드를 전송하기 때문일 수 있습니다. 먼저 어떤 이스케이프 코드가 전송되는지 확인해야합니다. 이를 보려면 "quoted-insert"라는 Readline 명령을 사용하거나 showkey --scancodes 명령을 실행하여 키 그대로의 값을 출력하십시오. 인용 삽입의 기본 바인딩은 Ctrl + V입니다.

예를 들어, 터미널에 다음과 같은 일련의 입력을 제공 할 수 있습니다.

Ctrl+V
Home
Spacebar
Ctrl+V
End

그리고 출력으로 얻으십시오

$ ^ [[1 ~ ^ [[4 ~

^ [는 쉘의 이스케이프 문자를 나타내므로 홈 키의 이스케이프 코드는 [1 ~이고 종료 키의 이스케이프 코드는 [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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.