编写一个vim函数来插入一个静态文本块

我希望能够在vim中做这样的事情(如果有帮助,你可以假设v7 +)。

键入一个像这样的命令(或closures的东西)

:inshtml 

并让vim将以下内容转储到当前光标位置的当前文件中

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

我可以写一个vim函数吗? 有没有更好的办法?

我这样做是通过在我的vim文件夹下保存一组文件,然后使用r命令(在当前位置插入文件内容,如果没有行号传递)从某个函数插入:

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

这是非常实用的 – 在我看来 – 当你想插入多行文本。 然后你可以,例如,映射一个键盘快捷键来调用你的函数:

 nmap ^N :call Class()<CR> 

晚会之后,只是为了将来的参考,但另一种做法是创build一个命令,例如

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

你可以称之为

 :Inshtml 

说明:命令在命令模式下运行,然后切换到普通模式:normal,然后用'i'插入模式,'i'后面跟着你的文本,然后你inputescape作为字符input^ V

也可以添加参数,例如

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

其中<args> (按字面意思input)将被实际的参数replace,然后用它来调用它

 :Inshtml blah 

snippetsEmu

我喜欢使用snippetsEmu vim插件插入像你的代码片段。

snippetsEmu的优点是你可以指定占位符并直接跳转到它们以插入一个值。 在你的情况下,你可以例如在标题标签之间添加一个占位符,以便在插入此代码段时可以轻松地为文档添加标题。

snippetsEmu带有各种片段(也用于HTML),并且可以添加新的片段。


编辑

snipMate

今天,我重新访问了我的VIM Confiugration +安装的插件,发现了snipMate插件,这比恕我直言更好,甚至比snippetsEmu更好snipMate更新就像TextMate所有占位符一样。

我使用下面的代码在〜/ .vim / plugins /中创build了一个新文件generate_html.vim

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

这样,每当我在vim中打开一个新的.html文件,它就会把这个文本打印到新文件中

你能定义一个缩写吗? 例如

 :ab insh 'your html here' 

因为上面的东西似乎没有参数化?

事实上,看着我的VIMconfiguration,我发现一个新的.html文件正在加载:

 autocmd BufNewFile *.html call GenerateHeader() 

并定义一个函数GenerateHeader()来插入我所需的模板(对于Java / Perl等)。

这是值得Vim食谱这类的东西。 这是一个很好的投资。

这应该是可能的。 我使用自动更换。 在我的.vimrc我有这一行:

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

每当我启动一个Perl脚本,我只需键入_perls然后按Enter。

你可以使用Python(或任何其他程序),如果像我一样,你还没有完全掌握vimScript

这个人谈论vimexpression式寄存器。 基本上你把这样的东西放在你的.vimrc文件中

 :imap <Cj> <Cr>=system('/home/BennyHill/htmlScript.py')<CR> 

所以每次在插入模式下,你按下Ctrl j它调用脚本htmlScript.py它有这样的东西( 注意我没有实际testing过)

 #!/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 )。 这可能是矫枉过正的,但是我比vim的语法更适合Python。

您可以将此文本复制到某些(例如'a')registry中。 除非你覆盖寄存器'a',否则每次需要粘贴。

复制注册一个在视觉模式:“唉
在正常模式下从寄存器中粘贴:“ap
在插入模式下从寄存器中粘贴:a

或者如果你有这个模板已经复制,你可以使用

 let @a = @* 

把这个模板注册一个。

vim有很多模板扩展插件 。

注意:我正在维护muTemplate的叉子 。 只需将代码转储到{rtp}/template/html.template$VIMTEMPLATES/html.template 。 就这样。 如果您不希望在打开新的HTML文件时隐式加载代码片段,请命名模板文件html/whatever.template (而不是html.template ),然后加载它:MuTemplate html/whatever在INSERT模式下(在HTML缓冲区中) whatever^r<tab>

所有的path问题,可移植性问题等已经被处理。 而不像snippetEmu支持(和某种程度上期望)几个( 难以维护 ,国际海事组织)片段在一个相同的片段定义文件,Mu-template需要一个模板文件每个片段。