vimshell のプロンプトで遊んでみた


実は動的プロンプトとは全く関係ないんですが、vimshell で遊んでみました。
こんな感じでプロンプトがアニメーションします。


[ソース]

set updatetime=500
let g:vimshell_prompt = "<po><yo> > "

let s:count = 0
let s:last_time = 0
function! s:get()
    let time = str2float(reltimestr(reltime()))
    let poyo =[
    \        "(´・_・`)",
    \        "( ´・_・)",
    \        "(  ´・_)",
    \        "(   ´・)",
    \        "(    ´)",
    \        "(      )",
    \        "(      )",
    \        "(`     )",
    \        "(・`    )",
    \        "(_・`   )",
    \        "(・_・`  )",
    \]
    if (time - s:last_time) > 0.45
        let s:count += 1
        let s:last_time = time
    endif
    return poyo[ s:count % len(poyo) ]
endfunction


function! s:update()
    let pos = getpos(".")
    let anim = s:get()
    let prev_anim = matchstr(getline("."), '<po>\zs.\{-}\ze<yo>')
    execute ':%s/<po>\zs.\{-}\ze<yo>/' . anim . '/g'
    call setpos(".", [pos[0], pos[1], pos[2] + strlen(anim) - strlen(prev_anim), pos[3]])
    let b:vimshell.context.prompt_pattern = printf('^<po>%s<yo>\ >\ ', anim)
endfunction


function! s:vimshell()
    setlocal conceallevel=2
    setlocal concealcursor=ni

    syntax match tagPoyoHiddenBegin /<po>/ conceal
    syntax match tagPoyoHiddenEnd  /<yo>/ conceal

    augroup vimshell-poyo
        autocmd!
        autocmd CursorHold  <buffer> call s:update()
        autocmd CursorHoldI <buffer> call s:update()
    augroup END
endfunction


augroup my-vimshell
    autocmd!
    autocmd FileType vimshell call s:vimshell()
augroup END


処理自体は前回やった (*゚∀゚)o彡゚ミミミン!ミミミン!ウーサミン!! と同じ原理。
vimshell のプロンプトに『』というタグを設定しておいて、そのタグ内に動的に顔文字を埋め込んでいます。
これ系のアニメーションはいろんなところで試してみると面白そう。