bash home/end/delete 键插入波浪符号,或者如果前面有 Esc 键,则为 [1~ [3~

bash home/end/delete 键插入波浪符号,或者如果前面有 Esc 键,则为 [1~ [3~

在 bash 中,home/ end/delete键插入波浪符号,或者如果前面有 Esc 键:[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版本:

$ 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. 我希望 Home 将光标移动到第一个字符之前的行首
  3. 我希望 End 将光标移动到第一个字符之前的行尾
  4. 我想要删除当前行/缓冲区中的下一个字符(光标右侧)

我需要编辑什么来修复这个问题?这是你的 bash 上的默认设置吗?

更新:我在 Windows 机器上运行一个 Windows 程序,sh.exe(正如你在 GNU bash 上面看到的),用 mingw 为 msys 编译:

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

答案1

.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它目前不起作用(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

答案2

检查 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-common 后它只会对新的登录 shell 有效。

答案3

好吧,既然你说你在 Windows 上工作,并且没有使用合适的终端仿真器,比如 PuTTY(带有薄荷味puttycyg等人),我建议你咨询readline 文档并学习 readline 的快捷方式。从长远来看,这会更好。

如果您使用终端仿真器而不是 Windows 自带的控制台窗口(这里不讨论解释器/shell),您将获得更可配置的替代方案。一旦您尝试使用 Vim 等其他程序,情况只会变得更糟。

要点:使用合适的终端仿真器,即使在 Windows 上或者学习 readline 快捷键。我刚刚测试了我最常用的快捷键,它们可以与 一起使用msys.bat

mingw-get install mintty && mintty

要编辑的文件be /usr/share/terminfo(MinGW 中不存在)- 用于tic“编译”规则(甚至没有包括在内,因为每个人都知道支持会严重削弱)。但是,我还没有看到任何有用的开发使其在 Windows 上几乎可用。这就是为什么你首先应该使用合适的终端仿真器。但我相信外科医生能够使用菜刀进行手术,所以你为什么不应该使用 Windows 内置的控制台窗口。祝你好运。

答案4

我发现以下内容也很有帮助: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working

具体来说:

如果您的按键不起作用,可能是因为您的特定终端发送了不在此列表中的转义码。首先,您需要找出发送的转义码。要查看它们,您可以使用名为“quoted-insert”的 Readline 命令或运行 showkey --scancodes 命令,该命令会逐字输出按键的值。quoted-insert 的默认绑定是 Ctrl+V。

例如,您可以在终端中输入以下一系列输入:

Ctrl+V
Home
Spacebar
Ctrl+V
End

并得到输出

$ ^[[1~ ^[[4~

^[ 表示 shell 中的转义字符,因此这意味着 Home 键的转义码为 [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

相关内容