【问题标题】:Writing a vim function to insert a block of static text编写一个vim函数来插入一个静态文本块
【发布时间】:2009-03-27 16:10:37
【问题描述】:

我希望能够在 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函数吗?有没有更好的办法?

【问题讨论】:

  • 查看 UltiSnips 插件:github.com/SirVer/ultisnips.
  • 如果您每次打开某个类型的新文件时都想要某种模板或格式,请查看 vim 的 :help 中的 skeleton or template
  • 我想只需要在制作新文件时添加。然后你可以将此行添加到 vimrc 文件 autocmd BufNewFile *.html 0r ~/.config/vim/templates/skeleton.html BufNewFile 在创建新文件时执行。 *.html 当文件为 *.html 0r 时插入文件 template.html 的开头
  • 您可以使用 :ab 或在 vimrc 示例中添加缩写。 :ab title &lt;head&gt;&lt;CR&gt;&lt;title&gt;&lt;/title&gt;&lt;CR&gt;&lt;/head&gt; 或从模板插入。 ab pyclass&lt;esc&gt;:r ~/.config/vim/templates/class.py 当你写 pyclass(return) 插入文件 class.py。 退出写入模式 :r 插入文件 class.py 的内容 我的 vimrc 中有这一行 ` autocmd BufNewFile,BufRead *.py ab pyclass:r ~/.config/vim/templates/class. py`

标签: function vim


【解决方案1】:

我通过在我的 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>

【讨论】:

  • 你能想出一个好的跨平台方式来处理查找模板文件吗?我喜欢这个想法,但我喜欢在 Windows、Linux 和 OSX 上使用它
  • 好的,这是我最喜欢的。 iab 很好,但很难为复杂的文件模板设置。不过,处理路径的跨平台方式仍然很好。
  • 对于像我这样的新手:注意文件路径不是字符串;在文件路径中使用 Class 函数参数,do like this 并使用 exe 'r' . filepath,其中 filepath 是您可以根据需要构建的字符串
  • @MarkBiek 我很确定这跨平台的。我在 Windows 上使用 Vim,它可以正确解释 ~/。使用~ 而不是/home/meC:\User\me 实际上是这个函数的可取之处,因为Vim 可以解决这个问题。
  • 这个类好像没有名字。没有?
【解决方案2】:

迟到了,只是为了将来参考,但另一种方法是创建一个命令,例如

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

你可以这样称呼它

:Inshtml

说明:命令在命令模式下运行,你用 :normal 切换到普通模式,然后用 'i' 切换到插入模式,'i' 后面是你的文本,你用转义结束,输入为输入^V

也可以添加参数,例如

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

其中&lt;args&gt;(按原样输入)将替换为实际参数,您可以使用

:Inshtml blah

【讨论】:

  • 最好使用:normal! 来避免您可能拥有的任何映射
  • 会一直保存吗?
【解决方案3】:

我在 ~/.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 文件时,它都会将该文本打印到新文件中

【讨论】:

  • 这似乎是关于如何作为 Vim 插件的一部分执行此操作的唯一答案。我意识到所有其他答案都解决了原始问题,但这是唯一使用 Vim 脚本的答案,并且对于任何制作 Vim 插件的人来说都是正确的答案。
  • 而不是在append 调用中使用确切的行号,而是使用append("$", "some text") 将行添加到缓冲区的末尾。它将允许更轻松地修改预定义的文本。
【解决方案4】:

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

:ab insh 'your html here'

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

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

autocmd BufNewFile *.html call GenerateHeader()

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

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

【讨论】:

    【解决方案5】:

    sn-psEmu

    我喜欢使用snippetsEmu vim 插件插入代码 sn-ps 像你的。

    sn-psEmu 的优点是您可以指定占位符并直接跳转到它们以插入值。例如,在您的情况下,您可以在 title 标签之间添加一个占位符,以便在插入此 sn-p 时轻松向文档添加标题。

    sn-psEmu 带有各种 sn-ps(也适用于 HTML),并且可以轻松添加新的 sn-ps。


    编辑

    snipMate

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

    【讨论】:

    【解决方案6】:

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

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

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

    【讨论】:

    • 好的,忽略该评论。我不明白 iab 是缩写命令,所以您在插入模式下键入 _perls。
    • 如果指定模式就好了。你是绝对正确的。
    • 这对于小东西来说绝对很棒!
    • 我正在使用类似的东西,但输出受到formatoptions 和其他我尚未发现的设置的影响。
    【解决方案7】:

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

    This guy 谈论 vim 表达式寄存器。基本上你把这样的东西放在你的 .vimrc 文件中

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

    因此,每次在插入模式下按 Ctrlj 时,它都会调用脚本 htmlScript.py,其中包含类似的内容(注意 我还没有实际测试过)

    #!/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 的语法更舒服。

    【讨论】:

    • 这是一个有趣的想法。我得看看。
    • @MarkBiek 使用已经建立的脚本语言要容易得多,使用诸如&lt;C-j&gt;html&lt;C-j&gt;Cif&lt;C-j&gt;Pyif 之类的助记符映射将非常简单...
    • 这很好用,但你忘了 chmod 755 /home/BennyHill/htmlScript.py 第一行应该是 #!/usr/bin/env python
    • @puk 如何自动化这个过程,以便在我打开一个新的 python 文件时添加这些文本?
    • @alhelal 你应该使用autocmd。我不太擅长 vim,但这个答案应该为你指明方向 vi.stackexchange.com/a/11294
    【解决方案8】:

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

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

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

    let @a = @*
    

    把这个模板注册一个。

    【讨论】:

      【解决方案9】:

      vim 有很多template expander plugins

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

      所有的路径问题、可移植性问题等都已经处理好了。与在同一个 sn-ps 定义文件中支持(并且以某种方式期望)多个(hard to maintain,IMO)sn-ps 的 sn-pEmu 不同,Mu-template 需要每个 sn-p 一个模板文件。

      【讨论】:

        【解决方案10】:

        将您的文本放入文件中(例如,html)。 然后将以下内容放入您的.vimrc
        command Inshtml r html

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

        那么如果可以在命令模式下输入Inshtml(即:Inshtml)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-06
          • 2018-12-07
          • 1970-01-01
          • 1970-01-01
          • 2019-03-06
          • 1970-01-01
          • 1970-01-01
          • 2022-10-13
          相关资源
          最近更新 更多