ZSH:如何在命令行中运行类似Vim的替换命令?

6

我在Zsh命令行中忘记了数组语法:

$ hello=[1,2,3,4] %ERR: 

我希望通过替换来解决问题。在Vim中,我会执行:.s@,@ @g。 那么如何在当前行或称为当前缓冲区上运行命令来编辑它?
2个回答

5
[jkramer/sgi5k:~]# list=(1,2,3,4,5,6,7,8,9,10)
[jkramer/sgi5k:~]# !:gs/,/ /                  
list=(1 2 3 4 5 6 7 8 9 10)

请参阅zshexpn(1)以获取更多有关历史记录完成/替换的信息。


3

仅使用自定义的zle小部件,例如:

function _-sedsubs()
{
    emulate -LR zsh
    local SEDARG="s"
    zle -R "Substitution: $SEDARG"
    local key=""
    read -k key
    local -r start=$key
    while (( (#key)!=(##\n) &&
             (#key)!=(##\r) )) ; do
        if (( (#key)==(##^?) || (#key)==(##^h) )) ; then
            SEDARG=${SEDARG[1,-2]}
        else
            SEDARG="${SEDARG}$key"
        fi
        zle -R "Substitution: $SEDARG"
        read -k key || return 1
    done
    BUFFER="$(echo $BUFFER | sed -r -e "$SEDARG")"
}
zle -N sedsubstitute                     _-sedsubs
bindkey "\C-o:s" sedsubstitute

如何启用它?我还启用了vi-mode插件和bindkey -v,但它直接跳转到execute:,如果我不启用例如vi-mode插件,则不起作用。 - Anne van Rossum
如果我从 zsh -f 开始,然后只需将代码粘贴到 zsh 中(无论是以前的版本还是当前版本,唯一更改的是我在第一个实际代码行之后用 zle -R "Substitution: $SEDARG" 替换了开头的 zle -R "Substitution: ",否则会令人困惑),它就可以工作。虽然你需要打得够快。这应该可以放入 zshrc 中。我不知道你所说的“直接跳转到 execute:”是什么意思,但我使用基于 emacs 的键映射(zsh -f 默认也使用 emacs)。也许你只是打字不够快,需要调整超时时间。 - ZyX
或者在vi绑定中使用<C-o>可以立即切换模式,而你实际上需要在“正常”模式下映射:s(不带<C-o>)。 - ZyX
默认情况下,在vicmd键映射中,:被映射为execute-named-cmd。因此,如果您在vi命令模式下键入:,您将得到execute:提示符 - 这可能是@AnnevanRossum所指的。当然,您可以使用bindkey -rM vicmd ':'取消绑定它。 - wjv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接