五一期间没有来得及回家,这次周末正好是母亲节。周五晚上工作结束后,回了一趟老家,已经快半年没有回去了。
周六早上,带爷爷、奶奶、妈妈一起去扬州世博园玩玩。避开五一假期,也是另外一番景色。
中午在宝能广场吃的“老土灶民间菜”,感觉他们家菜的口味还是挺不错的,而且也比较实惠。
吃完饭回家回家后陪爷爷奶奶还有妈妈打麻将,老年人爱好挺简单的。我记得我上次打牌还是去年11月份,手生的很。
礼拜天,是母亲节,今天中午选的是无锡融创茂的泰妃餐厅。
今天向大家分享一个我刚写的 Vim 插件 gfr.vim。名字取自三个词语缩写:Grep, Filter, Replace。顾名思义,这个插件提供的功能包括文本搜索、结果筛选以及文本替换功能。
Vim 文本搜索的插件已经非常多了,我自己也使用过很多种插件。比如:ack.vim
、ag.vim
、grepper.vim
等等。这些插件都提供了类似的功能,即为搜索制定的文字,并将结果输出到 Vim 的 quickfix window。
甚至,我之前还制作过一款实时异步搜索,并展示搜索结果的插件 flygrep.vim。
但是以上这些插件仅仅支持搜索指定文本的结果,不具备二次检索和替换的功能。
这个插件中,我比较常用的命令是 :Grep
。实际上,Vim 本身也有 :grep
和 :vimgrep
命令,功能是相同的,都是执行搜索命令,并且把搜索的结果展示在 quickfix 窗口内。
但是 Vim 自带的 :grep
和 :vimgrep
命令是单线程的,如果搜索的文件夹内内容非常多会卡住当前 Vim 的操作界面,体验不是很好。
Vim 和 Neovim 的一些内置函数还是有些差异的,而 gfr.vim
集成了 SpaceVim 的 API,可以同时兼容 Vim 和 Neovim。
gfr.vim
使用了 SpaceVim 的 notify API,对于一些插件通知消息,在 Vim 右上方使用浮窗提示。
和其他常用插件一样,你可以使用任意一个插件管理器来安装,比如使用 plug.vim:
Plug 'wsdjeg/gfr.vim'
在插件列表添加上面这段即可,启动 Vim 后执行 :PlugInstall
。
gfr.vim
提供了如下命令:
:Grep
: 搜索指定的文本,该命令后面的参数即为需要搜索的文本,比如 :Grep hello
指的就是搜索 hello
。如果直接调用:Grep
,并且不带任何参数,那么会弹出一个输入框,可供输入需要搜索的文本。:Filter
:检索上一次搜索的结果,可以理解为二次筛选。对于上一次搜索或者检索的结果,进行再一次的筛选。:GrepSave
:将当前的搜索结果保存至命名标签,以便于快速访问。:GrepResum
:使用:GrepResum 标签名
可以快速打开以往的搜索结果:Replace
:对搜索到的结果执行文本替换目前,这个插件只支持 grep
命令,后续计划增加 ag
、rg
等命令支持。
五一期间花了一点点时间将微信朋友圈“移植”到博客相册,今天抽空整理了下这个过程,并记录。
微信朋友圈14年左右开始使用,至今已经十年了,出于以下原因放弃:
最起初,只有三五个相册的时候,相册页面的内容是纯手工写的。后来,当把朋友圈老照片都转移过来后,手工操作的话就不合适了。
因为相册的内容比较简单:
{日期}
{context}
{gallery}
{location}
因此,基于dev#autodoc
API 写了一个脚本:
let s:AUTODOC = SpaceVim#api#import('dev#autodoc')
let s:AUTODOC.autoformat = 0
function! Gengallery() abort
let s:AUTODOC.begin = '^<!-- wsdjeg.net gallery start -->$'
let s:AUTODOC.end = '^<!-- wsdjeg.net gallery end -->$'
let s:AUTODOC.content_func = function('s:generate_gallery')
call s:AUTODOC.update()
endfunction
function! s:generate_gallery() abort
let content = []
call extend(content, s:gallery_list())
let content += ['']
return content
endfunction
function! s:gallery_list() abort
let text = []
let gallery_dirs = globpath('docs/uploads', '*', 1, 1)
let previous_t = ''
for gpath in gallery_dirs
if empty(previous_t) || matchstr(gpath, '\d\+') !=# previous_t
call extend(text, s:dir_to_g(gpath), 0)
let previous_t = matchstr(gpath, '\d\+')
endif
endfor
return text
endfunction
function! s:dir_to_g(d) abort
let t = []
let y = str2nr(matchstr(a:d, '\d\d\d\d'))
let m = str2nr(matchstr(a:d, '\d\d\d\d\zs\d\d'))
let d = matchstr(a:d, '\d\d\d\d\d\d\zs\d\d')
call add(t, '### ' . y . '年' . m . '月' . (empty(d) ? '' : d . '日'))
call add(t, '')
" 如果存在 text.txt 文件,读取内容,写入文字
if filereadable(a:d . '/text.txt')
call extend(t, readfile(a:d . '/text.txt'))
call add(t, '')
endif
call add(t, '{% include image-gallery-nofilename.html folder="' . substitute(a:d[5:], '\', '/', 'g') . '" %}')
call add(t, '')
" 如果存在 location 文件,读取内容,写入地址
if filereadable(a:d . '/location')
call add(t, '> <i class="fa fa-map-marker"></i> ' . readfile(a:d . '/location')[0])
call add(t, '')
endif
return t
endfunction
转眼间毕业已经十三年了,错过了大学同学毕业十年聚会,挺可惜的。一直想找时间回学校看看。
今天正好带着家人回学校转转,本以为假日期间在学校不会看到太多的人。但是到了之后发现,有很多都是带着小孩子到学校里面拍照、画画。
午饭选的是“桃花源记”,进川菜馆吃苏帮菜,有点失误了。
下午去了“诚品书店”,以前空闲的时候过去,书店里人很少,很安静。是个不错的看书的地方,今天人有点太多了,有点赶集的味道。
下一站去了圆融天幕,可惜不是晚上,没有看到夜景。
开车来到了平江路,一眼望去乌泱泱的人,只能放弃这一站了,还有苏州地标大秋裤也没来得及去看,期待下次吧。
今天是大悦城开业活动的最后一天,以前这个地方叫博大摩登。原先人气一点也不旺,但是这次过来感觉确实很热闹。
中午尝了一下新白鹿,一家不错的杭州菜。晚上看了一部电影,《长空之王》。实际上本来前天就想看了,周五晚上回来后在融创茂吃了个“等鱼柒·豆花烤鱼”,已经不记得是第几次吃这家了,小朋友似乎挺爱吃的。 完了本来想去看看电影,奈何时间太晚了,只能早早回去休息。
第一次了解到试飞员这一高危的职业,希望每一次试飞都可以安全落地。
看似和平的年代,实际上有很多人在背后默默付出,默默守护。
电影中穿插着各种家庭的元素,有父母、有老婆孩子,虽然不舍,但是还是默默支持,默默承受着。
张大队那句“做为军人,性命加使命才是生命”真的太贴切了,看完整个人都久久的沉浸在这样的敬佩、感动和自豪中,致敬这样一群默默守护我们的人!
最近在改写插件 tagbar 的日志系统,采用 SpaceVim 内置的日志插件。但是在调用 debug 函数时发现日志一直无法写入。
代码逻辑非常简单,lua 文件逻辑:
lua/spacevim/logger.lua
local M = {}
function M.test()
local derive = {
_debug_mode = false,
}
function derive.debug(msg)
if derive._debug_mode then
print(msg)
end
end
return derive
end
return M
vim script 这边只定义了一个函数:
autoload/testl.vim
function! testl#test() abort
return luaeval('require("testluaeval").test()')
endfunction
测试步骤:
let tlog = testl#test()
let tlog._debug_mode = v:true
call tlog.debug('hello')
运行到此处发现,消息并没有被打印。于是在 neovim 仓库提交了issue。得到的回复是,目前 neovim 还不支持 bindeval,但是支持 closures。
因此逻辑上做了如下改动:
lua/spacevim/logger.lua
local M = {}
function M.test()
local derive = {
_debug_mode = false,
}
function derive.debug(msg)
if derive._debug_mode then
print(msg)
end
end
function derive.start_debug()
derive._debug_mode = true
end
function derive.stop_debug()
derive._debug_mode = false
end
return derive
end
return M
vim script 这边只定义了一个函数:
autoload/testl.vim
function! testl#test() abort
return luaeval('require("testluaeval").test()')
endfunction
测试步骤:
let tlog = testl#test()
call tlog.start_debug()
call tlog.debug('hello')
通过以上的改动,测试步骤可以达到预期效果。