自动完成常用的命令行命令?


15

对于某些项目,我经常输入几个命令,例如:

cd an/extremely/long/path/in/which/I/have/some/kinda/project

./runmyproject --with some --command line --options set

看到我很懒,我尝试避免一次又一次地完整键入这些命令。因此,我当然可以大量地使用向上键来查找这些命令,但是通常,我之间也有很多命令,以至于搜索所花的时间比键入它还要多。

我现在想知道是否有某种实用工具可以建议一个完整的命令,而我还没有输入所有命令,我经常使用它。这样我可以例如键入“ cd an /”,它已经建议了路径的其余部分,因为在过去的一个月中我已经使用了很多。

我确实找到了一个叫做Bash Smart Complete的东西。但这有点“愚蠢”,因为它没有查看我以前使用的命令。我也刚刚找到了这样的答案,它建议将我经常使用的命令放在文件中。但是,这种响应速度不够快,因为每次启动新项目或更改文件夹或程序参数时,都需要为其创建一个新文件。

有人知道其他任何实用程序或其他方式来实现这一目标吗?或者,有人知道我如何更改Bash Smart Complete,以便它可以查看我过去一个月使用的命令,并完成适合过去一个月中使用最多的命令?

[编辑]以下是一些非常好的答案。我还没有将其标记为肯定的答案。不是因为我不喜欢答案,而是因为他们都不是绝对赢家。我认为Finalterm是一个很棒的项目。不幸的是,它的边缘仍然很粗糙。例如; 它尚不支持复制粘贴。不过,我会继续关注该项目,因为当它成熟时,我认为它将是一个很棒的终端应用程序。至于其他答案;他们要么建议创建一个别名(这不是我想要的,因为它会创建多余的工作而不是取消工作),要么使用Ctrl + R,这是一个绝妙的选择(我不知道!)。几个人建议使用Ctrl + R,因此我无法真正突出显示一个答案。

因此,目前肯定使用Ctrl + R,将来我可能会使用Finalterm。

谢谢大家的精彩回答!


2
你应该真的尝试一下zsh。它提供了您所要求的一切,还有更多。从bash转移到zsh
Basharat Sialvi 2013年

根据BASH手册页,该功能在BASH中也以“动态完成历史记录”的形式存在。默认情况下,它绑定到Alt + Tab使其无效,但是可以使用“ bind”更改绑定。
鲍里斯·布赫

1
@BasharatSial zsh可以具体帮助做什么?
poolie

Answers:


16

如果经常使用命令,则它们会记录在命令历史记录bash轨道中.bash_history

现在的诀窍是:您可以按CTRL-r反向搜索此历史记录以重新执行命令。

在逆向历史记录搜索模式下,bash会在您键入时实时显示以给定输入开头的历史记录中的最新命令。然后按Enter接受并执行建议的命令。持续按CTRL-R可以循环到具有相同前缀的旧命令。

它内置在bash中,不需要自定义脚本或安装软件:)它是bash最有用的功能之一,恕我直言。


3
如果不执行命令(例如,如果找不到所需的命令),请使用[ CTRL-g ]退出历史记录搜索模式。
Monica的MountainX

8

将以下内容粘贴(Ctrl-Shift-V)到终端屏幕:

echo '"\e[A": history-search-backward' > ~/.inputrc
echo '"\e[B": history-search-forward' >> ~/.inputrc
echo 'set show-all-if-ambiguous on' >> ~/.inputrc
echo 'set completion-ignore-case on' >> ~/.inputrc

退出(Ctrl-D)终端屏幕,然后再次打开终端。

现在,您只需键入前几个字符,然后按向上或向下滚动浏览筛选列表


3
这是完成工作的最简单答案!
cxrodgers

8

期末

这是一个非常有前途的终端应用程序,称为“ 最终期限”。在它的许多功能中,它还具有重新记录命令的历史,因此您可以选择它。以下是一些其他功能:

期末

您可以在本文中阅读有关它的更多信息。

这是创作者的网站。http://finalterm.org/

安装

sudo add-apt-repository ppa:versable/finalterm-daily
sudo apt-get update
sudo apt-get install finalterm

警告

我说过,这是有希望的。唯一的问题是它的版本为0.1。所以,有些事情好像vimnano还没有很好地工作。我也注意到它尚不支持拖放和复制粘贴。但是它确实具有您要求的功能。随着软件的成熟,它将成为台式机的最佳终端之一。

屏幕截图

这是起作用的功能:

 发挥作用

希望这可以帮助。

*我在Saucy上,所以这就是为什么我有Sal背景:)


谢谢你的提示!我检查了期末考试,看起来确实不错。不幸的是,它似乎还不支持复制粘贴。我尝试了Ctrl + V,Ctrl + Shift + V并单击鼠标右键,但是这些命令似乎都不起作用。因此,我会在未来牢记这一点!
kramer65

那是我看到的最大缺点。但是,该项目尚处于起步阶段,因此我希望可以尽快添加。我可以看到一个终端应用程序没有复制粘贴支持。
Max Tither

7

使用的alias为您的整个命令,或者添加目录到你$PATH。另外,您不必将目录更改为可执行文件(或脚本或任何其他文件)的运行目录,因此非常简单。两种方法都要求您重新启动所使用的终端,然后更改才会生效。

这是bash alias为您的示例创建的方法(将以下行添加到~/.bashrc文件中):

alias runmyproject='an/extremely/long/path/in/which/I/have/some/kinda/project/runmyproject --with some --command line --options set'

这样,您所需要做的就是runmyproject无论您身在何处都可以输入到终端,而无需指定选项/参数。

或者,您可以将项目路径添加到$PATH环境变量中。这样做,将以下行添加到您的~/.bashrc文件中:

PATH=an/extremely/long/path/in/which/I/have/some/kinda/project:$PATH
export PATH

在这种情况下,您仍然需要在运行可执行文件时为其指定选项/参数。


1
问题是我希望终端能够响应我的使用。有了这个,我每次开始处理新项目时或更改项目的目录结构时都必须更改别名。我的问题的主要部分是我希望它从我的使用中学习,而不是告诉我该怎么做。
kramer65

啊,我明白了。那么当前最受好评的答案应该可以解决问题。或至少紧密。
oaskamay 2013年

4

当我发现自己经常不得不切换到这样的目录时:

cd an/extremely/long/path/in/which/I/have/some/kinda/project

我只会这样做一次:

ln -s an/extremely/long/path/in/which/I/have/some/kinda/project ~/project

然后,使用:

cd ~/pr[tab]

到那个时刻:

./runmyproject --with some --command line --options set

我会使用bash历史记录搜索。在命令提示符处,只需按Ctrl-R并键入“ runmy”。瞧,整个命令以及上一次输入的所有选项都可以在其中重新输入。如果我不喜欢上次使用的选项并想看一下以前的命令,我会一直按Ctrl-R来循环浏览所有包含“ runmy”的命令。

如果您不喜欢符号链接的想法,则Ctrl-R历史记录搜索也可能对'cd'命令有所帮助。[Ctrl-R] / proj实际上很可能会将您用于cd的最后一个命令恢复到该目录。

我总是喜欢学习使用旨在帮助这种事情的bash功能,而不是添加别名或切换到特殊的shell。这样,我可以在远程计算机上使用相同的功能,或者如果我必须坐在同事的终端上。


感谢您的建议。事实是,我不想设置其他事情,例如,当项目文件夹更改或启动新项目时,我会处理其他事情。问题是我希望终端能够响应我的使用。我的问题的主要部分是我希望它从我的使用中学习,而不是告诉我该怎么做。我真的很喜欢Ctrl-R功能。谢谢你!
kramer65


2

尝试一下...这适用于您的历史记录文件中的所有命令...与Ctrl+ 相同R,但是我认为这更直观:)

  1. 编辑 /etc/inputrc

    sudo vim /etc/inputrc
  2. 取消注释或添加这两行

    "\e[5~": history-search-backward
    
    "\e[6~": history-search-forward
  3. 注销/登录


然后尝试编写历史记录中列出的一些命令...

喜欢...

ls -lah

ls

然后按

Page UpPage Dn浏览历史文件以搜索以“ ls”开头的命令

如果一切正确,它将自动完成您的命令...

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.