终端下不支持行编辑时,输错了可以用Ctrl+W来删除前面的内容 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
felix021
V2EX    Linux

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

  •  
  •   felix021
    felix021 2013-07-30 12:01:40 +08:00 7571 次点击
    这是一个创建于 4482 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原先输错了以后习惯性地按下 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
    rrfeng
        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



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

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

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

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

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

    @whuhacker 试了下delete的效果是这样:
    $ read
    y^[[3~
    txgcwm
        19
    txgcwm  
       2013-07-30 16:55:55 +08:00
    无处不见@felix021 的身影啊!
    felix021
        20
    felix021  
    OP
       2013-07-30 19:42:59 +08:00
    @txgcwm 。。。我也是最近才刷得比较多,这貌似是第二个帖子
    falconeye
        21
    falconeye  
       2013-07-30 22:16:53 +08:00 via iPad
    感谢,很实用啊!
    iveney
        22
    iveney  
       2013-07-31 08:13:16 +08:00
    stty 的问题。 看看你 stty -a 下面 erase 的定义是什么.
    felix021
        23
    felix021  
    OP
       2013-07-31 09:02:41 +08:00
    @iveney "erase = ^?",我一般都用SecureCRT,emulation是xterm。
    iveney
        24
    iveney  
       2013-08-01 05:46:38 +08:00
    光看 erase 不够,要看看你的 terminal emulator 的 backspace 发送的是什么,C-v 然后 backspace 看看。
    iveney
        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))。
    felix021
        26
    felix021  
    OP
       2013-08-01 08:55:04 +08:00
    @iveney 多谢,我试了下,BS的输入是^H,但stty -a中erase是^?,执行 stty erase "^H" 以后bs可以正常回删字符了:D
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3474 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 04:22 PVG 12:22 LAX 20:22 JFK 23:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86