как я могу добавить ТОЛЬКО последнюю часть диска, которая еще не была разработана/обнулена

Так что да, это старая тема, но ни один из этих вопросов не дал мне ответа, поэтому я просто потратил целую вечность, пытаясь понять это!

Вот мое решение с благодарностью от @Gilles за намек на использование 'fc -R' и 'fc -W' :).

Вставьте приведенный ниже сценарий в файл.zshrc.

перезагрузить исходный файл.zshrc

затем введите «забыть», чтобы забыть последнюю команду :D. введите «забыть 3», чтобы забыть последние 3 команды. Какой-то сексуальный шиз.

Нажатие на стрелку вверх приведет вас прямо к последней команде, а слово «забыть» тоже не запомнится :).

Обновлено:Добавлен домашний путь, так что теперь он работает во всех каталогах, лол.

Обновление 2:Добавлена ​​возможность передать количество последних команд, которые вы хотите забыть :D. Попробуйте «забыть 2», чтобы забыть последние 2 команды :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.
}

Итак, здесь происходит несколько вещей. Эта команда позволит нам ввести пробел перед любой командой, и она не будет добавлена ​​в историю.

setopt histignorespace

Таким образом, мы можем нажать пробел и ввести 'echo hi', нажать Enter, и когда мы нажмем стрелку вверх, 'echo hi' не будет в нашей истории :).

Обратите внимание, что псевдоним «забыть» имеет пробел перед моей _удалить _последнюю _запись в истории _. Это сделано для того, чтобы zsh не сохранял наше «забыть» в историю.

Описание функции

ZSH использует fc для истории или что-то в этом роде, поэтому мы делаем 'fc -W', чтобы записать наши текущие команды в файл истории, их мы используем 'head -n -1', чтобы обрезать последние команду отключить файл. Мы сохраняем этот вывод во временный файл, а затем заменяем исходный файл истории временным. И, наконец, перезагрузить историю с fc -R.

Однако существует проблема с функцией, которая исправлена ​​с помощью псевдонима.

Если мы запустим функцию по ее имени, она удалит последнюю команду, которая является вызовом функции. Вот почему мы используем псевдоним с вызовом его через пробел, чтобы zsh не добавил это имя функции в файл истории, сделав последнюю запись той, которую мы хотим :D.

1
17.11.2021, 22:07
0 ответов

Теги

Похожие вопросы