编写一个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需要一个模板文件每个片段。