V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
V2EX  ›  Linux

终端下不支持行编辑时,输错了可以用Ctrl+W来删除前面的内容

  •  
  •   felix021 · 2013-07-30 12:01:40 +08:00 · 4010 次点击
    这是一个创建于 1571 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原先输错了以后习惯性地按下 Backspace ,结果相当于多输入了一个字符^H,于是只好CTRL+C干掉,然后重新执行那个命令。

    某次无意中发现的,ctrl+w可以删除光标前面的一个“单词”,然后各种试用以后发现适用范围还挺广的,包括但不限于:

    1. Login/SSH输错密码。可能要按多次ctrl+w
    2. cp/rm/mv -i 的时候要求输入 y 时输错了
    3. sudo apt-get install/remove/upgrade 要求输入 y 时输错了
    4. 其他零零散散各种脚本中用read命令输入的情况(2和3可能也是用read输入的)
    第 1 条附言  ·  2013-07-30 12:39:32 +08:00
    前面没表达清楚,好多v友都没看明白我的意思,我的意思不是在终端下输入命令,而是在终端下执行命令时要求你输入的情况。

    具体的例子:

    1. cp -i
    $ touch 1.txt 2.txt
    $ cp -i 1.txt 2.txt #提示你是否要覆盖
    cp: overwrite `2.txt'? y^H

    #这里的^H就是backspace带来的结果。这时候可以用ctrl+w删掉。

    2. read命令
    $ read -p "test: "
    test: 12312312^H^H

    #^H同上
    第 2 条附言  ·  2013-07-31 09:07:15 +08:00
    补充#2:

    1. 之前搞错了,ssh输错了是可以backspace删除的,可能是因为我输错密码以后不知道该按几个BS,总是搞错,所以认为不行

    2. 除了Ctrl+W,还有两个大法(1)(@rrfeng)CTRL+U整行删除(2)(@delo) CTRL+Backspace前删一个字符。

    这种小trick跟大家分享一下也还是挺有收获的:D
    第 3 条附言  ·  2013-08-01 08:58:19 +08:00
    补充#3

    根据 @iveney 的说法,之所以BS不能正常回删,是因为terminal中BS的键映射和stty -a中的键映射不同。

    上面已经可以看出,在我的terminal中,我按下BS,输入的是^H(ASCII BS, 0x08),但是stty -a可以看到 "erase = ^?" 即stty中的映射是 ^?(ASCII DEL, 0x7f)。

    执行 stty erase "^H" 以后,可以修改stty中的映射,于是就能够正常回删了。把这一句加入.bashrc比较好。
    26 回复  |  直到 1970-01-01 08:00:00 +08:00
        1
    rrfeng   2013-07-30 12:03:30 +08:00   ♥ 6
    Ctrl + e :移到命令行尾
    Ctrl + f :按字符前移(右向)
    Ctrl + b :按字符后移(左向)
    Alt + f :按单词前移(右向)
    Alt + b :按单词后移(左向)
    Ctrl + xx:在命令行首和光标之间移动
    Ctrl + u :从光标处删除至命令行首
    Ctrl + k :从光标处删除至命令行尾
    Ctrl + w :从光标处删除至字首
    Alt + d :从光标处删除至字尾
    Ctrl + d :删除光标处的字符
    Ctrl + h :删除光标前的字符
    Ctrl + y :粘贴至光标后
    Alt + c :从光标处更改为首字母大写的单词
    Alt + u :从光标处更改为全部大写的单词
    Alt + l :从光标处更改为全部小写的单词
    Ctrl + t :交换光标处和之前的字符
    Alt + t :交换光标处和之前的单词
    Alt + Backspace:与 Ctrl + w 相同类似,分隔符有些差别 [感谢 rezilla 指正]
    重新执行命令

    Ctrl + r:逆向搜索命令历史
    Ctrl + g:从历史搜索模式退出
    Ctrl + p:历史中的上一条命令
    Ctrl + n:历史中的下一条命令
    Alt + .:使用上一条命令的最后一个参数
    控制命令

    Ctrl + l:清屏
    Ctrl + o:执行当前命令,并选择上一条命令
    Ctrl + s:阻止屏幕输出
    Ctrl + q:允许屏幕输出
    Ctrl + c:终止命令
    Ctrl + z:挂起命令
    Bang (!) 命令

    !!:执行上一条命令
    !blah:执行最近的以 blah 开头的命令,如 !ls
    !blah:p:仅打印输出,而不执行
    !$:上一条命令的最后一个参数,与 Alt + . 相同
    !$:p:打印输出 !$ 的内容
    !*:上一条命令的所有参数
    !*:p:打印输出 !* 的内容
    ^blah:删除上一条命令中的 blah
    ^blah^foo:将上一条命令中的 blah 替换为 foo
    ^blah^foo^:将上一条命令中所有的 blah 都替换为 foo



    ===========================
    随便找的,不客气……
        2
    bitsmix   2013-07-30 12:05:04 +08:00
    Ctrl-x e
        3
    felix021   2013-07-30 12:05:20 +08:00
    @rrfeng 谢谢,不过你似乎没有看明白我说的是什么。
        4
    felix021   2013-07-30 12:06:51 +08:00
    @bitsmix
    @rrfeng

    你们可以试试执行 read 命令,看看这些快捷键好使不。或者是在ssh时输错了密码。
        5
    soli   2013-07-30 12:11:50 +08:00
    安装 readline
        6
    felix021   2013-07-30 12:13:53 +08:00
    @soli 谢谢,不过我希望你能参考我前面的回复,确认你明白我说的是啥。
        7
    beakey   2013-07-30 12:23:13 +08:00
    为什么上面几个都不明白你说的是啥?我也不明白,但是在item2中配置快捷键 opt + del 对应0x1B 0x08 再终端就可以用opt+del 向前删除一个单词,这个和其他地方就统一了= =
        8
    delo   2013-07-30 12:29:43 +08:00
        9
    felix021   2013-07-30 12:36:37 +08:00
    @delo
    @beakey

    嗯 这么多人都没看明白,肯定就是我没描述清楚了,举例就是你执行 read 命令,然后输入,1L 上面提到的那一堆快捷键都没用。
        10
    limusi   2013-07-30 12:44:52 +08:00
    这种记命令的,果断用everitps

    http://evertips.info/topics/50a35c7e273f0224f5000004
        11
    rrfeng   2013-07-30 12:49:24 +08:00   ♥ 1
    @felix021
    是我没看清,不过你的问题有个简单的办法啊

    大部分情况下,ctrl + backspace 就可以正常删除了
        12
    felix021   2013-07-30 13:16:12 +08:00
    @rrfeng 噢 原来还可以按下CTRL键...
        13
    detailyang   2013-07-30 13:17:19 +08:00
    终端不是可以开启VI-Mode吗..
        14
    zava   2013-07-30 13:20:56 +08:00
    这就是 readline 啊。。
        15
    felix021   2013-07-30 13:30:03 +08:00
    @delo
    @detailyang
    @zava
    这不是readline,也跟vi/emacs mode无关,详见帖子的补充说明。
        16
    delo   2013-07-30 14:04:19 +08:00   ♥ 1
    呃,好吧,即使在read命令下,或者在Login/SSH输错密码的情况下,可以试试ctrl u
        17
    whuhacker   2013-07-30 14:04:30 +08:00
    @felix021 其实 Delete 键也可以……
    Ctrl + W 已经作为图形界面下关闭快捷键用习惯了
        18
    felix021   2013-07-30 14:46:37 +08:00
    @delo 赞Ctrl+U

    @whuhacker 试了下delete的效果是这样:
    $ read
    y^[[3~
        19
    txgcwm   2013-07-30 16:55:55 +08:00
    无处不见@felix021 的身影啊!
        20
    felix021   2013-07-30 19:42:59 +08:00
    @txgcwm 。。。我也是最近才刷得比较多,这貌似是第二个帖子
        21
    falconeye   2013-07-30 22:16:53 +08:00 via iPad
    感谢,很实用啊!
        22
    iveney   2013-07-31 08:13:16 +08:00
    stty 的问题。 看看你 stty -a 下面 erase 的定义是什么.
        23
    felix021   2013-07-31 09:02:41 +08:00
    @iveney "erase = ^?",我一般都用SecureCRT,emulation是xterm。
        24
    iveney   2013-08-01 05:46:38 +08:00
    光看 erase 不够,要看看你的 terminal emulator 的 backspace 发送的是什么,C-v 然后 backspace 看看。
        25
    iveney   2013-08-01 05:55:29 +08:00   ♥ 1
    补充上条。

    @felix021 光看 erase 不够,要看看你的 terminal emulator 的 backspace 发送的是什么,C-v 然后 按 backspace 看看是不是跟 stty 定义一样。

    比如我在 PuTTY 里如果设置了 backspace 发送 ^H 但是 stty 的 erase 定义为 ^?,那么你在 cp -i 里面机会出问题,你必须把它们设置为相同的 value,either ^H (ASCII BS (0x08)) or ^? ( ASCII DEL (0x7f))。
        26
    felix021   2013-08-01 08:55:04 +08:00
    @iveney 多谢,我试了下,BS的输入是^H,但stty -a中erase是^?,执行 ·stty erase "^H"· 以后bs可以正常回删字符了:D
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1063 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 66ms · UTC 00:51 · PVG 08:51 · LAX 16:51 · JFK 19:51
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1