Tak, to jest stary temat, ale żadne z tych pytań nie udzieliło mi odpowiedzi, więc spędziłem całe wieki próbując to rozgryźć!
Oto Moje rozwiązanie z podziękowaniami od @Gilles za podpowiedź użycia „fc -R” i „fc -W” :).
Wklej poniższy skrypt do pliku .zshrc.
przeładuj ze źródłowym .zshrc
następnie wpisz „zapomnij”, aby zapomnieć ostatnie polecenie: D. wpisz „zapomnij 3”, aby zapomnieć 3 ostatnie polecenia. Niektóre seksowne shizz.
Naciśnięcie strzałki w górę przeniesie Cię bezpośrednio do ostatniego polecenia i nie zapamiętasz też słowa „zapomnij” :).
Zaktualizowano: Dodano ścieżkę główną, więc działa teraz we wszystkich katalogach lol.
Aktualizacja 2: Dodano możliwość przekazywania liczby ostatnich poleceń, które chcesz zapomnieć: D. Spróbuj „zapomnieć 2”, aby zapomnieć 2 ostatnie polecenia: D.
# Put a space at the start of a command to make sure it doesn't get added to the history.
setopt histignorespace
alias forget=' my_remove_last_history_entry' # Added a space in 'my_remove_last_history_entry' so that zsh forgets the 'forget' command :).
# ZSH's history is different from bash,
# so here's my fucntion to remove
# the last item from history.
my_remove_last_history_entry() {
# This sub-function checks if the argument passed is a number.
# Thanks to @yabt on stackoverflow for this :).
is_int() ( return $(test "$@" -eq "$@" > /dev/null 2>&1); )
# Set history file's location
history_file="${HOME}/.zsh_history"
history_temp_file="${history_file}.tmp"
line_cout=$(wc -l $history_file)
# Check if the user passed a number,
# so we can delete x lines from history.
lines_to_remove=1
if [ $# -eq 0 ]; then
# No arguments supplied, so set to one.
lines_to_remove=1
else
# An argument passed. Check if it's a number.
if $(is_int "${1}"); then
lines_to_remove="$1"
else
echo "Unknown argument passed. Exiting..."
return
fi
fi
# Make the number negative, since head -n needs to be negative.
lines_to_remove="-${lines_to_remove}"
fc -W # write current shell's history to the history file.
# Get the files contents minus the last entry(head -n -1 does that)
#cat $history_file | head -n -1 &> $history_temp_file
cat $history_file | head -n "${lines_to_remove}" &> $history_temp_file
mv "$history_temp_file" "$history_file"
fc -R # read history file.
}
A więc dzieje się tutaj kilka rzeczy. To polecenie pozwoli nam wpisać spację przed dowolnym poleceniem i nie zostanie dodane do historii.
setopt histignorespace
Możemy więc nacisnąć spację i wpisać „echo hi”, nacisnąć enter, a kiedy naciskamy strzałkę w górę, „echo hi” nie jest w naszej historii :).
Zauważ, że alias „zapomnij” ma spację przed my_remove_last_history_entry. Dzieje się tak, aby zsh nie zapisał naszego „zapomnienia” w historii.
Funkcja wyjaśniona
ZSH używa fc do historii lub czegoś takiego, więc robimy „fc -W”, aby zapisać nasze bieżące polecenia do pliku historii, używamy „head -n -1”, aby przyciąć ostatnie polecenie z pliku. Zapisujemy ten wynik w pliku tymczasowym, a następnie zastępujemy oryginalny plik historii plikiem tymczasowym. I w końcu przeładuj historię fc -R.
Występuje jednak problem z funkcją, która jest naprawiona przez alias.
Jeśli uruchomimy funkcję po nazwie, usunie ona ostatnie polecenie, które jest wywołaniem funkcji. Dlatego używamy aliasu z wywołaniem do niego za pomocą spacji, aby zsh nie dodawał tej nazwy funkcji do pliku historii, czyniąc ostatni wpis tym, którego chcemy: D.
W
zsh
ustawhistignorespace
opcję (set -o histignorespace
). I wbash
, dodajignorespace
lubignoreboth
(niektóre dystrybucje już to robią domyślnie~/.bashrc
) do$HISTCONTROL
lub ustawHISTIGNORE=' *'
, a następnie możesz uruchomić bieżące polecenie za pomocą <spacji>, aby uniknąć jego nagrania.W
zsh
nadal możesz raz przywołać poprzednie polecenie, ale nie jest ono przechowywane w historii.źródło