Comment puis-je créer une section de commentaires / * avec /// comme dans XCode?

8

Dans XCode, il existe un module complémentaire appelé vvdocument, qui peut détecter trois accès /et les transférer ///dans:

/*!
*  @author Robbie Yi JIANG, 29-Jan-2016 14:01:45
*
*  
*/

Comment puis-je faire cela dans Vim.

Yi Jiang
la source

Réponses:

9

La méthode dans ma réponse précédente ne se transforme pas bien en contenu dynamique. C'est là que les plugins d'extraits comme UltiSnips et SnipMate entrent en jeu. Je vais fournir une démo d' UltiSnips ici. Installez-le en utilisant votre méthode préférée de Comment installer un plugin dans vim / vi?

Maintenant, créez un UltiSnipsrépertoire dans votre répertoire .vimou _vimfiles. Dans ce document, placez un c.snippetfichier contenant:

snippet /// "My header" A
/*!
*  @author Robbie Yi JIANG, `date +'%d-%b-%Y %T'`
*
*  
*/
endsnippet

Maintenant, si vous ouvrez un fichier C et tapez ///, il devrait être automatiquement remplacé par l'en-tête, y compris la date et l'heure actuelles. C'est ça!

En général, UltiSnips insère un extrait lorsque vous appuyez sur Tab. Ici, nous avons spécifié que l'extrait de code devrait être entré automatiquement - c'est ce que l' Aindique la fin de la première ligne. Commander :help UltiSnips-syntaxpour plus d'informations sur l'écriture d'extraits.

Cependant, la plupart des gens commencent par une collection d'extraits de code, tels que vim-snippets. Il y en a trop pour les décrire ici, mais vous pourriez en avoir certains très utiles.

muru
la source
3
+1 pour Ultisnips. Vous pouvez également spécifier des emplacements de saut et des emplacements par défaut pour votre curseur après avoir développé un extrait de code.
fruglemonkey
6

Une façon serait de créer un fichier contenant cet extrait et de le lire lorsque vous tapez ///.

Par exemple, créez ~/.vim/snippets/my_header.snipcontenant cet en-tête. Définissez ensuite ce mappage:

inoremap /// <esc>:r ~/.vim/snippets/my_header.snip<cr>i

Ou:

inoremap /// <esc>:call append(line('.')-1, readfile(expand('~/.vim/snippets/my_header.snip')))<cr>i

Dans la première cartographie, votre curseur sera placé sur la première ligne du texte inséré; et dans le second, le curseur sera placé sous le texte inséré.

La cartographie la plus simple, en termes de sauts de modes, est peut-être:

inoremap /// <c-r><c-o>=readfile(expand('~/.vim/snippets/my_header.snip'))<cr>

Pour une utilisation plus générale, vous voudrez peut-être examiner les plugins d'extraits. UltiSnips et SnipMate sont deux populaires. Je n'utilise pas non plus, donc je n'en recommanderai pas.

muru
la source
3

Écrivez une fonction qui renvoie la chaîne et appelez-la.

function! InsertHeader()
    let l:header = "/*!\n"
                \. "* @author Robbie Yi JIANG, " . strftime('%d-%b-%Y %H:%M:%S') . "\n"
                \. "*\n"
                \. "* \n"
                \. "*/\n"
    return l:header
endfunction

inoremap /// <C-R>=InsertHeader()<Enter><C-O>2k<C-O>$

Les détails strftimedépendent de votre plate-forme, si vous n'êtes pas sur Windows et que cela ne fonctionne pas, vous devrez man strftimecomprendre les arguments.

Cela fonctionne en mode insertion, mais cela fait des choses étranges pour le traitement de barre oblique. Si vous faites des //commentaires de style C ++ , la deuxième barre oblique n'apparaîtra que lorsque vous tapez un espace ou quelque chose après.

L' <C-R>=insère une expression à la position du curseur. Le InsertHeader()<Enter>bit est l'expression qui est évaluée. Je construis la chaîne ligne par ligne dans la fonction, .c'est la concaténation de chaîne et \le caractère de continuation de ligne (où la continuation dit "combine cela avec la ligne précédente", contrairement à la façon dont C et sa famille le font). Enfin, deux <C-O>opérations, une pour remonter de deux lignes et une pour passer à la fin de la ligne où vraisemblablement un commentaire de fichier va être entré; notez l'espace à la fin de la chaîne dans la quatrième ligne de l:header.

dash-tom-bang
la source