Когда я пытаюсь прочитать историю удара в энергию, я ничего не получаю.
:r !history
Если я просто выполняю команду, т.е.
:!history
вместо истории я получаю снимок своего терминала, поскольку это смотрело, прежде чем я запустил энергию.
Как я могу считать вывод "истории" в энергию? Чтение содержания .bash_history не сделает, поскольку я сохраняю историю с метками времени:
HISTTIMEFORMAT='%Y.%m.%d %R '
:r!echo "history" | bash -i 2>/dev/null | sed -e 's/\x1b\[.//g'
Команда history работает только в интерактивной оболочке.
Первая часть:
echo "history" | bash -i 2>/dev/null
Активизирует интерактивную оболочку (и удаляет строки, которые не выводятся из истории).
Вторая часть:
sed -e 's/\x1b\[.//g'
Удаляет escape-символ, который может выводить оболочка (произошло в моей системе).
Проблема в том, что эта история известна только оболочке bash, которая запустила vim. Когда вы делаете :!history
из vim, вы запускаете новый bash shell, который имеет свою собственную историю, которая пуста, поэтому вы видите экран таким, каким он был при запуске vim: он выводит все строки в своей истории, а это в общей сложности ноль. На самом деле это чрезмерное упрощение, но в любом случае вы не сможете получить историю команд, которые вы набрали непосредственно перед запуском vim таким образом.
Если вы хотите получить эти строки истории без выхода из vim, вы можете приостановить vim, нажав CTRL-Z
, а затем записать историю в файл, используя history >history.tmp
. Затем введите fg 1
, чтобы возобновить работу vim: это прикажет bash перевести фокус обратно на "задание номер 1", которым обычно является vim. Номер задания отображается после нажатия CTRL-Z:
[1]+ Stopped vim
поэтому если в скобках стоит число, отличное от 1, то вместо него нужно выполнить fg
. Затем (надеюсь, вы это знаете), когда вы вернетесь в vim, просто :tabedit history.tmp
, например, чтобы открыть сохраненную историю в новой вкладке.
В этом выводе также будут временные метки, но поскольку вы находитесь в vim, вы можете легко отфильтровать их командой :substitute
. Также вы можете отсечь их, используя HISTTIMESTAMP='' history
, а не просто history
при записи в файл; это все равно выведет индекс каждой записи. Полагаю, вы можете отфильтровать это и по пути в файл, пропустив его через sed
или cut
или одну из их команд. Но это очень легко сделать из vim (при условии, что вы знаете основы регулярных выражений; если нет, начните с :help :substitute
или, возможно, поищите учебник по regex).
Обратите внимание, что если вы читаете строки из ~/.bash_history, вы получаете историю только тех оболочек bash, которые завершились, то есть вы набрали exit
и окно терминала закрылось. Таким образом, все команды, которые вы набирали непосредственно перед запуском vim, не будут там присутствовать. Вы можете изменить способ работы, но тогда в истории окажутся команды из разных сессий.
Try:
r !set -o history; HISTFILE=~/.bash_history; history -r; history 10
Это включает временные метки и не включает историю, которая не была сохранена в файл истории.