k0p*_*kus 25 bash readline line-editor
我只是在输入以下内容:
mv foo/bar/poit/zoid/narf.txt
Run Code Online (Sandbox Code Playgroud)
突然意识到,该死的,我必须再次输入该参数的大部分内容
mv foo/bar/poit/zoid/narf.txt foo/bar/poit/zoid/troz.txt
Run Code Online (Sandbox Code Playgroud)
即使使用tabcompletion,也很痛苦。我知道我可以通过鼠标选择文本和中键来复制粘贴参数,但这还不够好。我想留在键盘上。
那么有没有办法使用键盘复制粘贴该行的当前参数?
小智 25
历史扩展实际上也适用于当前命令,使用事件指示符!#。将此与最后一个参数的单词指示符结合使用 - $- 以获取您刚刚输入的参数。并且您可以对它使用所有常规修饰符,因此,例如,如果您要重命名远处目录中的文件,则只需键入:
mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname
Run Code Online (Sandbox Code Playgroud)
jw0*_*013 19
如果我提前计划,我会使用大括号扩展。在这种情况下:
mv foo/bar/poit/zoid/{narf,troz}.txt
Run Code Online (Sandbox Code Playgroud)
这是使用默认readline键盘快捷键的另一种方法:
mv foo/bar/poit/soid/narf.txt: 开始unix-word-rubout删除foo/bar/poit/soid/narf.txtyank, 空格,yank再次得到mv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txtbackward-kill-word两次删除最后一个narf.txttroz.txt: 输入不同的尾部如果您花费大量时间使用bashshell,我建议您定期通读默认快捷方式列表,并挑选出一些对学习和融入日常工作有用的方法。 手册的第 8 章bash是一个很好的起点。知道捷径真的可以提高你的效率。
rus*_*ush 14
在您的示例中,您可以使用下一个构造:
mv foo/bar/poit/zoid/{narf.txt,troz.txt}
Run Code Online (Sandbox Code Playgroud)
甚至(如建议的Ansgar Esztermann):
mv foo/bar/poit/zoid/{narf,troz}.txt
Run Code Online (Sandbox Code Playgroud)
而不是键入/复制粘贴长地址两次。
玩弄我得到了这个工作:
mv foo/bar/poit/zoid/narf.txt
Run Code Online (Sandbox Code Playgroud)
点击Enter
以存储最后一个参数。
现在用于?获取最后一次输入的行返回。输入一个空格并获取上次使用的参数,请使用:
Alt + .
我讨厌引发错误,但它在这个用例中完成了工作。
这将插入 Readline 行缓冲区的最后一个字。!#是当前行,:$是最后一个字,\e^是history-expand-line。
"\ej":"!#:$\e^"
Run Code Online (Sandbox Code Playgroud)
当您在单词中间时,这也有效,并且不需要手动插入空格,但它的缺点是它会覆盖终止环:
"\ee":shell-backward-word
"\ei":shell-forward-word
"\ew":copy-region-as-kill
"\ej":"\ee\e \ei\ew \C-y"
Run Code Online (Sandbox Code Playgroud)
为了复制之前的以空格分隔的单词而不是 shell 单词,您可以使用\C-w\C-y\C-y. \C-w向后删除以空格分隔的单词。