我将 Zsh 与Zim一起使用。我已经设置了一个键绑定,用于在 Neovim 中编辑当前命令,方法是将以下内容放入.zshrc
:
bindkey -v
export VISUAL=nvim
autoload edit-command-line; zle -N edit-command-line
bindkey -M vicmd v edit-command-line
Run Code Online (Sandbox Code Playgroud)
这样,当我完成编辑命令时,最终结果将放置在原始结果下方,如下面的屏幕截图所示。
我想要的是最终结果替换原始行。造成这种情况的主要原因是我使用的是启用瞬态提示的 Powerlevel10k。此功能在这种特殊情况下不起作用。
免责声明:我是 Powerlevel10k 的作者。
启用瞬态提示后,当您在外部编辑器中完成命令编辑时, Powerlevel10k应截断提示。然而事实并非如此。感谢您的报告,我刚刚修复了它。
现在回到你原来的问题。
我想要的是最终结果替换原始行。
您需要为此定义一个自定义 zle 小部件。这是一种实现:
function edit-command-line-inplace() {
if [[ $CONTEXT != start ]]; then
if (( ! ${+widgets[edit-command-line]} )); then
autoload -Uz edit-command-line
zle -N edit-command-line
fi
zle edit-command-line
return
fi
() {
emulate -L zsh -o nomultibyte
local editor=("${(@Q)${(z)${VISUAL:-${EDITOR:-vi}}}}")
case $editor in
(*vim*)
"${(@)editor}" -c "normal! $(($#LBUFFER + 1))go" -- $1
;;
(*emacs*)
local lines=("${(@f)LBUFFER}")
"${(@)editor}" +${#lines}:$((${#lines[-1]} + 1)) $1
;;
(*)
"${(@)editor}" $1
;;
esac
BUFFER=$(<$1)
CURSOR=$#BUFFER
} =(<<<"$BUFFER") </dev/tty
}
Run Code Online (Sandbox Code Playgroud)
您可以按照与以下相同的方式绑定它edit-command-line
:
zle -N edit-command-line-inplace
bindkey -M vicmd v edit-command-line-inplace
Run Code Online (Sandbox Code Playgroud)
请注意,这edit-command-line-inplace
取决于edit-command-line
是否无法就地更新命令行。例如,尝试输入echo 'first line
、点击Enter,然后调用edit-command-line-inplace
。无法更新命令的第一行,因此edit-command-line-inplace
其行为方式与edit-command-line
.
edit-command-line-inplace
编辑:我发布的第一个版本明确调用nvim
来编辑命令行。我已经更新了代码以尊重VISUAL
环境EDITOR
变量。
归档时间: |
|
查看次数: |
1567 次 |
最近记录: |