如何保留上一个命令中的光标位置?

如何保留上一个命令中的光标位置?

当我迭代 bash 历史记录中的先前命令时,光标位置始终跳转到命令末尾。我想要某种方法来记住上次执行命令的当前光标位置。

当为某些命令尝试不同的命令行选项时,这可能很有用。现在我必须按下up键并将光标向后移动到键入选项的位置才能对其进行编辑。如果可能的话,我想消除第二步。

我使用的是 bash,但其他 shell 的解决方案也很有趣。

答案1

也许这就是您正在寻找的选择?

history-preserve-point (Off)
        If  set to On, the history code attempts to place point at the
        same location on each history line retrieved 
        with previous-history or next-history.

要打开它,请将其添加到您的~/.inputrc

set history-preserve-point on

答案2

几乎作品。

__insert_last_history_entry() {

    READLINE_LINE=$(history -p '!!')
}

bind -x '"\ea" : __insert_last_history_entry'   # Alt-a

将其保存在文件中(例如,insertLastHistory)并在命令行上获取它:

. insertLastHistory

(或者,将其内容插入到您的 shell 中~/.bashrc并重新启动 shell)。

Alt-a触发新的行为。

它不会改变光标位置

答案3

在 中zsh,要记住每个历史条目的光标位置并在每次调用历史条目时调用它,您需要将以下内容添加到您的 中~/.zshrc

typeset -A cursor_history
save-cursor()    cursor_history[$HISTNO]=$CURSOR
restore-cursor() CURSOR=${cursor_history[$HISTNO]-$CURSOR}

autoload -Uz add-zle-hook-widget
add-zle-hook-widget line-finish      save-cursor
add-zle-hook-widget history-line-set restore-cursor

(请注意,历史记录不会在 shell 调用之间保留,仅在当前 shell 会话内保留)。

当您离开当前编辑的行时,它也不会保存当前光标位置。为此,您还需要至少包装所有历史运动小部件,以便它们save-cursor首先执行以下操作:

for w (${(Mk)widgets:#.*hist*}) {
  functions[${w#.}]='save-cursor; zle '$w
  zle -N ${w#?}
}

答案4

注意事项:

  • 该解决方案涉及tmux
  • 实际上并没有记住光标位置:它只是将光标定位在行的开头而不是结尾。

  1. 将其添加到您的~/.tmux.conf

    ###############################################
    ## Last command line + Home
    
    bind -n 'C-a'    send-keys Up \; send-keys Home
    
  2. 重新加载 tmux 配置

    tmux source-file ~/.tmux.conf
    

然后当你按下时Ctrl+abash就会收到Up,紧接着Home

相关内容