利用 python 实现 vimwiki 的 wiki 词查找

背景

vimwiki 帮助什么都好,就是缺少对 wiki 词的快速查找.

比如在 wikidpad 中,我可以ctrl+o,输入 bigzhu 的话,那么会将所有含有 bigzhu 的 Wiki 词都显示出来.方便我快速检索.

可是 vimwiki 没有这个功能,只有 VimwikiGoto 必须要精确匹配,用起来很不顺手.自己动手来完善吧.

查找关键字的 python 程序

利用这两篇说到的代码,组合成这个 python 程序:

1.3 规整了一下

  • 规整了一下
  • 可以选择是否输出时间
  • 参数没给时有提示

    #!/usr/bin/env python
    #encoding=utf-8
    #file_name=search_wiki.py
    import glob
    import sys
    import os
    import time
    
    def search(wiki_name):
    file_names=glob.glob('*%s*.wiki'%wiki_name)
    files_info={}
    for i in file_names:
        modify_time=time.localtime(os.path.getmtime(i))
        files_info![pic](i)=modify_time
    return files_info
    
    def write_result(files_info, print_time=False):
    files_info_sorted=sorted(files_info.items(), key=lambda by:by![pic](1), reverse=True)
        
    f=open('search.wiki','w')
    name=""
    print >>f,'- status: draft'
    for file_info in files_info_sorted:
        splited_name= file_info![pic](0).rsplit('.',1)
        name=splited_name![pic](0)
        if(print_time):
            print >>f,'* ['+name+']('+name+'.md)'+'    '+time.strftime("%Y年%m月%d日 %H:%S", file_info![pic](1))
        else:
            print >>f,'* ['+name+']('+name+'.md)'
    f.close()
    
    if __name__=='__main__':
    args=sys.argv
    if(len(args)==1):
        print '请输入要查找的 wiki 关键字'
    elif(len(args)>2):
        wiki_name=args![pic](1)
        files_info=search(wiki_name)
        if(args![pic](2)=='time'):
            write_result(files_info, True)
        else:
            write_result(files_info)
    elif(len(args)==2):
        wiki_name=args![pic](1)
        files_info=search(wiki_name)
        write_result(files_info)

1.2 再次优化(按时间排序)

支持按时间排序

#!/usr/bin/python
* -*- coding:UTF-8 -*-

import glob
import sys
import os
import time


args=sys.argv
search=args![pic](1)
files_info={}

file_names=glob.glob('*%s*.wiki'%search)
for i in file_names:
    modify_time=time.localtime(os.path.getmtime(i))
    files_info![pic](i)=modify_time

files_info_sorted=sorted(files_info.items(), key=lambda by:by![pic](1), reverse=True)

f=open('search.wiki','w')
name=""
print >>f,'- status: draft'
for file_info in files_info_sorted:
    splited_name= file_info![pic](0).rsplit('.',1)
    name=splited_name![pic](0)
    print >>f,'['+name+']('+name+'.md)'+'    '+time.strftime("%Y年%m月%d日 %H:%S", file_info![pic](1))
f.close()

1.1 版优化(废弃)

没必要用 string 的 find,在 glob 就可以模糊查找.更快.

#!/usr/bin/python
* -*- coding:UTF-8 -*-

import glob
import shutil
import sys
import os

args=sys.argv
search=args![pic](1)

file_names=glob.glob('*%s*.wiki'%search)

f=open('search.wiki','w')
name=""
print >>f,'- status: draft'
for file_name in file_names:
    splited_name= file_name.rsplit('.',1)
    name=splited_name![pic](0)
    #index=name.find(search)
    #if(index!=-1):
    print >>f,'['+name+']('+name+'.md)'
f.close()

1.0版(废弃)

#!/usr/bin/python
* -*- coding:UTF-8 -*-

import glob
import shutil
import sys

args=sys.argv
search=args![pic](1)

file_names=glob.glob('*.wiki')

f=open('search.wiki','w')
name=""
print >>f,'- status: draft'
for file_name in file_names:
    splited_name= file_name.rsplit('.',1)
    name=splited_name![pic](0)
	index=name.find(search)
	if(index!=-1):
    	print >>f,'['+name+']('+name+'.md)'
f.close()

实现的功能就是查找 wiki 所在目录,比如关键字是 bigzhu,那么就会找到有含有 bigzhu 的 wiki 词,写入到 search.wiki中.

把这个文件起名 search.py,放到 wiki 所在目录.

chmod a+x search.py

vim 配置

gvim ~/.vimrc

加入:

au FileType wiki map <f4> :SearchWiki 

function SearchWiki(Name)
	execute "!search_wiki.py ".a:Name
	execute "VimwikiGoto search"
endfunction
au FileType wiki command! -buffer -nargs=1 SearchWiki call SearchWiki("<args>")

这时按下f3 输入要找的 wiki 词的一部分,就能在打开的 wiki 中看到所有的结果了.

ps

这个一定要注意加一下,没加的赶紧.

"设置vim的路径为打开文件的当前路径,以使得 wiki 的 search.py search_all.py 能够正常工作,否则都是在路径 ~/下
au BufNewFile,BufRead *.wiki cd %:p:h