当我迭代 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
- 实际上并没有记住光标位置:它只是将光标定位在行的开头而不是结尾。
将其添加到您的
~/.tmux.conf
:############################################### ## Last command line + Home bind -n 'C-a' send-keys Up \; send-keys Home
重新加载 tmux 配置
tmux source-file ~/.tmux.conf
然后当你按下时Ctrl+a
,bash
就会收到Up
,紧接着Home
。