Rozmowa z vimem z zewnątrz


12

Czy mogę zmienić zmienną w instancji vima z innej powłoki (bez wysyłania kluczy przez tmux)?

Pytam, ponieważ chciałbym użyć opcji compiling_cmd, success_cmd i failure_cmd firmy Latexmk, aby pokazać status kompilacji na linii statusu.

Być może mógłbym poprosić vima o sprawdzenie istnienia lub nieistnienia niektórych plików (używając plików jako zmiennych boolowskich)? Ale to wydaje się trochę brudne; mam nadzieję, że jest lepszy sposób.

Odpowiedzi:


19

Jeśli uruchomisz pierwszą sesję Vima z argumentem --servername VIM:

$ vim --servername VIM

następnie możesz wysłać dowolne polecenie z dowolnej powłoki z argumentem --remote-send.

Na przykład, jeśli używasz linii statusu, aby wyświetlić wartość jakiejś zmiennej g:myvar, a masz w vimrc następujące linie:

let g:myvar = "foo"
set stl+=%{g:myvar}

Następnie możesz zmienić jego wartość ( :let g:myvar = "bar") z innej powłoki:

$ vim --remote-send ':let g:myvar = "bar"<cr>'

Linia statusu powinna odzwierciedlać zmianę wartości.


Jak mówi twój ostatni komentarz , jeśli twoja instancja Vima nie jest w trybie normalnym, poprzednie polecenie nie będzie działać zgodnie z oczekiwaniami. Mogą być prostsze, ale oto 2 możliwe rozwiązania:

1) dodaj klucz, <esc>aby być w trybie normalnym
2) użyj argumentu --remote-exprzamiast --remote-senddo oceny wyrażenia i napisz małą funkcję pomocnika, której kod przypisze nową wartość do twojej zmiennej

Pierwsze rozwiązanie:

$ vim --remote-send '<esc>:let g:myvar = "bar"<cr>'

Drugie rozwiązanie:

Zdefiniuj następującą funkcję w swoim vimrc:

function! Myfunc(value)
    let g:myvar = a:value
endfunction

Następnie w twojej powłoce:

$ vim --remote-expr 'Myfunc("bar")'

Dziękuję Ci! Widzę, że nie mam tej funkcji skompilowanej, więc skompiluję ponownie. Mam nadzieję, że tak samo jest w neovim.
Toothrot

3
@Lawrence Mogę się mylić, ale myślę, że neovim nie implementuje tej +clientserverfunkcji ( github.com/tpope/vim-dispatch/issues/163#issuecomment-175383047 ). W takim przypadku może ta wtyczka pomogłaby ci: github.com/mhinz/neovim-remote
user9433424

Wygląda na to, że ma to taki sam efekt jak wysyłanie kluczy za pomocą tmux i zależy od tego, w jakim trybie znajduje się serwer vim (przykład zakłada tryb normalny). Idealnie chciałbym móc ustawić zmienną bezpośrednio.
Toothrot
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.