把你自己写的觉得不错的 vim 脚本贴出来 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tracyone
V2EX    Vim

把你自己写的觉得不错的 vim 脚本贴出来

  •  
  •   tracyone 2017-08-19 07:49:20 +08:00 via iPhone 2688 次点击
    这是一个创建于 2983 天前的主题,其中的信息可能已经有所发展或是发生改变。
    10 条回复    2017-10-19 10:23:20 +08:00
    xiaohanqing
        1
    xiaohanqing  
       2017-08-25 10:30:46 +08:00
    "vim8.0
    "异步 project 搜索
    function! AsyncGrep(keyword, ...)
    let file = exists('a:1') ? a:1 : '*.*'

    if a:keyword!~'\k' "暂时只支持关键字搜索
    return 'incorrect a:keyword'
    endif
    if file!~'\f'
    return 'incorrect file'
    endif

    if len(getqflist())>0
    cgetexpr ""
    let w:quickfix_title="searching..."
    redraw
    endif

    let job_opt = {}
    let job_opt.out_io = 'buffer'
    let job_opt.out_mode = 'nl'
    let job_opt.out_name = ''
    let job_opt.out_msg = ''
    let job_opt.out_cb = ''
    let job_opt.err_cb = {job, message -> execute("echom ".string(message), "")}
    let job_opt.exit_cb = function({kw, fl, job, status -> execute("
    \ if exists('g:grepJobtimer')|
    \ call timer_stop(g:grepJobtimer)|
    \ endif|
    \ let buf_line = getbufline(ch_getbufnr(job, 'out'),0, '$')|
    \ let buf_line = filter(buf_line, 'len(v:val)>0')|
    \ if len(buf_line)<1|
    \ echo 'can not find ".kw." in ".fl."'|
    \ return|
    \ endif|
    \ cgetexpr buf_line|
    \ copen|
    \ let w:quickfix_title='search ".kw."'|
    \ echo 'search finish'|
    \ ", "")}, [a:keyword, file])

    let job_opt.close_cb = ""

    if exists('g:grepJob') && type(g:grepJob)==v:t_job && job_status(g:grepJob)=='run' "防止多任务冲突
    call job_stop(g:grepJob)
    endif
    let job_command = [&shell, &shellcmdflag]
    "TODO 兼容更多的搜索工具
    let re_option=''
    if &grepprg=~'grep'
    let re_option = '-r'
    elseif &grepprg=~'findstr'
    let re_option = '/S'
    endif
    let job_command += [substitute(&grepprg, '\$\*', '"'.a:keyword.'"', 'g').' '.re_option.' '.file]
    let g:grepJob = job_start(job_command, extend(g:defaultJobOpt, job_opt))

    if job_status(g:grepJob)=='fail'
    return 'search fail'
    endif

    if exists('g:grepJobtimer')
    call timer_stop(g:grepJobtimer)
    endif
    let g:grepJobtimer = ProgressBar('searching', '.', 3)
    return 'search start'
    endfunction

    "进度条
    function! ProgressBar(leadingMsg, marker, num, ...)
    let interval = exists('a:1') ? a:1 : 700
    return timer_start(interval, function({leadingMsg, maker, num, timer -> execute("
    \ if mode(1)==#'R' || mode(1)=='n'|
    \ let timer_info=timer_info(timer)|
    \ echo leadingMsg.repeat(maker, ((9999*num-timer_info[0].repeat)%num)+1)|
    \ endif|
    \ ", "")}, [a:leadingMsg, a:marker, a:num]), {'repeat': 9999*a:num})
    endfunction!
    tracyone
        2
    tracyone  
    OP
       2017-08-25 11:58:15 +08:00
    @xiaohanqing 进度条很有意思。
    xiaohanqing
        3
    xiaohanqing  
       2017-08-26 21:19:08 +08:00 via Android
    @tracyone 贴一些有趣脚本出来给我玩,:D
    tracyone
        4
    tracyone  
    OP
       2017-08-26 21:32:42 +08:00
    "tmux function

    function! s:run_tmux(args) abort
    let cmd = 'tmux ' . ' ' . a:args
    return system(cmd)
    endfunction

    function! s:reg2tmux(reg) abort
    let args = 'set-buffer "' . escape(a:reg, '"$\\') . '"'
    silent call s:run_tmux(args)
    endfunction

    function! s:tmux2reg() abort
    let args = "show-buffer"
    let @" = s:run_tmux(args)
    endfunction

    function! te#tmux#reg2tmux() abort
    :call <SID>reg2tmux(@")
    endfunction

    function! te#tmux#tmux2reg() abort
    :call <SID>tmux2reg()
    endfunction


    vnoremap <C-C> y:call te#tmux#reg2tmux()<cr>
    inoremap <c-v> <C-o>:call te#tmux#tmux2reg()<cr><C-o>p


    最近写的,在 tmux 的 buffer 和 vim 的 uname 寄存器之间拷贝文本,对于字符界面的 vim 来说非常有用。
    yehuohan
        5
    yehuohan  
       2017-09-22 10:11:24 +08:00
    " 多目录、文件补全(输入一个文件 /目录后,按空格,可以接着补全第二个文件 /目录)
    " FUNCTION: GetMultiFilesCompletion(arglead, cmdline, cursorpos) {{{
    function! GetMultiFilesCompletion(arglead, cmdline, cursorpos)
    let l:complete = []
    let l:arglead_list = [""]
    let l:arglead_first = ""
    let l:arglead_glob = ""
    let l:files_list = []

    " process glob path-string
    if !empty(a:arglead)
    let l:arglead_list = split(a:arglead, " ")
    let l:arglead_first = join(l:arglead_list[0:-2], " ")
    let l:arglead_glob = l:arglead_list[-1]
    endif

    " glob hidden and not hidden files
    let l:files_list = split(glob(l:arglead_glob . "*") . "\n" . glob(l:arglead_glob . "\.[^.]*"), "\n")
    if len(l:arglead_list) == 1
    let l:complete = l:files_list
    else
    for item in l:files_list
    call add(l:complete, l:arglead_first . " " . item)
    endfor
    endif
    return l:complete
    endfunction
    " }}}
    tracyone
        6
    tracyone  
    OP
       2017-09-22 21:55:13 +08:00
    @yehuohan 给个使用例子呗?
    yehuohan
        7
    yehuohan  
       2017-09-23 12:29:25 +08:00
    @tracyone

    :<Func> Des<tab>top Dow<tab>loads

    <Func> 使用 GetMultiFilesCompletion 作为自动补全
    <tab> 按 Tab 的地方,补全完 Desktop 后,Downloads 能继续补全
    yehuohan
        8
    yehuohan  
       2017-09-23 12:31:39 +08:00
    @tracyone
    我用于 使用 vimgrep 全局搜索时,输入多个特定文件
    yehuohan
        9
    yehuohan  
       2017-09-28 14:00:12 +08:00
    还有一个,用一个 tab 实现 ZoomWin 功能,不过是使用 tab,所以界面就没 ZoomWin 插件的那样好看了,要是装了 ariline 或不显示 tabline 还好。还有就是因为 ToggleWindowZoom 使用 tab 模拟 ZoomWin,所以退出时,也要用 ToggleWindowZoom 来退出,不然会关错 tab。
    let s:is_max = 0
    function! ToggleWindowZoom()
    if s:is_max
    let s:is_max = 0
    execute "normal! " . s:last_tab . "gt"
    execute "noautocmd " . s:last_winnr . "wincmd w"
    silent! execute "tabclose " . s:this_tab
    else
    let s:is_max = 1
    let s:last_winnr = winnr()
    let s:last_tab = tabpagenr()
    execute "tabedit " . expand("%")
    let s:this_tab = tabpagenr()
    endif
    endfunction
    qiqiboy
        10
    qiqiboy  
       2017-10-19 10:23:20 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2581 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 07:53 PVG 15:53 LAX 00:53 JFK 03:53
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86