получить историю bash для vi - PullRequest
10 голосов
/ 25 марта 2010

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

:r !history

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

:!history

вместо истории я получаю снимок моего терминала, который выглядел до того, как я запустил vim.

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

HISTTIMEFORMAT='%Y.%m.%d %R  '

Ответы [ 5 ]

19 голосов
/ 25 марта 2010

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

history | vim -
13 голосов
/ 25 марта 2010

Проблема в том, что эта история известна только оболочке bash, которая запустила vim. Когда вы делаете :!history изнутри vim, вы запускаете новую оболочку bash с собственной историей, которая пуста, поэтому вы просто видите экран, который выглядел при запуске 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 или, возможно, поищите учебник по регулярным выражениям).

Обратите внимание, что если вы читаете в строках ~ / .bash_history, вы получаете историю только из оболочек bash, которые завершили завершение , т.е. вы набрали exit и окно терминала закрылось. Таким образом, никаких команд, введенных вами непосредственно перед запуском vim, там не будет. Вы можете изменить способ, которым это работает, но затем вы получите команды из разных сессий, все перемешанные в истории.

7 голосов
/ 25 марта 2010
: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-символ, который может выводить оболочка (произошло в моей системе).

1 голос
/ 20 июля 2011

Вы можете предварительно написать историю текущего сеанса:
history -w
Затем в редакторе вы можете получить, скажем, 20 команд истории:
:r ! tail -20 ~/.bash_history

1 голос
/ 25 марта 2010

Попробуйте:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...