Как добавить запись в историю раковины?

В моей функции fish я оцениваю построенную командную строку через eval (commandline), в частности - я ищу имя файла из fzf, а затем проанализирую, была ли добавлена ​​командная строка с помощью vim. Если бы это было - вместо того, чтобы возвращать vim filename, чтобы нажать enter после этого, я просто оцениваю его, как я показал ранее.

Дело в том, что если я его оцениваю, вместо того, чтобы нажимать вводить вручную, он не собирается в историю - например. Я не могу видеть это как предыдущую команду, нажав вверх.

Я попробовал set -x history (commandline) $history после eval, но он показывает мне ошибку set: Tried to change the read-only variable "history"

Есть ли способ вручную добавить пользовательскую строку (в моем случае буфер командной строки) в историю? ТНХ.

Ответ 1

history --merge не объединяет историю в хронологическом порядке # 2312. Поэтому, даже если мы вручную добавим команду в ~/.config/fish/fish_history, мы не сможем просто нажать ее, чтобы увидеть ее (хотя вы доберетесь до нее, если нажмете достаточно).

Чтобы обойти это, мы можем сделать копию fish_history, затем вызвать builtin history --clear, который очистит как внутреннюю историю рыбы, так и файл истории. Затем мы восстанавливаем файл истории из нашей копии, добавляем нашу команду и вызываем history --merge, чтобы объединить файл истории с пустой историей.

function evalh
    eval $argv

    # backup history file
    cp ~/.config/fish/fish_history /tmp/fish_history.tmp

    # clear internal history and history file (using builtin means we don't get a prompt)
    builtin history --clear

    # restore history file
    cp /tmp/fish_history.tmp ~/.config/fish/fish_history

    # append our command 
    echo "- cmd:" $argv >> ~/.config/fish/fish_history
    echo "  when:" (date "+%s") >> ~/.config/fish/fish_history

    # merge history file with (empty) internal history
    history --merge
end