Parler à vim de l'extérieur

12

Puis-je changer une variable dans une instance de vim à partir d'un autre shell (sans envoyer de clés via tmux)?

Je demande parce que je voudrais utiliser les options compiling_cmd, success_cmd et failure_cmd de latexmk pour afficher l'état de la compilation sur la ligne d'état.

Peut-être pourrais-je avoir vim chercher l'existence ou la non-existence de certains fichiers (en utilisant des fichiers comme variables booléennes)? Mais cela semble un peu sale; j'espère qu'il y a une meilleure façon.

Toothrot
la source

Réponses:

19

Si vous lancez votre première session Vim avec l'argument --servername VIM:

$ vim --servername VIM

alors vous pouvez envoyer n'importe quelle commande depuis n'importe quel autre shell avec l'argument --remote-send.

Par exemple, si vous utilisez votre ligne d'état pour afficher la valeur d'une variable g:myvaret que vous avez les lignes suivantes dans votre vimrc:

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

Ensuite, vous pouvez changer sa valeur ( :let g:myvar = "bar") à partir d'un autre shell:

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

La ligne d'état doit refléter la modification de la valeur.


Comme le dit votre dernier commentaire , si votre instance Vim n'est pas en mode normal, la commande précédente ne fonctionnera pas comme prévu. Il peut y avoir plus simple, mais voici 2 solutions possibles:

1) ajoutez la clé <esc>pour être en mode normal
2) utilisez l'argument --remote-exprau lieu d' --remote-sendévaluer une expression et écrivez une petite fonction d'aide dont le code assignera la nouvelle valeur à votre variable

Première solution:

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

Deuxième solution:

Définissez la fonction suivante dans votre vimrc:

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

Ensuite, dans votre coque:

$ vim --remote-expr 'Myfunc("bar")'
user9433424
la source
Je vous remercie! Je vois que cette fonctionnalité n'est pas compilée, donc je vais recompiler. Espérons que ce soit la même chose chez les neovim.
Toothrot
3
@ Lawrence Je me trompe peut-être, mais je pense que neovim n'implémente pas la +clientserverfonctionnalité ( github.com/tpope/vim-dispatch/issues/163#issuecomment-175383047 ). Si tel est le cas, ce plugin pourrait peut-être vous aider: github.com/mhinz/neovim-remote
user9433424
Il semble que cela ait le même effet que l'envoi de clés avec tmux et dépend de la connaissance du mode dans lequel se trouve le serveur vim (l'exemple suppose le mode normal). Idéalement, je voudrais pouvoir définir une variable directement.
Toothrot