phím bash home / end / xóa đang chèn dấu ngã hoặc nếu trước phím thoát, [1 ~ [3 ~


20

Trong bash, các home/ end/ deletekhóa được chèn một dấu ngã, hoặc nếu trước bởi phím Esc:[1~

Vì vậy, tôi gõ echo hellp, di chuyển con trỏ đến hel|lpvà gõ xóa, và bam, tôi đã nhận~tilde

Ngoài ra, tôi gõ echo hellp, di chuyển con trỏ đến hel|lpvà gõ esc rồi xóa, và bam, tôi đã nhận[3~

$ echo hel~lp
hel~lp

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

Phiên bản bash của tôi:

$ bash --version
GNU bash, version 3.1.17(1)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.

Những gì tôi muốn là hành vi như cmd.exe:

  1. Tôi muốn Esc xóa dòng / bộ đệm hiện tại
  2. Tôi muốn Home di chuyển con trỏ đến đầu dòng trước ký tự đầu tiên
  3. Tôi muốn End di chuyển con trỏ đến cuối dòng trước ký tự đầu tiên
  4. Tôi muốn xóa để xóa ký tự tiếp theo (bên phải con trỏ) khỏi dòng / bộ đệm hiện tại

Tôi phải chỉnh sửa gì để khắc phục điều này? Đây có phải là mặc định trên bash của bạn?

cập nhật: tôi đang ở trên một máy tính chạy chương trình windows, sh.exe (như bạn có thể thấy ở trên bash GNU), được biên dịch với mingw cho msys:

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

cửa sổ, không có trình giả lập thiết bị đầu cuối, msys.bat, nếu tôi biết cách báo cáo cài đặt, tôi sẽ không hỏi cách đặt chúng
tùy chọn

Câu trả lời:


22

Bạn tùy chỉnh bash thông qua một .inputrctệp trong của bạn /home/username, bạn có thể sao chép mặc định

cp /etc/inputrc.default   ~/.inputrc

đây là của tôi (ý kiến ​​bắt đầu bằng #)

# 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

để tìm hiểu những gì bạn cần nhập inputrc ở bên trái (mã thoát, vì nó có thể khác nhau giữa máy tính xách tay / máy tính để bàn ...), tại loại dấu nhắc, echo 'sau đó nhập Ctrl-Vtheo sau là khóa, như Home, sau đó nhập ' ví dụ

$ 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
~

sau đó thay thế từng ^[\e add \M-cho Alt lý thuyết bạn muốn sử dụng \C-cho Ctrlnhưng nó hiện không hoạt động (cửa sổ giới hạn)

các lệnh có sẵn (như backward-kill-line) được liệt kê trong http://www.gnu.org/software/bash/manual/bashref.html#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029

bạn có thể xem các phím tắt / ràng buộc bàn phím hiện có với bind -phoặc

$ 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".
~

đừng gây rối với TERMCAP


find / -name 'inputrc.default'không tìm thấy gì trên máy của tôi Nhà và cuối của tôi được sử dụng để làm việc ... :( Ngoài ra, FYI cho người khác: Để tải lại tệp bind -f ~/.inputrc
.inputrc

À! Sửa chữa: Tôi đã sử dụng .inputrc của bạn, ngoại trừ $if mode=emacskhối. Tôi đã thêm hai dòng này, và chúng hoạt động trở lại !! : D "\e[1~": beginning-of-line ... "\e[4~": end-of-line.
aliteralmind

trên RHL - tệp mặc định trong / etc / inputrc
Deian 16/2/2016

Thật không may, tôi không có quyền ghi vào tệp đó trên máy cụm.
Herman Toothrot

5

Chà, vì bạn nói rằng bạn đang làm việc trên Windows và không sử dụng trình giả lập thiết bị đầu cuối thích hợp như PuTTY (với mintty , puttycyg et al ), tôi khuyên bạn nên tham khảo tài liệu về đường dẫn và tìm hiểu các phím tắt cho đường đọc. Về lâu dài sẽ tốt hơn.

Nếu bạn sử dụng trình giả lập thiết bị đầu cuối thay vì cửa sổ giao diện điều khiển (không nói về trình thông dịch / trình bao ở đây) đi kèm với Windows, bạn sẽ có một giải pháp thay thế có thể cấu hình hơn. Khi bạn cố gắng sử dụng các chương trình khác như Vim, mọi thứ sẽ chỉ trở nên tồi tệ hơn.

Các ý chính: sử dụng một trình giả lập thiết bị đầu cuối thích hợp, ngay cả trên Windows hoặc tìm hiểu các phím tắt đọc. Tôi đã thử nghiệm những cái tôi sử dụng nhiều nhất bây giờ và họ làm việc với msys.bat.

mingw-get install mintty && mintty

Tệp để chỉnh sửa sẽ/usr/share/terminfo(không tồn tại trong MinGW) - sử dụng ticđể "biên dịch" các quy tắc (thậm chí không bao gồm vì mọi người đều biết rằng hỗ trợ sẽ bị tê liệt nghiêm trọng). Tuy nhiên, tôi chưa thấy bất kỳ sự phát triển hữu ích nào để làm cho điều này thậm chí gần có thể sử dụng được trên Windows. Đây là lý do tại sao bạn nên sử dụng một trình giả lập thiết bị đầu cuối thích hợp ở nơi đầu tiên. Nhưng tôi chắc chắn rằng một bác sĩ phẫu thuật sẽ có thể sử dụng một con dao nhà bếp để phẫu thuật, vậy tại sao bạn không nên sử dụng các cửa sổ điều khiển tích hợp trong Windows. Chúc may mắn.


4

Kiểm tra cài đặt Readline

Khi điều này xảy ra trên bản cài đặt tối thiểu của Debian / Ubuntu gần đây, có thể là do bạn chưa cài đặt readline-commongói. Đơn giản chỉ cần cài đặt gói sẽ giải quyết nó.

Ví dụ: trên Docker với kiểu gõ 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

Xin lưu ý rằng sau khi cài đặt readline-common, nó sẽ chỉ có hiệu lực đối với các shell đăng nhập mới.


exec bashlà một cách thay thế cá thể bash hiện tại bằng một cá thể mới, mà không cần thoát khỏi thiết bị đầu cuối (có thể cần thiết khi chơi trong pTTY container).
Kevin

@Kevin Trong khi đó là một tuyên bố hợp lệ, nó có liên quan gì đến bối cảnh của Q & A ở đây?
gertvdijk

1
đó là lý do tại sao tôi để nó dưới dạng bình luận thay vì đề xuất nó như là một chỉnh sửa cho câu trả lời của bạn. Bạn đã lưu ý sự cần thiết của một lớp vỏ mới để sử dụng phổ biến mới được cài đặt và đã cho thấy một thùng chứa như một hình ảnh như một phương tiện để đạt được điều đó. Đặc biệt, vì bạn đã sử dụng Docker làm ví dụ của mình, tôi nghĩ nhận xét của tôi có liên quan.
Kevin

@Kevin Ah, được rồi, hiểu nhầm quan điểm của bạn rồi. Nhiều cách tồn tại khi nhận được một vỏ đăng nhập mới, của bạn là một trong số đó. :)
gertvdijk

2

Tôi cũng thấy những điều hữu ích sau đây: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_ làm việc

Đặc biệt:

Nếu các khóa của bạn không hoạt động, đó có thể là do thiết bị đầu cuối cụ thể của bạn gửi mã thoát không có trong danh sách này. Trước tiên, bạn cần tìm ra mã thoát nào đang được gửi. Để xem chúng, bạn có thể sử dụng lệnh Readline có tên là "quote-insert" hoặc chạy lệnh showkey --scancodes để đưa ra giá trị của một nguyên văn chính. Liên kết mặc định cho trích dẫn-insert là Ctrl + V.

Ví dụ: bạn có thể đưa ra chuỗi đầu vào sau trong thiết bị đầu cuối của mình:

Ctrl+V
Home
Spacebar
Ctrl+V
End

Và lấy đầu ra

$ ^ [[1 ~ ^ [[4 ~

^ [Biểu thị một ký tự thoát trong vỏ của bạn, vì vậy điều này có nghĩa là phím Home của bạn có mã thoát là [1 ~ và khóa Kết thúc của bạn có mã thoát là [4 ~. Vì các mã thoát này không được liệt kê trong cấu hình Readline mặc định, bạn sẽ cần thêm chúng:

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

Lưu ý rằng Readline sử dụng \ e để chỉ ký tự thoát.

Phần có liên quan với tôi là đưa phần này vào inputrc:

"\e[1~": beginning-of-line
"\e[4~": end-of-line
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.