diff --git a/autoload/SpaceVim/api/data/json.vim b/autoload/SpaceVim/api/data/json.vim new file mode 100644 index 000000000..707248680 --- /dev/null +++ b/autoload/SpaceVim/api/data/json.vim @@ -0,0 +1,104 @@ +let s:json = {} + + +if exists('*json_decode') + let g:spacevim_api_json_true = v:true + let g:spacevim_api_json_true = v:false + let g:spacevim_api_json_true = v:null + function! s:json_decode(json) abort + if a:json ==# '' + return [] + endif + return json_decode(a:json) + endfunction +else + function! s:json_null() abort + endfunction + + function! s:json_true() abort + endfunction + + function! s:json_false() abort + endfunction + + let g:spacevim_api_json_true = [function('s:json_true')] + let g:spacevim_api_json_false = [function('s:json_false')] + let g:spacevim_api_json_null = [function('s:json_null')] + " @vimlint(EVL102, 1, l:true) + " @vimlint(EVL102, 1, l:false) + " @vimlint(EVL102, 1, l:null) + function! s:json_decode(json) abort + let true = g:spacevim_api_json_true + let false = g:spacevim_api_json_false + let null = g:spacevim_api_json_null + if substitute(a:json, '\v\"%(\\.|[^"\\])*\"|true|false|null|[+-]?\d+%(\.\d+%([Ee][+-]?\d+)?)?', '', 'g') !~# "[^,:{}[\\] \t]" + + try + let object = eval(a:json) + catch + " malformed JSON + let object = '' + endtry + else + let object = '' + endif + + return object + endfunction + " @vimlint(EVL102, 0, l:true) + " @vimlint(EVL102, 0, l:false) + " @vimlint(EVL102, 0, l:null) +endif + +lockvar g:spacevim_api_json_true +lockvar g:spacevim_api_json_false +lockvar g:spacevim_api_json_null + +let s:json['json_decode'] = function('s:json_decode') + +if exists('*json_encode') + function! s:json_encode(val) abort + return json_encode(a:val) + endfunction +else + function! s:json_encode(val) abort + if type(a:val) == type(0) + return a:val + elseif type(a:val) == type('') + let json = '"' . escape(a:val, '\"') . '"' + let json = substitute(json, "\r", '\\r', 'g') + let json = substitute(json, "\n", '\\n', 'g') + let json = substitute(json, "\t", '\\t', 'g') + let json = substitute(json, '\([[:cntrl:]]\)', '\=printf("\x%02d", char2nr(submatch(1)))', 'g') + return iconv(json, &encoding, 'utf-8') + elseif type(a:val) == 2 + let s = string(a:val) + if s == string(g:spacevim_api_json_null) + return 'null' + elseif s == string(g:spacevim_api_json_true) + return 'true' + elseif s == string(g:spacevim_api_json_false) + return 'false' + endif + elseif type(a:val) == type([]) + if len(a:val) == 1 && a:val[0] == g:spacevim_api_json_false[0] + return 'false' + elseif len(a:val) == 1 && a:val[0] == g:spacevim_api_json_true[0] + return 'true' + elseif len(a:val) == 1 && a:val[0] == g:spacevim_api_json_null[0] + return 'null' + endif + return '[' . join(map(copy(a:val), 's:json_encode(v:val)'), ',') . ']' + elseif type(a:val) == 4 + return '{' . join(map(keys(a:val), "s:json_encode(v:val) . ':' . s:json_encode(a:val[v:val])"), ',') . '}' + else + return string(a:val) + endif + endfunction +endif + +let s:json['json_encode'] = function('s:json_encode') + +function! SpaceVim#api#data#json#get() abort + return deepcopy(s:json) +endfunction diff --git a/autoload/SpaceVim/api/data/string.vim b/autoload/SpaceVim/api/data/string.vim index 148b0a96b..26398425a 100644 --- a/autoload/SpaceVim/api/data/string.vim +++ b/autoload/SpaceVim/api/data/string.vim @@ -7,6 +7,25 @@ endfunction let s:file['trim'] = function('s:trim') +function! s:fill(str, length) abort + if strwidth(a:str) <= a:length + return a:str . repeat(' ', a:length - strwidth(a:str)) + else + let l = 0 + for i in range(strchars(a:str) - 1) + if strwidth(strcharpart(a:str, 0, i)) > a:length + break + else + let l = i + endif + endfor + let str = strcharpart(a:str, 0, l) + return str . repeat(' ', a:length - strwidth(str)) + endif +endfunction + +let s:file['fill'] = function('s:fill') + function! s:trim_start(str) abort return substitute(a:str, '^\s*', '', 'g') endfunction diff --git a/autoload/SpaceVim/api/file.vim b/autoload/SpaceVim/api/file.vim index 5704ddcd9..48258c8fb 100644 --- a/autoload/SpaceVim/api/file.vim +++ b/autoload/SpaceVim/api/file.vim @@ -151,6 +151,30 @@ endfunction let s:file['fticon'] = function('s:filetypeIcon') +function! s:write(msg, fname) abort + let flags = filewritable(a:fname) ? 'a' : '' + call writefile([a:msg], a:fname, flags) +endfunction + +let s:file['write'] = function('s:write') + +function! s:override(msg, fname) abort + let flags = filewritable(a:fname) ? 'b' : '' + call writefile([a:msg], a:fname, flags) +endfunction + +let s:file['override'] = function('s:override') + +function! s:read(fname) abort + if filereadable(a:fname) + return readfile(a:fname, '') + else + return '' + endif +endfunction + +let s:file['read'] = function('s:read') + function! SpaceVim#api#file#get() abort return deepcopy(s:file) endfunction diff --git a/autoload/SpaceVim/api/unicode/box.vim b/autoload/SpaceVim/api/unicode/box.vim new file mode 100644 index 000000000..2a2d553c2 --- /dev/null +++ b/autoload/SpaceVim/api/unicode/box.vim @@ -0,0 +1,81 @@ +let s:box = {} +let s:json = SpaceVim#api#import('data#json') +let s:string = SpaceVim#api#import('data#string') +scriptencoding utf-8 +" http://jrgraphix.net/r/Unicode/2500-257F +" http://www.alanflavell.org.uk/unicode/unidata.html + +" json should be a list of items which have same keys +function! s:drawing_table(json, ...) abort + if empty(a:json) + return [] + endif + if &encoding ==# 'utf-8' + let top_left_corner = '╭' + let top_right_corner = '╮' + let bottom_left_corner = '╰' + let bottom_right_corner = '╯' + let side = '│' + let top_bottom_side = '─' + let middle = '┼' + let top_middle = '┬' + let left_middle = '├' + let right_middle = '┤' + let bottom_middle = '┴' + else + let top_left_corner = '*' + let top_right_corner = '*' + let bottom_left_corner = '*' + let bottom_right_corner = '*' + let side = '|' + let top_bottom_side = '-' + let middle = '*' + let top_middle = '*' + let left_middle = '*' + let right_middle = '*' + let bottom_middle = '*' + endif + let table = [] + let items = s:json.json_decode(a:json) + let col = len(keys(items[0])) + let top_line = top_left_corner + \ . repeat(repeat(top_bottom_side, 15) . top_middle, col - 1) + \ . repeat(top_bottom_side, 15) + \ . top_right_corner + let middle_line = left_middle + \ . repeat(repeat(top_bottom_side, 15) . middle, col - 1) + \ . repeat(top_bottom_side, 15) + \ . right_middle + let bottom_line = bottom_left_corner + \ . repeat(repeat(top_bottom_side, 15) . bottom_middle, col - 1) + \ . repeat(top_bottom_side, 15) + \ . bottom_right_corner + call add(table, top_line) + let tytle = side + if a:0 == 0 + let keys = keys(items[0]) + else + let keys = a:1 + endif + for key in keys + let tytle .= s:string.fill(key , 15) . side + endfor + call add(table, tytle) + call add(table, middle_line) + for item in items + let value_line = side + for key in keys + let value_line .= s:string.fill(item[key], 15) . side + endfor + call add(table, value_line) + call add(table, middle_line) + endfor + let table[-1] = bottom_line + return table +endfunction + +let s:box['drawing_table'] = function('s:drawing_table') + +function! SpaceVim#api#unicode#box#get() abort + return deepcopy(s:box) +endfunction diff --git a/config/neovim.vim b/config/neovim.vim index b558d8b24..a1253467f 100644 --- a/config/neovim.vim +++ b/config/neovim.vim @@ -22,38 +22,36 @@ let $NVIM_TUI_ENABLE_CURSOR_SHAPE=2 "silent! let &t_SR = "\]50;CursorShape=2\x7" "silent! let &t_EI = "\]50;CursorShape=0\x7" " dark0 + gray -let g:terminal_color_0 = "#282828" -let g:terminal_color_8 = "#928374" +let g:terminal_color_0 = '#282828' +let g:terminal_color_8 = '#928374' " neurtral_red + bright_red -let g:terminal_color_1 = "#cc241d" -let g:terminal_color_9 = "#fb4934" +let g:terminal_color_1 = '#cc241d' +let g:terminal_color_9 = '#fb4934' " neutral_green + bright_green -let g:terminal_color_2 = "#98971a" -let g:terminal_color_10 = "#b8bb26" +let g:terminal_color_2 = '#98971a' +let g:terminal_color_10 = '#b8bb26' " neutral_yellow + bright_yellow -let g:terminal_color_3 = "#d79921" -let g:terminal_color_11 = "#fabd2f" +let g:terminal_color_3 = '#d79921' +let g:terminal_color_11 = '#fabd2f' " neutral_blue + bright_blue -let g:terminal_color_4 = "#458588" -let g:terminal_color_12 = "#83a598" +let g:terminal_color_4 = '#458588' +let g:terminal_color_12 = '#83a598' " neutral_purple + bright_purple -let g:terminal_color_5 = "#b16286" -let g:terminal_color_13 = "#d3869b" +let g:terminal_color_5 = '#b16286' +let g:terminal_color_13 = '#d3869b' " neutral_aqua + faded_aqua -let g:terminal_color_6 = "#689d6a" -let g:terminal_color_14 = "#8ec07c" +let g:terminal_color_6 = '#689d6a' +let g:terminal_color_14 = '#8ec07c' " light4 + light1 -let g:terminal_color_7 = "#a89984" -let g:terminal_color_15 = "#ebdbb2" -nnoremap -nnoremap +let g:terminal_color_7 = '#a89984' +let g:terminal_color_15 = '#ebdbb2' augroup Terminal au! au TermOpen * let g:last_terminal_job_id = b:terminal_job_id | IndentLinesDisable