2
votes

Comment faire en sorte que tmux applique une option uniquement lorsque vim n'est pas en cours d'exécution?

Je voudrais avoir une option dans le fichier de configuration tmux à activer uniquement si vim ne fonctionne pas dans le panneau / la fenêtre en cours. En particulier, la ligne est la suivante:

is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"

if-shell "$is_vim" {command here}

qui me permet d'utiliser le clic du milieu pour coller directement du presse-papier principal vers tmux. Cela fonctionne très bien, le seul problème est qu'il a un comportement étrange à l'intérieur de vim (collage au mauvais endroit, saut de lignes étrange ...). Si je commente cette ligne, coller avec un clic du milieu dans vim fonctionne comme prévu, mais je perds la fonctionnalité de collage dans tmux, évidemment.

Ma question est donc: comment puis-je faire en sorte que tmux applique UNIQUEMENT cette liaison de touches si vim n'est pas en cours d'exécution?

En faisant quelques recherches, j'ai trouvé l'approche suivante qui semble prometteuse, mais je ne peux pas la faire fonctionner.

bind-key -n MouseDown2Pane run "tmux set-buffer \"$(xclip -o -sel primary)\"; tmux paste-buffer"

Modifier : Alternativement, je serais également heureux que la commande "tmux set-buffer \" $ (xclip -o -sel primary) \ "; tmux paste-buffer" fonctionne correctement lors du collage dans vim . Mais cela, pour une raison quelconque, semble être une tâche plus difficile.


2 commentaires

Que fait cette commande lorsqu'elle ne fonctionne pas correctement dans vim?


@jeremysprofile Il se comporte bizarrement. Il colle en fait ce qu'il y a dans le tampon, mais il tronque les premières lettres et ne le place pas sous le curseur, mais 2 ou 3 lignes après. Il fait également défiler la vue sur 2 ou 3 lignes. Cela se produit si je suis en mode normal dans vim, alors qu'en mode insertion, cela fonctionne correctement. Mais avec cette ligne commentée dans le fichier .tmux.conf, le collage fonctionne correctement également en mode normal.


3 Réponses :


1
votes

Votre tentative est vérifiée à chaque fois que le fichier .tmux.conf est généré, ce qui (généralement) uniquement lors de la création d'une session tmux pour la première fois.

Vous devez le faire vérifier à chaque fois que vous exécutez la commande. Heureusement, c'est aussi simple que de réorganiser l'ordre. Voici un exemple:

bind-key -n MouseDown2Pane if-shell "ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'" \
'<whatever it should do when vim is running' \
"tmux set-buffer \"$(xclip -o -sel primary)\"; tmux paste-buffer"

Ici, Ctrl + k vérifie si j'ai plusieurs volets dans ma fenêtre. Si je le fais, je passe au volet suivant. Si je ne le fais pas, je passe à la fenêtre suivante.

Je ne suis pas sûr que $ is_vim peut être une variable dans votre liaison au lieu d'être entièrement écrite, vous aurez pour tester cela, mais cela devrait ressembler à ceci:

bind-key -n C-k if-shell 'test #{window_panes} -gt 1' 'select-pane -t :.-1' 'next-window'

Ce qui semble complètement terrible et peut être lent car il doit exécuter cette commande shell pour tester chaque fois que vous utilisez ce bouton .


0 commentaires

2
votes

Ci-dessus a la bonne idée, mais il serait plus rapide d'utiliser pane_current_command au lieu d'une commande shell, quelque chose comme:

if -F '# {m: * vim *, # {pane_current_command}}' ...

Je recommanderais également d'utiliser "xclip ... | tmux loadb -" au lieu de set-buffer car vous ne rencontrez pas de problèmes avec les caractères spéciaux du shell dans le presse-papiers.


1 commentaires

Salut Nicholas, merci pour votre réponse utile. J'ai essayé de faire ceci: bind -n MouseDown2Pane if -F '# {m: * vim *, # {pane_current_command}}' run "xclip -o -sel primary | tmux load-buffer -; tmux paste-buffer" , cependant, j'ai 2 problèmes. Le premier est que je voudrais que cette commande soit exécutée lorsque vim n'est PAS en cours d'exécution, alors que comme ça l'instruction if est activée lorsque vim est en cours d'exécution. Comment faire cela (désolé pour la question n00b)? La seconde est que la commande écrite comme ça ne fonctionne plus, tmux dit commande inconnue xclip , pourquoi?



1
votes

Pour la première partie de votre problème, vous pouvez soit utiliser quelque chose comme # {? # {m: \ * vim \ *, # {pane_current_command}}, 0,1} pour inverser le match, ou vous pouvez utiliser le deuxième argument de if-shell au lieu du premier, vous feriez donc if -F '...' '' 'ma commande' où le deuxième argument est juste vide.

Les arguments if-shell SONT des commandes tmux, mais ils doivent être un seul argument. Vous devez donc les mettre entre guillemets - vous voudrez quelque chose comme:

bind -n MouseDown2Pane if -F '# {? # {m: \ * vim \ *, # {pane_current_command}}}, 0,1}' 'run "xclip -o -sel primaire | tmux load -buffer -; tmux paste-buffer "'


5 commentaires

Merci, mais malheureusement cela ne fonctionne pas, car tmux intercepte toujours les raccourcis clavier même lorsque vim est ouvert, et au lieu de faire une action de collage étrange, il ne fait rien. Il n'affiche pas le comportement de collage par défaut qu'il a lorsque cette ligne n'est pas commentée.


Quel comportement de collage par défaut? vim? Si vous voulez que tmux envoie le bouton de la souris à vim lorsqu'il est en cours d'exécution, vous devrez mettre "send -M" dans le faux côté de la commande if, au moment où vous ne faites rien.


Par faux côté, je veux dire ajouter un autre argument à la commande ci-dessus avec "envoyer -M" (y compris les guillemets).


Lequel est le faux côté de la commande? Désolé, je ne connais pas du tout cette syntaxe et je ne sais pas vraiment où chercher. Merci de votre aide! EDIT: oh ok, vous avez déjà répondu, tant pis !!


Oui!! La commande bind -n MouseDown2Pane if -F '# {? # {M: * vim *, # {pane_current_command}}, 0,1}' 'run "xclip -o -sel primary | tmux load-buffer - ; tmux paste-buffer "'" send -M " fait exactement ce que je voulais! Merci beaucoup Nicholas !!