zsh gnu-screen tab 完成“-x”标志,类似于“-ls”

zsh gnu-screen tab 完成“-x”标志,类似于“-ls”

在 bash 中,当我键入screen -x并按 Tab 两次时,我会得到所有正在运行的会话的列表。

在 zsh 中,当我键入screen -ls并按 Tab 两次时,我会得到所有正在运行的会话的列表,并且可以通过 Tab 浏览它们,最终在按 Enter 时选择一个会话,但在screen -ls session-name再次按 Enter 时执行。

我想要在 zsh 中获得-x类似于 的行为-ls,这样我就不必键入会话名称或选择会话并返回并更改lsx

我找不到实现screen -ln选项卡行为的代码,以便也实现它-x,我一直在插件列表中搜索/grepping,.oh-my-zsh但一无所获。

感谢任何帮助,或者一些工作流程提示。我经常使用 screen,其中大部分是通过screen -x.

答案1

代码在_screen(补全是由 zsh 原生提供的,它不是一个额外的插件)。 Zsh 完成 的所有会话,-ls但仅完成 的附加会话-x

-x旨在“附加到未分离的屏幕会话”(根据手册)。但如果会话是分离的,它也可以工作。所以这两种行为都是有道理的。理想情况下,这应该是 zsh 完成的配置选项。

要获得您想要的行为而不是当前行为,您需要更改该行

  '-x[attach to a not detached screen (multi display mode)]: :->attached-sessions' \

  '-x[attach to a not detached screen (multi display mode)]: :->any-sessions' \

您可以将以下代码放入 init 文件中,以对完成函数进行猴子修补,以获得您想要的行为。它需要在后面compinit(所以如果您使用 oh-my-zsh,则在 oh-my-zsh 行之后)。

# Monkey-patch the screen completion function to complete all sessions
# after -x, not just detached sessions.
autoload +X _screen # load immediately
set -o extendedglob # needed for (#b) and # below and generally a good
                    # thing to have in interactive shells
functions[_screen]=${functions[_screen]/(#b)(\'-x[^:]#:[^:]#:->)attached-sessions(\')/${match[1]}any-sessions${match[2]}}

相关内容