vim snipmate技巧-定制自己的snippet

2024-03-02 10:08

本文主要是介绍vim snipmate技巧-定制自己的snippet,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

snipMate.vim 为 Vim 实现了一些 TextMate 的片段(补全)特性,片段就是使用一个
关键字后加 <tab> 键来插入一些常用的文本。

例如,在 C 文件中使用默认安装的 snipMate.vim,如果在插入模式下输入 `for<tab>`,
它将展开为典型的 C 循环: >

for (i = 0; i < count; i++) {

}


要转到下一个循环项,只需要简单的按 <tab> 键;如果是重复的代码,例如示例中的
变量 `i`,只需要在高亮处输入文本,所有指定匹配的项都将被更新。要返回到上一项,
使用 <shift-tab> 就可以了。

==============================================================================
SYNTAX *snippet-syntax*
(语法)

有两种方式定义片段,一种是定义在 'snippets/<filetype>/<trigger>.snippet'文件
中,另一种则定义在 'snippets/<filetype>.snippets'文件中。
(译注:<filetype> 是文件类型,如 html,<trigger> 是关键字。)
注意,文件类型(filetype)支持点号(.) -- 例如,可以使用 >

:set ft=html.eruby

为当前文件同时激活 HTML 和 eRuby 两种片段。

*.snippets 文件的片段语法如下: >

snippet 关键字
将被展开的文本
更多被展开的文本

注意:关键字之后的片段中,最前面的硬 TAB 字符是必须的,并且不会展开到实际展开后
的文本中。*.snippet 文件也一样,除非声明关键字时,以缩进开始。

另外注意:片段必须使用硬 TAB 空白来定义,如果需要的话可以展开为空格
(参考 |snipMate-indenting|)。

井号(#) 用来作为 *.snippets 文件的单行注释,当然,它们只能用在片段定义之外,
例如: >

# 这是一个正确的注释
snippet trigger
expanded text
snippet another_trigger
# 这不是一个注释!
expanded text
<
这从语法着色上可以明显看出来。

*snipMate-${#}*
制表符(Tab stops) ~

默认情况下,光标被放置在片段的最后。可使用 "${#}"来指定下一个光标出现在哪里。
井号(#)即制表符的数字。例如:将光标放置在 <div> 标签的 id 属性值上,并允许用户
使用 <tab> 键跳转到 <div> 的中间:
>
snippet div
<div id="${1}">
${2}
</div>
<
*snipMate-placeholders* *snipMate-${#:}* *snipMate-$#*
占位符 ~

占位符文本可以由 "${#:text}" 提供,其中 # 是制表符的数值。而其中的 "text" 可以
使用 "$#" 来引用前面的副本,例如 C 循环: >

snippet for
for (${2:i}; $2 < ${1:count}; $1++) {
${4}
}

首先将选中 "count",用户也可以输入来改变被选中内容。当按下 <tab> 键, ${2} 中
的 "i" 将被定位并被选中,所有的 $2 变量默认值是 "i",它也会受用户输入影响同步
更新。
注意:TextMate 的 "$#" 语法仅用于变量,不可以是制表符。

变量中引用变量也是可以的,例如: >

snippet opt
<option value="${1:option}">${2:$1}</option>

同样,首先 "option" 将被选中,如果用户开始输入,$1 变量会同步更新。由于其中一个
$1 变量在 ${2} 中,它在下一个制表位(tab stop)中将被作为占位符,并允许用户修改。

要复制一个没有默认值的文本,使用 "${#:}" 就可以了,例如: >

snippet foo
${1:}bar$1
< *snipMate-commands*
插入 Vim 脚本 ~

片段定义中也可以使用 Vim 脚本命令,当片段被插入,这些命令通过 eval() 会被执行。
命令通过反引号(`...`)来定义;对于 TextMates 的功能,使用 |system()|函数,
例如: >

snippet date
`system("date +%Y-%m-%d")`

假如在 Unix 系统上,将被插入当前时间。注意:这个实例你可以(也应该)使用
|strftime()| 函数。

Filename([{expr}] [, {defaultText}]) *snipMate-filename* *Filename()*

由于当前文件名会被经常使用,所以默认定义了一个函数在 snipMate.vim 中,函数名是
Filename()。


如果不带参数,将返回不带后缀的文件名;第一个参数指定附加到文件名之前(或之后)
的文本,第二个参数则指定实际文件名不存在(文件未命名)的情况下返回的值, "$1"
在第一个参数中将被替换为文件名本身,如果希望仅仅返回文件名本身,第一个参数为
空白即可。例如: >

snippet filename
`Filename()`
snippet filename_with_default
`Filename('', 'name')`
snippet filename_foo
`filename('$1_foo')`

如果文件已被命名的话,第一个示例返回文件名本身,否则返回空字符串;
如果文件已被命名,第二个示例返回文件名本身,否则返回 "name";
如果文件被命名,第三个示例返回 文件名 + "_foo",否则返回空字符串。

*multi_snip*
在一个 *.snippets 文件中,可以指定多项匹配的片段,语法定义如下: >

snippet trigger 片段的描述信息 #1
被展开的文本
snippet trigger 另一个片段的描述信息 #2
另一个被展开的文本!

这个示例中,当输入 "trigger<tab>",将出现包含所有关于 "trigger" 描述的
编号菜单,用户输入相应的编号后,对应的片段将被展开。

要在 *.snippet 文件中创建多项匹配的片段,将所有的片段放在一个子目录中,目录
名称是触发字(trigger)即可:
'snippets/<filetype>/<trigger>/<name>.snippet'。

==============================================================================
USAGE *snipMate-usage*
(用法)
*'snippets'* *g:snippets_dir*
片段定义默认装在 'runtimepath' 下的 'snippets' 目录中,在 *nix 系统中是
'~/.vim/snippets/',Windows 下则是 '$HOME\vimfiles\snippets\'。要改变这个路径,
在 .vimrc 中设置 g:snippets_dir 变量为指定目录即可,想要添加另一个路径,就使用
|ExtractSnips()| 函数。它将调用 |globpath()| 函数,它使用统一的语法(例如:
以逗号(,)为分隔符的路径)。

ExtractSnipsFile({directory}, {filetype}) *ExtractSnipsFile()* *.snippets*

ExtractSnipsFile() 为特定的文件类型提取指定的 *.snippets 文件。.snippets 文件
包含针对特定的文件类型定义的多个片段。详细请参考 |snippet-syntax|。

ExtractSnips({directory}, {filetype}) *ExtractSnips()* *.snippet*

ExtractSnips() 针对特定的文件类型,从指定的目录中提取 *.snippet 文件,目录树
看起来应该是这样:'snippets/<filetype>/<trigger>.snippet'。如果片段有多项匹配,
'snippets/<filetype>/<trigger>/<name>.snippet' (参考 |multi_snip|)。

*ResetSnippets()*
ResetSnippets() 函数从内存中删除所有的片段,如果希望通过多次导入(|:source|)
来将片段置于顶部,这将非常有用。


*list-snippets* *i_CTRL-R_<Tab>*
想知道那些片段是可用的,在当前缓冲区按 <c-r><tab>,会根据|popupmenu-completion|
来显示可用的片段列表。

==============================================================================
SETTINGS *snipMate-settings* *g:snips_author*
(设置)

字符串 g:snips_author (等同于 TextMate 中的 $TM_FULLNAME) 用来设置你的姓名,
他可以用在片段定义中,来自动补全。例如: >

let g:snips_author = '闲耘?'
snippet name
`g:snips_author`
<
*snipMate-expandtab* *snipMate-indenting*
如果想在片段展开的文本中使用空白来替代制表符(tabs),设置 'expandtab' 和
'softtabstop' 为合适的数值即可,如果 'softtabstop' 未设置,则使用 'shiftwidth'
的设置。

*snipMate-remap*
snipMate 没有自定义触发键的自定义选项,但是可以在 'after' 目录下的
'plugin/snipMate.vim' 文件中修改两行代码来重映射。例如,要改变触发键为 CTRL-J:
把下面两行 >

ino <tab> <c-r>=TriggerSnippet()<cr>
snor <tab> <esc>i<right><c-r>=TriggerSnippet()<cr>

改为: >
ino <c-j> <c-r>=TriggerSnippet()<cr>
snor <c-j> <esc>i<right><c-r>=TriggerSnippet()<cr>

==============================================================================
FEATURES *snipMate-features*
(特性)

snipMate.vim 还有一些其他的特性:
- 片段语法与 TextMate 的非常类似,可以很方便的转换。
- 片段保持透明(它不在缓冲区中写标记位或占位符),不需要转义不完整的片段
有时候这非常有用。
- 在输入过程中自动更新片段。
- 片段支持多项匹配。
- 片段补全可以是无序的。例如,在 do...while 循环中,条件表达式可以被添加到
代码之前。
- [新] 支持基于文件的片段定义。
- [新] 可以展开触发器后非单词分隔符,例如 "bar.foo" 中的 "foo"。
- [新] <shift-tab> 可以反序跳转到上一个制表位。

==============================================================================
DISADVANTAGES *snipMate-disadvantages*
(缺点)

与 TextMate 的片段相比,snipMate 还有以下缺点:
- 没有 $0;制表位必须有明确的开始(必须从$1开始)。
- 不支持嵌套的占位符,例如: >

'<div${1: id="${2:some_id}}">${3}</div>'
<
在 TextMate 中,这个片段定义将首先高亮 ' id="some_id"',如果删掉它,
将自动忽略 ${2},下一个 <tab> 将跳转到 ${3};如果不删掉,会先高亮
"some_id"。在 snipMate.vim 中不可以这样。
- "${1/.*/\U&}" 这样的正则表达式变量不被执行。
- 占位符不可以跨多行。
- 不能激活同一文件中,不同作用域的片段。

也许其中的某些功能会被添加到以后的版本中。

==============================================================================
CONTACT *snipMate-contact* *snipMate-author*
(联系方式)

要联系插件作者(Michael Sanders),请发邮件至:
msanders42+snipmate <at> gmail <dot> com

我非常欢迎任何关于改善脚本的建议。

中文文档翻译问题请联系译者(闲耘?),邮件至:
hotoo.cn[AT]gmail.com

==============================================================================

vim:tw=78:ts=8:ft=help:norl:

这篇关于vim snipmate技巧-定制自己的snippet的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/765761

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

centos 6安装 vim

centos 安装vim 1.首先查询当前当前vim所依赖的包存在不存在.检查缺少哪个几个依赖包 [root@bogon firstCopy]# rpm -qa|grep vivimvim-common-7.4.160-5.el7.x86_64vim-enhanced-7.4.160-5.el7.x86_64vim-filesystem-7.4.160-5.el7.x86_64vim-

小技巧绕过Sina Visitor System(新浪访客系统)

0x00 前言 一直以来,爬虫与反爬虫技术都时刻进行着博弈,而新浪微博作为一个数据大户更是在反爬虫上不遗余力。常规手段如验证码、封IP等等相信很多人都见识过…… 当然确实有需要的话可以通过新浪开放平台提供的API进行数据采集,但是普通开发者的权限比较低,限制也比较多。所以如果只是做一些简单的功能还是爬虫比较方便~ 应该是今年的早些时候,新浪引入了一个Sina Visitor Syst

PDFQFZ高效定制:印章位置、大小随心所欲

前言 在科技编织的快节奏时代,我们不仅追求速度,更追求质量,让每一分努力都转化为生活的甜蜜果实——正是在这样的背景下,一款名为PDFQFZ-PDF的实用软件应运而生,它以其独特的功能和高效的处理能力,在PDF文档处理领域脱颖而出。 它的开发,源自于对现代办公效率提升的迫切需求。在数字化办公日益普及的今天,PDF作为一种跨平台、不易被篡改的文档格式,被广泛应用于合同签署、报告提交、证书打印等各个

文本编辑器-Vim

http://www.vim.org/ 简单介绍 Vim是一种高度可配置的文本编辑器,用于创建和更改任何类型的文本非常高效。它与大多数UNIX系统和苹果OS X一起被列为 “vi”。 Vim是稳定的,并且不断被开发以变得更好。 其功能包括: 1. 持久的,多级的撤消树 2. 广泛的插件系统 3. 支持数百种编程语言和文件格式 4. 强大的搜索和替换 5. 与许多工具集成 下载

PMP–一、二、三模–分类–14.敏捷–技巧–看板面板与燃尽图燃起图

文章目录 技巧一模14.敏捷--方法--看板(类似卡片)1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用以下哪种方法? 易错14.敏捷--精益、敏捷、看板(类似卡片)--敏捷、精益和看板方法共同的重点在于交付价值、尊重人、减少浪费、透明化、适应变更以及持续改善等方面。

OpenStack:Glance共享与上传、Nova操作选项解释、Cinder操作技巧

目录 Glance member task Nova lock shelve rescue Cinder manage local-attach transfer backup-export 总结 原作者:int32bit,参考内容 从2013年开始折腾OpenStack也有好几年的时间了。在使用过程中,我发现有很多很有用的操作,但是却很少被提及。这里我暂不直接

PMP–一、二、三模–分类–14.敏捷–技巧–原型MVP

文章目录 技巧一模14.敏捷--原型法--项目生命周期--迭代型生命周期,通过连续的原型或概念验证来改进产品或成果。每个新的原型都能带来新的干系人新的反馈和团队见解。题目中明确提到需要反馈,因此原型法比较好用。23、 [单选] 一个敏捷团队的任务是开发一款机器人。项目经理希望确保在机器人被实际建造之前,团队能够收到关于需求的早期反馈并相应地调整设计。项目经理应该使用以下哪一项来实现这个目标?