bash home / end / delete键正在插入波浪号,或者如果前面有转义键,则[1〜[3〜


20

在bash,所述home/ end/ delete键被插入,或者如果前面由逃逸密钥的代字号:[1~

所以我输入echo hellp,将光标移到,hel|lp然后输入delete,然后bam,我得到了~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程序sh.exe的Windows机器上(如您在GNU bash上面所看到的),使用mingw为msys编译:

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

Windows,没有终端仿真器,msys.bat,如果我知道如何报告设置,我不会问如何设置它们
可选

Answers:


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

要找到需要在左侧输入的内容(转义代码,因为笔记本电脑/台式机之间可能会有所不同...),请在提示符下键入echo '然后键入,然后Ctrl-V按键,例如Home,然后键入' example

$ 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的限制)

http://www.gnu.org/software/bash/manual/bashref.html#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029backward-kill-line中列出了可用的命令(如)

您可以使用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 2015年

在RHL上-/ etc / inputrc中的默认文件
Deian

不幸的是,我没有在群集计算机上对该文件的写访问权。
Herman Toothrot

5

好吧,由于您说的是在Windows上工作,而不是使用适当的终端仿真器(如PuTTY(带有minttyputtycyg等)),因此,我建议您查阅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-common之后,它将仅对新的登录Shell起作用。


exec bash这是一种在不退出终端的情况下用新实例替换当前bash实例的方法(在容器pTTY中播放时可能需要)。
凯文

@Kevin虽然这是一个有效的声明,但它与此处的问答内容有什么关系?
gertvdijk

1
这就是为什么我将其保留为评论而不是建议将其作为对答案的修改的原因。您指出了使用新安装的readline-common的新外壳的必要性,并展示了将容器作为映像来实现的一种方法。特别是,由于您使用Docker作为示例,所以我认为我的评论很有意义。
凯文(Kevin)

@Kevin Ah,好吧,那你就误解了。获取新登录shell的方法很多,您就是其中之一。:)
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〜

^ [表示外壳程序中的转义字符,因此这意味着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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.