web-dev-qa-db-fra.com

Écrire une fonction vim pour insérer un bloc de texte statique

J'aimerais pouvoir faire quelque chose comme ça dans vim (vous pouvez supposer que v7 + si ça peut aider).

Tapez une commande comme celle-ci (ou quelque chose de proche)

:inshtml

et demandez à vim de vider ce qui suit dans le fichier actuel à l’emplacement actuel du curseur

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body>
    </body>
</html>

Puis-je écrire une fonction vim faire cela? Y a-t-il un meilleur moyen?

43
Mark Biek

Je le fais en conservant dans mon dossier vim un ensemble de fichiers que j'insère ensuite à l'aide de la commande r (qui insère le contenu d'un fichier à l'emplacement actuel si aucun numéro de ligne n'est passé) à partir d'une fonction:

function! Class()
    " ~/vim/cpp/new-class.txt is the path to the template file
    r~/vim/cpp/new-class.txt
endfunction

À mon avis, c'est très pratique lorsque vous souhaitez insérer un texte multiligne. Vous pouvez ensuite, par exemple, mapper un raccourci clavier pour appeler votre fonction:

nmap ^N :call Class()<CR>
38
Paolo Tedesco

En retard pour le parti, juste pour référence future, mais une autre façon de le faire est de créer une commande, par exemple.

:command Inshtml :normal i your text here^V<ESC>

Vous pouvez l'appeler comme

:Inshtml

Explanation: la commande est exécutée en mode commande et vous passez en mode normal avec: normal, puis en mode insertion avec 'i', ce qui suit le 'i' est votre texte et vous terminez avec escape, qui est entré comme caractère en entrant ^ V

Il est également possible d’ajouter des arguments, par exemple.

:command -nargs=1 Inshtml :normal i You entered <args>^V<ESC>

<args> (entré littéralement tel quel) sera remplacé par les arguments réels, et vous l'appelez avec 

:Inshtml blah
32
Dan Andreatta

j'ai créé un nouveau fichier generate_html.vim in ~/.vim/plugins/ avec le code suivant

"
" <This plugin generates html tags to new html files>
"

autocmd BufNewFile  *.html  call    Generate_html()

function! Generate_html()
    call append(0, "<!DOCTYPE HTML>")
    call append(1, "<html><head>")
    call append(2, "    <title></title>")
    call append(3, '    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />')
    call append(4, '    <style type="text/css">')
    call append(5, '    </style>')
    call append(6, '</head>')
    call append(7, '<body>')
    call append(8, '</body>')
    call append(9, '</html>')
endfunction

ainsi, à chaque fois que j'ouvre un nouveau fichier .html dans vim, le texte est imprimé dans le nouveau fichier.

12
uromay

snippetsEmu

J'aime utiliser le plugin snippetsEmu vim pour insérer des extraits de code comme votre.

SnippetsEmu présente l'avantage de pouvoir spécifier des espaces réservés et d'y accéder directement pour insérer une valeur. Dans votre cas, vous pouvez par exemple ajouter un espace réservé entre les balises title afin que vous puissiez facilement ajouter un titre au document lors de l'insertion de cet extrait.

snippetsEmu est livré avec divers extraits (également pour HTML) et de nouveaux extraits peuvent être ajoutés tous les jours.


EDIT

snipMate

Aujourd'hui, j'ai revisité mon VIM confiugration + plugins installés et j'ai trouvé le plugin snipMate, ce qui est encore mieux à mon avis que snippetsEmu. (snipMate} _ met à jour comme TextMate tous les espaces réservés à la volée.

8
f3lix

Pouvez-vous définir une abréviation? par exemple.

:ab insh 'your html here'

comme rien dans ce qui précède ne semble être paramétré? 

En fait, en regardant mes config VIM, je détecte un nouveau fichier .html en cours de chargement:

autocmd BufNewFile *.html call GenerateHeader()

et définissez une fonction GenerateHeader() pour insérer le modèle requis (je fais de même pour Java/Perl, etc.).

Il vaut la peine d’obtenir le Vim Cookbook pour ce genre de choses. C'est un bon investissement.

7
Brian Agnew

Cela devrait être possible. J'utilise le remplacement automatique. Dans mon .vimrc j'ai cette ligne:

iab _perls #!/usr/bin/Perl<CR><BS><CR>use strict;<CR>use warnings;<CR>

Et chaque fois que je lance un script Perl, je tape simplement _perls et appuie sur Entrée.

4
innaM

Вы можете использовать Python

тот парень говорит о регистре выражений vim. По сути, вы положили что-то вроде того в свой файл .vimrc

:imap <C-j> <C-r>=system('/home/BennyHill/htmlScript.py')<CR>

Тобы каждый раз в режиме вставки нажиматьCtrljон вызывает скрипт htmlScript.py, в котором есть что-то вроде этого (NOTEна сао

#!/usr/bin/env python
import sys

snippet="""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body>
    </body>
</html>"""

sys.stdout.write(snippet)

Тогда просто не забудьте сделать файл исполняемым (chmod 0755 /home/BennyHill/htmlScript.py). À propos de Python, il y a environ 2 mois.

3
puk

Il y a beaucoup de templates expander plugins pour vim.

NB: Je maintiens le fork de muTemplate . Copiez simplement votre code dans {rtp}/template/html.template ou dans $VIMTEMPLATES/html.template. Et c'est tout. Si vous ne voulez pas que l'extrait de code soit implicitement chargé lors de l'ouverture d'un nouveau fichier HTML, nommez le fichier de modèle html/whatever.template (au lieu de html.template) et chargez-le avec :MuTemplate html/whatever de avec whatever^r<tab> en mode INSERT (dans un tampon HTML). 

Tous les problèmes de chemin, de portabilité, etc. sont déjà pris en charge. Et contrairement à snippetEmu qui prend en charge (et s’attend en quelque sorte) plusieurs extraits ( difficiles à gérer , IMO) dans un même fichier de définition d’extraits, Mu-template requiert un fichier modèle par extrait.

1
Luc Hermitte

Vous pouvez une fois copier ce texte dans un registre (par exemple 'a'). Et collez-le à chaque fois que vous avez besoin, à moins d'écraser le registre 'a'.

Pour copier pour enregistrer en mode visuel: "ay
Coller du registre a en mode normal: "ap
Pour coller du registre a en mode insertion: a

Ou si vous avez déjà copié ce modèle, vous pouvez utiliser

let @a = @*

Pour mettre ce modèle pour enregistrer un.

1
Mykola Golubyev

Placez votre texte dans un fichier (par exemple, html). Ensuite, mettez les éléments suivants dans votre .vimrc.
command Inshtml r html 

J'utilise Inshtml au lieu de inshtml car vim ne prend pas en charge les commandes définies par l'utilisateur commençant par une lettre minuscule.

Ensuite, si peut taper Inshtml en mode commande (c'est-à-dire, :Inshtml).

0
alhelal