尽可能靠近鱼

尽可能靠近鱼

我喜欢 fish shell,只在 MacOS 上使用它,但在其他地方我都使用 bash,因为它是唯一安装的东西。在感受到维护两个 shell 的配置文件的痛苦后,我决定停止使用 fish,转而使用 bash。为了尽可能地减少痛苦,我应该在 bash 中使用哪些配置选项/插件/等,以使其尽可能接近 fish?

我最怀念的事情:

  • 自动完成支持:fish 能记住我的所有命令,对部分(有时是巨大)命令进行完成,似乎能够理解我使用的所有 cmd 行应用程序并提供其命令的完成等。对于每个命令,如果我按下 tab 键,fish 会以暗淡的颜色显示它会自动完成的命令。
  • git 支持:fish 向我显示我是否在 github 存储库中、分支的名称以及它是否已被修改,或者在我的用户名@主机名旁边使用漂亮的颜色清晰显示,我也希望在 bash 上也有这个功能

答案1

配置有很多选项bash。我使用以下命令来轻松访问命令历史记录:-

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

这些设置UpDown箭头来在命令历史记录中上下扫描以命令行上光标前的字符开头的命令(就像 TCC 在 Windows 中所做的那样)。

至于提示符,您可以输入每次输出提示符时要运行的命令。我使用:-

PS1="\`curspos -n>/dev/tty\`\`[ \$BASH_LEVEL != 1 ]&&echo \"[\$BASH_LEVEL]\"\`\\t[\\w/]\\\$ "

这将在每个提示符下调用两个命令:-

  • curspos是我编写的一个脚本,用于检查光标位置,如果不在第一列,则输出新行(我对不必要的空行感到恼火)。
  • BASH_LEVEL如果级别不是 1,则检查会在提示之前用方括号括起来,这样就可以立即知道您是否在子 shell 中(例如)[2]15:55:32[~/]$

这些都不能直接满足您的要求,但它们说明了您可以在提示字符串中使用的功能。对于您的情况,您只需在gitcheck提示的其余部分之前添加一个脚本或函数(例如)来执行,这样就可以以您想要的格式输出您想要看到的任何信息作为提示的一部分。

我最后要评论的是,它在许多 Linux 发行版中都可用(例如它位于 Ubuntu 存储库中),因此仅当您无法安装软件包时才fish需要进行这些定制。bash

答案2

关于自动完成,bash使用 GNU Readline 提供制表符完成以及历史记录查找和完成。制表符完成适用于命令名称、文件以及(对于任何具有完成脚本的命令)选项和参数。使用UpDown线性浏览历史记录;或者,要搜索,请键入Ctrl+R和您记得的命令的任何部分。几乎所有 bash 都安装了 Readline,尤其是对于现代操作系统。

为了回答你的 Git 问题,Git 本身包含脚本来为提示添加颜色并执行tab 补全用于 bash shell 和其他。当我安装适用于 Windows 的 Git 时,随其分发的 bash 程序已预先准备好自动使用这些。

如果你熟悉 bash,那么可能并不难在 Mac 上添加 git 提示符。Bash 根据变量的内容生成提示符PS1。它允许您执行任意函数来生成提示符的部分内容,从而允许这些巧妙的脚本运行。与其他 shell 一样,bash 依赖于底层终端仿真器来产生颜色。它只是将您为提示符设置的文本传递给终端仿真器。只需添加正确的ANSI 代码PS1提示符,您将获得彩色输出。

答案3

可以在 bash 中使用以下方法实现高级 fish/zsh 类自动完成功能(以及语法高亮):ble.sh

ble.sh

对于支持 git status 和 branch 的提示,有多个开源选项可用。我所知道的功能最丰富、可自定义的提示是星舰

星舰

相关内容