Как сохранить историю оболочки из emacs и использовать ее в терминале?

2

Я использую emacs почти для всего, но когда я запускаю shell, M-x shellа затем выхожу из emacs, история не сохраняется, я пытался (savehist-mode 1)с этой целью, но, похоже, это не работает, есть ли способ сохранить историю Команды, используемые в Emacs и использовать их, когда я использую оболочку вне Emacs?

poz2k4444
источник
В моих испытаниях я обнаружил, что команды, выполняемые в режиме оболочки, сохраняются так ~/.bash_historyже, как и при bashзапуске в более обычном эмуляторе терминала; Я не уверен, почему вы бы видели другое поведение. Какую оболочку вы используете, и как она настроена с учетом истории?
Аарон Миллер
@AaronMiller Я не знаю, как ответить на ваши вопросы, как я уже сказал в своей книге, я просто печатаю, M-x shellи когда я убиваю буфер, он не сохраняет историю, единственная попытка, которую я сделал, была поместить (savehist-mode 1)в .emacsфайл, но все же я не могу смотрите команды, используемые в emacs
poz2k4444
1
savehist-modeприменяется по умолчанию только к вводу минибуфера и, следовательно, здесь не применимо (хотя в целом это может оказаться полезным). Скорее всего, ваша оболочка входа в систему есть bash, и я часто обнаруживал, что по умолчанию bashне будет сохранять историю, пока процесс не завершится корректно, то есть при выходе из системы - что не произойдет, если вы уничтожите буфер оболочки с помощью C-x kили подобным образом; когда это происходит, процесс оболочки уничтожается, а не завершается самостоятельно. Если это то, что вы делаете прямо сейчас, попробуйте сделать это logoutили exitв своем буфере оболочки, прежде чем уничтожать буфер, и посмотрите, сохраняется ли история.
Аарон Миллер
(Вы можете определить свою оболочку входа в систему с ps -p $$помощью командной строки; значение под «CMD» в выходных данных - это оболочка, которую вы используете. Скорее всего, так и будет bash, но если это не так, добавьте комментарий, чтобы сказать, что это такое и кто-то может быть в состоянии помочь вам дальше оттуда - я использую только bashсебя, поэтому не могу помочь, если вы используете что-то еще.)
Аарон Миллер
1
@AaronMiller да, это bash, и да, я только что сделал то, что вы сказали о выходе из оболочки, и история была сохранена, я не знал, пожалуйста, опубликуйте это как ответ ... Заранее спасибо !!
poz2k4444

Ответы:

5

savehist-modeздесь не применимо; причина того, что у вас возникла эта проблема, заключается в том, что Bash по умолчанию записывает данные в файл истории только тогда, когда его буфер истории в памяти заполнен или находится на выходе, а последний - только если он выходит чисто - то есть Bash процесс, который убит, а не завершит работу, никогда не будет записывать последние команды в файл истории.

Чтобы обойти эту проблему, убедитесь, что вы всегда аккуратно завершаете сеанс оболочки, выполняя logoutили exit, или печатая C-dв приглашении, перед уничтожением буферов оболочки; это даст Bash возможность написать файл истории перед выходом.

Также смотрите Bash FAQ по управлению файлами истории, чтобы узнать, как заставить Bash записывать каждую команду в историю, как только она выполняется; как только вы заработали эту работу, вам больше не нужно беспокоиться о выходе из своих оболочек, прежде чем вы убьете их буферы, но можете делать это C-x kс дикой энергией.

Аарон Миллер
источник
1
Как предложено в FAQ по bash, установка PROMPT_COMMAND = "history -a" в моем файле .bashrc отлично сработала, спасибо.
Виттен