如何在tcsh中通过bindkey将M-.绑定为!^+M-space的功能?
在tcsh中绑定Alt+.(M-.)到插入上一条命令的首个参数
正确的绑定命令
使用bindkey -s模拟你提到的!^+M-space操作,将Alt+.绑定为自动输出历史替换语法并触发展开:
bindkey -s "^[." "!^ ^[ "
或者通过直接提取历史命令参数的方式实现:
bindkey -x "^[." 'echo -n `history -h 2 | awk "{print \\$1}"`'
为什么之前的尝试失败
bindkey "^[." !^:bindkey默认绑定的是内置编辑命令,!^是历史替换语法,不属于编辑命令范畴,因此报错"Bad ! arg selector"。bindkey "^[." '!^':'!^'不是tcsh认可的内置编辑命令名称,无法被识别,导致报错"Bad command name"。bindkey -c "^[." 'echo !^':-c选项用于绑定按键执行shell命令,但此处!^不会被自动展开,且echo仅输出字符串,无法插入到当前命令行,同时命令格式有误引发报错。
原理说明
bindkey -s:设置按键为字符串输出模式,按下Alt+.时,tcsh会自动输出!^和Alt+空格(^[),后者触发历史替换,将!^替换为上一条命令的首个参数并插入到当前命令行。bindkey -x:设置按键为执行shell命令并插入输出,通过history -h 2获取最近两条无行号的命令,awk提取上一条命令的第一个参数,echo -n输出结果后,tcsh会将结果插入到当前命令行位置。
将上述任一命令添加到~/.tcshrc或~/.cshrc文件中,即可永久生效该绑定。
内容的提问来源于stack exchange,提问作者Mikef
相关产品推荐
相关产品推荐

