You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shell中快速恢复命令执行前的光标位置?

恢复Shell命令执行前的光标位置

Fish Shell 实现方案

Fish可以通过自定义函数和快捷键绑定实现这个功能:

  1. 定义命令执行前保存光标位置的函数:
function save-cursor-pos --on-event fish_preexec
    set -U __last_cursor_pos $CURSOR
end

这个函数会在命令即将执行时(触发fish_preexec事件),把当前光标位置存入全局变量__last_cursor_pos。

  1. 定义恢复光标位置的函数:
function restore-cursor-pos
    if set -q __last_cursor_pos
        set CURSOR $__last_cursor_pos
    end
end
  1. 绑定快捷键(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:52:27