【问题标题】:Possible to change tab completion behavior in fish shell?可以更改鱼壳中的制表符完成行为吗?
【发布时间】:2015-01-28 23:50:04
【问题描述】:

更新此投诉与旧版本的 fish 相关 - 请参阅以下来自 fish 开发人员的评论,该评论描述了对 fish pager 行为的惊人改进,从而消除了此投诉。

鱼壳很酷——但是我讨厌制表符补全的功能之一。

我经常 - 几乎就像一个紧张的蜱虫 - 在更改目录时输入路径时会点击 {tab}{tab}。这让我可以使用 {tab} 来检查某些路径的内容,同时解决我当前击键允许解决的大部分路径消歧问题。这提供了一种很好的方法,可以快速发现到达文件系统中某个位置的最快组合键,而无需经过深思熟虑或不必提前知道各个目录的内容。

另一方面,Fish 以我认为非常烦人的方式解释 {tab} {tab}。第一个 {tab} 列出了可能的完成,这很棒。按下下一个选项卡 fish 选择列表中的第一个补全并将当前在行中输入的路径的最后部分替换为完整的第一个补全——无论消歧状态如何。随后的选项卡循环显示下一个可能性。它类似于 windows 命令 shell 所做的。

这比正常的 bash 行为要糟糕得多......

考虑一个深度嵌套的目录结构 foo/bar/baz/a/b/c/

其中一些 foo、bar、baz 是空目录。 Bash 制表符补全让我可以输入 cd foo/{tab}{tab}{tab}{tab}{tab}{tab} ——无需考虑我按了多少次制表符,也无需考虑效果在我的命令行条目的当前状态上点击选项卡之前。

在正常情况下,所有这些目录都不会是空的——但上面的方法仍然可以非常快速地发现我需要输入的最少字符数才能进入某个深度嵌套的路径。

使用 bash 行为: cd some/unknown/dir/{tab}{tab} 保证

(1) 我看到目录 dir/ 的内容 (2) 到目前为止,从我的命令中可以明确表达的大部分内容都已完成,但仅此而已。

点击上面的两个标签后,我可能会看到如下内容:

abc123 酒吧123 baz123 bcd123 mnop123

可以进行以下操作:

a{TAB}{TAB}(给我 abc123,如果这是一个目录,则列出其内容)

m{tab}{tab}(给我 mnop123,如果它的目录列出了它的内容)

假设我想到达路径 bcd123: b -- 显示我打字太快了,现在只显示了 3 个选项 我很容易得出结论,我只需要按“c”就可以消除我的目标的歧义

b{tab}{tab}c{tab}{tab}(获取我想要的路径,如果是目录,则列出 bcd123 的内容)

fish 的模型更糟糕。 b{tab}{tab} 将完成到 bar123,我必须点击 tab 未知次数才能获得我想要的值,此外,我无法将条目上下文恢复为只有我的字母'到目前为止,我实际上已经输入了(除了多次按退格键)。如果在这个目录中碰巧有一大堆以 ba 开头的东西——我完全搞砸了会发生什么......

一般来说fish的模型更差:

  • 它不允许使用制表符来完成嵌套路径 - 要对鱼执行此操作,您需要在命令序列中的正确时间使用“/” - 这需要心理反馈
  • 在大型目录中更难发现消歧序列
  • 通常要求您在点击标签之前“小心”,这会降低您点击它的频率并降低其实用性...

请告诉我有一种方法可以在这里改变 fish 的行为,使其更像 bash ...fish 很酷,但这种行为无法使用——如果没有办法改变它,我将不得不回到 bash ...

【问题讨论】:

标签: bash shell tabs fish


【解决方案1】:

我赞扬你写了这篇详细而深思熟虑的帖子,它应该得到同样详细和深思熟虑的回应!

tab 补全行为已在 fish-top-of-tree(尚未发布)中重写,称为“新寻呼机”。你可以看到设计目标和讨论here。我在这个回复的底部写了一条说明如何获得它。

壳是个人的,就像任何个人的东西一样,合理化和辩护一文不值:你要么喜欢,要么不喜欢,我们甚至可能没有意识到影响我们感受的因素。所以我真的只能说尝试一下,看看你的感受,然后(请)报告。

我在 YouTube 上发布了新寻呼机的 short little screencast。需要注意的事项:1. 只需键入更多,菜单就会被关闭,2. 它会逐渐“展开”(需要几个选项卡才能完全可见),即使有大量完成,也不会模态地占据您的屏幕,并且是易于搜索和导航,并且 3. escape 将始终将其关闭并将您的命令行恢复为您输入的内容。

让我逐个谈谈你的担忧:

“我必须多次点击标签才能获得我想要的值”。使用新的寻呼机,所选项目在菜单中突出显示。这听起来微不足道,但我个人认为这会带来很大的不同:额外点击 Tab 的次数变得已知,而且由于您的手指在 Tab 上方,因此通常更容易再点击几次比键入其他字母的次数。您也可以使用箭头键进行导航。

“我无法将条目上下文恢复为我目前实际输入的字母”。使用新的寻呼机,转义键就是这样做的。很容易按下,因为 escape 就在您手指所在的选项卡的正上方。

“如果在这个目录中碰巧有一大堆以 ba 开头的东西——我完全搞砸了会发生什么”。 bash 和 old-pager-fish 都不能很好地处理大量完成。 fish 会让你进入这个模式分页环境,而 bash 会通过模式“显示所有 1002 种可能性?(y 或 n)”对话框打破你的流程,迫使你停止正在做的事情并点击“n”。

我想您会喜欢新寻呼机处理此问题的方式。最初,您会得到一个简短的菜单,最多可在提示符下方填充五行(不在上面,也不替换)。这个菜单是非模态的,可以通过输入更多或点击退出来关闭。如果您再次点击选项卡,菜单会增长以显示更多完成,但仍然是非模态的。从来没有不和谐的过渡。

“它不允许使用制表符来完成嵌套路径” 抱歉,我不确定您的意思。 bash 和 fish 在 tab 完成目录时都附加一个 /。

“在大型目录中更难发现消歧序列” 使用新的分页器,您可以点击转义键,输入更多内容,然后再次使用 Tab。或者您可以搜索菜单:将焦点放在菜单中并输入一些内容,然后它就会被过滤掉。请参阅上面的截屏视频。

“通常要求您在点击标签之前‘小心’,这会降低您点击它的频率并降低它的实用性” 非常有效的一点,新的寻呼机以几种方式解决了这一点.首先,它使用了渐进式披露的概念,这意味着需要“工作”才能输出大量数据。其次,它永远不会像旧的模态寻呼机那样“占据您的屏幕”。最后,您可以点击 escape 以恢复您输入的内容,并且由于寻呼机出现在提示下方,因此它不会像 bash 那样在您的回滚中留下小便。

如果您使用自制软件,您可以通过 brew install fish --HEAD 从 master 安装。还有nightly builds for Linux。最后,请随时在https://github.com/fish-shell/fish-shell/issues 提出问题,提出任何改进意见。

【讨论】:

  • 非常感谢您考虑周全的回复!到目前为止,我喜欢我在截屏视频中看到的内容,但尚未安装最新版本以与之交互(稍后会这样做)。但只是为了澄清我的意思是“它不允许使用 tab 来完成嵌套路径”——tab 之后会用斜杠完成一个目录路径组件,并且命令条目将显示为类似于 a/{underline}dir123/{ /underline},此时选项卡不会继续在 dir123/ 中搜索补全,而是会循环到目录 a/ 中的其他补全候选。
  • 我是从 HEAD 安装的,非常喜欢新的寻呼机设计!这是伟大的和巨大的进步!!在我看来,它比 bash 行为和之前的鱼壳行为要好得多。
  • 很高兴听到它。感谢您试一试:)
  • 对于 “它不允许使用选项卡来完成嵌套路径” 选项在点击选项卡并选择或输入您想要的选项后按 Enter 以选择该部分并继续键入以深入了解。
  • 有没有办法直接走到寻呼机列表的末尾?使用 ZSH,我可以向上箭头并在列表末尾结束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多