получите историю удара к vi

Когда я пытаюсь прочитать историю удара в энергию, я ничего не получаю.

:r !history

Если я просто выполняю команду, т.е.

:!history

вместо истории я получаю снимок своего терминала, поскольку это смотрело, прежде чем я запустил энергию.

Как я могу считать вывод "истории" в энергию? Чтение содержания .bash_history не сделает, поскольку я сохраняю историю с метками времени:

HISTTIMEFORMAT='%Y.%m.%d %R  '
10
задан ultracrepidarian 25 March 2010 в 00:04
поделиться

4 ответа

Из приглашения оболочки:

history | vim -
19
ответ дан 3 December 2019 в 13:47
поделиться
: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-символ, который может выводить оболочка (произошло в моей системе).

7
ответ дан 3 December 2019 в 13:47
поделиться

Проблема в том, что эта история известна только оболочке 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, не будут там присутствовать. Вы можете изменить способ работы, но тогда в истории окажутся команды из разных сессий.

13
ответ дан 3 December 2019 в 13:47
поделиться

Try:

r !set -o history; HISTFILE=~/.bash_history; history -r; history 10

Это включает временные метки и не включает историю, которая не была сохранена в файл истории.

1
ответ дан 3 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

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