当尝试执行命令时,我在 shell 中遇到一种常见情况
command "/some/complex/and terrible/path" -vf --various --flags --and -- things --config-file="/some other/annoyingly/large/path/to/somewhere"
事实证明我大部分时间都在那里,但需要移动一些东西。假设我必须将最后一个参数一直移到前面才能尝试下一步。
command --config-file="/some other/annoyingly/large/path/to/somewhere" "/some/complex/and terrible/path" -vf --various --flags --and -- things
尝试用击键高尔夫来看待这个问题,这是一个可怕的情况。这实际上是一个噩梦般的 shell 命令输入场景,您必须重新输入(或复制并粘贴)几乎一半的命令。保持理智的最佳希望可能是使用外部编辑器[像这样]。
即便如此,Vim 还不够聪明,无法进行 arg 解析(因此没有快速的方法可以使用 eg 来取出最后一个 arg daW
,尽管考虑到 vim 的强大功能,应该可以在 8 个按键左右完成这项工作) 。
我认为这可能是一个不错的解决方法,因为我确实使用了很多软件来在 vim 中编辑文本,因为我使用它来完成所有编码。
但我想要的是,Zsh(甚至 Bash!)行编辑器是否可以以某种方式进行编程,让我可以将 arg 推到周围。有点像这样:https://github.com/AndrewRadev/sideways.vim当然,这个插件也不适用于空格分隔的 shell 参数。并且需要vim。
我对定向跳跃(这样我可以将光标放在--config-file
arg 上的某处,然后混搭 HopLeft 以将 arg 跳到左侧)或猛拉并粘贴(这样我可以将光标放在--config-file
arg上的某处)感到满意,将其拉出,按 home 转到前面并将其粘贴在后面)。
通过这种方式,我们可以通过将参数作为一个单元进行导航,而不是将单个字符作为一个单元进行导航,从而快速重构 shell 参数。它会大大加快一般命令编辑的速度。我非常关心这一点,因为我直接在 shell 中进行了异常大量的编码。
如果我们要进一步发展这个想法,这将作为编辑器来实现模式,我们称之为参数编辑模式,其中光标在参数而不是字符上移动,并且可以将参数作为一个单元执行一组更完善的操作。
现在让我们回到现实。问题是这样的:我可以通过编程方式使 zsh 删除我当前所在的 shell 参数吗?然后再粘贴回去?我可以绑定一个键,让我根据实际参数进行跳跃,而不仅仅是跳跃单词吗?
似乎没有现成的绑定可以与 一起使用bindkey
,但感觉如果我可以以编程方式控制光标的位置,可能有一种方法可以做到这一点。毕竟我确实使用了一个可以实时语法突出显示我的命令的插件。https://github.com/zsh-users/zsh-syntax-highlighting
答案1
您可能正在寻找该select-word-style
框架,特别是它的壳文字风格。看
info zsh select-word-style
例如,添加到您的~/.zshrc
:
autoload -U select-word-style
zle -N select-word-style
bindkey '\ez' select-word-style
然后(假设你使用该emacs
模式)
- 按下Alt+Z即可调用
select-word-style
- 您将看到一个菜单,您可以在其中选择文字样式。S按选择文字
shell
样式。 - 然后Ctrl+W将删除前一个单词作为完整参数(a壳单词)。
- Ctrl+A或Home转到行首
- Alt+F向右移动一个单词
- Ctrl+Y撤回之前被删除的单词。
- Alt+ZN如果你想回到普通的文字风格。
答案2
问题是这样的:我可以通过编程方式使 zsh 删除我当前所在的 shell 参数吗?然后再粘贴回去?我可以绑定一个键,让我根据实际参数进行跳跃,而不仅仅是跳跃单词吗?
是的你可以。只需使用我的 Zsh 编辑插件。它包括用于跳过和剪切整个 shell 单词的键绑定。