" =============================================================== " File: espo.vim " Version: 0.02 " Author: Kyosuke Takayama (support@mc.neweb.ne.jp) " License: BSD " " $Id: espo.vim 84 2005-02-25 03:17:06Z takayama $ " =============================================================== if exists('g:espo_disable') finish endif function! s:EspoMain() call s:EspoInit() call s:EspoOpenResult() call s:EspoOpenList() endfun function! s:EspoOpenResult() if s:EspoSelect('_Espo__Result_') let file = tempname() let file = substitute(file, '\v\d+$', '_Espo__Result_', '') silent! exe 'edit ++enc='.&enc.' ++ff='.&ff.' '.file silent! setlocal nobackup noswf nowrap splitbelow silent! update! if has('syntax') && exists("g:syntax_on") syntax match Title /^.*\%1l.*$/ endif augroup tarerss autocmd BufEnter _Espo__Result_ match DiffText /^.*\%#.*$/ autocmd BufLeave _Espo__Result_ match None augroup END nnoremap :call EspoView(0) nnoremap j :call EspoScroll('j') nnoremap k :call EspoScroll('k') nnoremap h :call EspoScroll('h') nnoremap l :call EspoScroll('l') nnoremap r :call EspoResearch() nnoremap R :call EspoRelated() nnoremap s :call EspoSort() nnoremap p :call EspoTogglePreview() nnoremap q :call EspoOpenList() endif endfun function! s:EspoOpenList() if s:EspoSelect('.espo') 20vsp silent! exe 'edit ++enc='.&enc.' ++ff='.&ff.' ~/.espo' call setline(1, '>> NEW') call setline(2, 'latest') setlocal nonumber let i = 0 while i < line('$') if getline(i) == '>> Recent' let i = 0 break endif let i = i + 1 endwhile if i != 0 call setline(i, '>> Recent') endif silent! setlocal nobackup noswf nowrap splitbelow silent! update! nnoremap :call EspoEnter() nnoremap q :call EspoQuit() endif endfun function! s:EspoSelect(file) let winno = bufwinnr(a:file) if winno == -1 return 1 else silent! exe winno.'wincmd w' endif endfun function! s:EspoEnter() silent! update! let s:keyword = getline('.') if s:keyword == 'latest' let s:keyword = s:EspoParseMonth(strftime('%m')).' '.strftime('%Y') elseif line('.') == 1 || s:keyword == '' let s:keyword = input('Enter keyword: ') let i = 0 let flag = 0 let line = line('$') while i < line('$') if getline(i) == '>> Recent' let line = i elseif getline(i) == s:keyword let flag = 1 break endif let i = i + 1 endwhile if flag == 0 call append(line, s:keyword) silent! update! endif endif call s:EspoOpenResult() let s:sort = 'date' call s:EspoSearch(s:keyword) endfun function! s:EspoParseMonth(month) let month_01 = 'Jan' let month_02 = 'Feb' let month_03 = 'Mar' let month_04 = 'Apr' let month_05 = 'May' let month_06 = 'Jun' let month_07 = 'Jul' let month_08 = 'Aug' let month_09 = 'Sep' let month_10 = 'Oct' let month_11 = 'Nov' let month_12 = 'Dec' return month_{a:month} endfun function! s:EspoSearch(keyword) let keyword = escape(a:keyword, '"') let s:keyword = keyword setlocal modifiable let expr = 'asis' " `-expr' は検索語の表現形式を指定する。`type' は " `asis'、`wild'、`regex' のどれか。デフォルトは完全一致表現。 if keyword =~ '*' let expr = 'wild' endif if keyword =~ '^m ' let keyword = substitute(keyword, '^m ', '', '') let keyword = system('echo "'.keyword.'" | '.s:espo_migemo_cmd.' -t egrep '.s:espo_migemo_dict) let expr = 'regex' elseif keyword =~ '^r ' let keyword = substitute(keyword, '^r ', '', '') let expr = 'regex' endif let keyword = escape(keyword, "|[]()'*") silent! exe "%!".s:espo_cmd.' -max '.s:espo_range.' -sort '.s:sort. \ ' -expr '.expr.' -nt -ic euc-jp -oc euc-jp -nk -snum 0 '.s:espo_index.' '.keyword.'' let i = 0 let pushline = '' let l_title = '' let l_author = '' while i <= line('$') if getline(i) =~ '^' let line = getline(f+i) if line =~ '^]+\>(.*)\', '\1', '') let hit = matchstr(line, '\d\+') let pushline = pushline.name.'('.hit.') ' elseif line =~ '^' let line = getline(f+i) let name = substitute(line, '\v^\<([^>]+)\>.*\$', '\1', '') let l_{name} = substitute(line, '^<'.name.'>\(.*\)$', '\1', '') let f = f + 1 endwhile let score = substitute(getline(i), '^ a:len let str = substitute(str, '.$', '', '') endwhile while strlen(str) <= a:len let str = str . ' ' endwhile return str endfun function! s:EspoDecode(result) let result = a:result let result = substitute(result, ''', "'", 'g') let result = substitute(result, '>', '>', 'g') let result = substitute(result, '<', '<', 'g') let result = substitute(result, '"', '"', 'g') let result = substitute(result, ''', "'", 'g') let result = substitute(result, ' ', ' ', 'g') let result = substitute(result, '&', '\&', 'g') let result = substitute(result, '»', '≫', 'g') let result = substitute(result, '«', '≪', 'g') return result endfun function! s:EspoScroll(key) silent! execute 'normal!' .a:key if getchar(0) == char2nr(a:key) return s:EspoScroll(a:key) endif if s:espo_preview == 1 call s:EspoView(1) endif if has('syntax') "if has('gui_running') "match Cursor /^.*\%#.*$/ "else match DiffText /^.*\%#.*$/ "endif endif endfun function! s:EspoResearch() let keyword = input('Enter keyword: ', s:keyword) let s:keyword = keyword call s:EspoSearch(s:keyword) endfun function! s:EspoRelated() if line('.') == 1 return endif let s:keyword = '[related] '.substitute(getline('.'), '\v^.* (\d+) .{-}$', '\1', '') call s:EspoSearch(s:keyword) endfun function! s:EspoSort() while 1 let sort = input("Sort key (score, r-score, date, r-date): ") if sort == 'score' || sort == 'date' || sort == 'r-score' || sort == 'r-date' break endif echo 'score or date' endwhile let s:sort = sort call s:EspoSearch(s:keyword) endfun function! s:EspoTogglePreview() if s:espo_preview == 0 let s:espo_preview = 1 if s:EspoSelect('_Espo__Preview_') == 1 let s:lastfile = '' call s:EspoView(1) endif else let s:espo_preview = 0 if s:EspoSelect('_Espo__Preview_') == 0 close endif endif endfun function! s:EspoView(mode) if line('.') == 1 return endif let line = getline('.') let file = substitute(line, '\v^.* \d+ (.{-})$', '\1', '') let file = s:espo_base.file if file == '' || (file == s:lastfile && a:mode == 1) return endif let s:lastfile = file let file = substitute(file, '+', ' ', 'g') let file = substitute(file, '%\(\x\x\)', '\=nr2char("0x".submatch(1))', 'g') let file = substitute(file, '\\', '\\\\', 'g') let estbuf = bufnr('_Espo__Result_') " 先に開かないと、バッファ番号が無限増殖するわけ silent! exe 'edit '.file silent! setlocal bufhidden=wipe nobackup noswf nobuflisted bt=nofile normal! 1G let before = @/ let @/ = '\n\n' silent! execute 'normal!n' let @/ = before silent! normal! jVGy exe 'buf '.estbuf let estwin = bufwinnr('_Espo__Result_') if s:EspoSelect('_Espo__Preview_') new endif silent! exe 'edit ++enc='.&enc.' ++ff='.&ff.' _Espo__Preview_' setlocal bufhidden=wipe nobackup noswf nobuflisted bt=nofile silent! normal p 1delete update nnoremap q :call EspoOpenResult() "exe 'syntax match Search /'.s:keyword.'/' if a:mode == 1 exe estwin.'wincmd w' else exe estwin.'wincmd w' close endif endfun function! s:EspoQuit() if confirm("Quit Espo OK?", "&OK\n&NO") == 1 let buf = bufwinnr('_Espo__Result_') if buf != -1 exe buf.'wincmd w' bwipe endif let buf = bufwinnr('.espo') if buf != -1 exe buf.'wincmd w' bwipe endif let buf = bufwinnr('_Espo__Preview_') if buf != -1 exe buf.'wincmd w' bwipe endif endif endfun function! s:EspoInit() if !exists('g:espo_cmd') let g:espo_cmd = 'estxview' endif if !exists('g:espo_range') let g:espo_range = 100 endif if !exists('g:espo_preview') let g:espo_preview = 1 endif if !exists('g:espo_migemo_cmd') let g:espo_migemo_cmd = 'migemo' endif if !exists('g:espo_migemo_dict') let g:espo_migemo_dict = '/usr/share/migemo/migemo-dict' endif if !exists('g:espo_index') while 1 let g:espo_index = input('Espo index directory: ') if g:espo_index != '' break endif endwhile endif if !exists('g:espo_base') while 1 let g:espo_base = input('Espo base directory: ') if g:espo_base != '' break endif endwhile endif let s:espo_index = g:espo_index let s:espo_base = g:espo_base let s:espo_range = g:espo_range let s:espo_cmd = g:espo_cmd let s:espo_preview = g:espo_preview let s:espo_migemo_cmd = g:espo_migemo_cmd let s:espo_migemo_dict = g:espo_migemo_dict let s:lastfile = '' endfun command! Espo call s:EspoMain()