ZSH: menu selecione preenchimento automático para pesquisa de histórico

ZSH: menu selecione preenchimento automático para pesquisa de histórico

ZSH possui um menu poderoso de preenchimento automático, por exemplo, para escolher um diretório, escolher um processo com kill (kill[tab][tab]). Você pode usar setas para navegar pelas opções.

É possível ter o menu pop-up para a pesquisa do histórico (CTRL+R) também? De forma que o menu permitisse navegar pelas correspondências da barra de pesquisa CTRL + R atual?

Responder1

Eu sei que isso está longe de ser o que você está pedindo, mas isso pode resolver o seu problema subjacente.

Existe uma extensão de histórico do shell que mostra uma página cheia de resultados ao pesquisar o histórico. Ele também mostra resultados relevantes primeiro com base no diretório atual, repositório git, status de saída e host.

Você pode instalar o projeto aqui:https://github.com/curusarn/resh
Inicie-o usando CTRL+ R(substitui a pesquisa reversa).
Esta é a aparência do aplicativo de pesquisa:

captura de tela do aplicativo de pesquisa

Isenção de responsabilidade: sou o criador do projeto e isso é uma autopromoção descarada

Responder2

zsh-navigation-toolsfaz algo assim. Se você usar oh-my-zsh , basta adicionar zsh-navigation-toolsctrl -R para obter um histórico de rolagem com para cima/para baixo e pesquisa/filtragem. Você pode usá-lo sem oh-my-zsh, mas a configuração parece mais trabalhosa.plugins=(...).zshrc

Responder3

  1. Não que eu saiba.

  2. Talvezvocê deseja tentar predict-on, o que faz algo relacionado ao que você está perguntando:

    autoload -U predict-on
    zle -N predict-on
    zle -N predict-off
    bindkey '^X1' predict-on
    bindkey '^X2' predict-off
    

Responder4

Isso é possível; em princípio, modifiquei a _killconclusão para funcionar também para eventos históricos.

Aqui está um exemplo; depois de selecionar uma entrada, você pressiona [ENTER] uma vez para aceitar o número do evento (a linha de comando indica então fe hc 780) e pressiona [ENTER] novamente para executar o comando. (Use fcem vez de hcse desejar modificar a linha de comando antes da execução).

$ hc Makefile[TAB]
history event
 1906  9.3.2013 18:10  vi Makefile
 1867  9.3.2013 17:26  less Makefile
  780  3.2.2013 17:54  cat Makefile                
  776  3.2.2013 17:51  cat ../Makefile     

Para usá-lo, coloque os arquivos anexados em um diretório em seu $fpathe adicione estas linhas em seu ~/.zshrc:

zstyle ':completion:*:historyevent' command 'fc -dE -lr 1'
zstyle ':completion:*:historyevent' sort no

Finalmente, inicie uma nova zshsessão.

Cuidado, essa é uma solução rápida e suja, mas funcionou bem já há algum tempo.


_históriaevento

#autoload

local out histevent list expl match desc listargs all nm ret=1

_tags historyevent || return 1

all=(-U)
match="*[[:blank:]]*[[/[:blank:]]$PREFIX*$SUFFIX*"
nm="$compstate[nmatches]"

out=( "${(@f)$(_call_program historyevent fc -l 2>/dev/null)}" )
desc="$out[1]"
out=( "${(@M)out[2,-1]:#${~match}}" )

histevent=( "${(@)${(@M)out##[^0-9]#[0-9]#}##*[[:blank:]]}" )

if zstyle -T ":completion:${curcontext}:historyevent" verbose; then
  list=( "${(@Mr:COLUMNS-1:)out}" )
  desc=(-ld list)
else
  desc=()
fi

_wanted processes expl 'history event' \
    compadd "$@" "$desc[@]" "$all[@]" -a - histevent && ret=0

if [[ -n "$all" ]]; then
  zstyle -s ":completion:${curcontext}:historyevent" insert-ids out || out=menu

  case "$out" in
  menu)   compstate[insert]=menu ;;
  single) [[ $compstate[nmatches] -ne nm+1 ]] && compstate[insert]= ;;
  *)      [[ ${#:-$PREFIX$SUFFIX} -gt ${#compstate[unambiguous]} ]] &&
              compstate[insert]=menu ;;
  esac
fi

return ret

_fc

#compdef fc

local curcontext="$curcontext" line state ret=1

_arguments -C \
   '-e[editor command]' \
   '-l[list last history events]' \
   '-n[suppress numbers]' \
   '-r[reverse order]' \
   '*:history event:->historyevent' && ret=0

if [[ -n "$state" ]]; then
  _alternative \
    'historyevent:: _historyevent' && ret=0
fi

return ret

informação relacionada