bash home / end / delete key กำลังทำการใส่เครื่องหมายตัวหนอนหรือหากนำหน้าด้วยคีย์ escape [1 ~ [3 ~


20

ในทุบตีปุ่ม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 --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. ฉันต้องการให้ End เลื่อนเคอร์เซอร์ไปที่ท้ายบรรทัดก่อนอักขระตัวแรก
  4. ฉันต้องการลบเพื่อลบอักขระถัดไป (ด้านขวาของเคอร์เซอร์) จากบรรทัด / บัฟเฟอร์ปัจจุบัน

ฉันต้องแก้ไขอะไรเพื่อแก้ไขปัญหานี้ เป็นค่าเริ่มต้นในทุบตีของคุณหรือไม่

อัปเดต:ฉันอยู่บนเครื่อง windows ที่รันโปรแกรม windows, sh.exe (ดังที่คุณเห็นด้านบนของ GNU bash), คอมไพล์ด้วย mingw สำหรับ msys:

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

windows, ไม่มีเทอร์มินัลอีมูเลเตอร์, msys.bat ถ้าฉันรู้วิธีการรายงานการตั้งค่าฉันจะไม่ถามวิธีการตั้งค่า
ตัวเลือก

คำตอบ:


22

คุณกำหนดทุบตีผ่าน.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บล็อก ฉันเพิ่มสองบรรทัดนี้และพวกเขาทำงานอีกครั้ง !! : "\e[1~": beginning-of-line ... "\e[4~": end-of-lineD
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

เมื่อสิ่งนี้เกิดขึ้นเมื่อมีการติดตั้ง 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 แล้วมันจะมีผลกับเชลล์ล็อกอินใหม่เท่านั้น


exec bashเป็นวิธีการแทนที่อินสแตนซ์ bash ปัจจุบันด้วยอันใหม่โดยไม่ต้องออกจากเทอร์มินัล (เท่าที่จำเป็นเมื่อเล่นใน pTTY ของคอนเทนเนอร์)
เควิน

@ Kevin ในขณะที่เป็นข้อความที่ถูกต้องสิ่งที่เกี่ยวข้องกับบริบทของคำถาม & คำตอบที่นี่?
gertvdijk

1
นั่นคือเหตุผลที่ฉันทิ้งมันไว้เป็นความคิดเห็นแทนที่จะแนะนำให้มันเป็นการแก้ไขคำตอบของคุณ คุณสังเกตเห็นความต้องการของเชลล์ใหม่เพื่อใช้ readline ที่ติดตั้งใหม่และแสดงให้เห็นว่าการคอมมิทคอนเทนเนอร์เป็นอิมเมจเป็นวิธีหนึ่งในการทำให้สำเร็จ โดยเฉพาะอย่างยิ่งเมื่อคุณใช้ Docker เป็นตัวอย่างของคุณฉันคิดว่าความคิดเห็นของฉันมีความเกี่ยวข้อง
เควิน

@ เควินอาโอเคเข้าใจผิดจุดของคุณแล้ว มีหลายวิธีในการรับเชลล์ล็อกอินใหม่คุณเป็นหนึ่งในนั้น :)
gertvdijk

2

ฉันพบว่ามีประโยชน์ต่อไปนี้เช่นกัน: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working

โดยเฉพาะ:

หากคีย์ของคุณไม่ทำงานอาจเป็นเพราะเทอร์มินัลเฉพาะของคุณส่งรหัสการยกเว้นที่ไม่อยู่ในรายการนี้ ก่อนอื่นคุณต้องค้นหาว่ามีการส่งรหัส escape ใดบ้าง หากต้องการดูพวกเขาคุณสามารถใช้คำสั่ง Readline เรียกว่า "quote-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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.