Powiedzmy, że mam zawieszony serwer X11, co uniemożliwia mi zapisanie pracy z sesji XTerm Vim, którą kontroluje serwer X11. (Nie GVim, tylko zwykły Vim-in-XTerm.)
Czy jest sposób, w jaki mógłbym (z innego terminala) powiedzieć działającemu procesowi Vima, aby „zapisz wszystko i wyjdź” z linii poleceń? Wysyłając sygnał lub w inny sposób?
Wiem o plikach wymiany Vima i że mogę po prostu zabić Vima i odzyskać go po zamianie. Pytam, czy istnieje „czystszy” sposób.
Odpowiedzi:
Po niedawnym napotkaniu tego problemu (w inny sposób: Vim działający na zdalnym serwerze, a zapomniałem ekranu), postanowiłem polować na jakiś sposób.
Pierwszym pomysłem było sprawdzenie deskryptorów plików używanych przez Vima i próba napisania do niego. Fds Vima wskazują na psedoterminal otwarty przez emulator terminala, co naturalnie:
Jednak moje pierwsze próby nie powiodły się:
^[
I^M
otrzymano z CtrlVEsci CtrlVEnter, odpowiednio.Wszystkie spowodowały pojawienie się znaków na terminalu (testowałem to lokalnie, przed zastosowaniem go do sesji zdalnej). Googlując się, znalazłem ten post SO , używając Pythona do pisania na urządzeniu pseudoterminalowym:
I wypróbowanie go na interaktywnej powłoce pytona działało:
Gotowy!
źródło
Możesz wysyłać polecenia do vima zewnętrznie, jeśli używasz ...
Serwery Vim
Na przykład robienie:
spowoduje, że vim uruchomi serwer o nazwie „vim”. Wywołaj go dwa razy, a nowy serwer zostanie nazwany „vim1”, nazwij go trzykrotnie, a będzie to „vim2” itp. Możesz utworzyć alias dla tego polecenia.
Możesz wiedzieć, jaki serwer nazywa się określona instancja, patrząc na tytuł okna. Kiedy widzisz:
w nazwie serwera rozróżniana jest wielkość liter „VIM3” („vim3” odnosi się do tej samej instancji). Pamiętaj, że jeśli zobaczysz:
to niekoniecznie oznacza, że ma serwer o nazwie „VIM”. Możesz upewnić się, że serwer istnieje, wymieniając nazwy serwerów z:
Jednak pytanie dotyczy tylko „VIM”. Jeśli widzisz „GVIM” lub inną nazwę z dołączonym numerem, oznacza to, że jest to serwer.
Jak korzystać z klienta
Teraz, na swoje pytanie, możesz zapisać wszystko i zamknąć daną instancję vima, wykonując np .:
Używamy klawisza Escape, aby powrócić do trybu normalnego na wypadek, gdybyś był w trybie wstawiania lub poleceń. Możesz zrobić coś innego
:wqa
, ale wydaje mi się to najbardziej odpowiednie, ponieważ pozostawi pliki wymiany buforów, których nie można zapisać (ponieważ są nowe i nie mają nazwy pliku itp.).Jeśli chcesz to zrobić dla wszystkich instancji, takich jak w twoim przypadku, możesz po prostu przeglądać listę serwerów w następujący sposób:
Jeśli z jakiegoś powodu ci się nie podoba
--remote-send
, możesz zamiast tego użyć tego,--remote-expr
co ma tę zaletę, że spowoduje wyświetlenie przez klienta wyniku lub błędu, który mógł spowodować, na przykład:Zauważ, że korzystanie z funkcjonalności serwera Vima wymaga, aby Vim został zbudowany z tą
+clientserver
opcją.źródło
Zainstaluj
reptyr
polecenie za pomocą menedżera pakietów systemu, takiego jak:Następnie użyj
reptyr
polecenia, aby przełączyć zdalny tty na lokalny (nowy) tty w następujący sposób:Gdzie
PID
jest identyfikator procesu z danychps
wyjściowych polecenia.Po błędzie:
Zmień „zakres ptrace” na 0:
Po zmianie sesji vim ze starej na nową, zapisz i wyjdź jak zwykle. Pamiętaj, że może być konieczne naciśnięcie przycisku, Enteraby odświeżyć konsolę.
źródło
Co jeśli z wdziękiem zabijesz Vima?
kill -s 15 -p [PID for Vim]
kill -s (sygnał) 15 nazywa się SIGTERM, co oznacza, że proces ten z wdziękiem się wyłącza.
Aby uzyskać PID (identyfikator procesu) Vima, użyj:
ps ax | grep vim
źródło