332 lines
9.2 KiB
VimL
332 lines
9.2 KiB
VimL
function! SetColor(name, fg, bg, fg_l, bg_l, style) abort
|
|
"{{{
|
|
if &background ==? 'dark'
|
|
if a:fg ==? 'normal'
|
|
let l:guifg = ' guifg=' . g:d_normal_fg
|
|
let l:ctermfg = 'ctermfg=black'
|
|
" let l:termfg = 'termfg=black'
|
|
elseif a:fg ==? 'none'
|
|
let l:guifg = ' guifg=' . g:d_normal_bg
|
|
let l:ctermfg = ' ctermfg=white'
|
|
" let l:termfg = ' termfg=white'
|
|
elseif a:fg ==? ''
|
|
let l:guifg = ''
|
|
let l:ctermfg = ''
|
|
" let l:termfg = ''
|
|
else
|
|
let l:guifg = ' guifg=' . a:fg
|
|
let l:ctermfg = ' ctermfg=black'
|
|
" let l:termfg = ' termfg=black'
|
|
endif
|
|
|
|
if a:bg ==? 'none'
|
|
let l:guibg = ' guibg=NONE'
|
|
let l:ctermbg = ' ctermbg=none'
|
|
" let l:termbg = ' termbg=none'
|
|
elseif a:bg ==? ''
|
|
let l:guibg = ''
|
|
let l:ctermbg = ''
|
|
" let l:termbg = ''
|
|
else
|
|
let l:guibg = ' guibg=' . a:bg
|
|
let l:ctermbg = ' ctermbg=black'
|
|
endif
|
|
else " light background
|
|
if a:fg_l ==? 'normal'
|
|
let l:guifg = ' guifg=' . g:l_normal_fg
|
|
let l:ctermfg = ' ctermfg=black'
|
|
" let l:termfg = ' termfg=black'
|
|
elseif a:fg_l ==? 'none'
|
|
let l:guifg = ' guifg=' . g:l_normal_bg
|
|
let l:ctermfg = ' ctermfg=white'
|
|
" let l:termfg = ' termfg=white'
|
|
elseif a:fg_l ==? ''
|
|
let l:guifg = ''
|
|
let l:ctermfg = ''
|
|
let l:termfg = ''
|
|
else
|
|
let l:guifg = ' guifg=' . a:fg_l
|
|
let l:ctermfg = ' ctermfg=black'
|
|
" let l:termfg = ' termfg=black'
|
|
endif
|
|
|
|
if a:bg_l ==? 'none'
|
|
let l:guibg = ' guibg=NONE'
|
|
let l:ctermbg = ' ctermbg=none'
|
|
" let l:termbg = ' termbg=none'
|
|
elseif a:bg_l ==? ''
|
|
let l:guibg = ''
|
|
let l:ctermbg = ''
|
|
" let l:termbg = ''
|
|
else
|
|
let l:guibg = ' guibg=' . a:bg_l
|
|
let l:ctermbg = ' ctermbg=white'
|
|
" let l:termbg = ' termbg=white'
|
|
endif
|
|
endif
|
|
|
|
if a:style ==? ''
|
|
let l:style = ' term=none cterm=none gui=NONE'
|
|
else
|
|
let l:style = ' term=' . a:style . ' cterm=' . a:style . ' gui=' . a:style
|
|
endif
|
|
|
|
let l:histring = 'hi! ' . a:name . l:guifg . l:guibg . l:style
|
|
let l:histring .= l:ctermfg . l:ctermbg
|
|
" let l:histring .= l:termfg . l:termbg
|
|
|
|
execute 'hi clear ' . a:name
|
|
execute l:histring
|
|
|
|
endfunction"}}}
|
|
|
|
" TODO better name
|
|
function! GetStatusFrag(condition, colorname, conditionprefix, text) abort
|
|
let l:frag='%#' . a:colorname . '#'"{{{
|
|
let l:frag.=a:conditionprefix
|
|
let l:frag.='%{(' . a:condition . ")?'" . a:text . "':''}"
|
|
return l:frag
|
|
endfunction
|
|
"}}}
|
|
|
|
function! MyFoldText()
|
|
"{{{
|
|
let l:linecount = v:foldend - v:foldstart - 1
|
|
let l:line = getline(v:foldstart)
|
|
|
|
let l:prefix = '|+' . l:linecount . v:folddashes . '| '
|
|
let l:subexp = '^ \{,' . len(l:prefix) . '}'
|
|
|
|
let l:foldtext = substitute(l:line, l:subexp, l:prefix, '')
|
|
let l:foldtext = substitute(l:foldtext, '"{\{3}', '', '')
|
|
|
|
return l:foldtext
|
|
endfunction
|
|
"}}}
|
|
|
|
function! CheckLineEnding() abort
|
|
"{{{
|
|
:normal $
|
|
if getline('.')[col('.')-1] == ';' || getline('.')[col('.')-1] == ','
|
|
:startinsert
|
|
else
|
|
:startinsert!
|
|
endif
|
|
endfunction
|
|
"}}}
|
|
|
|
" get name of syntax item
|
|
function! SyntaxItem() abort
|
|
"{{{
|
|
return synIDattr(synID(line('.'),col('.'),1),'name') . ' -> ' . synIDattr(synIDtrans(synID(line('.'),col('.'),1)), 'name' )
|
|
endfunction
|
|
nnoremap <space>pp :echom SyntaxItem()<CR>
|
|
"}}}
|
|
|
|
" devdocs DD
|
|
" https://gist.github.com/romainl/8d3b73428b4366f75a19be2dad2f0987#file-devdocs-vim
|
|
function! s:Get_env() abort
|
|
if has('win64') || has('win32') || has('win16')"{{{
|
|
return 'WINDOWS'
|
|
else
|
|
return toupper(substitute(system('uname'), '\n', '', ''))
|
|
endif
|
|
endfunction
|
|
" What command to use on what system
|
|
let s:cmds = {'DARWIN': 'open', 'LINUX': 'qutebrowser', 'WINDOWS': 'start'}
|
|
|
|
" Build the URL stub
|
|
let s:stub = s:cmds[<SID>Get_env()] . " 'http://devdocs.io/?q="
|
|
|
|
command! -nargs=* DD silent! call system(len(split(<q-args>, ' ')) == 0 ?
|
|
\ s:stub . &ft . ' ' . expand('<cword>') . "'" : len(split(<q-args>, ' ')) == 1 ?
|
|
\ s:stub . &ft . ' ' . <q-args> . "'" : s:stub . <q-args> . "'")
|
|
"}}}
|
|
|
|
" use ranger as file manager
|
|
if !exists('*RangerExplorer')
|
|
function RangerExplorer() abort"{{{
|
|
exec 'silent !ranger --choosefile=/tmp/vim_ranger_current_file ' . expand('%:p:h')
|
|
if filereadable('/tmp/vim_ranger_current_file')
|
|
exec 'edit ' . system('cat /tmp/vim_ranger_current_file')
|
|
call system('rm /tmp/vim_ranger_current_file')
|
|
endif
|
|
redraw!
|
|
endfun
|
|
map <space>ra :call RangerExplorer()<CR>
|
|
endif
|
|
"}}}
|
|
|
|
function! SetColorColumn() abort
|
|
if &buftype == ''"{{{
|
|
setlocal colorcolumn=80
|
|
endif
|
|
endfunction
|
|
"}}}
|
|
|
|
function! GetLinterStatus(key) abort
|
|
"{{{
|
|
let l:statuscount = 0
|
|
|
|
if exists('b:ale_linted')
|
|
let l:linter = ale#statusline#Count(bufnr(''))
|
|
else
|
|
let l:linter = GetDiagnosticCountsFromSigns(bufnr(''))
|
|
endif
|
|
|
|
if has_key(l:linter, a:key)
|
|
let l:statuscount = l:linter[a:key]
|
|
endif
|
|
return l:statuscount
|
|
endfunction
|
|
"}}}
|
|
|
|
" Shell command
|
|
" http://vim.wikia.com/wiki/VimTip1599
|
|
function! s:RunShellCommand(cmdline) abort
|
|
"{{{
|
|
let l:expanded_cmdline = a:cmdline
|
|
for l:part in split(a:cmdline, ' ')
|
|
if l:part[0] =~ '\v[%#<]'
|
|
let l:expanded_part = fnameescape(expand(l:part))
|
|
let l:expanded_cmdline = substitute(l:expanded_cmdline, l:part, l:expanded_part, '')
|
|
endif
|
|
endfor
|
|
|
|
if g:shell_scratch_buffer_nr > -1
|
|
let l:win_nr = bufwinnr(g:shell_scratch_buffer_nr)
|
|
if l:win_nr < 0
|
|
execute 'bdelete' g:shell_scratch_buffer_nr
|
|
top new
|
|
let g:shell_scratch_buffer_nr = bufnr('%')
|
|
else
|
|
execute l:win_nr. ' wincmd w'
|
|
setlocal modifiable
|
|
%delete _
|
|
endif
|
|
else
|
|
top new
|
|
let g:shell_scratch_buffer_nr = bufnr('%')
|
|
endif
|
|
|
|
setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
|
|
nnoremap <buffer> q :bdelete<CR>
|
|
augroup ResetShellBufferNr
|
|
autocmd! * <buffer>
|
|
autocmd BufUnload <buffer> let g:shell_scratch_buffer_nr = -1
|
|
augroup END
|
|
|
|
" call setline(1, 'You entered: ' . a:cmdline)
|
|
" call setline(2, 'Expanded Form: ' .l:expanded_cmdline)
|
|
" call setline(3,substitute(getline(2),'.','=','g'))
|
|
execute '$read !'. l:expanded_cmdline
|
|
1
|
|
|
|
setlocal nomodifiable
|
|
if !exists('b:shell_line_count')
|
|
let b:shell_line_count = line('$')
|
|
if b:shell_line_count > 25
|
|
let b:shell_line_count = 20
|
|
endif
|
|
execute 'resize' b:shell_line_count + 1
|
|
endif
|
|
|
|
wincmd p
|
|
endfunction
|
|
|
|
command! -complete=shellcmd -nargs=+ Shell call s:RunShellCommand(<q-args>)
|
|
let g:shell_scratch_buffer_nr = -1
|
|
"}}}
|
|
|
|
function! GetDiagnosticCountsFromSigns(buffer) abort
|
|
let l:error = 0
|
|
let l:warn = 0
|
|
let l:info = 0
|
|
let l:hint = 0
|
|
|
|
redir => l:result
|
|
silent exec 'sign place buffer=' . a:buffer
|
|
redir end
|
|
|
|
let l:lines = split(l:result, '\n')
|
|
|
|
for l:line in l:lines
|
|
if l:line =~? 'Error'
|
|
let l:error += 1
|
|
endif
|
|
if l:line =~? 'Warning'
|
|
let l:warn += 1
|
|
endif
|
|
if l:line =~? 'Info'
|
|
let l:info += 1
|
|
endif
|
|
if l:line =~? 'Hint'
|
|
let l:hint += 1
|
|
endif
|
|
endfor
|
|
|
|
return {'error': l:error, 'warning': l:warn, 'info': l:info, 'hint': l:hint}
|
|
|
|
endfunction
|
|
|
|
|
|
" https://stackoverflow.com/a/40195855
|
|
" ex_command: command to run to execute file
|
|
function! SaveAndExecute(ex_command) abort
|
|
" SOURCE [reusable window]: https://github.com/fatih/vim-go/blob/master/autoload/go/ui.vim{{{
|
|
|
|
" save and reload current file
|
|
silent execute "update | edit"
|
|
|
|
" get file path of current file
|
|
let s:current_buffer_file_path = expand("%")
|
|
|
|
let s:output_buffer_name = "Python"
|
|
let s:output_buffer_filetype = "output"
|
|
|
|
" reuse existing buffer window if it exists otherwise create a new one
|
|
if !exists("s:buf_nr") || !bufexists(s:buf_nr)
|
|
silent execute 'top new ' . s:output_buffer_name
|
|
let s:buf_nr = bufnr('%')
|
|
elseif bufwinnr(s:buf_nr) == -1
|
|
silent execute 'top new'
|
|
silent execute s:buf_nr . 'buffer'
|
|
elseif bufwinnr(s:buf_nr) != bufwinnr('%')
|
|
silent execute bufwinnr(s:buf_nr) . 'wincmd w'
|
|
endif
|
|
|
|
silent execute "setlocal filetype=" . s:output_buffer_filetype
|
|
setlocal bufhidden=delete
|
|
setlocal buftype=nofile
|
|
setlocal noswapfile
|
|
setlocal nobuflisted
|
|
setlocal winfixheight
|
|
setlocal cursorline " make it easy to distinguish
|
|
setlocal nonumber
|
|
setlocal norelativenumber
|
|
setlocal showbreak=""
|
|
|
|
nnoremap <silent> <buffer> q :bdelete<CR>
|
|
|
|
" clear the buffer
|
|
setlocal noreadonly
|
|
" setlocal modifiable
|
|
%delete _
|
|
|
|
" add the console output
|
|
silent execute '.!'. a:ex_command . ' ' . shellescape(s:current_buffer_file_path, 1)
|
|
|
|
" resize window to content length
|
|
" Note: This is annoying because if you print a lot of lines then your code buffer is forced to a height of one line every time you run this function.
|
|
" However without this line the buffer starts off as a default size and if you resize the buffer then it keeps that custom size after repeated runs of this function.
|
|
" But if you close the output buffer then it returns to using the default size when its recreated
|
|
"execute 'resize' . line('$')
|
|
|
|
" make the buffer non modifiable
|
|
setlocal readonly
|
|
" setlocal nomodifiable
|
|
endfunction
|
|
"}}}
|
|
|
|
" vim: foldmethod=marker
|