Réponses:
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 UltiSnips
répertoire dans votre répertoire .vim
ou _vimfiles
. Dans ce document, placez un c.snippet
fichier 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' A
indique la fin de la première ligne. Commander :help UltiSnips-syntax
pour 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.
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.snip
contenant 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.
É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 strftime
dépendent de votre plate-forme, si vous n'êtes pas sur Windows et que cela ne fonctionne pas, vous devrez man strftime
comprendre 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
.