搜索多个终端窗口共享的 bash 历史记录,但保持会话分开

搜索多个终端窗口共享的 bash 历史记录,但保持会话分开

我已阅读解决方案在多个终端窗口中保留 bash 历史记录 我正在寻找以下妥协:

  1. 所有并发会话中的命令bash在执行后都会附加到一个共享文件中
  2. Ctrl+r在一个会话中查找来自其他会话的命令
  3. 在一个会话中按Up/Down仅有的循环执行该会话中的命令。

这可能吗bash?如果没有,zsh也许?

答案1

我在尝试实现类似目标时偶然发现了这个问题。我相信以下内容可以解决您的问题:

  1. 使用文件来记录所有执行的命令。感谢 Eli Bendersky 的贡献邮政,我按原样使用他的代码,唯一的变化是在$PERSISTENT_HISTORY_FILE.

  2. 安装弗兹夫使用键绑定(我不确定通过包管理器安装是否设置键绑定,但通过 git 和安装脚本可以)。

  3. __fzf_history将函数更改fzf/shell/key-bindings.bash为:

__fzf_history__() {
  local output opts script
  opts="--height ${FZF_TMUX_HEIGHT:-40%} --bind=ctrl-z:ignore ${FZF_DEFAULT_OPTS-} -n2..,.. --scheme=history --bind=ctrl-r:toggle-sort ${FZF_CTRL_R_OPTS-} +m --read0"
  script='BEGIN { $/ = "\n"; $HISTCOUNT = $ENV{last_hist} + 1 } s/^[ *]//; print $HISTCOUNT - $. . "\t$_" if !$seen{$_}++'
  output=$(
    tac $PERSISTENT_HISTORY_FILE |
        last_hist=$(HISTTIMEFORMAT='%F %T  ' builtin history 1) perl -n -l0 -e "$script" |
      FZF_DEFAULT_OPTS="$opts" $(__fzfcmd) --query "$READLINE_LINE"
    ) || return
  READLINE_LINE=${output#*| }
  if [[ -z "$READLINE_POINT" ]]; then
    echo "$READLINE_LINE"
  else
    READLINE_POINT=0x7fffffff
  fi
}

显然,您可以创建自己的函数,从 fzf 细节中剥离上面的代码并将其绑定到 ctrl+r。

相关内容