在vim中使用snippets

推荐使用vim-plug作为vim包管理器,轻量且能异步更新,还支持插件分支。

1. 所用插件

1
2
3
4
5
6
7
" vim-plug配置插件方式
" supertab用来防止使用tab展开snippet与youcompleteme的tab补全发生冲突
Plug 'ervandew/supertab'
" ultisnips是引擎
Plug 'SirVer/ultisnips'
" 所有常用snippet都在vim-snippets里
Plug 'honza/vim-snippets'

2. 插件设置,以及YCM与UltiSnips不冲突的设置方法

具体supertab插件以及UltiSnip插件设置如下:

1
2
3
4
5
6
7
8
9
10
11
12
" make YCM compatible with UltiSnips (using supertab)
let g:ycm_key_list_select_completion = ['<C-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<C-p>', '<Up>']
let g:SuperTabDefaultCompletionType = '<C-n>'

" better key bindings for UltiSnipsExpandTrigger
let g:UltiSnipsSnippetDirectories = ['~/.vim/UltiSnips', 'UltiSnips']
let g:UltiSnipsExpandTrigger = "<tab>"
let g:UltiSnipsJumpForwardTrigger = "<tab>"
let g:UltiSnipsJumpBackwardTrigger = "<s-tab>"
" If you want :UltiSnipsEdit to split your window.
let g:UltiSnipsEditSplit="vertical"

这样YouCompleteMe就被绑定到了Ctrl+n,然后这个快捷键又被SuperTab绑定到tab

3. 自定义snippet

可以使用UltiSnips的语法自定义代码块,比如jekyll博客,我们每次新建博客的时候都要加入固定的博客头,我们想要实现输入head然后按下tab键自动补全固定表头。

自定义snippet如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# ~/.vim/bundle/UltiSnips/markdown.snippets

snippet head "Jekyll post header" b
---
title: ${1:title}
layout: post
published: false
guid: `!p
import uuid
if not snip.c:
guid = uuid.uuid4().hex
snip.rv = guid
`
date: `!v strftime("%Y-%m-%d %H:%M:%s")`
categories: [${2:Python}]
tags: [${3:code, python}]
---
**目录:**
* Kramdown table of contents
{:toc .toc}
* * *

${0}
endsnippet
# vim:ft=snippets:

UltiSnips自定义snippet的语法为:snippet trigger_word ["description" [options] ]

在上例中,我们的trigger_wordheaddescriptionjekyll post header, optionsbb意味着只有trigger_word在行首的时候,才执行对应操作; 其中的变量${n},代表是第几个可以用tab跳转的可输入块,默认开始时光标停留在${1}上,最后一个可跳转位置是${0}

  • 本文作者: 大护法
  • 本文链接: https://todebug.com/vim-snippets/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 4.0 许可协议。转载请注明出处!
0%