Son komut (veya bonus için geçerli komut) zsh geçmişinden nasıl kaldırılır


15

Elbette bunu yapmanın süper basit bir akıllı yolu var, ancak zshell'deki tarih fc'ye aliased gibi göründüğü için, Tek bir satırı tarihten nasıl kaldırabilirim? .

Bunun nasıl yapılacağına dair bir işaret var mı? Benim kullanım durumum, son verilen komutu geçmişten kaldırmaktır, böylece otomatik tamamlamayı durdurur (çoğunlukla bir şey yanlış yazdığınızda ve görünmeye devam ederse).

Biliyorum ki son verilen komutu yaparak

history | tail -n 1, ama tarih -d çalışmıyor ve zsh için uygun belgeleri bulamıyorum.

Yanıtlar:


10

Zsh gerçek bir tarih baskısı olanağı sunmuyor. Komut geçmişi temel olarak salt okunurdur. Yapabileceğiniz tek şey toptan yerine koymak.

Komut satırı geçmişini düzenlemek için:

  1. Bir dosyaya kaydedin: fc -W
  2. Dosyayı düzenle
  3. Dosyadan geçmişi yükleyin: fc -R

Ayarlayarak dosya adını seçebilirsiniz HISTFILE.

Test edilmemiş kod:

remove_last_history_entry () {
  setopt local_options extended_history no_hist_save_no_dups err_return

  local HISTFILE=~/.zsh_history_tmp_$$ SAVEHIST=$HISTSIZE
  fc -W
  ed -s $HISTFILE <<EOF >/dev/null
d
w
q
EOF
  fc -R
}

6

Genellikle satırı kaldırabilirsiniz ~/.zsh_history, ancak bulamazsanız ~/.zshrcgeçmiş dosyanızın konumunu arayın .

Ardından rahatsız edici satırları kaldırmak için istediğiniz herhangi bir metin düzenleyiciyi kullanın. Alternatif olarak, tüm dosyayı silin ve tüm zsh örneklerini kapatın ve yeni bir tane başlatın. Tarih tasfiye edildi!


2

Yani evet, bu eski bir konu, ama bu soruların hiçbiri bana cevap vermedi, bu yüzden ben de bunu anlamaya çalışmak için yaşları harcadım!

İşte 'fc -R' ve 'fc -W' :) kullanımının ipucu için @Gilles'dan teşekkürler .

Bunun altındaki komut dosyasını .zshrc dosyanıza yapıştırın.

.zshrc kaynağı ile yeniden yükle

ardından son komutu unutmak için 'unut' yazın: D. son 3 komutu unutmak için 'unut 3' yazın. Bazı seksi shizz.

Yukarı oka basmak sizi doğrudan son komuta götürür ve 'unut' kelimesini de hatırlamaz :).

Güncellendi: Ev yolu eklendi, bu yüzden şimdi lol tüm dizinlerde çalışır.

Güncelleme 2: Unutmak istediğiniz son komut sayısını geçme özelliği eklendi: D. Son 2 komutu unutmak için '2'yi unut' seçeneğini deneyin: 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.
}

Yani burada birkaç şey oluyor. Bu komut, herhangi bir komuttan önce bir boşluk yazmamıza izin verir ve geçmişe eklenmez.

setopt histignorespace

Böylece boşluk çubuğuna basıp 'echo hi' yazabilir, enter tuşuna basabilir ve yukarı oka bastığımızda 'echo hi' tarihimizde değildir :).

'Unutma' takma adının my_remove_last_history_entry'den önce nasıl bir alana sahip olduğuna dikkat edin. Bu zsh bizim 'unut' bizim tarihe kaydetmez.

Açıklanan fonksiyon

ZSH geçmiş veya bir şey için fc kullanır, bu nedenle mevcut komutlarımızı geçmiş dosyasına yazmak için 'fc -W' yaparız, dosyadaki son komutu kesmek için 'head -n -1' kullanırız. Bu çıktıyı geçici bir dosyaya kaydedip orijinal geçmiş dosyasını geçici olanla değiştiriyoruz. Ve nihayet fc -R ile tarihi yeniden yükleyin.

Ancak takma adla düzeltilen işlevle ilgili bir sorun vardır.

İşlevi adıyla çalıştırırsak, işleve çağrı olan son komutu kaldırır. Bu nedenle, takma adı boşluk kullanarak çağrıyla kullanırız, böylece zsh bu işlev adını geçmiş dosyasına eklemez ve son girdiyi istediğimiz gibi yapar: D.


ya son komut çok satırlıysa?
avp

Bu resmi cevap olarak oylanmalıdır. Teşekkürler.
gsl

1

'De ( ) seçeneğini zshayarlayın . Ve ekleyin veya (bazı dağıtımlar bunu varsayılan olarak zaten yapar ) veya ayarlayın ve ardından kaydetmemek için geçerli komutu bir <boşluk> ile başlatabilirsiniz .histignorespaceset -o histignorespacebashignorespaceignoreboth~/.bashrc$HISTCONTROLHISTIGNORE=' *'

:
 : none
fc -nl -1

:

İçinde zsh, önceki komutu bir kez hatırlayabilirsiniz, ancak geçmişte saklanmaz.


1
Bu soruya değinmiyor.
Chris Page
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.