如何在Shell中快速恢复命令执行前的光标位置?
恢复Shell命令执行前的光标位置
Fish Shell 实现方案
Fish可以通过自定义函数和快捷键绑定实现这个功能:
- 定义命令执行前保存光标位置的函数:
function save-cursor-pos --on-event fish_preexec set -U __last_cursor_pos $CURSOR end
这个函数会在命令即将执行时(触发fish_preexec事件),把当前光标位置存入全局变量__last_cursor_pos。
- 定义恢复光标位置的函数:
function restore-cursor-pos if set -q __last_cursor_pos set CURSOR $__last_cursor_pos end end
- 绑定快捷键(比如
Ctrl+R,可自行修改):
bind \cr restore-cursor-pos
把以上代码添加到~/.config/fish/config.fish,执行source ~/.config/fish/config.fish生效。之后调出失败的历史命令,按下绑定的快捷键就能直接回到之前的光标位置。
Zsh 实现方案
Zsh借助钩子函数和行编辑器(zle)轻松实现:
# 保存命令执行前的光标位置 autoload -Uz add-zsh-hook save-cursor-pos() { LAST_CURSOR_POS=$CURSOR } add-zsh-hook preexec save-cursor-pos # 定义恢复光标位置的zle组件 restore-cursor-pos() { if [[ -n "$LAST_CURSOR_POS" ]]; then CURSOR=$LAST_CURSOR_POS fi } zle -N restore-cursor-pos # 绑定快捷键,示例为Alt+P bindkey '\ep' restore-cursor-pos
将代码写入~/.zshrc,执行source ~/.zshrc生效。调出历史命令后按Alt+P即可恢复光标位置。
Bash 实现方案
Bash需要借助readline特性和提示符命令模拟preexec钩子:
# 保存光标位置到临时文件 save_cursor_pos() { # 通过ANSI转义序列获取当前光标列位置 local pos pos=$(echo -ne "\033[6n" | grep -o '[0-9;]*R' | cut -d';' -f2) echo "$pos" > ~/.bash_last_cursor_pos } # 恢复光标位置的函数 restore_cursor_pos() { if [[ -f ~/.bash_last_cursor_pos ]]; then local pos=$(cat ~/.bash_last_cursor_pos) # 移动光标到目标位置:先回到行首,再向前移动指定次数 readline beginning-of-line for ((i=0; i<pos-1; i++)); do readline forward-char done fi } # 每次显示提示符时保存光标位置 PROMPT_COMMAND="save_cursor_pos; $PROMPT_COMMAND" # 绑定恢复快捷键为Ctrl+R bind -x '"\C-r": restore_cursor_pos'
把代码添加到~/.bashrc,执行source ~/.bashrc生效。调出历史命令后按Ctrl+R即可恢复之前的光标位置。
内容的提问来源于stack exchange,提问作者lefuturiste
相关产品推荐
相关产品推荐

