• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Vimscript 实例研究:Grep运算符(Operator),第三部分

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

我们新鲜出炉的"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>

享受一下,吃点零食犒劳自己。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Vimscript 列表发布时间:2022-02-03
下一篇:
Vimscript 实例研究:Grep运算符(Operator),第二部分发布时间:2022-02-03
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap