编写vim函数以插入静态文本块

时间:2009-03-27 16:10:37

标签: function vim

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

输入这样的命令(或关闭的东西)

: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函数吗?还有更好的方法吗?

10 个答案:

答案 0 :(得分:39)

我这样做是通过在我的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>

答案 1 :(得分:34)

晚会,仅供将来参考,但另一种方法是创建命令,例如

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

您可以将其称为

:Inshtml

说明:该命令在命令模式下运行,然后切换到正常模式,使用:normal,然后插入带有'i'的模式,'i'后面是你的文本,你完成了escape,输入为输入^ V

的字符

也可以添加参数,例如

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

其中<args>(按字面意思输入)将替换为实际参数,并用

调用它
:Inshtml blah

答案 2 :(得分:14)

我在〜/ .vim / plugins / 中创建了一个新文件 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文件时,它会将该文本打印到新文件

答案 3 :(得分:8)

snippetsEmu

我喜欢使用snippetsEmu vim插件来插入像您这样的代码段。

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

snippetsEmu附带了各种代码段(也适用于HTML),并且可以添加新的代码段。


修改

snipMate

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

答案 4 :(得分:7)

您可以定义缩写吗? e.g。

:ab insh 'your html here'

因为上面的内容似乎没有参数化?

事实上,看着我的VIM配置,我检测到一个新的.html文件被加载:

autocmd BufNewFile *.html call GenerateHeader()

并定义一个函数GenerateHeader()来插入我需要的模板(我对Java / Perl等做同样的事情。)。

这种东西值得Vim Cookbook。这是一项合理的投资。

答案 5 :(得分:4)

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

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

每当我启动一个Perl脚本时,我只需输入_perls并按Enter键。

答案 6 :(得分:3)

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

This guy讨论了vim表达式寄存器。基本上你在.vimrc文件

中放了这样的东西
:imap <C-j> <C-r>=system('/home/BennyHill/htmlScript.py')<CR>

因此,每次在插入模式下按 Ctrl j 它会调用脚本htmlScript.py,其中包含类似的内容(注< / strong>我实际上没有测试过这个)

#!/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)。它可能有点矫枉过正,但我​​对Python的熟悉程度远远超过vim的语法。

答案 7 :(得分:1)

您可以将此文本复制到某些(例如“a”)寄存器。并在每次需要时粘贴它,除非你覆盖注册'a'。

要复制以在视觉模式下注册:“ay
要在正常模式下从寄存器a粘贴:“ap
从寄存器a粘贴到插入模式:a

或者,如果您已复制此模板,则可以使用

let @a = @*

将此模板注册为。

答案 8 :(得分:1)

vim有很多template expander plugins

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

所有路径问题,可移植性问题等都已得到解决。与snippetEmu不同,snippetEmu在同一片段定义文件中支持(并以某种方式预期)多个(hard to maintain,IMO)片段,Mu-template每个片段需要一个模板文件。

答案 9 :(得分:0)

将您的文字放在一个文件中(例如,ref.child().update())。 然后将以下内容放入html .vimrc

我使用command Inshtml r html而不是Inshtml,因为vim不支持以小写字母开头的用户定义命令。

然后,如果可以在命令模式下键入inshtml(即Inshtml)。