如何在bash控制台上重复当前键入的参数?


23

我只是在输入以下内容:

mv foo/bar/poit/zoid/narf.txt

突然意识到,该死,我不得不再次输入该参数的大部分内容

mv foo/bar/poit/zoid/narf.txt foo/bar/poit/zoid/troz.txt

即使有Tabcompletion,也相当痛苦。我知道我可以通过鼠标选择文本和Middleclick复制粘贴参数,但这还不够好。我想留在键盘上。

那么有没有办法使用键盘复制粘贴行的当前参数呢?


3
我的建议无法回答您的问题,但是只是一个小提示。如您的示例中所示,您可以使用下一种构造:mv foo/bar/poit/zoid/{narf.txt,troz.txt}而不是两次键入/复制长地址。
2012年

2
比@Rush的解决方案略短:mv foo/bar/poit/zoid/{narf,troz}.txt。如果我们.../zoid/this_source_file_has_to_be_patched.c{,.orig}
遇到

@Rush您介意指出答案吗?可能不是我直接问的,但是再说一遍,您的解决方案远非我想要的那样。它值得接受。
k0pernikus 2012年

Answers:


15

如果我已提前计划,则使用大括号扩展。在这种情况下:

mv foo/bar/poit/zoid/{narf,troz}.txt

这是使用默认readline键盘快捷键的另一种方法:

  • mv foo/bar/poit/soid/narf.txt:开始
  • Ctrl- wunix-word-rubout删除foo/bar/poit/soid/narf.txt
  • Ctrl- ,ySpace- Ctrlyyank空间,yank再次得到mv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txt
  • Meta- backspaceMeta- backspacebackward-kill-word两次删除最后一个narf.txt
  • troz.txt:键入不同的尾部

如果您使用bashShell 花费了很多时间,我建议您定期阅读默认快捷方式的列表,并挑选一些似乎对学习和合并到您的例程中有用的快捷方式。 手册的第8章bash是一个不错的起点。了解捷径可以真正提高您的效率。


整齐!就我而言,我必须按Alt + Backspace而不是Meta + Backspace。
k0pernikus 2012年

3
@ k0pernikus是,在大多数键盘上,Alt键是Meta键。
jw013

1
要保存重新键入内容.txt,可以按Ctrl + Left(或其他任何调用的快捷方式backward-word),然后按Left一个字符,然后按Alt + Backspace并键入troz
wjandrea

24

历史扩展实际上也可以使用事件指示符在当前命令上运行!#。将其与最后一个参数的单词指示符结合使用$--以获取刚刚键入的参数。而且,您可以在其上使用所有常规修饰符,因此,例如,如果您要在遥远的目录中重命名文件,则可以键入:

mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname

很有用!magic-space在inputrc中bash的选项可以自动扩展历史记录扩展的情况下,这种方法特别有效。(我无法使用投票最多的答案,因为我将^ W设置为以斜线分隔,因为这通常更有用。)
Soren Bjornstad

@SorenBjornstad alt+backspace通常已经在斜杠之类的单词定界符处停止了,因此您无需更改^W获取该功能的方式,您可以删除非单词字符或空格定界的单词
Eric Renouf


6

玩耍,我得到了这个工作:

mv foo/bar/poit/zoid/narf.txt

点击Enter
以存储最后一个参数。

现在用于返回最后输入的行。输入一个空格并获取上一次使用的参数:

Alt + .

我讨厌惹一个错误,但是在这个用例中它可以完成工作。


太酷了,又学到了另一个好建议!
Bram 2012年

<kbd> Esc </ kbd> + <kbd>。</ kbd>与<kbd> Alt </ kbd> + <kbd>。</ kbd>相同。
Nikos Alexandris

2

您可以轻松使用变量:

a=test.csv ; cp $a $a.bak

或者在你的情况下(注意标签工程竞争的一个部分):

a=foo/bar/poit/zoid/ ; mv ${a}narf.txt ${a}troz.txt

2

我在我的~/.inputrc

"\ej":"!#:$\e^"

!#是当前行,:$是最后一个字,\e^history-expand-line


这应该标记为答案。现在按“ alt / option + j”会复制最后一个单词。
mpprdev

2

对于zsh,我发现以下快捷键很有用。

# Bind alt-m to insert previous word from the current line
bindkey '^[m' copy-prev-shell-word

# Bind alt-k to kill word before cursor in vi-style
bindkey '^[k' vi-backward-kill-word

所以我打了Alt- M然后重复最后一个参数Alt- K如果我想删除路径末端的部分。

这是您可以映射的某些行为的有用参考


2

简短的交互式两步解决方案

  1. 类型: echo foo/bar/poit/zoid/narf.txt

    foo/bar/poit/zoid/narf.txt可用于bash中的Alt- .快捷方式。

  2. 类型:mv和命中Alt- ,,. -SpaceAlt.

    你会得到mv foo/bar/poit/zoid/troz.txt foo/bar/poit/zoid/troz.txt。现在,您可以轻松修改姓氏。

午夜指挥官

该工具(非常方便)是在控制台中运行的文件管理器。它使您可以交互式地将文件名和目录路径复制到命令行中。因此,Midnight Commander向您显示2个面板(左侧和右侧),其中列出了不同目录的内容。

简短指南:

  • Up/ Down箭头键选择当前面板中的文件。
  • Tab 在左右面板之间切换。
  • Ctrl- Shift- Enter拷贝当前选定的文件到命令行(包括完整路径)
  • Alt- o在另一个面板中打开当前选择的目录
  • Ctrl- o让您全屏查看控制台
  • Ctrl- xp将活动面板的路径复制到控制台中
  • Ctrl- xCtrl- p将非活动面板的路径复制到控制台中
  • Esc- Tab自动完成

这是到目前为止,我找到快捷方式之后最快的方法。


0

在{,}“复制器”中使用相同的内容。即:

git tag -m {v,v}1.0.1

# same as 

git tag -m v1.0.1 v1.0.1
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.