如何编写vim函数将模板文本粘贴到当前文件中?

时间:2019-04-02 07:51:00

标签: vim

最近我正在学习Go语言。

我发现在很多情况下,我需要输入以下文本:

package main

import "fmt"

func main () {
}

所以我在想,也许我可以在.vimrc中编写一些vim函数,以便在使用vim时将模板文本写入当前文件。可以节省很多工作。

我了解了学习vim脚本语言几个小时后,就可以知道了。但是我认为这对于许多未使用过vim的用户来说是普遍的需求,我在Stackoverflow上也没有找到类似的问题。所以我问了这个问题。

4 个答案:

答案 0 :(得分:2)

您可以按照以下步骤创建模板:

首先,创建一个文件(例如base.go),该文件将作为您的模板,其中包含您在问题中键入的代码段(我将模板存储在$HOME/.vim/templates/<language>/中,因此对于您来说,是$HOME/.vim/templates/go/base.go,但位置完全取决于您)

然后,在您的.vimrc中,添加以下映射:

nnoremap <space>t :-1read $HOME/.vim/templates/go/base.go<CR>/{<CR>o

在普通模式下按space-t时,此映射将执行以下操作:

  • 文件$HOME/.vim/templates/go/base.go的内容插入到光标所在的位置,
  • 光标将移动到开头{
  • 您在括号中处于插入模式。

因此,当您打开一个新的go文件时,请按space-t,它将插入您的模板并将您放置在开始编码的位置。

编辑: -1指示文件内容的插入位置(:.read file将其插入到当前(.)行之后。-1将其插入到当前行之后-1。如此有效,就是将其插入到光标所在的位置,然后向下移动包括您所在的行在内的各行。有关其的更多信息,您可以阅读:help range

使用/{<CR>o部分进行跳转,该部分查找{/{),转到<CR>,然后在( o

答案 1 :(得分:1)

:help templates显示了在打开新文件时如何读取框架模板。

几个template expander plugins建立在该原始机制的基础上,并支持诸如自动求值(例如当前日期,环境变量,内联的Vimscript表达式)之类的事情。

有些人喜欢按需加载这些模板(而不是自动加载),因此他们对 snippet 插件感到非常满意。某些插件会同时执行两种操作(按需提供片段,以及新文件上的模板)。


密切相关(重叠很多):摘要就像类固醇的内置:abbreviate一样,通常带有参数插入,镜像和其中的多个止动符。 snipMate是第一个非常著名(且仍被广泛使用)的Vim插件(受 TextMate 编辑器的启发);不幸的是,它不再维护。尽管有a forkUltiSnips是一种现代的替代方法(尽管需要Python)。还有更多内容,请参见this list on the Vim Tips Wikithis comparison by Mark Weber

有三点要评估:首先,摘要引擎本身的功能,其次,作者或其他人提供的摘要的质量和广度;第三,添加新片段很容易。

答案 2 :(得分:0)

其他答案和评论也很棒,因此作为附加选项提供。这与padawin的答案非常相似,但是将框架嵌入到vimrc文件中,可能对您有好处,也可能没有好处。

我已将我的软件设置为插入模式扩展(在此处的最后一行),所以我只需键入copy#并按Enter键,就会出现此文本。 (您会注意到,该文本在随后的行中不包含注释星,这是因为它们是在Vim为我“键入”该词时自动添加的。可能有一种方法可以改变这种行为,但是对我很好。)

function! InsertCopyright()
    let l:year = strftime("%Y")
    return
        \  "/**\n"
        \. "Copyright My Great Company, " . l:year . ". All rights reserved.\n"
        \. "/"
endfunction

iabbrev <expr> copy# InsertCopyright()

答案 3 :(得分:0)

我已经基于ultisnips插件和my own solution创建了Noah Frederick work。名为“ ultisnips_custom.vim”的文件应放在:after/plugin/ultisnips_custom.vim

然后应为要触发标题的每种文件类型创建一个名为_skel的片段。

另一个提示:在ultisnips触发器下面链接的代码中,已更改为<c-j>,因此您可以根据需要进行更改。

这是我的代码:

"             File: ultisnips_custom.vim - Custom UltiSnips settings
"       Maintainer: Sergio Araújo
" Oririnal Creator: Noah Frederick
"      Last Change: abr 02 2019 17:40
"      Place it at: after/plugin/ultisnips_custom.vim

" We need python or python3 to run ultisnips
if !has("python") && !has("python3")
  finish
endif

" This function is called by the autocommand at the end of the file
function! TestAndLoadSkel() abort
  let filename = expand('%')
  " Abort on non-empty buffer or extant file
  if !(line('$') == 1 && getline('$') == '') || filereadable('%')
    return
  endif

  " Load UltiSnips in case it was deferred via vim-plug
  if !exists('g:did_plugin_ultisnips') && exists(':PlugStatus')
    call plug#load('ultisnips')
    doautocmd FileType
  endif

  " the function feedkys simulates the insert key sequence in order to call
  " the template (skel)
  execute 'call feedkeys("i_skel\<c-j>")'
endfunction

augroup ultisnips_custom
  autocmd!
  au Bufnewfile *.sh,*.zsh,*.html,*.css,*.py,*.tex,*.md :call TestAndLoadSkel()
  "autocmd BufEnter *.sh,*.zsh,*.html,*.py execute 'call feedkeys("i_skel\<c-j>")'
augroup END

" vim: fdm=marker:sw=2:sts=2:et