function! utils#Cabbrev(key, value) abort execute printf('cabbrev %s (getcmdtype() == ":" && getcmdpos() <= %d) ? %s : %s', \ a:key, 1 + len(a:key), Single_quote(a:value), Single_quote(a:key)) endfunction function! s:Single_quote(str) abort return "'" . substitute(copy(a:str), "'", "''", 'g') . "'" endfunction function! utils#VimFolds(lnum) abort let l:cur_line = getline(a:lnum) let l:next_line = getline(a:lnum+1) if l:cur_line =~# '^"{' return '>' . (matchend(l:cur_line, '"{*') - 1) endif if l:cur_line ==# '' && (matchend(l:next_line, '"{*') - 1) == 1 return 0 endif return '=' endfunction function! utils#MyFoldText() abort let l:line = getline(v:foldstart) let l:fold_line_num = v:foldend - v:foldstart let l:fold_text = substitute(l:line, '^"{\+', '', 'g') let l:fill_char_num = &textwidth - len(l:fold_text) - len(l:fold_line_num) - 10 return printf('+%s%s %s (%s L)', repeat('-', 4), l:fold_text, repeat('-', l:fill_char_num), l:fold_line_num) endfunction function! utils#ToggleCursorCol() abort if &cursorcolumn set nocursorcolumn echo 'cursorcolumn: OFF' else set cursorcolumn echo 'cursorcolumn: ON' endif endfunction function! utils#SwitchLine(src_line_idx, direction) abort if a:direction ==# 'up' if a:src_line_idx == 1 return endif move-2 elseif a:direction ==# 'down' if a:src_line_idx == line('$') return endif move+1 endif endfunction function! utils#MoveSelection(direction) abort if visualmode() !=# 'V' return endif let l:start_line = line("'<") let l:end_line = line("'>") let l:num_line = l:end_line - l:start_line + 1 if a:direction ==# 'up' if l:start_line == 1 normal! gv return endif silent execute printf('%s,%smove-2', l:start_line, l:end_line) normal! gv elseif a:direction ==# 'down' if l:end_line == line('$') normal! gv return endif silent execute printf('%s,%smove+%s', l:start_line, l:end_line, l:num_line) normal! gv endif endfunction function utils#Get_titlestr() abort let l:title_str = '' if g:is_linux let l:title_str = hostname() . ' ' endif let l:buf_path = expand('%:p:~') let l:title_str = l:title_str . l:buf_path . ' ' return l:title_str endfunction function utils#iso_time(timestamp) abort if !a:timestamp return strftime('%Y-%m-%d %H:%M:%S%z') endif if len(a:timestamp) == 13 let l:timestamp = a:timestamp[:-4] elseif len(a:timestamp) == 16 let l:timestamp = a:timestamp[:-7] else let l:timestamp = a:timestamp endif return strftime('%Y-%m-%d %H:%M:%S%z', l:timestamp) endfunction function! utils#CaptureCommandOutput(command) abort let l:tmp = @m redir @m silent! execute a:command redir END tabnew | setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile let l:lines = split(@m, '\n') call nvim_buf_set_lines(0, 0, 0, 0, l:lines) let @m = l:tmp endfunction function! utils#MultiEdit(patterns) abort for p in a:patterns for f in glob(p, 0, 1) execute 'edit ' . f endfor endfor endfunction