diff --git a/autoload/tui.vim b/autoload/tui.vim new file mode 100644 index 0000000..7091642 --- /dev/null +++ b/autoload/tui.vim @@ -0,0 +1,7 @@ +vim9script + +export def Init(tui_home: string) + tui#core#cached#Set("tui.home", tui_home) + tui#core#layer#Init(expand(tui_home .. "/layers")) +enddef + diff --git a/autoload/tui/core/cached.vim b/autoload/tui/core/cached.vim new file mode 100644 index 0000000..62fd39b --- /dev/null +++ b/autoload/tui/core/cached.vim @@ -0,0 +1,83 @@ +vim9script + +const CACHE_KEY_PATTERN = '\v^[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)*$' + +export def Has(key: string, advanced_key: bool = v:true): bool + assert_true(!empty(key) && !empty(split(key)) && match(key, CACHE_KEY_PATTERN) != -1) + + const tui_cached = get(g:, 'tui_cached', {}) + if !advanced_key + return has_key(tui_cached, key) + endif + + var temp_keys = split(key, '\.') + var real_key = temp_keys[-1] + var real_dict = tui_cached + var index = 0 + for sub_key in temp_keys + if index < len(temp_keys) - 1 + if !has_key(real_dict, sub_key) || (type(real_dict[sub_key]) != type({})) + return 0 + endif + real_dict = real_dict[sub_key] + endif + index = index + 1 + endfor + return has_key(real_dict, real_key) +enddef + +export def Get(key: string, default_value: any = v:none, advanced_key: bool = v:true): any + assert_true(!empty(key) && !empty(split(key)) && match(key, CACHE_KEY_PATTERN) != -1) + + const tui_cached = get(g:, 'tui_cached', {}) + if !advanced_key + return has_key(tui_cached, key) ? tui_cached[key] : default_value + endif + + var temp_keys = split(key, '\.') + var real_key = temp_keys[-1] + var real_dict = tui_cached + var index = 0 + for sub_key in temp_keys + if index < len(temp_keys) - 1 + if !has_key(real_dict, sub_key) || (type(real_dict[sub_key]) != type({})) + return default_value + endif + real_dict = real_dict[sub_key] + endif + index = index + 1 + endfor + return has_key(real_dict, real_key) ? real_dict[real_key] : default_value +enddef + +export def Set(key: string, value: any, advanced_key: bool = v:true): any + assert_true(!empty(key) && !empty(split(key)) && match(key, CACHE_KEY_PATTERN) != -1) + + final tui_cached = get(g:, 'tui_cached', {}) + if !advanced_key + tui_cached[key] = value + return value + endif + + var temp_keys = split(key, '\.') + var real_key = temp_keys[-1] + var real_dict = tui_cached + var index = 0 + for sub_key in temp_keys + if index < len(temp_keys) - 1 + if !has_key(real_dict, sub_key) + real_dict[sub_key] = {} + endif + real_dict = real_dict[sub_key] + if type(real_dict) != type({}) + throw "tui-util-cached_Set: invalid key - [" .. key .. "]" + endif + endif + index = index + 1 + endfor + real_dict[real_key] = value + final g:tui_cached = tui_cached + + return value +enddef + diff --git a/autoload/tui/core/layer.vim b/autoload/tui/core/layer.vim new file mode 100644 index 0000000..2765c51 --- /dev/null +++ b/autoload/tui/core/layer.vim @@ -0,0 +1,39 @@ +vim9script + +export def Init(layer_home: string = v:none) + if !tui#core#cached#Has("tui.layer.home") + var tui_layer_home = layer_home + if empty(layer_home) || empty(split(layer_home)) + tui_layer_home = expand(tui#core#cached.Get("tui.home") .. "/layers") + endif + tui#core#cached#Set('tui.layer.home', tui_layer_home) + + command! -nargs=1 -bar TuiLayer call tui#core#layer#Load() + Load0(tui_layer_home) + endif +enddef + +export def Load(layer_id: string) + const tui_layer_home = tui#core#cached#Get("tui.layer.home") + const layer_path = expand(tui_layer_home .. "/" .. substitute(layer_id, '\.', '/', 'g')) + Load0(layer_path) +enddef + +def Load0(layer_path: string) + if filereadable(layer_path) + execute('source ' .. layer_path) + elseif filereadable(layer_path .. '.vim') + execute('source ' .. layer_path .. '.vim') + elseif isdirectory(layer_path) + if filereadable(expand(layer_path .. '/init.vim')) + execute('source ' .. expand(layer_path .. '/init.vim')) + else + for sub_file in split(glob(layer_path .. "/*.vim"), '\n') + if filereadable(sub_file) + execute("source " .. sub_file) + endif + endfor + endif + endif +enddef + diff --git a/colors/molokai.vim b/colors/molokai.vim new file mode 100644 index 0000000..9df1350 --- /dev/null +++ b/colors/molokai.vim @@ -0,0 +1,269 @@ +vim9script + +# Vim color file +# +# Author: Tomas Restrepo +# https://github.com/tomasr/molokai +# +# Note: Based on the Monokai theme for TextMate +# by Wimer Hazenberg and its darker variant +# by Hamish Stuart Macpherson +# + +# no guarantees for version 5.8 and below, but this makes it stop +# complaining +hi clear +if exists("syntax_on") + syntax reset +endif + +final g:colors_name = "molokai" +final molokai_original = get(g:, 'molokai_original', 0) + +hi Boolean guifg=#AE81FF +hi Character guifg=#E6DB74 +hi Number guifg=#AE81FF +hi String guifg=#E6DB74 +hi Conditional guifg=#F92672 gui=bold +hi Constant guifg=#AE81FF gui=bold +hi Cursor guifg=#000000 guibg=#F8F8F0 +hi iCursor guifg=#000000 guibg=#F8F8F0 +hi Debug guifg=#BCA3A3 gui=bold +hi Define guifg=#66D9EF +hi Delimiter guifg=#8F8F8F +hi DiffAdd guibg=#13354A +hi DiffChange guifg=#89807D guibg=#4C4745 +hi DiffDelete guifg=#960050 guibg=#1E0010 +hi DiffText guibg=#4C4745 gui=italic,bold + +hi Directory guifg=#A6E22E gui=bold +hi Error guifg=#E6DB74 guibg=#1E0010 +hi ErrorMsg guifg=#F92672 guibg=#232526 gui=bold +hi Exception guifg=#A6E22E gui=bold +hi Float guifg=#AE81FF +hi FoldColumn guifg=#465457 guibg=#000000 +hi Folded guifg=#465457 guibg=#000000 +hi Function guifg=#A6E22E +hi Identifier guifg=#FD971F +hi Ignore guifg=#808080 guibg=bg +hi IncSearch guifg=#C4BE89 guibg=#000000 + +hi Keyword guifg=#F92672 gui=bold +hi Label guifg=#E6DB74 gui=none +hi Macro guifg=#C4BE89 gui=italic +hi SpecialKey guifg=#66D9EF gui=italic + +hi MatchParen guifg=#000000 guibg=#FD971F gui=bold +hi ModeMsg guifg=#E6DB74 +hi MoreMsg guifg=#E6DB74 +hi Operator guifg=#F92672 + +# complete menu +hi Pmenu guifg=#66D9EF guibg=#000000 +hi PmenuSel guibg=#808080 +hi PmenuSbar guibg=#080808 +hi PmenuThumb guifg=#66D9EF + +hi PreCondit guifg=#A6E22E gui=bold +hi PreProc guifg=#A6E22E +hi Question guifg=#66D9EF +hi Repeat guifg=#F92672 gui=bold +hi Search guifg=#000000 guibg=#FFE792 +# marks +hi SignColumn guifg=#A6E22E guibg=#232526 +hi SpecialChar guifg=#F92672 gui=bold +hi SpecialComment guifg=#7E8E91 gui=bold +hi Special guifg=#66D9EF guibg=bg gui=italic +if has("spell") + hi SpellBad guisp=#FF0000 gui=undercurl + hi SpellCap guisp=#7070F0 gui=undercurl + hi SpellLocal guisp=#70F0F0 gui=undercurl + hi SpellRare guisp=#FFFFFF gui=undercurl +endif +hi Statement guifg=#F92672 gui=bold +hi StatusLine guifg=#455354 guibg=fg +hi StatusLineNC guifg=#808080 guibg=#080808 +hi StorageClass guifg=#FD971F gui=italic +hi Structure guifg=#66D9EF +hi Tag guifg=#F92672 gui=italic +hi Title guifg=#ef5939 +hi Todo guifg=#FFFFFF guibg=bg gui=bold + +hi Typedef guifg=#66D9EF +hi Type guifg=#66D9EF gui=none +hi Underlined guifg=#808080 gui=underline + +hi VertSplit guifg=#808080 guibg=#080808 gui=bold +hi VisualNOS guibg=#403D3D +hi Visual guibg=#403D3D +hi WarningMsg guifg=#FFFFFF guibg=#333333 gui=bold +hi WildMenu guifg=#66D9EF guibg=#000000 + +hi TabLineFill guifg=#1B1D1E guibg=#1B1D1E +hi TabLine guibg=#1B1D1E guifg=#808080 gui=none + +if molokai_original == 1 + hi Normal guifg=#F8F8F2 guibg=#272822 + hi Comment guifg=#75715E + hi CursorLine guibg=#3E3D32 + hi CursorLineNr guifg=#FD971F gui=none + hi CursorColumn guibg=#3E3D32 + hi ColorColumn guibg=#3B3A32 + hi LineNr guifg=#BCBCBC guibg=#3B3A32 + hi NonText guifg=#75715E + hi SpecialKey guifg=#75715E +else + hi Normal guifg=#F8F8F2 guibg=#1B1D1E + hi Comment guifg=#7E8E91 + hi CursorLine guibg=#293739 + hi CursorLineNr guifg=#FD971F gui=none + hi CursorColumn guibg=#293739 + hi ColorColumn guibg=#232526 + hi LineNr guifg=#465457 guibg=#232526 + hi NonText guifg=#465457 + hi SpecialKey guifg=#465457 +endif + +# +# Support for 256-color terminal +# +if str2nr(&t_Co) > 255 + if molokai_original == 1 + hi Normal ctermbg=234 + hi CursorLine ctermbg=235 cterm=none + hi CursorLineNr ctermfg=208 cterm=none + else + hi Normal ctermfg=252 ctermbg=233 + hi CursorLine ctermbg=234 cterm=none + hi CursorLineNr ctermfg=208 cterm=none + endif + hi Boolean ctermfg=135 + hi Character ctermfg=144 + hi Number ctermfg=135 + hi String ctermfg=144 + hi Conditional ctermfg=161 cterm=bold + hi Constant ctermfg=135 cterm=bold + hi Cursor ctermfg=16 ctermbg=253 + hi Debug ctermfg=225 cterm=bold + hi Define ctermfg=81 + hi Delimiter ctermfg=241 + + hi DiffAdd ctermbg=24 + hi DiffChange ctermfg=181 ctermbg=239 + hi DiffDelete ctermfg=162 ctermbg=53 + hi DiffText ctermbg=102 cterm=bold + + hi Directory ctermfg=118 cterm=bold + hi Error ctermfg=219 ctermbg=89 + hi ErrorMsg ctermfg=199 ctermbg=16 cterm=bold + hi Exception ctermfg=118 cterm=bold + hi Float ctermfg=135 + hi FoldColumn ctermfg=67 ctermbg=16 + hi Folded ctermfg=67 ctermbg=16 + hi Function ctermfg=118 + hi Identifier ctermfg=208 cterm=none + hi Ignore ctermfg=244 ctermbg=232 + hi IncSearch ctermfg=193 ctermbg=16 + + hi keyword ctermfg=161 cterm=bold + hi Label ctermfg=229 cterm=none + hi Macro ctermfg=193 + hi SpecialKey ctermfg=81 + + hi MatchParen ctermfg=233 ctermbg=208 cterm=bold + hi ModeMsg ctermfg=229 + hi MoreMsg ctermfg=229 + hi Operator ctermfg=161 + + # complete menu + hi Pmenu ctermfg=81 ctermbg=16 + hi PmenuSel ctermfg=255 ctermbg=242 + hi PmenuSbar ctermbg=232 + hi PmenuThumb ctermfg=81 + + hi PreCondit ctermfg=118 cterm=bold + hi PreProc ctermfg=118 + hi Question ctermfg=81 + hi Repeat ctermfg=161 cterm=bold + hi Search ctermfg=0 ctermbg=222 cterm=NONE + + # marks column + hi SignColumn ctermfg=118 ctermbg=235 + hi SpecialChar ctermfg=161 cterm=bold + hi SpecialComment ctermfg=245 cterm=bold + hi Special ctermfg=81 + if has("spell") + hi SpellBad ctermbg=52 + hi SpellCap ctermbg=17 + hi SpellLocal ctermbg=17 + hi SpellRare ctermfg=none ctermbg=none cterm=reverse + endif + hi Statement ctermfg=161 cterm=bold + hi StatusLine ctermfg=238 ctermbg=253 + hi StatusLineNC ctermfg=244 ctermbg=232 + hi StorageClass ctermfg=208 + hi Structure ctermfg=81 + hi Tag ctermfg=161 + hi Title ctermfg=166 + hi Todo ctermfg=231 ctermbg=232 cterm=bold + + hi Typedef ctermfg=81 + hi Type ctermfg=81 cterm=none + hi Underlined ctermfg=244 cterm=underline + + hi VertSplit ctermfg=244 ctermbg=232 cterm=bold + hi VisualNOS ctermbg=238 + hi Visual ctermbg=235 + hi WarningMsg ctermfg=231 ctermbg=238 cterm=bold + hi WildMenu ctermfg=81 ctermbg=16 + + hi Comment ctermfg=59 + hi CursorColumn ctermbg=236 + hi ColorColumn ctermbg=236 + hi LineNr ctermfg=250 ctermbg=236 + hi NonText ctermfg=59 + + hi SpecialKey ctermfg=59 + + if exists("g:rehash256") && g:rehash256 == 1 + hi Normal ctermfg=252 ctermbg=234 + hi CursorLine ctermbg=236 cterm=none + hi CursorLineNr ctermfg=208 cterm=none + + hi Boolean ctermfg=141 + hi Character ctermfg=222 + hi Number ctermfg=141 + hi String ctermfg=222 + hi Conditional ctermfg=197 cterm=bold + hi Constant ctermfg=141 cterm=bold + + hi DiffDelete ctermfg=125 ctermbg=233 + + hi Directory ctermfg=154 cterm=bold + hi Error ctermfg=222 ctermbg=233 + hi Exception ctermfg=154 cterm=bold + hi Float ctermfg=141 + hi Function ctermfg=154 + hi Identifier ctermfg=208 + + hi Keyword ctermfg=197 cterm=bold + hi Operator ctermfg=197 + hi PreCondit ctermfg=154 cterm=bold + hi PreProc ctermfg=154 + hi Repeat ctermfg=197 cterm=bold + + hi Statement ctermfg=197 cterm=bold + hi Tag ctermfg=197 + hi Title ctermfg=203 + hi Visual ctermbg=238 + + hi Comment ctermfg=244 + hi LineNr ctermfg=239 ctermbg=235 + hi NonText ctermfg=239 + hi SpecialKey ctermfg=239 + endif +endif + +# Must be at the end, because of ctermbg=234 bug. +# https://groups.google.com/forum/#!msg/vim_dev/afPqwAFNdrU/nqh6tOM87QUJ +set background=dark diff --git a/init.vim b/init.vim new file mode 100644 index 0000000..2b2d616 --- /dev/null +++ b/init.vim @@ -0,0 +1,4 @@ +vim9script + +tui#Init(expand(":p:h")) + diff --git a/layers/base/init.vim b/layers/base/init.vim new file mode 100644 index 0000000..ee986d5 --- /dev/null +++ b/layers/base/init.vim @@ -0,0 +1,3 @@ +vim9script + +TuiLayer base.options diff --git a/layers/base/options.vim b/layers/base/options.vim new file mode 100644 index 0000000..20821c8 --- /dev/null +++ b/layers/base/options.vim @@ -0,0 +1,52 @@ +vim9script + +# ******************** line number ******************** +set number +set relativenumber +# set numberwidth=2 + +# ******************** tab size ******************** +set tabstop=4 +set softtabstop=4 +set shiftwidth=4 +set expandtab + +# ******************** encoding ******************** +set encoding=utf-8 +set termencoding=utf-8 +set fileencodings="utf-8,gb2312,gbk,ucs-bom,cp936,latin-1" + +## ******************** blank chars ******************** +set list +set listchars=space:ยท + +## ******************** backup ******************** +set nobackup +set nowritebackup +set noswapfile + +## ******************** search ******************** +set hlsearch +set ignorecase +set noincsearch + +## ******************** filetype ******************** +filetype on +filetype plugin on +filetype indent on + +# ******************** colorscheme ******************** +set t_Co=256 +set termguicolors +syntax on +colorscheme molokai +set cursorline + +## ******************** others ******************** +set nocompatible +set nowrap +set wildmenu +set clipboard+=unnamed +set conceallevel=0 +set mouse=a + diff --git a/layers/init.vim b/layers/init.vim new file mode 100644 index 0000000..d120988 --- /dev/null +++ b/layers/init.vim @@ -0,0 +1,5 @@ +vim9script + +TuiLayer base + +# TuiLayer plug