Допустим, у меня есть сервер X11, который зависает, и я не могу сохранить работу из сеанса XTerm Vim, которым управляет сервер X11. (Не GVim, просто обычный Vim-in-XTerm.)
Есть ли способ, которым я мог бы (с другого терминала) сказать запущенному процессу Vim «сохранить все и выйти» из командной строки? Отправив сигнал или каким-либо другим способом?
Я знаю о файлах подкачки Vim, и что я могу просто убить Vim и восстановиться после свопинга. Я спрашиваю, есть ли "более чистый" способ.
Ответы:
Недавно столкнувшись с этой проблемой (другим способом: Vim работает на удаленном сервере, и я забыл экран), я решил найти способ.
Первой идеей было поиск файловых дескрипторов, используемых Vim, и попытка записи в него. Fds Vim указывает на пседотерминал, открытый эмулятором терминала, естественно:
Однако мои первые попытки провалились:
^[
И^M
были получены CtrlVEscи CtrlVEnter, соответственно.Все они привели к появлению символов на терминале (я проверял это локально, прежде чем применить его к удаленному сеансу). Погуглив, я нашел этот пост , использующий Python для записи на псевдотерминальное устройство:
И попробовать это на интерактивной оболочке Python сработало:
Выполнено!
источник
Вы можете отправлять команды vim извне, если вы работаете ...
Vim серверы
Например, делать:
заставит vim запустить сервер с именем "vim". Назовите его дважды, и новый сервер будет называться «vim1», трижды назовите его, это будет «vim2» и т. Д. Возможно, вы захотите создать псевдоним этой команды.
Вы можете узнать, на каком сервере назван конкретный экземпляр, посмотрев на заголовок окна. Когда ты видишь:
имя сервера нечувствительно к регистру "VIM3" ("vim3" будет ссылаться на тот же экземпляр). Обратите внимание, что если вы видите:
это не обязательно означает, что у него есть сервер с именем "VIM". Вы можете убедиться, что сервер существует, перечислив имена серверов с помощью:
Тем не менее, вопрос возникает только для «ВИМ», в частности. Если вы видите «GVIM» или какое-то другое имя с добавленным к нему номером, это означает, что это сервер.
Как пользоваться клиентом
Теперь, на ваш вопрос, вы можете сохранить все и выйти из данного экземпляра vim, выполнив, например:
Мы используем escape для возврата в нормальный режим, если вы находитесь в режиме вставки или командном режиме. Вы можете сделать что-то кроме
:wqa
, но это кажется мне наиболее подходящим, потому что это оставит файлы обмена буферов, которые не могут быть сохранены (потому что они новые и не имеют имени файла и т. Д.).Если вы хотите сделать это для всех экземпляров, как в вашем случае здесь, вы можете просто перебрать список серверов следующим образом:
Если по какой-то причине вам не нравится
--remote-send
, вы можете использовать вместо--remote-expr
этого то преимущество, которое заставит клиента выводить результат или ошибку, которую он мог вызвать, например, так:Обратите внимание, что использование функциональности сервера Vim требует, чтобы Vim был собран с
+clientserver
опцией.источник
Установите
reptyr
команду с помощью системного менеджера пакетов, такого как:Затем используйте
reptyr
команду для переключения удаленного tty на локальный (новый) tty следующим образом:Где
PID
находится идентификатор процесса изps
вывода команды.После ошибки:
Измените «ptrace scope» на 0:
Как только сессия vim будет перенесена из старого в новый, сохраните и закройте как обычно. Обратите внимание, что вам, возможно, придется нажать, Enterчтобы обновить консоль.
источник
Что если ты изящно убьешь Вима?
kill -s 15 -p [PID for Vim]
kill -s (сигнал) 15 называется SIGTERM, который говорит, что процесс корректно завершает свою работу.
Чтобы получить PID (идентификатор процесса) Vim, используйте:
ps ax | grep vim
источник