在 bash 中,当我键入screen -x
并按 Tab 两次时,我会得到所有正在运行的会话的列表。
在 zsh 中,当我键入screen -ls
并按 Tab 两次时,我会得到所有正在运行的会话的列表,并且可以通过 Tab 浏览它们,最终在按 Enter 时选择一个会话,但在screen -ls session-name
再次按 Enter 时执行。
我想要在 zsh 中获得-x
类似于 的行为-ls
,这样我就不必键入会话名称或选择会话并返回并更改ls
为x
。
我找不到实现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]}}