Xóa khóa không hoạt động trên dòng lệnh


10

** Lưu ý: Tôi đã hỏi câu hỏi tương tự trên SuperUser, nhưng không nhận được câu trả lời nào. Bây giờ tôi nhận ra đây là một diễn đàn phù hợp hơn cho câu hỏi cụ thể này. *

Trong trình bao ksh, phím Xoá không hoạt động phù hợp trên dòng lệnh. Tôi nhận được một ~ khi tôi nhấn Xóa.

Làm thế nào để tôi:

  1. liên kết chức năng "Xóa ký tự tại con trỏ" với nút Xóa bàn phím? (Control-D hoạt động như tôi mong đợi nút xóa hoạt động và những nỗ lực sử dụng bí danh của tôi không thành công và có khả năng là ngây thơ.)
  2. liên kết chức năng của " Di chuyển đến đầu dòng" với nút bàn phím Home? (Kiểm soát A thực hiện việc này ngay bây giờ, nhưng tôi muốn Home thực hiện nó.)
  3. liên kết chức năng của " Di chuyển đến cuối dòng " với nút Bàn phím kết thúc? (Kiểm soát E thực hiện điều này ngay bây giờ, nhưng tôi muốn kết thúc để làm điều đó.)

Cập nhật cuối cùng (?)

Tôi tình cờ thấy một cái gì đó hoạt động, nhưng tôi không hiểu tại sao. Những công việc này:

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward

Theo http://www.qnx.com/developers/docs/6.3.2/neutrino/utilities/k/ksh.html#bind ,

prefix-2
Key binding: ^X, ^[[
Introduces a 2-character command sequence.

Vì vậy, câu hỏi cập nhậtprefix-2 của tôi là tại sao tôi cần phải sử dụng cho việc này? Hãy dịch cho tôi để tôi có thể hiểu vì vậy tôi không phải làm phiền mọi người một lần nữa về điều này.

TUỔI NHÂN VIÊN SAU

CẬP NHẬT

Hóa ra ESC trong QNX là ^[. Sử dụng lệnh bind '^[[3~'='delete-char-backward'tôi có thể lấy con trỏ để ghi đè ký tự dưới con trỏ bằng a ~. Đây là một số tiến bộ ít nhất - bây giờ tôi biết cách đánh vần Xóa Khóa cho trình bao. Hầu hết mọi thứ tôi thấy trên web đều nói rằng phím xóa là vậy ^?, nhưng dường như nó không hoạt động với tôi. Ngoài ra, tôi nên đề cập đến việc tôi đang truy cập thông qua PuTTy.

Tôi không hiểu vì Control D thực hiện những gì tôi muốn phím xóa thực hiện. Tôi đã cố gắng ràng buộc nó eot-or-deletemột lần nữa nhưng không có kết quả.

Điều này nên đơn giản, phải không?

CẬP NHẬT 2:

 bind | grep prefix
^X = prefix-2
^[ = prefix-1
ÿ = prefix-3
^[O = prefix-2
^[[ = prefix-2


bind | grep '[^ -~]'
ÿ = prefix-3
à  = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word

CẬP NHẬT 3: Thêm cài đặt của tôi

Cài đặt ENV

 echo $ENV
/etc/kshrc

BIND Hoàn thành đầu ra

bind
^A = beginning-of-line
^B = backward-char
^C = abort
^D = eot-or-delete
^E = end-of-line
^F = forward-char
^G = abort
^H = delete-char-backward
^I = complete
^J = newline
^K = kill-to-eol
^L = redraw
^M = newline
^N = down-history
^O = newline-and-next
^P = up-history
^R = search-history
^T = transpose-chars
^U = kill-line
^V = version
^W = kill-region
^X = prefix-2
^Y = yank
^[ = prefix-1
^\ = no-op
^] = search-character-forward
^^ = quote
^_ = eot
^? = delete-char-backward
ÿ = prefix-3
^[^H = delete-word-backward
^[^X = complete-file
^[^[ = complete
^[^] = search-character-backward
^[  = set-mark-command
^[# = comment
^[* = expand-file
^[. = prev-hist-word
^[0 = set-arg
^[1 = set-arg
^[2 = set-arg
^[3 = set-arg
^[4 = set-arg
^[5 = set-arg
^[6 = set-arg
^[7 = set-arg
^[8 = set-arg
^[9 = set-arg
^[< = beginning-of-history
^[= = complete-list
^[> = end-of-history
^[? = list
^[C = capitalize-word
^[L = downcase-word
^[O = prefix-2
^[U = upcase-word
^[[ = prefix-2
^[_ = prev-hist-word
^[b = backward-word
^[c = capitalize-word
^[d = delete-word-forward
^[f = forward-word
^[g = goto-history
^[h = delete-word-backward
^[l = downcase-word
^[u = upcase-word
^[y = yank-pop
^[^? = delete-word-backward
^X^X = exchange-point-and-mark
^X^Y = list-file
^X^[ = complete-command
^X? = list-command
^XA = up-history
^XB = down-history
^XC = forward-char
^XD = backward-char
^XH = beginning-of-line
^XP = delete-char-forward
^XY = end-of-line
^Xc = forward-word
^Xd = backward-word
^Xw = end-of-line
à  = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word

/ etc / kshrc

/etc # cat kshrc
case $- in
*i*)
    export SHELL_COLOR_BLUE="print -n \\033[0;34m"
    export SHELL_COLOR_GREEN="print -n \\033[0;32m"
    export SHELL_COLOR_RED="print -n \\033[0;31m"
    export SHELL_COLOR_LIGHTGRAY="print -n \\033[0;37m"
    export SHELL_COLOR_YELLOW="print -n \\033[1;33m"

    export COLOR_BLACK="\\033[0;30m"
    export COLOR_BLUE="\\033[0;34m"
    export COLOR_GREEN="\\033[0;32m"
    export COLOR_CYAN="\\033[0;36m"
    export COLOR_RED="\\033[0;31m"
    export COLOR_PURPLE="\\033[0;35m"
    export COLOR_BROWN="\\033[0;33m"
    export COLOR_LIGHTGRAY="\\033[0;37m"
    export COLOR_DARKGRAY="\\033[1;30m"
    export COLOR_LIGHTBLUE="\\033[1;34m"
    export COLOR_LIGHTGREEN="\\033[1;32m"
    export COLOR_LIGHTCYAN="\\033[1;36m"
    export COLOR_LIGHTRED="\\033[1;31m"
    export COLOR_LIGHTPURPLE="\\033[1;35m"
    export COLOR_YELLOW="\\033[1;33m"
    export COLOR_WHITE="\\033[1;37m"

    if [[ `id -u` -eq 0 ]]; then
        export PS1=`$SHELL_COLOR_RED`'$(hostname -s):'`$SHELL_COLOR_YELLOW`'$(pwd) # '`$SHELL_COLOR_LIGHTGRAY`
    else
        export PS1=`$SHELL_COLOR_BLUE`'$(hostname -s):'`$SHELL_COLOR_GREEN`'$(pwd) $ '`$SHELL_COLOR_LIGHTGRAY`
    fi

esac

Cài đặt PuTTy:

nhập mô tả hình ảnh ở đây

Những lưu ý có thể có hoặc không quan trọng, nhưng có thể cung cấp nền:

Vỏ là "PD KSH v5.2.14 99/07 / 13.2". Có, tôi không có tùy chọn để nâng cấp ... đó là một hệ thống nhúng. "Lấy một cái vỏ hiện đại" không phải là một câu trả lời khả thi. Hệ điều hành là QNX Neutrino 6.4.1.

liên kết hiển thị như sau:

 bind | grep del
^D = eot-or-delete
^H = delete-char-backward
^? = delete-char-backward
^[^H = delete-word-backward
^[d = delete-word-forward
^[h = delete-word-backward
^[^? = delete-word-backward
^XP = delete-char-forward
ଠ= delete-char-forward

infocmp hiển thị như sau:

infocmp  #      Reconstructed via infocmp from file:
/usr/lib/terminfo/x/xterm xterm|vs100|xterm terminal emulator,
        am, km, mir, msgr, xenl, xon,
        cols#80, it#8, lines#65, vt@,
        acsc=Oa``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=@, bold=\E[1m, clear=\E[H\E[2J, cr=^M,
        csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
        cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
        dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
        el=\E[K, el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=^I,
        hts=\EH, ich=\E[%p1%d@, ich1=\E[2~, il=\E[%p1%dL, il1=\E[L,
        ind=^J, is1=\E=\E[?1l, kBEG=\ENn, kCPY=\ENs, kCRT=\ENt,
        kDL=\ENv, kEXT=\ENw, kFND=\ENx, kHLP=\ENy, kOPT=\ENz,
        ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOq, kcan=\EOm, kclo=\ENc,
        kclr=\ENa, kcmd=\EOu, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
        kcuu1=\E[A, kdch1=\E[P, kend=\E[9, kf1=\E[11~, kf10=\E[21~,
        kf11=\E[23~, kf12=\E[24~, kf2=\E[12~, kf3=\E[13~,
        kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
        kf9=\E[20~, kfnd=\ENf, khlp=\ENh, khome=\E[8, khts=\ENb,
        kich1=\E[2~, kmov=\ENi, kmrk=\ENm, kmsg=\ENe, knp=\E[6~,
        kopn=\ENo, kopt=\ENk, kpp=\E[5~, kref=\ENl, kres=\ENp,
        krfr=\ENg, krpl=\ENr, krst=\ENj, ksav=\ENq, kslt=\EOM,
        ktbc=\ENd, kund=\ENu, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
        rmam=\E[?7l, rmkx=\E>, rmso=\E[m,
        rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=@,
        sc=\E7,
        setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
        setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
        sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m,
        sgr0=\E[m, smacs=^N, smam=\E[?7h, smkx=\E=, smso=\E[7m,
        tbc=\E[3g,

stty cho thấy như sau:

stty Name:  /dev/ttyp0 Type:  pseudo Opens: 2
+edit +echok +echonl
+osflow  intr=^C  quit=^\ erase=^?  kill=^U   eof=^D start=^Q  stop=^S  susp=^Z lnext=^V   min=01  time=00   pr1=^[   pr2=5B  left=44 right=43
up=41  down=42   ins=40   del=50  home=48   end=59


Tôi thực sự đã thấy cả hai liên kết đó và tôi đã cố gắng sửa đổi kshrcđể không có kết quả. Tôi nhận được sh: /etc/kshrc[21]: trap: bad signal KEYBDtôi không có tùy chọn vỏ khác không may. Tôi không biết liệu đây có phải là sự cố với PDKSH hoặc với QNX hoặc cả hai không. Tôi biết những tổ hợp phím nào sẽ gây ra những gì tôi muốn. Tôi chỉ cần biết cú pháp để ánh xạ chúng tới các phím thích hợp.
kmort

Phím Xóa hoạt động với tôi với Pdksh (cùng phiên bản, nó đã không được duy trì từ thế kỷ trước) trong Linux. Điều gì bind | grep prefixthể hiện cho bạn? Và bind | grep '[^ -~]'?
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Tôi đã cập nhật với kết quả của các lệnh liên kết của bạn. Nó có thể là cài đặt PuTTy của tôi? Tôi đánh giá cao sự giúp đỡ của bạn. :-)
kmort

AFAIK bind '^[[3~'='delete-char-forward'nên đã làm việc. Tôi không hiểu những ký tự không phải ASCII đó đến từ đâu (chúng không phải là chuỗi ESC + foo với tập bit thứ 8, cũng không phải là sự nhầm lẫn giữa latin1 / utf8). Liệu `bind '^ X3 ~ = xóa-char-Forward' có hoạt động không?
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


6

Dành cho nhân viên của Google:

Phù Đối với một cái gì đó rất đơn giản, điều này thật khó.

Các giải pháp ngắn là sử dụng sau đây để thiết lập các phím xóa (trong kshrchoặc bất cứ nơi nào),

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward

Và đặt cài đặt thiết bị đầu cuối PuTTy của bạn rxvtthay vì Standard.

Cài đặt PuTTy

Điều này thực sự giúp tôi làm việc này là: http://www.mail-archive.com/misc@openbsd.org/msg81796.html

ksh làm những điều ngớ ngẩn với phím home và end. Về cơ bản, tôi không thể làm cho nó nói lên sự khác biệt giữa Trang chủ, Kết thúc và Xóa cùng một lúc. Bất cứ điều gì đã bị ràng buộc cuối cùng, cả ba chìa khóa sẽ làm. Thay đổi những gì PuTTy gửi cho các khóa này đã giúp rất nhiều.

Lưu ý: Một số người gợi ý nếu bạn muốn xem shell nào sẽ nhận được khi bạn nhấn phím, gõ cat, nhấn enter, sau đó nhấn phím. Đối với vỏ của tôi, điều này đã không làm việc. Tôi đã nhận ~cho tất cả các phím điều khiển. Thay vào đó, những gì tôi đã làm là nhấn Escmột lần, sau đó nhấn phím. Mã kiểm soát sẽ hiển thị sau đó hiển thị. Sử dụng mã kiểm soát đó bindvà bạn đã hoàn tất.


Tôi có thể xác nhận rằng điều này cũng hoạt động trong Conemu + Cygwin.
Janac Meena

2

[Mặc dù chúng tôi có một thiết lập hơi khác nhau, tôi hy vọng những điều sau đây có thể được sử dụng cho ai đó, vì tôi nghĩ rằng một số nguyên tắc chung tương tự được áp dụng. Điều này đã chứng tỏ là một trải nghiệm học tập tốt cho tôi về cách Linux xử lý thiết bị đầu cuối cơ bản.]

Nếu shell đang chạy bên trong cửa sổ terminal gnome , thì dưới Preferences| Profileschọn một hồ sơ, sau đó chọn Editvà sau đó là Compatibilitytab và thay đổi Delete key generatesthành Automatic. (Hoặc nếu thất bại, hãy thử các lựa chọn khác ở đó.)

[Tôi đang sử dụng Debian Stretch.]


Tôi không biết làm thế nào, hoặc thậm chí khi chính xác Del của tôi bị hỏng, nhưng nó bắt đầu xóa trái chứ không phải phải!

Bài viết này rất hữu ích cho tôi để hiểu mọi thứ hoạt động như thế nào.


Tôi đã sử dụng các chiến lược gỡ lỗi được đề xuất trong bài viết được liên kết ở trên:

Nhập ^v Del^v Backspace, [control-v rồi xóa khóa ...] để tìm mã trình tự đầu cuối được trả về.

Và sử dụng showkey -s, showkey -k, showkey -avà sau đó DelBackspacechìa khóa để kiểm tra việc ba lớp (nguyên từ bàn phím, như sản lượng từ tài xế tty, và như chuỗi ký tự cho thiết bị đầu cuối).

Từ điều này tôi nhận thấy rằng khi sử dụng stty (ví dụ stty1) rằng hành vi shell của tôi khác với khi sử dụng xterm (từ bên trong một thiết bị đầu cuối Graphical X). Del đã xóa chính xác chuyển tiếp (phải) trong stty1, nhưng ngược lại (trái) trong xterm của tôi.


Bài viết là một liên kết chết
Sữa

1

Hai câu trả lời hiện tại không hoạt động đối với tôi từ bash Linux (Ubuntu 18.10), thông qua SSH đến Solaris 11.3 bash, sử dụng thiết bị đầu cuối gnome.

Tôi thấy rằng tôi cần phải sử dụng bindlệnh, nhưng với một cách giải quyết, vì tôi không thể có được một Deletechức năng riêng.

Vì vậy, cách khắc phục là khi Deleteđược nhấn, để mô phỏng việc xóa bằng cách ánh xạ phím nhấn đến Backspace.

bind '"^[[3~":"^[[C^?"'

Để gõ, sử dụng phím bấm:

CTRL-vDeletecho phần đầu tiên
CTRL-vCTRL-vBackspacecho phần thứ hai.
(hoặc sử dụng \echo lối thoát thay thế, ví dụ "\e[3~":)

Nó không hoàn hảo, nếu bạn Deleteở cuối dòng, nó vẫn còn tồn tại. Nhưng nó tiết kiệm cho tôi khi phải sao lưu ~nhân vật nhiều lần một ngày.

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.