Ich rede mit vim von draußen

12

Kann ich eine Variable in einer Instanz von vim von einer anderen Shell aus ändern (ohne Schlüssel über tmux zu senden)?

Ich frage, weil ich die Optionen compiling_cmd, success_cmd und failure_cmd von latexmk verwenden möchte, um den Kompilierungsstatus in der Statuszeile anzuzeigen.

Vielleicht könnte ich vim nach dem Vorhandensein oder Nichtvorhandensein bestimmter Dateien suchen lassen (Dateien als boolesche Variablen verwenden)? Aber das scheint ein bisschen schmutzig zu sein; hoffentlich gibt es einen besseren Weg.

Toothrot
quelle

Antworten:

19

Wenn Sie Ihre erste Vim-Sitzung mit dem Argument starten --servername VIM:

$ vim --servername VIM

Dann können Sie jeden Befehl von jeder anderen Shell mit dem Argument senden --remote-send.

Wenn Sie zum Beispiel Ihre Statuszeile verwenden, um den Wert einer Variablen anzuzeigen g:myvar, und Sie die folgenden Zeilen in Ihrem vimrc haben:

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

Dann können Sie den Wert ( :let g:myvar = "bar") in einer anderen Shell ändern :

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

Die Statuszeile sollte die Änderung des Werts widerspiegeln.


Laut Ihrem letzten Kommentar funktioniert der vorherige Befehl nicht wie erwartet, wenn sich Ihre Vim-Instanz nicht im normalen Modus befindet. Es mag einfacher sein, aber hier gibt es zwei mögliche Lösungen:

1) fügen Sie den Schlüssel <esc>im normalen Modus zu
2) das Argument --remote-exprstatt --remote-sendeines Ausdrucks und schreiben Sie eine kleine Hilfsfunktion , deren Code bewerten den neuen Wert auf Ihre Variablen zuweisen

Erste Lösung:

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

Zweite Lösung:

Definieren Sie die folgende Funktion in Ihrem vimrc:

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

Dann in deiner Schale:

$ vim --remote-expr 'Myfunc("bar")'
user9433424
quelle
Vielen Dank! Ich sehe, dass dieses Feature nicht kompiliert ist, also werde ich es erneut kompilieren. Hoffentlich ist es auch in Neovim so.
Toothrot
3
@Lawrence Ich kann mich irren, aber ich denke, dass Neovim die Funktion nicht implementiert +clientserver( github.com/tpope/vim-dispatch/issues/163#issuecomment-175383047 ). Wenn dies der Fall ist, könnte Ihnen dieses Plugin helfen: github.com/mhinz/neovim-remote
user9433424
Dies hat anscheinend den gleichen Effekt wie das Senden von Schlüsseln mit tmux und hängt davon ab, in welchem ​​Modus sich der vim-server befindet (im Beispiel wird der normale Modus angenommen). Idealerweise möchte ich eine Variable direkt setzen können.
Toothrot