2010-10-06 4 views
3

J'ai un objectif simple: Mapper Ctrl-C, une commande que je ne pense pas avoir jamais utilisée pour tuer vim, pour insérer automatiquement au début d'une ligne le caractère correct (s) pour commenter cette ligne en fonction du type de fichier du fichier. J'ai pensé que je pourrais utiliser une autocommande pour reconnaître le type de fichier et définir une variable vim pour le caractère de commentaire correct lorsque le fichier est ouvert. J'ai donc essayé quelque chose comme:Insérer des variables vim dans le texte pour raccourci de commentaire

" Control C, which is NEVER used. Now comments out lines! 
autocmd BufNewFile,BufRead *.c let CommentChar = "//" 
autocmd BufNewFile,BufRead *.py let CommentChar = "#" 
map <C-C> mwI:echo &CommentChar<Esc>`wll 

Cette carte marque mon emplacement actuel, va au début de la ligne en mode d'insertion, fait écho le caractère de commentaire (s) à ce moment, entre en mode de commande, REMONTE à la marque set, et va deux caractères juste pour compenser les caractères de commentaire insérés (en supposant que le commentaire de style C).

La partie en italique est la partie avec laquelle j'ai des problèmes; c'est seulement là comme un endroit pour représenter ce que je veux faire. Pouvez-vous m'aider à comprendre comment y parvenir? Points bonus si vous utilisez strlen (CommentChar) pour avancer le bon nombre d'espaces vers la droite! Points bonus supplémentaires pour le maître-vim qui inclut comment faire des commentaires de style bloc si vous êtes en mode visuel !! Je suis encore relativement nouveau chez vim scripting; mon .vimrc est un maigre 98 lignes long, donc si vous pouviez m'aider s'il vous plaît en expliquant les réponses que vous fournissez! Merci.

Répondre

5

Vous pouvez utiliser <C-r> ici:

noremap <C-c> mwI<C-r>=g:CommentChar<CR><Esc>`wll 

voir :h i_CTRL-R.

Regardez aussi NERDCommenter plug-in, avec ce mapping ressemblera à ceci:

" By default, NERDCommenter uses /* ... */ comments for c code. 
" Make it use // instead 
let NERD_c_alt_style=1 
noremap <C-c> :call NERDComment(0, "norm")<CR> 

Et vous ne devez définir les caractères de commentaire par vous-même.

+0

le '' 'registre est génial :) – Benoit

+0

Merci d'avoir expliqué tout cela. J'avais lu à propos de i_CTRL-R mais je ne l'avais pas compris. Grâce à vous j'ai réussi à faire fonctionner mon petit script (mais j'ai changé 'wll pour' w: exe "normal" .strlen (CommentChar). "L" pour ramener le curseur au bon endroit). Merci aussi à vous, j'ai abandonné mon script et j'utilise maintenant NERDCommenter! Mais au moins j'en ai appris plus sur vim dans le processus. – physicsmichael

2

Je l'ai retiré du wiki vim tips à un moment donné et je l'utilise moi-même. Le seul inconvénient est qu'il ajoute un espace à la fin de la ligne (s) pour une raison quelconque, probablement quelque chose de petit que j'ai oublié.

" Set comment characters for common languages 
autocmd FileType python,sh,bash,zsh,ruby,perl,muttrc let StartComment="#" | let EndComment="" 
autocmd FileType html let StartComment="<!--" | let EndComment="-->" 
autocmd FileType php,cpp,javascript let StartComment="//" | let EndComment="" 
autocmd FileType c,css let StartComment="/*" | let EndComment="*/" 
autocmd FileType vim let StartComment="\"" | let EndComment="" 
autocmd FileType ini let StartComment=";" | let EndComment="" 

" Toggle comments on a visual block 
function! CommentLines() 
    try 
     execute ":[email protected]^".g:StartComment." @\@g" 
     execute ":[email protected] ".g:EndComment."[email protected]@g" 
    catch 
     execute ":[email protected]^@".g:StartComment." @g" 
     execute ":[email protected][email protected] ".g:EndComment."@g" 
    endtry 
endfunction 

" Comment conveniently 
vmap <Leader>c :call CommentLines()<CR> 
+2

Merci pour l'esprit StartComment et EndComment. Cela sera utile pour d'autres tâches aussi. – physicsmichael

+0

Souhaite que je pourrais upvote ce deux fois! BTW les espaces à la fin sont dus aux espaces codés en dur dans la ligne d'exécution avant et après le caractère @. Supprimez-les et, si vous le souhaitez, ajoutez des espaces de compensation aux variables réelles StartComment et EndComment – Magnus

+0

Une amélioration mineure que j'ai trouvée utile: utilisez b: StartComment et b: EndComment (à la fois pour l'initialisation et l'utilisation). Cela vous permet d'avoir différentes valeurs dans différents tampons. Ce qui est important si vous avez plusieurs types de fichiers ouverts qui utilisent différents caractères de commentaire. – Matthew

Questions connexes