zhist - Slimmere shellgeschiedenis voor zsh

Doel

De standaard zsh-geschiedenis slaat enkel een commando en een tijdstempel op. zhist voegt hier context aan toe: waar je een commando hebt uitgevoerd en of dit is mislukt. De fzf-picker maakt gebruik van deze context, waardoor mislukte commando's in het rood worden weergegeven. Met één toetscombinatie kan er geschakeld worden tussen de globale geschiedenis en de geschiedenis van de huidige map.

Installatie

Installeer de tool via Go:

go install github.com/overflowy/zhist@latest

Vereisten: Voor de picker is fzf versie 0.45 of nieuwer vereist.

Configuratie

Voeg de volgende regel toe aan je .zshrc:

eval "$(zhist init)"

Om bestaande geschiedenis eenmalig te importeren, gebruik je:

zhist import ~/.zsh_history

Let op: Geïmporteerde vermeldingen bevatten geen map of exitstatus. Deze tonen een lege map en worden nooit in het rood weergegeven.

Sneltoetsen

ToetsActie
ctrl-rOpen de geschiedenis-picker
up / downOpen de picker bij een lege regel; anders stap door de regelgeschiedenis
ctrl-gSchakel tussen globale geschiedenis en huidige map
ctrl-dVerwijder de geselecteerde vermelding
ctrl-xVerwijder alle vermeldingen met hetzelfde commando
tabAccepteer het commando en laat deze op de regel staan

Commando's negeren

Om te voorkomen dat bepaalde commando's in de opslag terechtkomen, kun je een HIST_EXCLUDE array definiëren in .zshrc. zhist slaat een commando over wanneer het eerste woord in deze array voorkomt.

Voorbeeld:

HIST_EXCLUDE=(cd ls clear pwd exit)

Kenmerken van uitsluiting:

  • De matching is exact en hoofdlettergevoelig, en geldt alleen voor het eerste woord (bijv. ls slaat ls -la over, maar niet lsd).
  • Bij commando's met meerdere regels bepaalt het eerste woord van de eerste regel of het commando wordt overgeslagen.
  • De hook leest de array op het moment van registratie; wijzigingen in een actieve shell worden direct toegepast op het volgende commando.
  • Een spatie aan het begin van een commando zorgt er ook voor dat de registratie wordt overgeslagen (voor incidentele uitsluitingen).

Aanbevolen zsh-geschiedenisinstellingen

Omdat zhist verantwoordelijk is voor de persistente opslag, is het aanbevolen om de native geschiedenis alleen in het geheugen te houden voor het terugstappen door regels en ! expansie binnen een sessie.

unset HISTFILE  # macOS /etc/zshrc stelt dit in; unset stopt zsh met het lezen of schrijven van het bestand
HISTSIZE=100000 # Geheugenevenementen voor pijl-omhoog en ! expansie
SAVEHIST=0      # Schrijf nooit een geschiedenisbestand
setopt BANG_HIST            # Behandel het '!' teken speciaal tijdens expansie
setopt HIST_IGNORE_DUPS     # Registreer geen vermelding die zojuist al is geregistreerd
setopt HIST_IGNORE_ALL_DUPS # Verwijder oude registratie als nieuwe registratie een duplicaat is
setopt HIST_FIND_NO_DUPS    # Toon geen regel die eerder is gevonden
setopt HIST_IGNORE_SPACE    # Registreer geen vermelding die begint met een spatie
setopt HIST_REDUCE_BLANKS   # Verwijder overbodige spaties voor registratie van de vermelding
setopt HIST_VERIFY          # Voer niet direct uit na geschiedenisexpansie

Stel SHAREHISTORY, INCAPPENDHISTORY of EXTENDEDHISTORY niet in. Deze beïnvloeden alleen het geschiedenisbestand, dat door zhist wordt vervangen.

Compatibiliteitsopmerkingen

  • Commando's met een spatie aan het begin worden niet geregistreerd. Dit komt overeen met de werking van HISTIGNORESPACE.
  • De opdracht eval "$(zhist init)" moet worden uitgevoerd na plugins die ctrl-r of de pijltjestoetsen binden (zoals atuin, zsh-history-substring-search of prompt pickers). De laatste binding is leidend.
  • De record hook voegt zichzelf toe aan precmd_functions en geeft $? door. Prompts die de exitstatus in hun eigen precmd lezen, blijven gewoon werken.

CLI (Command Line Interface)

CommandoBeschrijving
zhist initPrint het zsh-integratiescript
zhist add -dir D -exit NVoeg een vermelding toe; commando wordt via stdin gelezen
zhist list [-dir D]Print vermeldingen voor fzf (nieuwste eerst, gededupliceerd)
zhist get -id IDPrint het volledige commando van een vermelding
zhist delete -id ID [-all]Verwijder een vermelding, of alle vermeldingen met dat commando
zhist import FILEImporteer een zsh EXTENDED_HISTORY bestand