tutorial temas personalizar para escribir comandos function vim

function - temas - vim tutorial



Escribir una función vim para insertar un bloque de texto estático (10)

snippetsEmu

Me gusta usar el complemento snippetsEmu vim para insertar fragmentos de código como los tuyos.

La ventaja de snippetsEmu es que puede especificar marcadores de posición y saltar directamente a ellos para insertar un valor. En su caso, podría, por ejemplo, agregar un marcador de posición entre las etiquetas de título para que pueda agregar fácilmente un título al documento al insertar este fragmento.

snippetsEmu viene con varios fragmentos (también para HTML) y se pueden agregar fragmentos nuevos fácilmente.

EDITAR

snipMate

Hoy revisé mis complementos VIM confiugration + installed y encontré el complemento snipMate , que en mi humilde opinión es incluso mejor que los snippetsEmu . Las actualizaciones snipMate al igual que TextMate todos los marcadores de posición sobre la marcha.

Me gustaría poder hacer algo como esto en vim (puedes asumir v7 + si ayuda).

Escriba un comando como este (o algo parecido)

:inshtml

y haga que vim descargue lo siguiente en el archivo actual en la ubicación actual del cursor

<!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>

¿Puedo escribir una función vim? ¿Esto es? ¿Hay una mejor manera?


¿Puedes definir una abreviatura? p.ej

:ab insh ''your html here''

ya que nada de lo anterior parece estar parametrizado?

De hecho, mirando mis configuraciones de VIM, detecto un nuevo archivo .html que se carga así:

autocmd BufNewFile *.html call GenerateHeader()

y defina una función GenerateHeader() para insertar mi plantilla requerida (hago lo mismo con Java / Perl, etc.).

Vale la pena obtener el libro de cocina Vim para este tipo de cosas. Es una buena inversión.


Esto debería ser posible. Yo uso auto-reemplazo. En mi .vimrc tengo esta línea:

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

Y cada vez que inicio un script de Perl, simplemente escribo _perls y presiono Enter.


Hay muchos complementos de expansión de plantilla para vim.

NB: estoy manteniendo el tenedor de muTemplate . Simplemente {rtp}/template/html.template su código en {rtp}/template/html.template o en $VIMTEMPLATES/html.template . Y eso es todo. Si no desea que el fragmento se cargue implícitamente al abrir un nuevo archivo HTML, html.template nombre al archivo de plantilla html/whatever.template (en lugar de html.template ) y cárguelo con :MuTemplate html/whatever of with whatever^r<tab> en modo INSERT (en un búfer de HTML).

Todos los problemas de ruta, problemas de portabilidad, etc. ya están solucionados. Y a diferencia de snippetEmu que admite (y de alguna manera espera) varios fragmentos ( difíciles de mantener , IMO) en un mismo archivo de definición de fragmentos, Mu-template requiere un archivo de plantilla por fragmento.


He creado un nuevo archivo generate_html.vim en ~ / .vim / plugins / con el siguiente código

" " <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

De esta forma, cada vez que abro un nuevo archivo .html en vim, imprime ese texto en el nuevo archivo


Lo hago manteniendo en mi carpeta vim un conjunto de archivos que luego inserto usando el comando r (que inserta el contenido de un archivo, en la ubicación actual si no se pasa ningún número de línea) desde alguna función:

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

Esto es muy práctico, en mi opinión, cuando desea insertar texto de varias líneas. Entonces puede, por ejemplo, asignar un atajo de teclado para llamar a su función:

nmap ^N :call Class()<CR>


Pon tu texto en un archivo (por ejemplo, html ). Luego ponga lo siguiente en su .vimrc .
command Inshtml r html

Uso Inshtml lugar de inshtml porque vim no admite el comando definido por el usuario que comienza con una letra pequeña.

Entonces, si puede escribir Inshtml en el modo de comando (es decir :Inshtml ).


Puedes usar Python (o cualquier otro programa) si, como yo, no has comprendido vimScript

Este chico habla sobre el registro de expresión vim. Esencialmente pones algo como esto en tu archivo .vimrc

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

De modo que cada vez que esté en el modo de inserción, presione Ctrl j para htmlScript.py el script htmlScript.py que tiene algo así ( NOTA , en realidad no lo he probado).

#!/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)

Entonces solo recuerde hacer que el archivo sea ejecutable ( chmod 0755 /home/BennyHill/htmlScript.py ). Puede ser excesivo, pero estoy mucho más cómodo con Python que con la sintaxis de vim.


Tarde a la fiesta, solo para referencia futura, pero otra forma de hacerlo es crear un comando, por ejemplo

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

Lo puedes llamar como

:Inshtml

Explicación: el comando se ejecuta en modo comando, y cambia al modo normal con: normal, luego para insertar el modo con ''i'', lo que sigue a ''i'' es su texto y termina con escape, que se ingresa como carácter al ingresar ^ V

También es posible agregar argumentos, por ejemplo

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

donde <args> (ingresado literalmente como está) se reemplazará con los argumentos reales, y usted lo llamará con

:Inshtml blah


Una vez puede copiar este texto en algún registro (por ejemplo ''a''). Y péguelo cada vez que lo necesite a menos que sobrescriba el registro ''a''.

Para copiar para registrar a en modo visual: "ay
Para pegar desde registrar a en modo normal: "ap
Para pegar desde registrar a en modo de inserción: a

O si tiene esta plantilla ya copiada puede usar

let @a = @*

Para poner esta plantilla para registrar a.