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
Cochez [Comment créer une question minimale, complète et vérifiable] (http://stackoverflow.com/help/mcve). –
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
@sidyll il n'y a pas de registre appelé '@' in vim –