2011-04-28 3 views
2

Ma question centrale est comment créer un mappage personnalisé qui permet le comptage et le mouvement. Mais j'aimerais que le compte prenne le pas sur la motion. Pour clarifier je veux ce qui suit pour travailler:Commande Vim avec comptage et mouvement possible?

[count][cmd] - Faire quelque chose d'utile sur les lignes [count], et ne pas attendre [motion].

[cmd][motion] - Faire quelque chose d'utile dans la plage de [mouvement] des lignes.

Mon scénario exact tente d'ajouter des commentaires aux lignes, mais j'utiliserais cette information pour d'autres mappages dans mon vimrc. Voici ce que j'ai jusqu'ici.

"comment motion of lines 
nmap <silent> ,c :set opfunc=Comment<CR>[email protected] 
"comment count lines 
nmap <silent> ,cc :s/^/\/\//<CR>:noh<CR> 

function! Comment(...) 
     silent exe "'[,']s/^/\\/\\//" 
     silent exe "noh" 
endfunction 

,c[motion] Commentaires d'une ligne par mouvement. [count],cc Commentaires une ligne par le nombre. Je voudrais ,c[motion] et [count],c pour fonctionner.

Est-ce possible?

EDIT: clarifié ma question. Changed "plage" à "compter"

+0

avantage de créer des solutions encapsulées dans des fonctions est que vous pouvez maintenir une liste des sauts et des changements par la commande keepjumps' pour plus de détails: h keepjumps J'ai quelques fonctions qui utilisent cette fonction: https: // bitbucket.org/sergio/vimfiles/src/7e15525eed4a/vimrc – SergioAraujo

+0

Je n'ai pas de problème pour garder les états de saut, merci. –

+0

Par plage, voulez-vous dire un [compte] (http://vimdoc.sourceforge.net/htmldoc/intro.html#count), comme en tapant '5dd' pour supprimer cinq lignes en mode normal? Ou voulez-vous vraiment dire un [range] (http://vimdoc.sourceforge.net/htmldoc/cmdline.html#cmdline-ranges), comme taper ':.,. + 4d' pour supprimer cinq lignes en mode ex? – Andy

Répondre

6
function s:ExecuteCountOrMotion() 
    setlocal operatorfunc=Comment 
    if v:count is 0 
     return '[email protected]' 
    else 
     return '[email protected]@' 
    endif 
endfunction 
nnoremap <expr> ,c <SID>ExecuteCountOrMotion() 

Par ailleurs, vous n'avez pas besoin d'exécuter:

  1. Au lieu de silent exe "{range}s/.../.../" vous devriez écrire {range}s/.../.../e. Vous pouvez utiliser s#^#//#e pour éviter de vous échapper.
  2. silent nohl fonctionne aussi bien que silent execute "nohl", mais provoque vim de ne pas faire l'analyse de la ligne supplémentaire.
+0

Merci beaucoup! Surtout pour les trois conseils utiles. –

+0

Merci Zyx, je ne pensais pas que je trouverais ce que je cherchais si rapidement, mais cette réponse est venue en premier et le pointeur vers v: count était exactement ce dont j'avais besoin. – dubiousjim