我们新鲜出炉的"grep运算符"工作得很好,但是写Vimscript的目的,就是要体贴地改善你的用户的生活。 我们可以额外做两件事,让我们的运算符更加符合Vim生态圈的要求。
由于把文本复制到未命名寄存器中,我们破坏了之前在那里的内容。
这并不是我们的用户想要的,所以让我们在复制之前先保存寄存器中的内容并于最后重新加载。 修改代码成这样:
nnoremap <leader>g :set operatorfunc=GrepOperator<cr>g@
vnoremap <leader>g :<c-u>call GrepOperator(visualmode())<cr>
function! GrepOperator(type)
let saved_unnamed_register = @@
if a:type ==# "v"
normal! `<v`>y
elseif a:type ==# "char"
normal! `[v`]y
else
return
endif
silent execute "grep! -R " . shellescape(@@) . " ."
copen
let @@ = saved_unnamed_register
endfunction
我们在函数的开头和结尾加入了两个let
语句。 第一个用一个变量保存@@
中的内容,第二个则重新加载保存的内容。
保存并source文件。测试一下,复制一些文本,接着按下<leader>giw
来执行运算符, 然后按下p
来粘贴之前复制的文本。
当写Vim插件时,你_总是_应该尽量在修改之前保存原来的设置和寄存器值,并在之后加载回去。 这样你就避免了让用户陷入恐慌的可能。
我们的脚本在全局命名空间中创建了函数GrepOperator
。 这大概不算什么大问题,但当你写Vimscript的时候,事前以免万一远好过事后万分歉意。
仅需增加几行代码,我们就能避免污染全局命名空间。把代码修改成这样:
nnoremap <leader>g :set operatorfunc=<SID>GrepOperator<cr>g@
vnoremap <leader>g :<c-u>call <SID>GrepOperator(visualmode())<cr>
function! s:GrepOperator(type)
let saved_unnamed_register = @@
if a:type ==# "v"
normal! `<v`>y
elseif a:type ==# "char"
normal! `[v`]y
else
return
endif
silent execute "grep! -R " . shellescape(@@) . " ."
copen
let @@ = saved_unnamed_register
endfunction
脚本的前三行已经被改变了。首先,我们在函数名前增加前缀s:
,这样它就会处于当前脚本的命名空间。
我们也修改了映射,在GrepOperator
前面添上<SID>
,所以Vim才能找到这个函数。 如果我们不这样做,Vim会尝试在全局命名空间查找该函数,这是不可能找到的。
欢呼吧,我们的grep-operator.vim
脚本不仅非常有用,而且是一个善解人意的Vimscript公民!
阅读:help <SID>
。
享受一下,吃点零食犒劳自己。
Group/Order分组与排序Group方法用于查询分组,Order方法用于查询排序。使用示例:// SELECT COUNT(*) total,age FR...
Model对象也可以通过TX事务对象创建,通过事务对象创建的Model对象与通过DB数据库对象创建的Model对象功能...
SVG circle 通过 circle 可以绘制一个圆形,它只有3个属性用来设置圆形。SVG 圆形 - circle circle 标签可用来创建一个圆: 下面...
XSL-FO table-cell 对象XSL-FO 参考手册定义和用法 fo:table-cell 对象是一个包含表格单元格内容的容器。语法fo:table-cell!--Co...
XML Schema element 元素 完整 XML Schema 参考手册定义和用法 element 元素定义一个元素。 元素信息 父元素: schema, choice, ...
XML Schema simpleContent 元素 完整 XML Schema 参考手册定义和用法 simpleContent 元素包含对 complexType 元素(它以字符数据...
XML Schema notation 元素 完整 XML Schema 参考手册 定义和用法 notation 元素描述 XML 文档中非 XML 数据的格式。 元素信息 父...
XSLT xsl:output 元素XSLTxsl:output元素用于定义文档的输出格式,请参考本节中的实例。 完整的 XSLT 元素参考手册定义和用法 xs...