2017-03-06 1 views
0

J'écris actuellement un plugin pour Vim et je voudrais qu'il restaure le registre par défaut après l'avoir exécuté. Cependant, la fonction en question est appelée via une construction <C-r>=Myfunction()<CR>, ce qui signifie que je dois la restaurer après le retour de la fonction. J'ai essayé de le faire comme ceci:Restaurer un registre après un appel de fonction <C-r>

inoremap <silent> <Space> <C-r>=Myfunction()<CR> 
function! Myfunction() 
    let oldreg  = getreg('"') 
    let oldregtype = getregtype('"') 
    let restore  = "\<ESC>:call setreg('\"','".oldreg."','".oldregtype."')\<CR>a" 

    let @" = "whatever" 

    return "\<ESC>yya ".restore 
endfunction 

Comme vous pouvez le voir, le registre " est affecté par la chaîne de retour, donc je ne peux pas appeler directement setreg. Évidemment, cette fonction ne fait vraiment rien, mais la fonction que j'utilise est assez longue. Aussi, je m'excuse si cette chaîne est un peu difficile à lire, mais je ne suis pas vraiment sûr d'une autre manière d'accomplir cela. Dans l'ensemble, la fonction semble fonctionner lorsque le registre contient un mot, mais échoue chaque fois que quelque chose avec un retour à la ligne est dans le registre. (L'erreur spécifique est E115: Missing quote en ce qui concerne l'argument oldreg.) J'ai essayé d'y remédier en shellescaping oldreg d'abord; cependant, cela se traduit par l'erreur E121: Undefined Variable, où la variable indéfinie est ce qui était dans mon registre. Des pensées sur ce qui pourrait aller mal ici?

EDIT: J'ai trouvé une solution. C'est assez poilu, mais ça fonctionne parfaitement jusque là. Voici comment appliquer une solution à mon exemple de code, au cas où cela aiderait quelqu'un.

inoremap <silent> <Space> <C-r>=Myfunction()<CR> 
function! Myfunction() 
    let oldreg  = substitute(escape(getreg('"'), '\\'), '\n', '\\n', 'g') 
    let oldregtype = getregtype('"') 
    let restore  = "\<ESC>:call setreg('\"',\"".oldreg."\",'".oldregtype."')\<CR>a" 

    let @" = "whatever" 

    return "\<ESC>yya ".restore 
endfunction 
+1

Cochez [Comment créer une question minimale, complète et vérifiable] (http://stackoverflow.com/help/mcve). –

+0

Actuellement, en l'état, votre exemple n'a pas beaucoup de sens pour moi car je ne vois pas ce qui vous empêche de simplement appeler 'setreg' directement à la fin de votre fonction. Qu'est-ce qui empêche cela? Pourquoi avez-vous besoin de le réinitialiser après l'appel de la fonction? Si la fonction renvoie uniquement une chaîne? Avez-vous besoin d'utiliser '' @ 'ailleurs? Cela n'a de sens que si vous devez l'utiliser entre l'extrémité 'MyFunction' et le' 'dans votre appel, ce qui n'arrivera pas de toute façon. Ne réponds pas à la question, j'essaie juste de comprendre ton but, car il semble qu'il y ait un autre moyen de le faire. :) – sidyll

+0

@sidyll il n'y a pas de registre appelé '@' in vim –

Répondre

0

Voici une façon de procéder: Vim: how to paste over without overwriting register

Depuis, nous avons été doué setreg(), et j'ai également mis au point une solution plus générique de simplifier la restauration des choses les plus utiles (lh#on#exit()). Dans tous les cas, une solution consisterait à renvoyer @=FunctionToExecute() et la restauration aurait lieu dans cette fonction. Mais comme d'autres l'ont dit, vous devrez peut-être être plus explicite au sujet de vos besoins car il peut exister des solutions plus spécifiques pour les résoudre. Par exemple, au lieu de supprimer avec yy ou avec :yank, vous pouvez simplement utiliser la fonction getline() qui laisserait tous les registres non modifiés. Pour changer une ligne, il y a setline(), mais cela casserait le refaire et d'autres choses.

+0

Vos suggestions fonctionnent, donc je marque cela comme correct. Cependant, j'ai trouvé une solution légèrement différente qui a mieux fonctionné avec la structure de mon programme. –

0

Au lieu d'aller en mode normal après votre retour votre fonction, je pense vous devriez aller à l'intérieur. De cette façon, vous pouvez appeler setreg() normalement dedans. Par exemple:

function! Myfunction() 
    let oldreg  = getreg('"') 
    let oldregtype = getregtype('"') 

    let @" = "whatever" 

    normal! yya 

    setreg('"', oldreg, oldregtype) 
endfunction