2010-03-29 8 views
2

Dessiner un blanc sur ceci, et google n'a pas été utile.Vim: Appelle une commande ex (ensemble) de la fonction?

Vous voulez faire une fonction comme ceci:

function JakPaste() 
     let tmp = :set paste? 
     if tmp == "paste" 
       set nopaste 
     else 
       set paste 
     endif 
endfunction 

map <F2> :call JakPaste()<CR> 

Toutefois, cela ne fonctionne pas. J'ai isolé la ligne brisée:

function JakPaste() 
     let tmp = set paste? 
endfunction 

map <F2> :call JakPaste()<CR> 

résultats F2 En appuyant sur cette erreur:

Error detected while processing function JakPaste: 
line 1: 
E121: Undefined variable: set 
E15: Invalid expression: set paste? 
Hit ENTER or type command to continue 

Comment dois-je appeler une commande ex (ensemble) à partir d'une fonction vim?

This semble quelque peu pertinent, mais je ne comprends toujours pas.

Répondre

6

La raison pour laquelle cela ne fonctionne pas est que vous essayez d'exécuter une commande dans une expression - ce sont des choses différentes. La construction ? que vous avez utilisée fait que vim fait écho à la valeur de l'option; ce n'est pas la même chose qu'une fonction renvoyant la valeur. Pour être clair: le problème n'est pas que vous appelez une commande ex depuis une fonction - chaque autre ligne de la fonction est une commande ex - c'est que vous appelez la commande ex dans une expression.

Mais ce n'est pas la bonne façon d'effectuer la tâche que vous essayez ici. Voici le chemin le plus court, grâce au commentaire de raiponce:

set paste! 

Maintenant, si vous avez besoin quelque chose de plus intelligent que simplement inverser un booléen, vous pouvez utiliser & pour transformer un nom d'option dans une variable utilisable. Voici deux façons d'utiliser que:

" still a function, good for taking extra action (here, printing notification)" 
function TogglePaste() 
    if (&paste) 
     set nopaste 
     echo "paste off" 
    else 
     set paste 
     echo "paste on" 
    endif 
endfunction 

" just set the variable directly" 
let &paste = !&paste 
+6

ou simplement ': set paste' – rampion

+0

@rampion: Wow, je continue à penser que j'ai lu assez de la documentation. Je ne pense pas. – Cascabel

+0

Vous pouvez également afficher la nouvelle valeur en utilisant ': set paste! coller? ' –