最近我正在学习Go语言。
我发现在很多情况下,我需要输入以下文本:
package main
import "fmt"
func main () {
}
所以我在想,也许我可以在.vimrc
中编写一些vim函数,以便在使用vim时将模板文本写入当前文件。可以节省很多工作。
我了解了学习vim脚本语言几个小时后,就可以知道了。但是我认为这对于许多未使用过vim的用户来说是普遍的需求,我在Stackoverflow上也没有找到类似的问题。所以我问了这个问题。
答案 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 fork。 UltiSnips是一种现代的替代方法(尽管需要Python)。还有更多内容,请参见this list on the Vim Tips Wiki和this 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