我喜欢在不触碰鼠标的情况下使用bash(在linux上)。
我经常遇到以下情况。
$ locate libfreetype.a
/usr/lib/x86_64-linux-gnu/libfreetype.a
$ cd /usr/lib/x86_64-linux-gnu
在这种情况下,我复制/usr/lib/x86_64-linux-gnu/
并使用鼠标粘贴或键入它。我不想那样做。
理想情况下,locate libfreetype.a
的输出存储在某个地方(可能是killring ??)并用C-y
命令粘贴它并在终端上编辑它。
有没有好方法呢? (仅针对此示例情况,有智能的单行命令。但这些并不是理想的答案。我想要一个通用的解决方案。)
另一个例子
假设我记得memo...
与libfreetype.a
位于同一目录中,但我忘记了目录名称。
$ locate libfreetype.a
/usr/lib/x86_64-linux-gnu/libfreetype.a
$ nano /usr/lib/x86_64-linux-gnu/memo # Tab completion here
$ nano /usr/lib/x86_64-linux-gnu/memo_xxx.txt
如果我可以缓存输出/usr/lib/x86_64-linux-gnu/libfreetype.a
并粘贴它,那么事情就很容易了。
(nano $(dirname $(locate libfreetype.a))/memo_xxx.txt
适用于这种情况,但如果我想改变路径本身,我需要考虑另一种技术。)
答案 0 :(得分:1)
可能这个小脚本会帮助你:
复制强>
#!/bin/bash
tr '\n' ' ' | xclip
用法:
$ locate libfreetype.a | copy
$ cd
# now press <shift> + <insert>
$ cd /usr/lib/x86_64-linux-gnu/libfreetype.a
# you can continue editing
xclip命令将其输入复制以粘贴到X应用程序中。
tr '\n' ' '
命令将所有换行符转换为空格。如果要将文本粘贴到命令行中,则需要此选项。它剥离尾部换行符,如果要复制的输出包含多行,则将这些行连接在一起。使用普通xclip
时,所有换行符都是字面上粘贴的。这将导致bash运行命令,并且不允许您编辑任何内容。
此外,如果您的命令输出(例如locate
)包含多行,并且您想选择一个进行复制(而不是复制所有这些行),您可能会发现它方便使用iselect
。 iselect
读取输入并显示用于选择行/行的交互式菜单,并将其打印到标准输出。
你可以这样使用它:
$ locate pattern | iselect -a | tr '\n' ' ' | xlip
# locate prints several lines
# you select one of them interactively with iselect
# the result is copied to clipboard and you can use it now
$ # <shift> + <insert>
如果您愿意,请将其放在脚本中:
<强> icopy 强>
#!/bin/bash
iselect -am | tr '\n' ' ' | xclip
(-m
选项允许选择多行而不是一行
现在:
$ locate pattern | icopy
此解决方案的缺点:
xclip
,并且可选择iselect
)另见:
man iselect
(链接:man.cx/iselect)man xclip
(链接:linux.die.net/man/1/xclip)man tr
(链接:linux.die.net/man/1/tr)(不能发布2个以上的链接)
答案 1 :(得分:0)
您可以从 .bashrc 运行 script
(man script),它会生成会话输出的实时日志。并绑定一个在编辑器中打开日志文件的快捷方式,这样你就可以将抽取的文本插入到 $READLINE_LINE 中。
但是 script
捕获来自交互式程序(例如编辑器)的原始输出,因此如果可以修改 script
以跳过交互式输出,它会起作用。下一步是解析输出,以加快导航速度。
这是一个仅对非交互式工具执行此操作的 .bashrc 片段:https://asciinema.org/a/395092
答案 2 :(得分:-3)
你可以使用
!$
像
shell$ echo myDir/
myDir/
shell$ cd !$
cd myDir/
shell$ pwd
/home/myDir