ZSH和ZLE,移动到行首,写入字符串,移动到行尾。

5

虽然这不是必要的,但它有点让我感到困扰,这里是来自我的 .zshrc 的片段:

一个名为 add_sudo 的函数/小部件,将在行的开头写入 sudo,然后应该移到行的末尾。

它绑定到了 ctrl+f。

但它没有移到行的末尾,它忽略了最后一个命令并停留在那里,只是写下了 sudo。

add_sudo() {
  zle beginning-of-line;
  zle -U "sudo ";
  zle end-of-line;
}

zle -N add_sudo
bindkey "^f" add_sudo

有没有解决方案?

1
你应该直接修改 $BUFFER(即 BUFFER="sudo $BUFFER"),然后移动 $CURSOR(即 (( CURSOR += 5 )))。将其推入输入栈中,正如你所看到的那样,完全不直观。 - 4ae1e1
1个回答

7

我可以回答这个问题!我刚刚加入,很高兴能帮忙……但我一开始没有看清问题,现在我会用 BUFFER= 和 CURSOR= 来补救错误。感谢 @4ae1e1 的帮助,所有功劳归他。

add_sudo (){
prefix="sudo"
BUFFER="$prefix $BUFFER"
CURSOR=$(($CURSOR + $#prefix + 1))
}
zle -N add_sudo
bindkey "^f" add_sudo

能够满足您的需求,现在每次我忘记使用sudo时都可以使用这个命令!

编辑x2

需要注意的是,这个命令会将光标定位回它之前所在的位置,这也是我喜欢使用它的原因。正如4aelel所说,您可以使用CURSOR+=5将光标定位到行尾。

同样需要注意的是,我意识到我并没有完全回答问题,因为问题是如何在zsh和zli中实现,而不是如何实现。如果我找到答案,我会同时附上这两种解决方案。我刚刚开始接触zli,还没有完全掌握细节,最近才转向zsh。


2
我注意到你将这个标记为Prezto,如果你确实使用它,那么似乎这个功能已经存在于keyboard.zsh中,可以查看这个提交https://github.com/sorin-ionescu/prezto/commit/9f8b41aaec63076d25b41b41c85c9244576c2cdb。 - joe modo

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