This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.{sh,py,vim}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
@@ -0,0 +1,40 @@
|
||||
name: check
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
validate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install validation tools
|
||||
run: sudo apt-get update && sudo apt-get install -y shellcheck tmux vim-nox
|
||||
|
||||
- name: Check shell scripts
|
||||
run: |
|
||||
bash -n install.sh uninstall.sh bash_tools.sh bash_tools/*.sh
|
||||
shellcheck install.sh uninstall.sh bash_tools.sh bash_tools/*.sh
|
||||
|
||||
- name: Check Python
|
||||
run: python3 -m compileall -q win-install.py
|
||||
|
||||
- name: Check Vim startup
|
||||
run: vim -Nu "$PWD/.vimrc" -n -es -c 'doautocmd VimEnter' -c 'qa!'
|
||||
|
||||
- name: Check tmux configuration
|
||||
run: |
|
||||
tmux -L dotfiles-check -f "$PWD/.tmux.conf" new-session -d
|
||||
tmux -L dotfiles-check kill-server
|
||||
|
||||
- name: Reject empty tracked files
|
||||
shell: bash
|
||||
run: |
|
||||
while IFS= read -r -d '' file; do
|
||||
[[ -s "$file" ]] || { echo "Empty tracked file: $file"; exit 1; }
|
||||
done < <(git ls-files -z)
|
||||
@@ -1,5 +1,6 @@
|
||||
.DS_Store
|
||||
*.pyc
|
||||
__pycache__/
|
||||
*._*
|
||||
.vim/
|
||||
node_modules/
|
||||
|
||||
+25
-49
@@ -1,67 +1,43 @@
|
||||
set-option -sg escape-time 10
|
||||
set -g default-terminal "screen-256color"
|
||||
# set -g default-terminal "xterm-256color"
|
||||
set-option -g history-limit 1000000
|
||||
|
||||
set -g focus-events on # requirement for vim's vim-tmux-clipboard plugin
|
||||
|
||||
# turn off status line
|
||||
set -g default-terminal 'tmux-256color'
|
||||
set -as terminal-features ',xterm-256color:RGB'
|
||||
set -g history-limit 100000
|
||||
set -g mouse on
|
||||
set -g focus-events on
|
||||
set -g status off
|
||||
|
||||
set-option -sa terminal-overrides ',xterm-256color:RGB'
|
||||
setw -g mode-keys vi
|
||||
bind-key -T copy-mode-vi 'v' send -X begin-selection
|
||||
bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'
|
||||
|
||||
# vim-like pane resizing
|
||||
bind-key -r C-k resize-pane -U
|
||||
bind-key -r C-j resize-pane -D
|
||||
bind-key -T copy-mode-vi v send -X begin-selection
|
||||
bind-key -T copy-mode-vi y send -X copy-pipe-and-cancel \
|
||||
'if command -v wl-copy >/dev/null 2>&1; then wl-copy; elif command -v xclip >/dev/null 2>&1; then xclip -in -selection clipboard; elif command -v pbcopy >/dev/null 2>&1; then pbcopy; elif command -v clip.exe >/dev/null 2>&1; then clip.exe; else cat >/dev/null; fi'
|
||||
|
||||
# Prefix + Ctrl-H/J/K/L resizes panes.
|
||||
bind-key -r C-h resize-pane -L
|
||||
bind-key -r C-j resize-pane -D
|
||||
bind-key -r C-k resize-pane -U
|
||||
bind-key -r C-l resize-pane -R
|
||||
|
||||
# vim-like pane switching
|
||||
# bind-key -n C-k select-pane -U
|
||||
# bind-key -n C-j select-pane -D
|
||||
# bind-key -n C-h select-pane -L
|
||||
# bind-key -n C-l select-pane -R
|
||||
|
||||
# and now unbind keys
|
||||
unbind Up
|
||||
unbind Down
|
||||
unbind Left
|
||||
unbind Right
|
||||
|
||||
unbind C-Up
|
||||
unbind C-Down
|
||||
unbind C-Left
|
||||
unbind C-Right
|
||||
|
||||
# Smart pane switching with awareness of Vim splits.
|
||||
# See: https://github.com/christoomey/vim-tmux-navigator
|
||||
# Ctrl-H/J/K/L moves seamlessly between tmux panes and Vim splits.
|
||||
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
|
||||
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|l?n?vim?x?)(diff)?$'"
|
||||
bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L'
|
||||
bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D'
|
||||
bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U'
|
||||
bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R'
|
||||
tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")'
|
||||
if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
|
||||
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'"
|
||||
if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
|
||||
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'"
|
||||
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?\\.?(view|l?n?vim?x?)(diff)?(-wrapped)?$'"
|
||||
bind-key -n C-h if-shell "$is_vim" 'send-keys C-h' 'select-pane -L'
|
||||
bind-key -n C-j if-shell "$is_vim" 'send-keys C-j' 'select-pane -D'
|
||||
bind-key -n C-k if-shell "$is_vim" 'send-keys C-k' 'select-pane -U'
|
||||
bind-key -n C-l if-shell "$is_vim" 'send-keys C-l' 'select-pane -R'
|
||||
bind-key -n 'C-\' if-shell "$is_vim" 'send-keys C-\' 'select-pane -l'
|
||||
|
||||
bind-key -T copy-mode-vi 'C-h' select-pane -L
|
||||
bind-key -T copy-mode-vi 'C-j' select-pane -D
|
||||
bind-key -T copy-mode-vi 'C-k' select-pane -U
|
||||
bind-key -T copy-mode-vi 'C-l' select-pane -R
|
||||
bind-key -T copy-mode-vi C-h select-pane -L
|
||||
bind-key -T copy-mode-vi C-j select-pane -D
|
||||
bind-key -T copy-mode-vi C-k select-pane -U
|
||||
bind-key -T copy-mode-vi C-l select-pane -R
|
||||
bind-key -T copy-mode-vi 'C-\' select-pane -l
|
||||
|
||||
set -g @plugin 'tmux-plugins/tpm'
|
||||
set -g @plugin 'tmux-plugins/tmux-sensible'
|
||||
|
||||
set -g @plugin 'roosta/tmux-fuzzback'
|
||||
set -g @fuzzback-popup-size '90%'
|
||||
set -g @fuzzback-popup 1
|
||||
set -g @fuzzback-fzf-colors 'gutter:-1,bg+:-1'
|
||||
|
||||
run '~/.tmux/plugins/tpm/tpm'
|
||||
if-shell 'test -x "$HOME/.tmux/plugins/tpm/tpm"' \
|
||||
'run-shell "$HOME/.tmux/plugins/tpm/tpm"'
|
||||
|
||||
@@ -1,269 +1,253 @@
|
||||
" dotfile location
|
||||
let g:dotfiledir = expand(fnamemodify(resolve(expand('<sfile>:p')), ':h').'/')
|
||||
" vim runtime folder
|
||||
let g:vim_dir = expand('~/.vim/')
|
||||
" Vim 9 configuration shared across Linux, WSL, Windows, and macOS.
|
||||
if v:version < 900
|
||||
echoerr 'This configuration requires Vim 9 or newer.'
|
||||
finish
|
||||
endif
|
||||
|
||||
" detect vim type(vim or nvim)
|
||||
let g:vim_v = 0
|
||||
if has('nvim')
|
||||
let g:vim_type = 'nvim'
|
||||
else
|
||||
let g:vim_type = 'vim'
|
||||
let g:vim_v = v:version
|
||||
endif
|
||||
let g:dotfiledir = fnamemodify(resolve(expand('<sfile>:p')), ':h') . '/'
|
||||
let g:dotvimdir = g:dotfiledir . 'config/vim'
|
||||
let g:vim_dir = has('win32') || has('win64') ? expand('~/vimfiles') : expand('~/.vim')
|
||||
execute 'set runtimepath^=' . fnameescape(g:dotvimdir)
|
||||
|
||||
" detect operating system (Windows/Linux/Darwin)
|
||||
let g:isWSL = 0
|
||||
if has("win64") || has("win32") || has("win16")
|
||||
let g:os = "Windows"
|
||||
set updatetime=50
|
||||
if executable('pwsh')
|
||||
" prefer to use powershell 7
|
||||
set shell=pwsh
|
||||
else
|
||||
set shell=powershell
|
||||
endif
|
||||
else
|
||||
let g:os = substitute(system('uname'), '\n', '', '')
|
||||
if system('uname -r') =~ "icrosoft"
|
||||
let g:isWSL = 1
|
||||
endif
|
||||
endif
|
||||
let g:os = has('win32') || has('win64') ? 'Windows'
|
||||
\ : has('macunix') ? 'Darwin'
|
||||
\ : substitute(system('uname'), '\n', '', '')
|
||||
|
||||
if g:os ==# 'Windows'
|
||||
if executable('pwsh')
|
||||
set shell=pwsh
|
||||
elseif executable('powershell')
|
||||
set shell=powershell
|
||||
endif
|
||||
endif
|
||||
|
||||
set runtimepath^=~/.vim runtimepath+=~/.vim/after
|
||||
let &packpath=&runtimepath
|
||||
let mapleader = ','
|
||||
let maplocalleader = '_'
|
||||
|
||||
" The default leader is '\', but many people prefer ',' as it's in a standard
|
||||
let mapleader = ','
|
||||
let maplocalleader = '_'
|
||||
filetype plugin indent on
|
||||
syntax enable
|
||||
set encoding=utf-8
|
||||
set belloff=all
|
||||
set mouse=a
|
||||
set hidden
|
||||
set history=1000
|
||||
set updatetime=300
|
||||
set shortmess+=filmnrxoOtTF
|
||||
set backspace=indent,eol,start
|
||||
set number
|
||||
set cursorline
|
||||
set cursorlineopt=number
|
||||
set noshowmode
|
||||
set showmatch
|
||||
set incsearch
|
||||
set hlsearch
|
||||
set ignorecase
|
||||
set smartcase
|
||||
set wildmenu
|
||||
set wildmode=list:longest,full
|
||||
set scrolloff=5
|
||||
set sidescrolloff=5
|
||||
set splitright
|
||||
set splitbelow
|
||||
set display=lastline
|
||||
set expandtab
|
||||
set shiftwidth=4
|
||||
set tabstop=4
|
||||
set softtabstop=4
|
||||
set autoindent
|
||||
set nojoinspaces
|
||||
set nospell
|
||||
set list
|
||||
set listchars=tab:•\ ,trail:•,extends:»,precedes:«
|
||||
let &fillchars = 'eob: ,vert:│,stl: ,stlnc: '
|
||||
set foldmethod=syntax
|
||||
set foldlevelstart=99
|
||||
set undofile
|
||||
set undolevels=1000
|
||||
set undoreload=10000
|
||||
set viewoptions=folds
|
||||
if has('termguicolors')
|
||||
set termguicolors
|
||||
endif
|
||||
|
||||
" General {
|
||||
for s:dir in ['backup', 'swap', 'undo', 'view']
|
||||
let s:path = g:vim_dir . '/' . s:dir
|
||||
if !isdirectory(s:path)
|
||||
silent! call mkdir(s:path, 'p')
|
||||
endif
|
||||
endfor
|
||||
execute 'set backupdir=' . fnameescape(g:vim_dir . '/backup//')
|
||||
execute 'set directory=' . fnameescape(g:vim_dir . '/swap//')
|
||||
execute 'set undodir=' . fnameescape(g:vim_dir . '/undo//')
|
||||
execute 'set viewdir=' . fnameescape(g:vim_dir . '/view//')
|
||||
|
||||
filetype plugin indent on " Automatically detect file types.
|
||||
syntax on " Syntax highlighting
|
||||
set belloff=all " Turn off the annoying bell
|
||||
set mouse=a " Automatically enable mouse usage
|
||||
set mousehide " Hide the mouse cursor while typing
|
||||
set shortmess+=F " Don't show the file name when open new file
|
||||
" scriptencoding utf-8
|
||||
if has('clipboard')
|
||||
if g:os ==# 'Darwin' || g:os ==# 'Windows'
|
||||
set clipboard=unnamed
|
||||
else
|
||||
set clipboard=unnamedplus
|
||||
endif
|
||||
endif
|
||||
|
||||
set shortmess+=filmnrxoOtT " Abbrev. of messages (avoids 'hit enter')
|
||||
" set viewoptions=folds,options,cursor,unix,slash " Better Unix / Windows compatibility
|
||||
" set virtualedit=onemore " Allow for cursor beyond last character
|
||||
set history=1000 " Store a ton of history (default is 20)
|
||||
set hidden " Allow buffer switching without saving
|
||||
set iskeyword-=. " '.' is an end of word designator
|
||||
set iskeyword-=# " '#' is an end of word designator
|
||||
set iskeyword+=-
|
||||
augroup DotfilesCore
|
||||
autocmd!
|
||||
autocmd FileType javascript,typescript,lua setlocal tabstop=2 shiftwidth=2 softtabstop=2
|
||||
autocmd FileType haskell,ruby,yaml setlocal tabstop=2 shiftwidth=2 softtabstop=2
|
||||
autocmd FileType c,cpp,vim,java,python,lua setlocal colorcolumn=80
|
||||
autocmd FileType help setlocal colorcolumn=
|
||||
autocmd FileType * setlocal formatoptions-=o
|
||||
autocmd BufNewFile,BufRead *.html.twig setfiletype html.twig
|
||||
autocmd BufNewFile,BufRead *.ts setfiletype typescript
|
||||
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line('$') | execute 'normal! g`"' | endif
|
||||
autocmd BufWinLeave ?* if &buftype ==# '' && !empty(expand('%:p')) | silent! mkview | endif
|
||||
autocmd BufWinEnter ?* if &buftype ==# '' && !empty(expand('%:p')) | silent! loadview | endif
|
||||
augroup END
|
||||
|
||||
augroup FileFormat
|
||||
autocmd!
|
||||
autocmd FileType javascript,typescript,lua setlocal tabstop=2 shiftwidth=2 softtabstop=2
|
||||
" autocmd FileType c,cpp,python,java setlocal tabstop=4 shiftwidth=4 softtabstop=4
|
||||
autocmd BufNewFile,BufRead *.html.twig set filetype=html.twig
|
||||
autocmd FileType haskell,puppet,ruby,yml setlocal expandtab shiftwidth=2 softtabstop=2
|
||||
" Instead of reverting the cursor to the last position in the buffer, we
|
||||
" set it to the first line when editing a git commit message
|
||||
autocmd FileType gitcommit au! BufEnter COMMIT_EDITMSG call setpos('.', [0, 1, 1, 0])
|
||||
augroup END
|
||||
nnoremap j gj
|
||||
nnoremap k gk
|
||||
nnoremap Y y$
|
||||
xnoremap < <gv
|
||||
xnoremap > >gv
|
||||
nnoremap <silent> <leader>h :nohlsearch<CR>
|
||||
nnoremap <leader>ws :%s/\s\+$//e<CR>
|
||||
nnoremap <Leader>s :%s/\<<C-r><C-w>\>/<C-r><C-w>
|
||||
nnoremap <silent> <space>q :bprevious<CR>
|
||||
nnoremap <silent> <space>e :bnext<CR>
|
||||
nnoremap <silent> <C-w>% :vsplit<CR>
|
||||
nnoremap <silent> <C-w>" :split<CR>
|
||||
nnoremap q: <nop>
|
||||
nnoremap Q <nop>
|
||||
command! WQ wq
|
||||
command! Wq wq
|
||||
command! W write
|
||||
command! Q quit
|
||||
|
||||
" Setting up the directories {
|
||||
" set backup " Backups are nice ...
|
||||
if has('persistent_undo')
|
||||
set undofile " So is persistent undo ...
|
||||
set undolevels=1000 " Maximum number of changes that can be undone
|
||||
set undoreload=10000 " Maximum number lines to save for undo on a buffer reload
|
||||
endif
|
||||
" }
|
||||
" Plugin installation is explicit: run install.sh or :PlugInstall/:PlugUpdate.
|
||||
let s:plug_vim = g:vim_dir . '/autoload/plug.vim'
|
||||
if filereadable(s:plug_vim)
|
||||
execute 'source ' . fnameescape(s:plug_vim)
|
||||
call plug#begin(g:vim_dir . '/plugged')
|
||||
Plug 'vim-fuzzbox/fuzzbox.vim'
|
||||
Plug 'preservim/nerdtree', { 'on': ['NERDTreeToggle', 'NERDTreeFind'] }
|
||||
Plug 'ryanoasis/vim-devicons'
|
||||
|
||||
" }
|
||||
Plug 'tpope/vim-repeat'
|
||||
Plug 'tpope/vim-surround'
|
||||
Plug 'tpope/vim-commentary'
|
||||
|
||||
" Vim UI {
|
||||
"
|
||||
set noshowmode
|
||||
set cursorline " Highlight current line
|
||||
set cursorlineopt=number " only highlight line number
|
||||
set cmdheight=1 " get rid of the extra useless line at the bottom(if not working, probably a plugin is changing the value)
|
||||
Plug 'tpope/vim-fugitive'
|
||||
Plug 'airblade/vim-gitgutter'
|
||||
|
||||
set backspace=indent,eol,start " Backspace for dummies
|
||||
set fillchars=eob:\ ,vert:│,stl:\ ,stlnc:\ , " it can remove '~' at the end of buffer, and window split line
|
||||
set number " Line numbers on
|
||||
set showmatch " Show matching brackets/parenthesis
|
||||
set incsearch " Find as you type search
|
||||
set hlsearch " Highlight search terms
|
||||
set winminheight=0 " Windows can be 0 line high
|
||||
set ignorecase " Case insensitive search
|
||||
set smartcase " Case sensitive when uc present
|
||||
set wildmenu " Show list instead of just completing
|
||||
set wildmode=list:longest,full " Command <Tab> completion, list matches, then longest common part, then all.
|
||||
set whichwrap=b,s,h,l,<,>,[,] " Backspace and cursor keys wrap too
|
||||
set scrolljump=1 " Lines to scroll when cursor leaves screen
|
||||
set scrolloff=5 " Minimum lines to keep above and below cursor
|
||||
set sidescrolloff=5 " Minimum lines to keep at the left or right of the cursor
|
||||
set display=lastline " don't replace whole long line with @@@
|
||||
augroup cc
|
||||
au!
|
||||
autocmd FileType c,cpp,vim,java,python,lua set colorcolumn=80
|
||||
autocmd FileType help set colorcolumn=
|
||||
augroup END
|
||||
Plug 'mhinz/vim-startify'
|
||||
Plug 'Donaldttt/vim-bufferline'
|
||||
Plug 'Donaldttt/vim-global-statusline', { 'branch': 'vim9' }
|
||||
Plug 'christoomey/vim-tmux-navigator'
|
||||
|
||||
" }
|
||||
Plug 'sainnhe/everforest'
|
||||
Plug 'bluz71/vim-moonfly-colors', { 'as': 'moonfly' }
|
||||
Plug 'NLKNguyen/papercolor-theme'
|
||||
call plug#end()
|
||||
else
|
||||
echohl WarningMsg
|
||||
echom 'vim-plug is not installed; run install.sh to install plugins.'
|
||||
echohl None
|
||||
endif
|
||||
|
||||
" Formatting {
|
||||
set autoindent " Indent at the same level of the previous line
|
||||
set expandtab " Tabs are spaces, not tabs
|
||||
set shiftwidth=4 " Use indents of 4 spaces
|
||||
set tabstop=4 " An indentation every four columns
|
||||
set softtabstop=4 " Let backspace delete indent
|
||||
" Fuzzbox replaces the former Fuzzyy plugin and keeps its familiar mappings.
|
||||
let g:fuzzbox_dropdown = 1
|
||||
let g:fuzzbox_window_defaults = {'maxwidth': 0.8, 'maxheight': 0.8}
|
||||
let g:fuzzbox_window_options = {
|
||||
\ 'files': {'width': 0.8},
|
||||
\ 'buffers': {'preview': 1, 'width': 0.8, 'preview_ratio': 0.5},
|
||||
\ 'grep': {'preview': 1, 'width': 0.8, 'preview_ratio': 0.5},
|
||||
\ 'mru': {'preview': 1}}
|
||||
nnoremap <silent> <leader>fl :FuzzyCmdHistory<CR>
|
||||
|
||||
set conceallevel=0
|
||||
set nojoinspaces " Prevents inserting two spaces after punctuation on a join (J)
|
||||
set splitright " Puts new vsplit windows to the right of the current
|
||||
set splitbelow " Puts new split windows to the bottom of the current
|
||||
" set nolist " let vim not showing '$' or other sign
|
||||
set list " Display unprintable characters f12 - switches
|
||||
" NERDTree remains intentionally small; Fuzzbox handles most navigation.
|
||||
let g:NERDShutUp = 1
|
||||
let g:NERDTreeMinimalMenu = 1
|
||||
let g:NERDTreeMinimalUI = 1
|
||||
let g:NERDTreeChDirMode = 0
|
||||
let g:NERDTreeQuitOnOpen = 1
|
||||
let g:NERDTreeMouseMode = 2
|
||||
let g:NERDTreeShowHidden = 1
|
||||
let g:NERDTreeMapOpenExpl = ''
|
||||
let g:NERDTreeDirArrowCollapsible = ''
|
||||
let g:NERDTreeDirArrowExpandable = ''
|
||||
|
||||
" stop inserting the current comment leader after hitting 'o' or 'O' in Normal mode
|
||||
au FileType * setlocal formatoptions-=o
|
||||
function! s:ToggleTree() abort
|
||||
if exists('t:NERDTreeBufName') && bufwinnr(t:NERDTreeBufName) != -1
|
||||
NERDTreeClose
|
||||
elseif &filetype ==# 'startify' || empty(expand('%:p'))
|
||||
NERDTreeToggle
|
||||
else
|
||||
NERDTreeFind
|
||||
endif
|
||||
endfunction
|
||||
nnoremap <silent> <leader>e :call <SID>ToggleTree()<CR>
|
||||
|
||||
set listchars=tab:•\ ,trail:•,extends:»,precedes:« " Unprintable chars mapping
|
||||
let g:gitgutter_map_keys = 0
|
||||
nnoremap <silent> <leader>gt :GitGutterBufferToggle<CR>
|
||||
|
||||
set nospell " Spell checking off
|
||||
set matchpairs+=<:> " Match, to be used with %
|
||||
let g:tmux_navigator_no_mappings = 1
|
||||
nnoremap <silent> <C-h> :TmuxNavigateLeft<CR>
|
||||
nnoremap <silent> <C-j> :TmuxNavigateDown<CR>
|
||||
nnoremap <silent> <C-k> :TmuxNavigateUp<CR>
|
||||
nnoremap <silent> <C-l> :TmuxNavigateRight<CR>
|
||||
|
||||
" }
|
||||
let g:bufferline_echo = 0
|
||||
let g:bufferline_modified = '+'
|
||||
let g:bufferline_active_buffer_left = '['
|
||||
let g:bufferline_active_buffer_right = ']'
|
||||
|
||||
" Key (re)Mappings {
|
||||
let g:startify_change_to_dir = 0
|
||||
let g:startify_files_number = 8
|
||||
let g:startify_bookmarks = [g:dotfiledir . '.vimrc']
|
||||
let g:startify_lists = [
|
||||
\ {'header': [' RECENT'], 'type': 'files'},
|
||||
\ {'header': [' BOOKMARKS'], 'type': 'bookmarks'}]
|
||||
|
||||
" Wrapped lines goes down/up to next row, rather than next line in file.
|
||||
noremap j gj
|
||||
noremap k gk
|
||||
function! s:StatuslineHighlights() abort
|
||||
highlight default DotModeNormal cterm=reverse gui=reverse
|
||||
highlight default link DotModeInsert DiffAdd
|
||||
highlight default link DotModeVisual Visual
|
||||
highlight default link DotModeCommand DiffChange
|
||||
endfunction
|
||||
|
||||
" Yank from the cursor to the end of the line, to be consistent with C and D.
|
||||
nnoremap Y y$
|
||||
function! s:StatuslineUpdate() abort
|
||||
if !exists('g:StlSetPart') || !exists('g:StlRefresh')
|
||||
return
|
||||
endif
|
||||
let l:modes = {
|
||||
\ 'n': [' NORMAL ', 'DotModeNormal'],
|
||||
\ 'i': [' INSERT ', 'DotModeInsert'],
|
||||
\ 'v': [' VISUAL ', 'DotModeVisual'],
|
||||
\ 'V': [' V-LINE ', 'DotModeVisual'],
|
||||
\ nr2char(22): [' V-BLOCK ', 'DotModeVisual'],
|
||||
\ 'c': [' COMMAND ', 'DotModeCommand']}
|
||||
let l:current = get(l:modes, mode(), [' ' . &filetype . ' ', 'StatusLine'])
|
||||
call g:StlSetPart(0, l:current[0], l:current[1], 'mode')
|
||||
let l:name = empty(expand('%:t')) ? '[No Name]' : expand('%:t')
|
||||
call g:StlSetPart(10, ' ' . l:name . (&modified ? ' [+]' : ''), '', 'filename')
|
||||
try
|
||||
call g:StlSetPart(30, ' ' . bufferline#get_echo_string(), '', 'buffers')
|
||||
catch
|
||||
endtry
|
||||
call g:StlSetPart(max([0, &columns - 14]), printf(' %d:%d ', line('.'), virtcol('.')), '', 'position')
|
||||
call g:StlRefresh()
|
||||
endfunction
|
||||
|
||||
set foldmethod=syntax
|
||||
augroup vimfold
|
||||
autocmd!
|
||||
if has('nvim')
|
||||
" check tree-sitter config
|
||||
else
|
||||
autocmd FileType python set foldmethod=indent
|
||||
autocmd FileType vim set foldmethod=syntax
|
||||
endif
|
||||
augroup END
|
||||
augroup DotfilesUi
|
||||
autocmd!
|
||||
autocmd VimEnter * call theme#Init() | call <SID>StatuslineHighlights() | call <SID>StatuslineUpdate()
|
||||
autocmd ModeChanged,BufEnter,BufDelete,BufWritePost * call <SID>StatuslineUpdate()
|
||||
autocmd CursorHold * call <SID>StatuslineUpdate()
|
||||
autocmd ColorScheme * call <SID>StatuslineHighlights()
|
||||
augroup END
|
||||
|
||||
" so when a buffer open it wouldn't be fold by default
|
||||
" set nofoldenable
|
||||
set foldlevelstart=99
|
||||
nnoremap <silent> <leader>cbg :call theme#toggleBg()<CR>
|
||||
nnoremap <silent> <leader>ctb :call theme#toggleTransparent()<CR>
|
||||
|
||||
" Visual shifting (does not exit Visual mode)
|
||||
vnoremap < <gv
|
||||
vnoremap > >gv
|
||||
|
||||
" Allow using the repeat operator with a visual selection (!)
|
||||
" http://stackoverflow.com/a/8064607/127816
|
||||
vnoremap . :normal .<CR>
|
||||
|
||||
" For when you forget to sudo.. Really Write the file.
|
||||
" cmap w!! w !sudo tee % >/dev/null
|
||||
|
||||
" Adjust viewports to the same size
|
||||
map <Leader>= <C-w>=
|
||||
|
||||
" Map <Leader>ff to display all lines with keyword under cursor
|
||||
" and ask which one to jump to
|
||||
nmap <Leader>j [I:let nr = input("Which one: ")<Bar>exe "normal " . nr ."[\t"<CR>
|
||||
|
||||
" Easier horizontal scrolling
|
||||
map zl zL
|
||||
map zh zH
|
||||
|
||||
" Functions {
|
||||
|
||||
" Initialize directories for undo, swap, viewdir (see :h undodir, etc.)
|
||||
" to ~/.vim/.vim*
|
||||
function! InitializeDirectories()
|
||||
let common_dir = g:vim_dir
|
||||
let dir_list = {
|
||||
\ 'backupdir' : '.vimbackup',
|
||||
\ 'viewdir' : '.vimviews',
|
||||
\ 'directory' : '.vimswap' }
|
||||
|
||||
if has('persistent_undo')
|
||||
let dir_list['undodir'] = '.vimundo'
|
||||
endif
|
||||
|
||||
for [settingname, dirname] in items(dir_list)
|
||||
let directory = common_dir . dirname . '/'
|
||||
if exists("*mkdir")
|
||||
if !isdirectory(directory)
|
||||
call mkdir(directory)
|
||||
endif
|
||||
endif
|
||||
if !isdirectory(directory)
|
||||
echo "Warning: Unable to create backup directory: " . directory
|
||||
echo "Try: mkdir -p " . directory
|
||||
else
|
||||
let directory = substitute(directory, " ", "\\\\ ", "g")
|
||||
exec "set " . settingname . "=" . directory
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
call InitializeDirectories()
|
||||
|
||||
" Visual mode pressing * or # searches for the current selection
|
||||
" Super useful! From an idea by Michael Naumann
|
||||
vnoremap <silent> * :<C-u>call VisualSelection('', '')<CR>/<C-R>=@/<CR><CR>
|
||||
vnoremap <silent> # :<C-u>call VisualSelection('', '')<CR>?<C-R>=@/<CR><CR>
|
||||
|
||||
" Fix file type error for typescript
|
||||
autocmd BufNewFile,BufRead *.ts set filetype=typescript
|
||||
|
||||
" copy to system
|
||||
if g:os == 'Darwin' || g:os == 'Windows'
|
||||
set clipboard=unnamed
|
||||
else
|
||||
if g:isWSL && has('nvim')
|
||||
" :h clipboard-wsl
|
||||
set clipboard=unnamedplus
|
||||
|
||||
" cache has to be enabled otherwise cause freeze
|
||||
" obviously wsl without xclip won't work
|
||||
let g:clipboard = {
|
||||
\ 'name': 'WSLxclip',
|
||||
\ 'copy': {
|
||||
\ '+': 'xclip -quiet -i -selection clipboard',
|
||||
\ '*': 'xclip -quiet -i -selection primary',
|
||||
\ },
|
||||
\ 'paste': {
|
||||
\ '+': 'xclip -o -selection clipboard',
|
||||
\ '*': 'xclip -o -selection primary',
|
||||
\ },
|
||||
\ 'cache_enabled': 1,
|
||||
\ }
|
||||
elseif g:isWSL
|
||||
set clipboard=unnamedplus
|
||||
else
|
||||
set clipboard=unnamedplus
|
||||
endif
|
||||
endif
|
||||
|
||||
" fix paste mess up when using tmux
|
||||
if &term =~ "screen"
|
||||
let &t_BE = "\e[?2004h"
|
||||
let &t_BD = "\e[?2004l"
|
||||
exec "set t_PS=\e[200~"
|
||||
exec "set t_PE=\e[201~"
|
||||
endif
|
||||
|
||||
" disable netrw as i am using nerdtree and nvim-tree
|
||||
let g:loaded_netrw = 1
|
||||
let g:loaded_netrwPlugin = 1
|
||||
|
||||
" Use bundles config {
|
||||
if filereadable(g:dotfiledir."/main.vim")
|
||||
execute('source '.g:dotfiledir.'/main.vim')
|
||||
endif
|
||||
" }
|
||||
if has('gui_running')
|
||||
set guifont=Hack\ Nerd\ Font:h13
|
||||
endif
|
||||
|
||||
@@ -1,19 +1,77 @@
|
||||
# Dotfiles
|
||||
All kind of dot files
|
||||
|
||||
## Installation
|
||||
Focused Vim 9, Bash, and tmux configuration for Linux, WSL, and macOS. The
|
||||
Windows installer manages the same Vim configuration.
|
||||
|
||||
### Linux, \*nix, Mac OSX Installation
|
||||
## Requirements
|
||||
|
||||
Simply copying and pasting the following line into a terminal.
|
||||
- Git
|
||||
- Vim 9 or newer
|
||||
- `curl` for the Unix installer
|
||||
- Optional: tmux, zoxide, ripgrep, and a Nerd Font
|
||||
|
||||
## Install
|
||||
|
||||
Clone the repository, then install all components:
|
||||
|
||||
```bash
|
||||
curl https://raw.githubusercontent.com/Donaldttt/dotfiles/main/install.sh -L > dotfiles_install.sh && sh dotfiles_install.sh
|
||||
git clone https://github.com/Donaldttt/dotfiles.git ~/.dotfiles
|
||||
~/.dotfiles/install.sh
|
||||
```
|
||||
|
||||
or
|
||||
Components can be installed independently and combined:
|
||||
|
||||
```bash
|
||||
sh <(curl https://raw.githubusercontent.com/Donaldttt/dotfiles/main/install.sh -L)
|
||||
~/.dotfiles/install.sh vim
|
||||
~/.dotfiles/install.sh shell tmux
|
||||
```
|
||||
|
||||
The installer backs up conflicting files, creates managed links, and installs
|
||||
Vim plugins and TPM. It never updates an existing repository automatically and
|
||||
does not install zoxide; if zoxide is already available, the managed Bash block
|
||||
initializes it.
|
||||
|
||||
On Windows, clone the repository and run:
|
||||
|
||||
```powershell
|
||||
python .\win-install.py
|
||||
```
|
||||
|
||||
## Vim
|
||||
|
||||
The Vim setup includes Fuzzbox and NERDTree navigation, Fugitive and GitGutter,
|
||||
Startify, a compact global statusline, and five color schemes.
|
||||
|
||||
Useful mappings use `,` as the leader key:
|
||||
|
||||
- `,ff`: files
|
||||
- `,fg`: text search
|
||||
- `,e`: NERDTree
|
||||
- `,cbg`: light/dark mode
|
||||
- `,ctb`: transparency
|
||||
- `:FuzzyColors`: choose a color scheme
|
||||
|
||||
Plugin maintenance is explicit:
|
||||
|
||||
```vim
|
||||
:PlugUpdate
|
||||
:PlugClean
|
||||
```
|
||||
|
||||
## Update and uninstall
|
||||
|
||||
Update safely from a clean worktree:
|
||||
|
||||
```bash
|
||||
git -C ~/.dotfiles pull --ff-only
|
||||
~/.dotfiles/install.sh
|
||||
```
|
||||
|
||||
To remove managed links and the managed Bash block:
|
||||
|
||||
```bash
|
||||
~/.dotfiles/uninstall.sh
|
||||
```
|
||||
|
||||
Uninstalling intentionally retains the repository, backups, Vim data/plugins,
|
||||
and TPM so user data is never removed implicitly.
|
||||
|
||||
+29
-61
@@ -1,70 +1,38 @@
|
||||
# args:
|
||||
# $1:
|
||||
# The IP address you want to query geo info for.
|
||||
# If no argument supplied, the host machine's ip will
|
||||
# be used
|
||||
# doc for api: https://ip-api.com/docs/api
|
||||
# Bash-only interactive shell helpers.
|
||||
[[ -n ${BASH_VERSION:-} ]] || return 0
|
||||
|
||||
if [ -n "$ZSH_NAME" ]; then
|
||||
SHELL_NAME=zsh
|
||||
DOTFILE_DIR=${0:a:h}/
|
||||
# enable emacs key bindings
|
||||
bindkey -e
|
||||
source $DOTFILE_DIR/bash_tools/theme_zsh.sh
|
||||
elif [ -n "$SHELL" ];then
|
||||
SHELL_NAME=bash
|
||||
DOTFILE_DIR=$(dirname ${BASH_SOURCE[0]})/
|
||||
source $DOTFILE_DIR/bash_tools/theme_bash.sh
|
||||
fi
|
||||
|
||||
## ENVIRONMENT
|
||||
DOTFILE_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
|
||||
|
||||
export EDITOR='vim'
|
||||
export PATH=$PATH:~/.local/bin
|
||||
export VISUAL="$EDITOR"
|
||||
case ":$PATH:" in
|
||||
*":$HOME/.local/bin:"*) ;;
|
||||
*) export PATH="$PATH:$HOME/.local/bin" ;;
|
||||
esac
|
||||
|
||||
# For references:
|
||||
# https://askubuntu.com/questions/466198/how-do-i-change-the-color-for-directories-with-ls-in-the-console
|
||||
# shellcheck source=bash_tools/theme_bash.sh
|
||||
source "$DOTFILE_DIR/bash_tools/theme_bash.sh"
|
||||
# shellcheck source=bash_tools/ls_colors_theme.sh
|
||||
source "$DOTFILE_DIR/bash_tools/ls_colors_theme.sh"
|
||||
|
||||
# We use vivid to generate configuration for LS_COLORS
|
||||
# more info: https://github.com/sharkdp/vivid
|
||||
source $DOTFILE_DIR/bash_tools/ls_colors_theme.sh
|
||||
alias ls='ls --color=auto'
|
||||
if ls --color=auto -d . >/dev/null 2>&1; then
|
||||
alias ls='ls --color=auto'
|
||||
elif [[ $OSTYPE == darwin* ]]; then
|
||||
alias ls='ls -G'
|
||||
fi
|
||||
|
||||
# get ipinfo of the machine
|
||||
function ipinfo(){
|
||||
local api_str="http://ip-api.com/json/$1?fields=query,country,regionName,city,district,zip,isp,org,reverse,mobile,proxy,hosting"
|
||||
if ! hash python; then
|
||||
curl "$api_str"
|
||||
else
|
||||
curl -s "$api_str" | python -m json.tool
|
||||
fi
|
||||
# Search for a literal string. Usage: fct <directory> <text>
|
||||
fct() {
|
||||
(($# == 2)) || { printf 'Usage: fct <directory> <text>\n' >&2; return 2; }
|
||||
if command -v rg >/dev/null 2>&1; then
|
||||
rg -n --fixed-strings -- "$2" "$1"
|
||||
else
|
||||
grep -Rnw -- "$1" -e "$2"
|
||||
fi
|
||||
}
|
||||
|
||||
# find file contain certain text string($2) in certain directory($1)
|
||||
function fct(){
|
||||
grep -rnw $1 -e $2
|
||||
# Query dict.org. Usage: odict <word>
|
||||
odict() {
|
||||
(($# == 1)) || { printf 'Usage: odict <word>\n' >&2; return 2; }
|
||||
curl --fail --silent --show-error "dict://dict.org/d:$1"
|
||||
}
|
||||
|
||||
# online directory
|
||||
function odict(){
|
||||
curl dict://dict.org/d:"${1}"
|
||||
}
|
||||
|
||||
# self host directory
|
||||
function dict(){
|
||||
python $DOTFILE_DIR/bash_tools/dict.py $1 $2
|
||||
}
|
||||
|
||||
# set_wallpaper() function
|
||||
source $DOTFILE_DIR/bash_tools/wallpaper.sh
|
||||
|
||||
#
|
||||
# Command Configuration
|
||||
#
|
||||
|
||||
# -A: get rid of . and ..
|
||||
# -t: Sort by time. Display the newest first
|
||||
#alias ls=ls -At
|
||||
|
||||
source $DOTFILE_DIR/bash_tools/fzf_file_seletor.sh
|
||||
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
import json
|
||||
import sys
|
||||
import re
|
||||
|
||||
from urllib.request import urlopen
|
||||
|
||||
Usage = """
|
||||
Usage: python3 dict.sh [word]
|
||||
"""
|
||||
|
||||
HAS_RICH = 0
|
||||
try:
|
||||
from rich.console import Console
|
||||
from rich.panel import Panel
|
||||
from rich.text import Text
|
||||
from rich import print
|
||||
HAS_RICH = 1
|
||||
except:
|
||||
pass
|
||||
|
||||
def basic_paring(data):
|
||||
""" Display data in the most simple way
|
||||
"""
|
||||
word = data["word"]
|
||||
defs = data["def"]
|
||||
samples = data["sample_sentence"]
|
||||
ponetic = data["phonetic"]
|
||||
|
||||
print(word)
|
||||
|
||||
if len(ponetic.items()) > 0:
|
||||
for _, v in ponetic.items():
|
||||
print(v, end=" ")
|
||||
print()
|
||||
print()
|
||||
|
||||
if len(defs) > 0:
|
||||
for k in defs:
|
||||
print(k, defs[k])
|
||||
print()
|
||||
|
||||
for s in samples[:2]:
|
||||
print("-", end=" ")
|
||||
print(s['en'])
|
||||
print()
|
||||
|
||||
def rich_paring(data):
|
||||
console = Console()
|
||||
word = data["word"]
|
||||
defs = data["def"]
|
||||
ponetic = data["phonetic"]
|
||||
samples = data["sample_sentence"]
|
||||
|
||||
console.print(word, style="bold magenta")
|
||||
print()
|
||||
|
||||
if len(ponetic.items()) > 0:
|
||||
for _, v in ponetic.items():
|
||||
#v = v.replace('[', '\[').replace(']', ']')
|
||||
console.print(Text(v, style="yellow"))
|
||||
print()
|
||||
|
||||
if len(defs) > 0:
|
||||
for k in defs:
|
||||
console.print(Text(k, style="green"))
|
||||
console.print(Text(defs[k], style="cyan"))
|
||||
print()
|
||||
|
||||
for s in samples[:2]:
|
||||
ens = s['en'].replace('"', '\"')
|
||||
ens = re.sub(r'\*\*([^ ]*?)\*\*', r'[/][red]\1[/][yellow4]', ens)
|
||||
|
||||
text = Text.from_markup("[yellow4]" + ens + "[/]", justify="left")
|
||||
panel = Panel(text)
|
||||
|
||||
console.print(panel)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) != 2:
|
||||
print(Usage)
|
||||
exit(1)
|
||||
|
||||
word = sys.argv[1]
|
||||
url = "http://do.useless.pw/{}".format(word)
|
||||
r = urlopen(url)
|
||||
content = r.read()
|
||||
json_content = json.loads(content)
|
||||
if not HAS_RICH:
|
||||
basic_paring(json_content)
|
||||
else:
|
||||
rich_paring(json_content)
|
||||
@@ -1,228 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# For any command require a file path, this function
|
||||
# helps to select the correct file with key words
|
||||
# Usage:
|
||||
# Add the command to desired list
|
||||
|
||||
# fzf match everything
|
||||
fzf_command_list_all=(\
|
||||
)
|
||||
|
||||
# fzf match files
|
||||
fzf_command_list_file=(\
|
||||
set_wallpaper \
|
||||
)
|
||||
|
||||
# fzf only match folders
|
||||
fzf_command_list_dir=(\
|
||||
cd \
|
||||
)
|
||||
|
||||
# in case above functions are broken
|
||||
function no_fzf(){
|
||||
for c in "${fzf_command_list_all[@]}"; do
|
||||
unalias $c
|
||||
done
|
||||
for c in "${fzf_command_list_file[@]}"; do
|
||||
unalias $c
|
||||
done
|
||||
for c in "${fzf_command_list_dir[@]}"; do
|
||||
unalias $c
|
||||
done
|
||||
}
|
||||
|
||||
function dp(){
|
||||
local debug=0
|
||||
[ "$debug" = "1" ] && echo $1
|
||||
}
|
||||
|
||||
# SHELL specific setting
|
||||
if [ ! -z "$ZSH_NAME" ]; then
|
||||
SHELL_NAME=zsh
|
||||
dp "[bash_tools]: In ZSH shell"
|
||||
# disable error output when
|
||||
# wildcard found 0 match
|
||||
setopt +o nomatch
|
||||
|
||||
#setopt extended_glob
|
||||
|
||||
# show hidden file when using wildcard
|
||||
# use in fzf_selector
|
||||
# only for zsh
|
||||
setopt dotglob
|
||||
setopt glob_dots
|
||||
else
|
||||
# temporary
|
||||
SHELL_NAME=bash
|
||||
dp "[bash_tools]: In non-ZSH shell"
|
||||
# only for bash
|
||||
shopt -s dotglob
|
||||
|
||||
# allow reverse wildcard exp. !(b*)
|
||||
# shopt -s extglob
|
||||
|
||||
# allows filename patterns which match no
|
||||
# files to expand to a null string, rather
|
||||
# than themselves
|
||||
shopt -s nullglob
|
||||
fi
|
||||
|
||||
ret=''
|
||||
|
||||
# $1 keyword
|
||||
# $2
|
||||
# 0: show all
|
||||
# 1: only show directories
|
||||
# 2: only show files
|
||||
function fzf_selector() {
|
||||
ret=$1
|
||||
if [ "$1" = "." ] || [ "$1" = ".." ] || \
|
||||
[[ "$1" == -* ]] || [[ "$1" == */* ]]; then
|
||||
dp "fzf return directly"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ $2 = 0 ]; then
|
||||
all_items=(*)
|
||||
elif [ $2 = 1 ]; then
|
||||
dp "try to find dirs"
|
||||
all_items=(*/)
|
||||
elif [ $2 = 2 ]; then
|
||||
dp "try to find files"
|
||||
if [ "$SHELL_NAME" = "zsh" ]; then
|
||||
eval "all_items=(*(^/))"
|
||||
elif [ "$SHELL_NAME" = "bash" ]; then
|
||||
# no easy way to list just regular files
|
||||
# in bash???
|
||||
all=(*)
|
||||
all_items=()
|
||||
for item in "${all[@]}"; do
|
||||
[ -f "$item" ] && all_items+=("$item")
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
dp "fzf-keyword: $1"
|
||||
files=()
|
||||
# match
|
||||
# 1. try match file/dir equals to keyword completely
|
||||
# 2. try match file/dir which keyword is substring of
|
||||
# 3. try match file/dir equals to keyword completely after ignoring cases
|
||||
# 4. try match file/dir which keyword is substring of after ignoring cases
|
||||
|
||||
for item in "${all_items[@]}"; do
|
||||
dp "item: $item"
|
||||
# 1.
|
||||
if [ "$item" = "$1" ] || [ "$item" = "$1/" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 2.
|
||||
# this line ignore cases
|
||||
# [[ $1 =~ [A-Z] ]] && \
|
||||
grep $1 <<< $item > /dev/null 2>&1 && \
|
||||
files+=("$item")
|
||||
done
|
||||
|
||||
dp "len contains upper cases ${#files[@]}"
|
||||
|
||||
if [ "${#files[@]}" = "0" ]; then
|
||||
for item in "${all_items[@]}"; do
|
||||
# 3.
|
||||
if ([ "$SHELL_NAME" = "bash" ] && ( [ "${item,,}" = "${1,,}" ] || [ "${item,,}" = "${1,,}/" ] )) || \
|
||||
([ "$SHELL_NAME" = "zsh" ] && ( [ "${item:l}" = "${1:l}" ] || [ "${item:l}" = "${1:l}/" ] )) ; then
|
||||
ret=$item
|
||||
return 0
|
||||
fi
|
||||
# 4.
|
||||
grep -i $1 <<< $item > /dev/null 2>&1 && files+=("$item")
|
||||
done
|
||||
fi
|
||||
|
||||
if [ "${#files[@]}" = "0" ]; then
|
||||
# if grep find zero file
|
||||
ret=$1
|
||||
elif [ "${#files[@]}" = "1" ]; then
|
||||
ret=$files
|
||||
else
|
||||
select file in "${files[@]}"; do
|
||||
ret=$file
|
||||
break
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
# $1 command for fzf substuting(like ls)
|
||||
# $2 original args pass to function
|
||||
# $3 command require file type (file: 0 |directory: 1)
|
||||
function fzf_command_execute() {
|
||||
local args=($@)
|
||||
local len=${#args[@]}
|
||||
|
||||
dp "args: $args"
|
||||
dp "lens: $len"
|
||||
|
||||
# zsh shell's array starts with 1 rather than 0
|
||||
if [ ! -z "$ZSH_NAME" ]; then
|
||||
dp "zsh"
|
||||
flag="${args[2]}"
|
||||
unset 'args[2]'
|
||||
command_prefix="${args[1]}"
|
||||
else
|
||||
dp "not zsh"
|
||||
flag="${args[1]}"
|
||||
unset 'args[1]'
|
||||
command_prefix="${args[0]}"
|
||||
fi
|
||||
|
||||
dp "flag: $flag"
|
||||
|
||||
if [ "$len" = "2" ]; then
|
||||
# flag will take 1 length
|
||||
# so if len == 2 means no argument is given
|
||||
${args[@]}
|
||||
return 0
|
||||
fi
|
||||
# probably work for bash
|
||||
#keyword="${args: -1}"
|
||||
|
||||
keyword=""
|
||||
slice_flag=1
|
||||
for arg in "${args[@]:2}"; do
|
||||
dp "argg $arg"
|
||||
if [ "$slice_flag" = "1" ]; then
|
||||
if [ "$keyword" = "" ]; then
|
||||
keyword="$arg"
|
||||
else
|
||||
keyword="$keyword $arg"
|
||||
fi
|
||||
elif [[ "$arg" == "-"* ]]; then
|
||||
command_prefix="$command_prefix $arg"
|
||||
else
|
||||
slice_flag=1
|
||||
fi
|
||||
done
|
||||
dp "command_prefix: $command_prefix"
|
||||
dp "keyword: $keyword"
|
||||
|
||||
# Delete last argument
|
||||
# Here we assume it is a file path
|
||||
|
||||
fzf_selector "$keyword" $flag
|
||||
dp "ret: $ret"
|
||||
|
||||
$command_prefix "$ret"
|
||||
}
|
||||
|
||||
for c in "${fzf_command_list_all[@]}"; do
|
||||
alias $c="fzf_command_execute $c 0"
|
||||
done
|
||||
for c in "${fzf_command_list_file[@]}"; do
|
||||
alias $c="fzf_command_execute $c 2"
|
||||
done
|
||||
for c in "${fzf_command_list_dir[@]}"; do
|
||||
alias $c="fzf_command_execute $c 1"
|
||||
done
|
||||
|
||||
@@ -1,23 +1,9 @@
|
||||
__dotfiles_git_prompt() {
|
||||
local branch marks=''
|
||||
branch=$(git symbolic-ref --quiet --short HEAD 2>/dev/null) || return
|
||||
git diff --no-ext-diff --quiet --ignore-submodules -- 2>/dev/null || marks+=' *'
|
||||
git diff --cached --no-ext-diff --quiet --ignore-submodules -- 2>/dev/null || marks+=' +'
|
||||
printf '\[\e[38;5;166m\](%s\[\e[38;5;204m\]%s\[\e[38;5;166m\])\[\e[0m\]' "$branch" "$marks"
|
||||
}
|
||||
|
||||
# display git status
|
||||
export GIT_PS1_SHOWDIRTYSTATE=1
|
||||
if [[ $(type -t __git_ps1) != function ]]; then
|
||||
__git_ps1(){
|
||||
|
||||
local branch=`git branch 2>/dev/null | grep '*' | sed 's/* \(.*\)/\1/'`
|
||||
|
||||
if [ -n "$branch" ]; then
|
||||
status=`git status 2>/dev/null`
|
||||
local stage_info="not staged for commit"
|
||||
local commit_info="Changes to be committed"
|
||||
|
||||
local stage_sign=''
|
||||
local commit_sign=''
|
||||
[[ "$status" == *"$stage_info"* ]] && stage_sign=" *"
|
||||
[[ "$status" == *"$commit_info"* ]] && commit_sign=" +"
|
||||
echo "(${branch}${stage_sign}${commit_sign})"
|
||||
fi
|
||||
}
|
||||
fi
|
||||
export PS1=' \[\e[0;32m\]\w\[\e[01;31m\]$(__git_ps1 "(%s)")\[\e[00m\] '
|
||||
# »
|
||||
PS1=' \[\e[38;5;106m\]\w\[\e[0m\]$(__dotfiles_git_prompt)\$ '
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
# Autoload zsh add-zsh-hook and vcs_info functions (-U autoload w/o substition, -z use zsh style)
|
||||
autoload -Uz add-zsh-hook vcs_info
|
||||
autoload -U colors && colors
|
||||
# Enable substitution in the prompt.
|
||||
setopt prompt_subst
|
||||
# Run vcs_info just before a prompt is displayed (precmd)
|
||||
add-zsh-hook precmd vcs_info
|
||||
# Enable checking for (un)staged changes, enabling use of %u and %c
|
||||
zstyle ':vcs_info:*' check-for-changes true
|
||||
# Set custom strings for an unstaged vcs repo changes (*) and staged changes (+)
|
||||
zstyle ':vcs_info:*' unstagedstr ' *'
|
||||
zstyle ':vcs_info:*' stagedstr ' +'
|
||||
# Set the format of the Git information for vcs_info
|
||||
|
||||
# 3-Digit codes for various colors:
|
||||
# https://unix.stackexchange.com/a/124409/194343
|
||||
|
||||
vcs_info='%F{166}(%b%F{204}%u%c%f%F{166})%f'
|
||||
zstyle ':vcs_info:git:*' formats $vcs_info
|
||||
|
||||
zstyle ':vcs_info:git:*' actionformats '(%b|%a%u%c)'
|
||||
|
||||
#export PS1='%F{green}%1~ %F{cyan}${vcs_info_msg_0_}%f '
|
||||
|
||||
local user="%B%(!.%F{red}.%F{green})%n%f "
|
||||
|
||||
local user_symbol='%(!.#.$)'
|
||||
local current_dir="%B%~%b"
|
||||
local vcs_branch='${vcs_info_msg_0_}'
|
||||
|
||||
#PROMPT="╭─${user}${current_dir}${vcs_branch}
|
||||
#╰─%B${user_symbol}%b "
|
||||
|
||||
#PROMPT="%F{magenta}› ${current_dir}${vcs_branch} "
|
||||
|
||||
PROMPT=" %F{106}${current_dir}%f${vcs_branch}$ "
|
||||
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
|
||||
# Linux specific functions
|
||||
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||||
|
||||
set_gnome_wp() {
|
||||
gsettings set org.gnome.desktop.background picture-uri "file://$1"
|
||||
gsettings set org.gnome.desktop.background picture-uri-dark "file://$1"
|
||||
}
|
||||
|
||||
function set_wallpaper(){
|
||||
local file=$1
|
||||
# convert to abs path
|
||||
if [[ ! "$file" = /* ]]; then
|
||||
file=$(pwd)/$1
|
||||
fi
|
||||
set_gnome_wp $file
|
||||
}
|
||||
|
||||
fi
|
||||
|
||||
# Mac OSX specific functions
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
|
||||
function set_wallpaper(){
|
||||
local file=$1
|
||||
# convert to abs path
|
||||
if [[ ! "$file" = /* ]]; then
|
||||
file=$(pwd)/$1
|
||||
fi
|
||||
|
||||
apple_script_single_desk="tell application \"Finder\" to set desktop picture to POSIX file \"$file\""
|
||||
osascript -e "$apple_script_single_desk"
|
||||
}
|
||||
|
||||
fi
|
||||
Binary file not shown.
@@ -1,376 +0,0 @@
|
||||
#! /usr/bin/env python3
|
||||
|
||||
""" Convert values between RGB hex codes and xterm-256 color codes.
|
||||
|
||||
Nice long listing of all 256 colors and their codes. Useful for
|
||||
developing console color themes, or even script output schemes.
|
||||
|
||||
Resources:
|
||||
* http://en.wikipedia.org/wiki/8-bit_color
|
||||
* http://en.wikipedia.org/wiki/ANSI_escape_code
|
||||
* /usr/share/X11/rgb.txt
|
||||
|
||||
I'm not sure where this script was inspired from. I think I must have
|
||||
written it from scratch, though it's been several years now.
|
||||
"""
|
||||
|
||||
__author__ = 'Micah Elliott http://MicahElliott.com'
|
||||
__version__ = '0.1'
|
||||
__copyright__ = 'Copyright (C) 2011 Micah Elliott. All rights reserved.'
|
||||
__license__ = 'WTFPL http://sam.zoy.org/wtfpl/'
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
import sys, re
|
||||
|
||||
CLUT = [ # color look-up table
|
||||
# 8-bit, RGB hex
|
||||
|
||||
# Primary 3-bit (8 colors). Unique representation!
|
||||
('00', '000000'),
|
||||
('01', '800000'),
|
||||
('02', '008000'),
|
||||
('03', '808000'),
|
||||
('04', '000080'),
|
||||
('05', '800080'),
|
||||
('06', '008080'),
|
||||
('07', 'c0c0c0'),
|
||||
|
||||
# Equivalent "bright" versions of original 8 colors.
|
||||
('08', '808080'),
|
||||
('09', 'ff0000'),
|
||||
('10', '00ff00'),
|
||||
('11', 'ffff00'),
|
||||
('12', '0000ff'),
|
||||
('13', 'ff00ff'),
|
||||
('14', '00ffff'),
|
||||
('15', 'ffffff'),
|
||||
|
||||
# Strictly ascending.
|
||||
('16', '000000'),
|
||||
('17', '00005f'),
|
||||
('18', '000087'),
|
||||
('19', '0000af'),
|
||||
('20', '0000d7'),
|
||||
('21', '0000ff'),
|
||||
('22', '005f00'),
|
||||
('23', '005f5f'),
|
||||
('24', '005f87'),
|
||||
('25', '005faf'),
|
||||
('26', '005fd7'),
|
||||
('27', '005fff'),
|
||||
('28', '008700'),
|
||||
('29', '00875f'),
|
||||
('30', '008787'),
|
||||
('31', '0087af'),
|
||||
('32', '0087d7'),
|
||||
('33', '0087ff'),
|
||||
('34', '00af00'),
|
||||
('35', '00af5f'),
|
||||
('36', '00af87'),
|
||||
('37', '00afaf'),
|
||||
('38', '00afd7'),
|
||||
('39', '00afff'),
|
||||
('40', '00d700'),
|
||||
('41', '00d75f'),
|
||||
('42', '00d787'),
|
||||
('43', '00d7af'),
|
||||
('44', '00d7d7'),
|
||||
('45', '00d7ff'),
|
||||
('46', '00ff00'),
|
||||
('47', '00ff5f'),
|
||||
('48', '00ff87'),
|
||||
('49', '00ffaf'),
|
||||
('50', '00ffd7'),
|
||||
('51', '00ffff'),
|
||||
('52', '5f0000'),
|
||||
('53', '5f005f'),
|
||||
('54', '5f0087'),
|
||||
('55', '5f00af'),
|
||||
('56', '5f00d7'),
|
||||
('57', '5f00ff'),
|
||||
('58', '5f5f00'),
|
||||
('59', '5f5f5f'),
|
||||
('60', '5f5f87'),
|
||||
('61', '5f5faf'),
|
||||
('62', '5f5fd7'),
|
||||
('63', '5f5fff'),
|
||||
('64', '5f8700'),
|
||||
('65', '5f875f'),
|
||||
('66', '5f8787'),
|
||||
('67', '5f87af'),
|
||||
('68', '5f87d7'),
|
||||
('69', '5f87ff'),
|
||||
('70', '5faf00'),
|
||||
('71', '5faf5f'),
|
||||
('72', '5faf87'),
|
||||
('73', '5fafaf'),
|
||||
('74', '5fafd7'),
|
||||
('75', '5fafff'),
|
||||
('76', '5fd700'),
|
||||
('77', '5fd75f'),
|
||||
('78', '5fd787'),
|
||||
('79', '5fd7af'),
|
||||
('80', '5fd7d7'),
|
||||
('81', '5fd7ff'),
|
||||
('82', '5fff00'),
|
||||
('83', '5fff5f'),
|
||||
('84', '5fff87'),
|
||||
('85', '5fffaf'),
|
||||
('86', '5fffd7'),
|
||||
('87', '5fffff'),
|
||||
('88', '870000'),
|
||||
('89', '87005f'),
|
||||
('90', '870087'),
|
||||
('91', '8700af'),
|
||||
('92', '8700d7'),
|
||||
('93', '8700ff'),
|
||||
('94', '875f00'),
|
||||
('95', '875f5f'),
|
||||
('96', '875f87'),
|
||||
('97', '875faf'),
|
||||
('98', '875fd7'),
|
||||
('99', '875fff'),
|
||||
('100', '878700'),
|
||||
('101', '87875f'),
|
||||
('102', '878787'),
|
||||
('103', '8787af'),
|
||||
('104', '8787d7'),
|
||||
('105', '8787ff'),
|
||||
('106', '87af00'),
|
||||
('107', '87af5f'),
|
||||
('108', '87af87'),
|
||||
('109', '87afaf'),
|
||||
('110', '87afd7'),
|
||||
('111', '87afff'),
|
||||
('112', '87d700'),
|
||||
('113', '87d75f'),
|
||||
('114', '87d787'),
|
||||
('115', '87d7af'),
|
||||
('116', '87d7d7'),
|
||||
('117', '87d7ff'),
|
||||
('118', '87ff00'),
|
||||
('119', '87ff5f'),
|
||||
('120', '87ff87'),
|
||||
('121', '87ffaf'),
|
||||
('122', '87ffd7'),
|
||||
('123', '87ffff'),
|
||||
('124', 'af0000'),
|
||||
('125', 'af005f'),
|
||||
('126', 'af0087'),
|
||||
('127', 'af00af'),
|
||||
('128', 'af00d7'),
|
||||
('129', 'af00ff'),
|
||||
('130', 'af5f00'),
|
||||
('131', 'af5f5f'),
|
||||
('132', 'af5f87'),
|
||||
('133', 'af5faf'),
|
||||
('134', 'af5fd7'),
|
||||
('135', 'af5fff'),
|
||||
('136', 'af8700'),
|
||||
('137', 'af875f'),
|
||||
('138', 'af8787'),
|
||||
('139', 'af87af'),
|
||||
('140', 'af87d7'),
|
||||
('141', 'af87ff'),
|
||||
('142', 'afaf00'),
|
||||
('143', 'afaf5f'),
|
||||
('144', 'afaf87'),
|
||||
('145', 'afafaf'),
|
||||
('146', 'afafd7'),
|
||||
('147', 'afafff'),
|
||||
('148', 'afd700'),
|
||||
('149', 'afd75f'),
|
||||
('150', 'afd787'),
|
||||
('151', 'afd7af'),
|
||||
('152', 'afd7d7'),
|
||||
('153', 'afd7ff'),
|
||||
('154', 'afff00'),
|
||||
('155', 'afff5f'),
|
||||
('156', 'afff87'),
|
||||
('157', 'afffaf'),
|
||||
('158', 'afffd7'),
|
||||
('159', 'afffff'),
|
||||
('160', 'd70000'),
|
||||
('161', 'd7005f'),
|
||||
('162', 'd70087'),
|
||||
('163', 'd700af'),
|
||||
('164', 'd700d7'),
|
||||
('165', 'd700ff'),
|
||||
('166', 'd75f00'),
|
||||
('167', 'd75f5f'),
|
||||
('168', 'd75f87'),
|
||||
('169', 'd75faf'),
|
||||
('170', 'd75fd7'),
|
||||
('171', 'd75fff'),
|
||||
('172', 'd78700'),
|
||||
('173', 'd7875f'),
|
||||
('174', 'd78787'),
|
||||
('175', 'd787af'),
|
||||
('176', 'd787d7'),
|
||||
('177', 'd787ff'),
|
||||
('178', 'd7af00'),
|
||||
('179', 'd7af5f'),
|
||||
('180', 'd7af87'),
|
||||
('181', 'd7afaf'),
|
||||
('182', 'd7afd7'),
|
||||
('183', 'd7afff'),
|
||||
('184', 'd7d700'),
|
||||
('185', 'd7d75f'),
|
||||
('186', 'd7d787'),
|
||||
('187', 'd7d7af'),
|
||||
('188', 'd7d7d7'),
|
||||
('189', 'd7d7ff'),
|
||||
('190', 'd7ff00'),
|
||||
('191', 'd7ff5f'),
|
||||
('192', 'd7ff87'),
|
||||
('193', 'd7ffaf'),
|
||||
('194', 'd7ffd7'),
|
||||
('195', 'd7ffff'),
|
||||
('196', 'ff0000'),
|
||||
('197', 'ff005f'),
|
||||
('198', 'ff0087'),
|
||||
('199', 'ff00af'),
|
||||
('200', 'ff00d7'),
|
||||
('201', 'ff00ff'),
|
||||
('202', 'ff5f00'),
|
||||
('203', 'ff5f5f'),
|
||||
('204', 'ff5f87'),
|
||||
('205', 'ff5faf'),
|
||||
('206', 'ff5fd7'),
|
||||
('207', 'ff5fff'),
|
||||
('208', 'ff8700'),
|
||||
('209', 'ff875f'),
|
||||
('210', 'ff8787'),
|
||||
('211', 'ff87af'),
|
||||
('212', 'ff87d7'),
|
||||
('213', 'ff87ff'),
|
||||
('214', 'ffaf00'),
|
||||
('215', 'ffaf5f'),
|
||||
('216', 'ffaf87'),
|
||||
('217', 'ffafaf'),
|
||||
('218', 'ffafd7'),
|
||||
('219', 'ffafff'),
|
||||
('220', 'ffd700'),
|
||||
('221', 'ffd75f'),
|
||||
('222', 'ffd787'),
|
||||
('223', 'ffd7af'),
|
||||
('224', 'ffd7d7'),
|
||||
('225', 'ffd7ff'),
|
||||
('226', 'ffff00'),
|
||||
('227', 'ffff5f'),
|
||||
('228', 'ffff87'),
|
||||
('229', 'ffffaf'),
|
||||
('230', 'ffffd7'),
|
||||
('231', 'ffffff'),
|
||||
|
||||
# Gray-scale range.
|
||||
('232', '080808'),
|
||||
('233', '121212'),
|
||||
('234', '1c1c1c'),
|
||||
('235', '262626'),
|
||||
('236', '303030'),
|
||||
('237', '3a3a3a'),
|
||||
('238', '444444'),
|
||||
('239', '4e4e4e'),
|
||||
('240', '585858'),
|
||||
('241', '626262'),
|
||||
('242', '6c6c6c'),
|
||||
('243', '767676'),
|
||||
('244', '808080'),
|
||||
('245', '8a8a8a'),
|
||||
('246', '949494'),
|
||||
('247', '9e9e9e'),
|
||||
('248', 'a8a8a8'),
|
||||
('249', 'b2b2b2'),
|
||||
('250', 'bcbcbc'),
|
||||
('251', 'c6c6c6'),
|
||||
('252', 'd0d0d0'),
|
||||
('253', 'dadada'),
|
||||
('254', 'e4e4e4'),
|
||||
('255', 'eeeeee'),
|
||||
]
|
||||
|
||||
def _str2hex(hexstr):
|
||||
return int(hexstr, 16)
|
||||
|
||||
def _strip_hash(rgb):
|
||||
# Strip leading `#` if exists.
|
||||
if rgb.startswith('#'):
|
||||
rgb = rgb.lstrip('#')
|
||||
return rgb
|
||||
|
||||
def _create_dicts():
|
||||
short2rgb_dict = dict(CLUT)
|
||||
rgb2short_dict = {}
|
||||
for k, v in short2rgb_dict.items():
|
||||
rgb2short_dict[v] = k
|
||||
return rgb2short_dict, short2rgb_dict
|
||||
|
||||
def short2rgb(short):
|
||||
return SHORT2RGB_DICT[short]
|
||||
|
||||
def print_all():
|
||||
""" Print all 256 xterm color codes.
|
||||
"""
|
||||
for short, rgb in CLUT:
|
||||
sys.stdout.write('\033[48;5;%sm%s:%s' % (short, short, rgb))
|
||||
sys.stdout.write("\033[0m ")
|
||||
sys.stdout.write('\033[38;5;%sm%s:%s' % (short, short, rgb))
|
||||
sys.stdout.write("\033[0m\n")
|
||||
print("Printed all codes.")
|
||||
print("You can translate a hex or 0-255 code by providing an argument.")
|
||||
|
||||
def rgb2short(rgb):
|
||||
""" Find the closest xterm-256 approximation to the given RGB value.
|
||||
@param rgb: Hex code representing an RGB value, eg, 'abcdef'
|
||||
@returns: String between 0 and 255, compatible with xterm.
|
||||
>>> rgb2short('123456')
|
||||
('23', '005f5f')
|
||||
>>> rgb2short('ffffff')
|
||||
('231', 'ffffff')
|
||||
>>> rgb2short('0DADD6') # vimeo logo
|
||||
('38', '00afd7')
|
||||
"""
|
||||
rgb = _strip_hash(rgb)
|
||||
incs = (0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff)
|
||||
# Break 6-char RGB code into 3 integer vals.
|
||||
parts = [ int(h, 16) for h in re.split(r'(..)(..)(..)', rgb)[1:4] ]
|
||||
res = []
|
||||
for part in parts:
|
||||
i = 0
|
||||
while i < len(incs)-1:
|
||||
s, b = incs[i], incs[i+1] # smaller, bigger
|
||||
if s <= part <= b:
|
||||
s1 = abs(s - part)
|
||||
b1 = abs(b - part)
|
||||
if s1 < b1: closest = s
|
||||
else: closest = b
|
||||
res.append(closest)
|
||||
break
|
||||
i += 1
|
||||
#print '***', res
|
||||
res = ''.join([ ('%02.x' % i) for i in res ])
|
||||
equiv = RGB2SHORT_DICT[ res ]
|
||||
#print '***', res, equiv
|
||||
return equiv, res
|
||||
|
||||
RGB2SHORT_DICT, SHORT2RGB_DICT = _create_dicts()
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
if __name__ == '__main__':
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
if len(sys.argv) == 1:
|
||||
print_all()
|
||||
raise SystemExit
|
||||
arg = sys.argv[1]
|
||||
if len(arg) < 4 and int(arg) < 256:
|
||||
rgb = short2rgb(arg)
|
||||
sys.stdout.write('xterm color \033[38;5;%sm%s\033[0m -> RGB exact \033[38;5;%sm%s\033[0m' % (arg, arg, arg, rgb))
|
||||
sys.stdout.write("\033[0m\n")
|
||||
else:
|
||||
short, rgb = rgb2short(arg)
|
||||
sys.stdout.write('RGB %s -> xterm color approx \033[38;5;%sm%s (%s)' % (arg, short, short, rgb))
|
||||
sys.stdout.write("\033[0m\n")
|
||||
@@ -1,7 +0,0 @@
|
||||
set __fish_git_prompt_show_informative_status 1
|
||||
function fish_prompt -d "Write out the prompt"
|
||||
# This shows up as USER@HOST /home/user/ >, with the directory colored
|
||||
# $USER and $hostname are set by fish, so you can just use them
|
||||
# instead of using `whoami` and `hostname`
|
||||
printf ' %s%s%s%s$ ' (set_color $fish_color_cwd) (prompt_pwd) (set_color normal) (fish_git_prompt)
|
||||
end
|
||||
@@ -1,164 +0,0 @@
|
||||
gaps:
|
||||
inner_gap: 5
|
||||
outer_gap: 5
|
||||
|
||||
bar:
|
||||
height: 20
|
||||
position: "top"
|
||||
opacity: 0.6
|
||||
# background: "#101010"
|
||||
background: "#282c34"
|
||||
# foreground: "white"
|
||||
foreground: "#ffffff"
|
||||
# font_family: "Segoe UI"
|
||||
font_family: "Hack Nerd Mono"
|
||||
font_size: "13"
|
||||
padding: "1 6 1 6"
|
||||
components_left:
|
||||
- type: "workspaces"
|
||||
opacity: 0.7
|
||||
components_right:
|
||||
- type: "clock"
|
||||
time_formatting: "hh:mm tt ddd MMM d"
|
||||
|
||||
workspaces:
|
||||
- name: 1
|
||||
- name: 2
|
||||
- name: 3
|
||||
- name: 4
|
||||
- name: 5
|
||||
- name: 6
|
||||
- name: 7
|
||||
- name: 8
|
||||
- name: 9
|
||||
|
||||
window_rules:
|
||||
# Task Manager requires admin privileges to manage and should be ignored unless running
|
||||
# the WM as admin.
|
||||
- command: "ignore"
|
||||
match_process_name: "Taskmgr"
|
||||
match_process_name: "msrdc"
|
||||
|
||||
# Launches system dialogs as floating by default (eg. File Explorer save/open dialog).
|
||||
- command: "set floating"
|
||||
match_class_name: "#32770"
|
||||
|
||||
# Some applications (eg. Steam) have borders that extend past the normal border size.
|
||||
- command: "resize borders 0px -7px -7px -7px"
|
||||
match_process_name: "steam"
|
||||
|
||||
- command: "set tiling"
|
||||
match_process_name: "neovide"
|
||||
|
||||
keybindings:
|
||||
# Shift focus in a given direction.
|
||||
- command: "focus left"
|
||||
bindings: ["Alt+H", "Alt+Left"]
|
||||
- command: "focus right"
|
||||
bindings: ["Alt+L", "Alt+Right"]
|
||||
- command: "focus up"
|
||||
bindings: ["Alt+K", "Alt+Up"]
|
||||
- command: "focus down"
|
||||
bindings: ["Alt+J", "Alt+Down"]
|
||||
|
||||
# Move focused window in a given direction.
|
||||
- command: "move left"
|
||||
bindings: ["Alt+Shift+H", "Alt+Shift+Left"]
|
||||
- command: "move right"
|
||||
bindings: ["Alt+Shift+L", "Alt+Shift+Right"]
|
||||
- command: "move up"
|
||||
bindings: ["Alt+Shift+K", "Alt+Shift+Up"]
|
||||
- command: "move down"
|
||||
bindings: ["Alt+Shift+J", "Alt+Shift+Down"]
|
||||
|
||||
# Resize focused window by a percentage or pixel amount.
|
||||
- command: "resize width -2%"
|
||||
binding: "Alt+U"
|
||||
- command: "resize width +2%"
|
||||
binding: "Alt+P"
|
||||
- command: "resize height +2%"
|
||||
binding: "Alt+O"
|
||||
- command: "resize height -2%"
|
||||
binding: "Alt+I"
|
||||
|
||||
# Change layout direction to be either horizontal or vertical.
|
||||
- command: "layout horizontal"
|
||||
binding: "Alt+Shift+V"
|
||||
- command: "layout vertical"
|
||||
binding: "Alt+V"
|
||||
|
||||
# Change focus between floating / tiling windows.
|
||||
- command: "toggle focus mode"
|
||||
binding: "Alt+Space"
|
||||
|
||||
# Change the focused window to be floating / tiling.
|
||||
- command: "toggle floating"
|
||||
binding: "Alt+Shift+Space"
|
||||
|
||||
# Change the focused window to be maximized / unmaximized.
|
||||
- command: "toggle maximized"
|
||||
binding: "Alt+F"
|
||||
|
||||
# Minimize focused window.
|
||||
- command: "set minimized"
|
||||
binding: "Alt+M"
|
||||
|
||||
# Close focused window.
|
||||
- command: "close"
|
||||
binding: "Alt+Shift+Q"
|
||||
|
||||
# Kill GlazeWM process safely.
|
||||
- command: "exit wm"
|
||||
binding: "Alt+Shift+E"
|
||||
|
||||
# Re-evaluate configuration file.
|
||||
- command: "reload config"
|
||||
binding: "Alt+Shift+R"
|
||||
|
||||
# Launch CMD terminal (alternatively `exec wt` or `exec %ProgramFiles%/Git/git-bash.exe`
|
||||
# to start Windows Terminal and Git Bash respectively.
|
||||
- command: "exec wt"
|
||||
binding: "Alt+Enter"
|
||||
|
||||
- command: "exec chrome"
|
||||
binding: "Alt+F2"
|
||||
|
||||
# Change focus to a workspace defined in `workspaces` config.
|
||||
- command: "focus workspace 1"
|
||||
binding: "Alt+1"
|
||||
- command: "focus workspace 2"
|
||||
binding: "Alt+2"
|
||||
- command: "focus workspace 3"
|
||||
binding: "Alt+3"
|
||||
- command: "focus workspace 4"
|
||||
binding: "Alt+4"
|
||||
- command: "focus workspace 5"
|
||||
binding: "Alt+5"
|
||||
- command: "focus workspace 6"
|
||||
binding: "Alt+6"
|
||||
- command: "focus workspace 7"
|
||||
binding: "Alt+7"
|
||||
- command: "focus workspace 8"
|
||||
binding: "Alt+8"
|
||||
- command: "focus workspace 9"
|
||||
binding: "Alt+9"
|
||||
|
||||
# Move focused window to a workspace defined in `workspaces` config.
|
||||
- commands: ["move to workspace 1", "focus workspace 1"]
|
||||
binding: "Alt+Shift+1"
|
||||
- commands: ["move to workspace 2", "focus workspace 2"]
|
||||
binding: "Alt+Shift+2"
|
||||
- commands: ["move to workspace 3", "focus workspace 3"]
|
||||
binding: "Alt+Shift+3"
|
||||
- commands: ["move to workspace 4", "focus workspace 4"]
|
||||
binding: "Alt+Shift+4"
|
||||
- commands: ["move to workspace 5", "focus workspace 5"]
|
||||
binding: "Alt+Shift+5"
|
||||
- commands: ["move to workspace 6", "focus workspace 6"]
|
||||
binding: "Alt+Shift+6"
|
||||
- commands: ["move to workspace 7", "focus workspace 7"]
|
||||
binding: "Alt+Shift+7"
|
||||
- commands: ["move to workspace 8", "focus workspace 8"]
|
||||
binding: "Alt+Shift+8"
|
||||
- commands: ["move to workspace 9", "focus workspace 9"]
|
||||
bindings: ["Alt+Shift+9"]
|
||||
@@ -1,4 +0,0 @@
|
||||
|
||||
# SETUPLIB
|
||||
|
||||
a python library for writing cross-platform env setup script
|
||||
@@ -1,26 +0,0 @@
|
||||
import sys
|
||||
import os
|
||||
|
||||
class setup():
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def _has_path(self, path):
|
||||
"""
|
||||
Check if path exists(is file or directory)
|
||||
"""
|
||||
return os.path.exists(path)
|
||||
|
||||
def _is_file(self, path):
|
||||
"""
|
||||
Check if path is file
|
||||
"""
|
||||
return os.path.isfile(path)
|
||||
|
||||
def _is_dir(self, path):
|
||||
"""
|
||||
Check if path is directory
|
||||
"""
|
||||
return os.path.isdir(path)
|
||||
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
git config --global user.name "Nachuan Tang"
|
||||
git config --global user.email "tangnachuan1208@gmail.com"
|
||||
@@ -1 +0,0 @@
|
||||
theme_config.vim
|
||||
@@ -1,85 +0,0 @@
|
||||
" Base16 Classic Dark vim-airline-theme (https://github.com/dawikur/base16-vim-airline-themes)
|
||||
" For vim-airline (https://github.com/vim-airline/vim-airline)
|
||||
" By Jason Heeris (http://heeris.id.au)
|
||||
|
||||
let s:scheme_slug = 'sunbather_dark'
|
||||
|
||||
let g:airline#themes#{s:scheme_slug}#palette = {}
|
||||
|
||||
" GUI color definitions
|
||||
let s:gui00 = '#151515'
|
||||
let s:gui01 = '#202020'
|
||||
let s:gui02 = '#303030'
|
||||
let s:gui03 = '#505050'
|
||||
let s:gui04 = '#B0B0B0'
|
||||
let s:gui05 = '#D0D0D0'
|
||||
let s:gui06 = '#E0E0E0'
|
||||
let s:gui07 = '#F5F5F5'
|
||||
let s:gui08 = '#AC4142'
|
||||
let s:gui09 = '#D28445'
|
||||
let s:gui0A = '#F4BF75'
|
||||
let s:gui0B = '#90A959'
|
||||
let s:gui0C = '#75B5AA'
|
||||
let s:gui0D = '#6A9FB5'
|
||||
let s:gui0E = '#AA759F'
|
||||
let s:gui0F = '#8F5536'
|
||||
|
||||
" Terminal color definitions
|
||||
let s:cterm00 = "00"
|
||||
let s:cterm03 = "08"
|
||||
let s:cterm05 = "07"
|
||||
let s:cterm07 = "15"
|
||||
let s:cterm08 = "01"
|
||||
let s:cterm0A = "03"
|
||||
let s:cterm0B = "02"
|
||||
let s:cterm0C = "06"
|
||||
let s:cterm0D = "04"
|
||||
let s:cterm0E = "05"
|
||||
if exists("base16colorspace") && base16colorspace == "256"
|
||||
let s:cterm01 = "18"
|
||||
let s:cterm02 = "19"
|
||||
let s:cterm04 = "20"
|
||||
let s:cterm06 = "21"
|
||||
let s:cterm09 = "16"
|
||||
let s:cterm0F = "17"
|
||||
else
|
||||
let s:cterm01 = "10"
|
||||
let s:cterm02 = "11"
|
||||
let s:cterm04 = "12"
|
||||
let s:cterm06 = "13"
|
||||
let s:cterm09 = "09"
|
||||
let s:cterm0F = "14"
|
||||
endif
|
||||
|
||||
let g:airline#themes#{s:scheme_slug}#palette.normal = airline#themes#generate_color_map(
|
||||
\ [ s:gui01, s:gui04, s:cterm01, s:cterm04 ],
|
||||
\ [ s:gui04, s:gui02, s:cterm04, s:cterm02 ],
|
||||
\ [ s:gui04, s:gui01, s:cterm04, s:cterm01 ])
|
||||
let g:airline#themes#{s:scheme_slug}#palette.normal_modified = {
|
||||
\ 'airline_c' : [ s:gui07, s:gui01, s:cterm07, s:cterm01 ]}
|
||||
|
||||
let g:airline#themes#{s:scheme_slug}#palette.insert = airline#themes#generate_color_map(
|
||||
\ [ s:gui01, s:gui0B, s:cterm01, s:cterm0B ],
|
||||
\ [ s:gui04, s:gui02, s:cterm04, s:cterm02 ],
|
||||
\ [ s:gui04, s:gui01, s:cterm04, s:cterm01 ])
|
||||
let g:airline#themes#{s:scheme_slug}#palette.insert_modified = {
|
||||
\ 'airline_c' : [ s:gui07, s:gui01, s:cterm07, s:cterm01 ]}
|
||||
|
||||
let g:airline#themes#{s:scheme_slug}#palette.replace = airline#themes#generate_color_map(
|
||||
\ [ s:gui01, s:gui0E, s:cterm01, s:cterm0E ],
|
||||
\ [ s:gui04, s:gui02, s:cterm04, s:cterm02 ],
|
||||
\ [ s:gui04, s:gui01, s:cterm04, s:cterm01 ])
|
||||
let g:airline#themes#{s:scheme_slug}#palette.replace_modified = {
|
||||
\ 'airline_c' : [ s:gui07, s:gui01, s:cterm07, s:cterm01 ]}
|
||||
|
||||
let g:airline#themes#{s:scheme_slug}#palette.visual = airline#themes#generate_color_map(
|
||||
\ [ s:gui01, s:gui09, s:cterm01, s:cterm09 ],
|
||||
\ [ s:gui04, s:gui02, s:cterm04, s:cterm02 ],
|
||||
\ [ s:gui04, s:gui01, s:cterm04, s:cterm01 ])
|
||||
let g:airline#themes#{s:scheme_slug}#palette.visual_modified = {
|
||||
\ 'airline_c' : [ s:gui07, s:gui01, s:cterm07, s:cterm01 ]}
|
||||
|
||||
let g:airline#themes#{s:scheme_slug}#palette.inactive = airline#themes#generate_color_map(
|
||||
\ [ s:gui01, s:gui01, s:cterm01, s:cterm01 ],
|
||||
\ [ s:gui04, s:gui01, s:cterm04, s:cterm01 ],
|
||||
\ [ s:gui05, s:gui01, s:cterm05, s:cterm01 ])
|
||||
@@ -1,85 +0,0 @@
|
||||
" Base16 Summerfruit Light vim-airline-theme (https://github.com/dawikur/base16-vim-airline-themes)
|
||||
" For vim-airline (https://github.com/vim-airline/vim-airline)
|
||||
" By Christopher Corley (http://christop.club/)
|
||||
|
||||
let s:scheme_slug = 'sunbather_light'
|
||||
|
||||
let g:airline#themes#{s:scheme_slug}#palette = {}
|
||||
|
||||
" GUI color definitions
|
||||
let s:gui00 = '#FFFFFF'
|
||||
let s:gui01 = '#E0E0E0'
|
||||
let s:gui02 = '#D0D0D0'
|
||||
let s:gui03 = '#B0B0B0'
|
||||
let s:gui04 = '#000000'
|
||||
let s:gui05 = '#101010'
|
||||
let s:gui06 = '#151515'
|
||||
let s:gui07 = '#202020'
|
||||
let s:gui08 = '#FF0086'
|
||||
let s:gui09 = '#FD8900'
|
||||
let s:gui0A = '#ABA800'
|
||||
let s:gui0B = '#00C918'
|
||||
let s:gui0C = '#1FAAAA'
|
||||
let s:gui0D = '#3777E6'
|
||||
let s:gui0E = '#AD00A1'
|
||||
let s:gui0F = '#CC6633'
|
||||
|
||||
" Terminal color definitions
|
||||
let s:cterm00 = "00"
|
||||
let s:cterm03 = "08"
|
||||
let s:cterm05 = "07"
|
||||
let s:cterm07 = "15"
|
||||
let s:cterm08 = "01"
|
||||
let s:cterm0A = "03"
|
||||
let s:cterm0B = "02"
|
||||
let s:cterm0C = "06"
|
||||
let s:cterm0D = "04"
|
||||
let s:cterm0E = "05"
|
||||
if exists("base16colorspace") && base16colorspace == "256"
|
||||
let s:cterm01 = "18"
|
||||
let s:cterm02 = "19"
|
||||
let s:cterm04 = "20"
|
||||
let s:cterm06 = "21"
|
||||
let s:cterm09 = "16"
|
||||
let s:cterm0F = "17"
|
||||
else
|
||||
let s:cterm01 = "10"
|
||||
let s:cterm02 = "11"
|
||||
let s:cterm04 = "12"
|
||||
let s:cterm06 = "13"
|
||||
let s:cterm09 = "09"
|
||||
let s:cterm0F = "14"
|
||||
endif
|
||||
|
||||
let g:airline#themes#{s:scheme_slug}#palette.normal = airline#themes#generate_color_map(
|
||||
\ [ s:gui01, s:gui04, s:cterm01, s:cterm04 ],
|
||||
\ [ s:gui04, s:gui02, s:cterm04, s:cterm02 ],
|
||||
\ [ s:gui04, s:gui01, s:cterm04, s:cterm01 ])
|
||||
let g:airline#themes#{s:scheme_slug}#palette.normal_modified = {
|
||||
\ 'airline_c' : [ s:gui07, s:gui01, s:cterm07, s:cterm01 ]}
|
||||
|
||||
let g:airline#themes#{s:scheme_slug}#palette.insert = airline#themes#generate_color_map(
|
||||
\ [ s:gui01, s:gui0B, s:cterm01, s:cterm0B ],
|
||||
\ [ s:gui04, s:gui02, s:cterm04, s:cterm02 ],
|
||||
\ [ s:gui04, s:gui01, s:cterm04, s:cterm01 ])
|
||||
let g:airline#themes#{s:scheme_slug}#palette.insert_modified = {
|
||||
\ 'airline_c' : [ s:gui07, s:gui01, s:cterm07, s:cterm01 ]}
|
||||
|
||||
let g:airline#themes#{s:scheme_slug}#palette.replace = airline#themes#generate_color_map(
|
||||
\ [ s:gui01, s:gui0E, s:cterm01, s:cterm0E ],
|
||||
\ [ s:gui04, s:gui02, s:cterm04, s:cterm02 ],
|
||||
\ [ s:gui04, s:gui01, s:cterm04, s:cterm01 ])
|
||||
let g:airline#themes#{s:scheme_slug}#palette.replace_modified = {
|
||||
\ 'airline_c' : [ s:gui07, s:gui01, s:cterm07, s:cterm01 ]}
|
||||
|
||||
let g:airline#themes#{s:scheme_slug}#palette.visual = airline#themes#generate_color_map(
|
||||
\ [ s:gui01, s:gui09, s:cterm01, s:cterm09 ],
|
||||
\ [ s:gui04, s:gui02, s:cterm04, s:cterm02 ],
|
||||
\ [ s:gui04, s:gui01, s:cterm04, s:cterm01 ])
|
||||
let g:airline#themes#{s:scheme_slug}#palette.visual_modified = {
|
||||
\ 'airline_c' : [ s:gui07, s:gui01, s:cterm07, s:cterm01 ]}
|
||||
|
||||
let g:airline#themes#{s:scheme_slug}#palette.inactive = airline#themes#generate_color_map(
|
||||
\ [ s:gui01, s:gui01, s:cterm01, s:cterm01 ],
|
||||
\ [ s:gui04, s:gui01, s:cterm04, s:cterm01 ],
|
||||
\ [ s:gui05, s:gui01, s:cterm05, s:cterm01 ])
|
||||
@@ -1,27 +0,0 @@
|
||||
" vim build with clipboard support doesn't need this and it work
|
||||
" better than neovim
|
||||
|
||||
func s:helper()
|
||||
call system('printf "%s" '.shellescape(join(v:event['regcontents'], "\n")).' | xclip -sel clip' )
|
||||
endfunc
|
||||
|
||||
func! clipboard#get()
|
||||
endfunc
|
||||
|
||||
func! clipboard#enable()
|
||||
augroup WSLClipboard
|
||||
au!
|
||||
au TextYankPost * call s:helper()
|
||||
augroup END
|
||||
endfunc
|
||||
|
||||
func! clipboard#disable()
|
||||
augroup WSLClipboard
|
||||
au!
|
||||
augroup END
|
||||
endfunc
|
||||
|
||||
func! clipboard#paste()
|
||||
return system('xclip -o -sel clip' )
|
||||
endfunc
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
let s:path = get(g:, '_config_path', fnamemodify(
|
||||
\ resolve(expand('<sfile>:p')), ':h:h').'/_config.vim')
|
||||
let s:config = {}
|
||||
|
||||
function! config#saveConfig()
|
||||
let p = utils#readvar(s:path)
|
||||
if type(p) != type({})
|
||||
let p = {}
|
||||
endif
|
||||
let vim_type = has('nvim') ? 'nvim' : 'vim'
|
||||
let config = has_key(p, vim_type) && type(p[vim_type]) == v:t_dict
|
||||
\ ? p[vim_type] : {}
|
||||
let config = utils#merge(config, s:config)
|
||||
|
||||
" vim and nvim may have diferenrt available plugins
|
||||
let p[vim_type] = config
|
||||
call utils#savevar(p, s:path)
|
||||
endfunction
|
||||
|
||||
function! s:loadConfig()
|
||||
let result = utils#readvar(s:path)
|
||||
" if it is dictionary
|
||||
let vim_type = has('nvim') ? 'nvim' : 'vim'
|
||||
if type(result) == v:t_dict
|
||||
if has_key(result, vim_type)
|
||||
let config = result[vim_type]
|
||||
if type(config) == v:t_dict
|
||||
let s:config = config
|
||||
return
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! config#setConfig(dict)
|
||||
let s:config = utils#merge(s:config, a:config)
|
||||
endfunction
|
||||
|
||||
function! config#init()
|
||||
call config#loadConfig()
|
||||
augroup config
|
||||
autocmd!
|
||||
autocmd VimLeave * call config#saveConfig()
|
||||
augroup END
|
||||
endfunction
|
||||
@@ -1,171 +0,0 @@
|
||||
|
||||
" this intent to create a list of options that can be toggled on/off
|
||||
|
||||
let s:options = {}
|
||||
|
||||
if !has('nvim')
|
||||
import autoload 'fuzzyy/utils/selector.vim'
|
||||
endif
|
||||
|
||||
" opt is a dictionary with the following keys(* = required):
|
||||
" togglefunc and enablefunc/disablefunc are mutually exclusive
|
||||
" params:
|
||||
" - name: name of the option
|
||||
" - opt: a dictionary with following options():
|
||||
" - desc: description,
|
||||
" - togglefunc: function reference, if exists, enablefunc and disablefunc
|
||||
" will be ignored,
|
||||
" - enablefunc: function reference, if this exists, disablefunc must exists
|
||||
" as well and vice verse
|
||||
" - disablefunc: function reference,
|
||||
" - isEnabled: string, true or false or function reference. only needed when
|
||||
" using enablefunc and disablefunc
|
||||
function! options#add(name, opt) abort
|
||||
if (!has_key(a:opt, 'togglefunc')
|
||||
\ && (!has_key(a:opt, 'enablefunc') || !has_key(a:opt, 'disablefunc')))
|
||||
throw 'invalid option (togglefunc or enablefunc/disablefunc must be set))'
|
||||
endif
|
||||
|
||||
if !has_key(a:opt, 'isEnabled') && !has_key(a:opt, 'togglefunc')
|
||||
throw 'specify initial state(isEnabled) or set togglefunc'
|
||||
endif
|
||||
|
||||
for key in ['togglefunc', 'enablefunc', 'disablefunc']
|
||||
if has_key(a:opt, key) && type(a:opt[key]) != v:t_func
|
||||
throw key . ' must be a function reference'
|
||||
endif
|
||||
endfor
|
||||
|
||||
if !has_key(a:opt, 'desc')
|
||||
let a:opt['desc'] = ''
|
||||
endif
|
||||
|
||||
let s:options[a:name] = a:opt
|
||||
endfunction
|
||||
|
||||
" Register a simple vim option
|
||||
" params:
|
||||
" - name: name of the option
|
||||
" - dictionary(optional):
|
||||
" - desc: description of the option
|
||||
function! options#addVimOption(name, ...) abort
|
||||
let opt = {}
|
||||
|
||||
func opt.togglefunc(key)
|
||||
if eval('&' . a:key)
|
||||
execute('set no' . a:key)
|
||||
else
|
||||
execute('set ' . a:key)
|
||||
endif
|
||||
endfunc
|
||||
|
||||
if a:0 > 0
|
||||
let opt['desc'] = a:1
|
||||
endif
|
||||
|
||||
call options#add(a:name, opt)
|
||||
endfunction
|
||||
|
||||
function! options#getAll() abort
|
||||
let list = []
|
||||
for [key, val] in items(s:options)
|
||||
let desc = val.desc != '' ? ' - ' . val.desc : ''
|
||||
call add(list, [key, key . desc])
|
||||
endfor
|
||||
return list
|
||||
endfunction
|
||||
|
||||
function! options#getAllRaw() abort
|
||||
let list = []
|
||||
for [key, val] in items(s:options)
|
||||
call add(list, [key, desc])
|
||||
endfor
|
||||
return list
|
||||
endfunction
|
||||
|
||||
function! options#toggle(name) abort
|
||||
if !has_key(s:options, a:name)
|
||||
throw 'invalid option name: ' . a:name
|
||||
endif
|
||||
|
||||
let opt = s:options[a:name]
|
||||
if has_key(opt, 'togglefunc')
|
||||
call opt.togglefunc(a:name)
|
||||
else
|
||||
if type(opt.isEnabled) == v:t_func
|
||||
let isEnabled = opt.isEnabled()
|
||||
else
|
||||
let isEnabled = opt.isEnabled
|
||||
endif
|
||||
if isEnabled
|
||||
call opt.disablefunc()
|
||||
else
|
||||
call opt.enablefunc()
|
||||
endif
|
||||
if type(opt.isEnabled) != v:t_func
|
||||
let s:options[a:name].isEnabled = opt.isEnabled ? v:false : v:true
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! options#preSet()
|
||||
call options#addVimOption('number', 'show line number')
|
||||
call options#addVimOption('relativenumber')
|
||||
|
||||
let colorcolumnOpt = {
|
||||
\ 'desc': 'show color column',
|
||||
\ 'isEnabled': &colorcolumn != ''
|
||||
\ }
|
||||
function colorcolumnOpt.togglefunc(...)
|
||||
if &colorcolumn == ''
|
||||
let &colorcolumn = '80'
|
||||
else
|
||||
let &colorcolumn = ''
|
||||
endif
|
||||
endfunction
|
||||
|
||||
call options#add('colorcolumn', colorcolumnOpt)
|
||||
|
||||
let toggleBgOpt = {
|
||||
\ 'desc': 'toggle dark/light theme',
|
||||
\ }
|
||||
function toggleBgOpt.togglefunc(...)
|
||||
call theme#toggleBg()
|
||||
endfunction
|
||||
call options#add('dark/light', toggleBgOpt)
|
||||
endfunction
|
||||
|
||||
function! s:select(wid, result)
|
||||
let result = a:result[0]
|
||||
if result != v:null
|
||||
let key = s:rmap[result]
|
||||
call options#toggle(key)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! options#fzf_options()
|
||||
let list = []
|
||||
let s:rmap = {}
|
||||
for [key, val] in items(s:options)
|
||||
let desc = val.desc != '' ? key . ' - ' . val.desc : key
|
||||
call add(list, desc)
|
||||
let s:rmap[desc] = key
|
||||
endfor
|
||||
let s:fzf_list = list
|
||||
call selector.Start( list,
|
||||
\ {
|
||||
\ 'select_cb' : function('s:select'),
|
||||
\ 'yoffset' : 0.3,
|
||||
\ 'height' : 0.4,
|
||||
\ 'title' : 'Options',
|
||||
\ 'width' : 0.4
|
||||
\ })
|
||||
endfunc
|
||||
|
||||
function! options#init()
|
||||
call options#preSet()
|
||||
if !has('nvim')
|
||||
command! -nargs=0 Options call options#fzf_options()
|
||||
nnoremap <silent> <leader>fo :Options<CR>
|
||||
endif
|
||||
endfunction
|
||||
@@ -1,8 +0,0 @@
|
||||
func! os#getOS()
|
||||
if has("win64") || has("win32") || has("win16")
|
||||
return "Windows"
|
||||
else
|
||||
return substitute(system('uname'), '\n', '', '')
|
||||
endif
|
||||
endfunc
|
||||
|
||||
+98
-361
@@ -1,383 +1,120 @@
|
||||
let s:path = get(g:, 'theme_config_path', fnamemodify(
|
||||
\ resolve(expand('<sfile>:p')), ':h:h').'/theme_config.vim')
|
||||
let s:path = get(g:, 'vim_dir', expand('~/.vim')) . '/theme.json'
|
||||
let s:defaults = {
|
||||
\ 'background': 'dark',
|
||||
\ 'dark': {'theme': 'moonfly', 'transparent': v:false},
|
||||
\ 'light': {'theme': 'PaperColor', 'transparent': v:false}}
|
||||
let s:config = deepcopy(s:defaults)
|
||||
let s:applying = v:false
|
||||
let s:transparent_groups = [
|
||||
\ 'Normal', 'NormalNC', 'EndOfBuffer', 'Folded', 'LineNr', 'SignColumn',
|
||||
\ 'StatusLine', 'StatusLineNC', 'VertSplit', 'WinSeparator', 'NormalFloat']
|
||||
|
||||
let s:themefixes = []
|
||||
|
||||
let s:bgType = has('termguicolors') ? 'guibg' : 'ctermbg'
|
||||
|
||||
" sometimes even in termguicolors, when guibg is not set, the bg will fall
|
||||
" back to use ctermbg, so we have to set them both to none
|
||||
let s:bgNonType = !has('termguicolors') ? 'guibg=NONE' : 'ctermbg=NONE'
|
||||
let s:transBlendOpt = has('nvim') ? ' blend=0' : ''
|
||||
|
||||
let s:default_config = {
|
||||
\ 'background': 'dark',
|
||||
\ 'light': {
|
||||
\ 'theme': 'sunbather_light',
|
||||
\ 'default': 'sunbather_light',
|
||||
\ 'transparent': v:false,
|
||||
\ 'airline_theme': 'sunbather_light',
|
||||
\ },
|
||||
\ 'dark': {
|
||||
\ 'theme': 'base16-harmonic-dark',
|
||||
\ 'default': 'base16-harmonic-dark',
|
||||
\ 'transparent': v:false,
|
||||
\ 'airline_theme': 'base16-harmonic-dark',
|
||||
\ },
|
||||
\ }
|
||||
|
||||
" When enable transparent background, these group will be set to transparent
|
||||
let s:transgroups = [
|
||||
\ 'Normal', 'NormalNC', 'Comment', 'Constant', 'Special', 'Identifier',
|
||||
\ 'Folded', 'Statusline', 'StatuslineNC',
|
||||
\ 'Statement', 'PreProc', 'Type', 'Underlined', 'String', 'Function',
|
||||
\ 'Conditional', 'Repeat', 'Operator', 'Structure', 'LineNr', 'NonText',
|
||||
\ 'SignColumn', 'CursorLineNr', 'EndOfBuffer', 'VertSplit',
|
||||
\ 'DiagnosticSignWarn', 'DiagnosticSignError', 'DiagnosticSignInfo',]
|
||||
|
||||
" background group that will be set to normal's background color
|
||||
let s:cleanbg = ['DiagnosticSignWarn', 'DiagnosticSignError', 'DiagnosticSignInfo',
|
||||
\ 'VertSplit', 'LineNr', 'SignColumn', 'NormalFloat']
|
||||
|
||||
let s:config = get(g:, 'theme_config', s:default_config)
|
||||
|
||||
function! theme#setConfig(bg, key, value)
|
||||
let s:config[a:bg][a:key] = a:value
|
||||
endfunction
|
||||
" register extra transparent hi group
|
||||
function! theme#getCleanBg()
|
||||
return s:cleanbg
|
||||
endfunction
|
||||
|
||||
function! theme#getBgType()
|
||||
return s:bgType
|
||||
endfunction
|
||||
|
||||
function! theme#getTransGroup()
|
||||
return s:transgroups
|
||||
endfunction
|
||||
|
||||
" register extra transparent hi group
|
||||
function theme#addCleanBg(group)
|
||||
let li = type(a:group) == 1 ? [a:group] : a:group
|
||||
for hi in li
|
||||
if index(s:cleanbg, hi) == -1
|
||||
call add(s:cleanbg, hi)
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
" register extra transparent hi group
|
||||
function theme#addTransGroup(group)
|
||||
let li = type(a:group) == 1 ? [a:group] : a:group
|
||||
for hi in li
|
||||
if index(s:transgroups, hi) == -1
|
||||
call add(s:transgroups, hi)
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
function! theme#setColor(bg, ...)
|
||||
let colors_name = a:0 > 0 ? a:1 : s:config[a:bg].theme
|
||||
if !utils#hascolorscheme(colors_name)
|
||||
let colors_name = 'default'
|
||||
endif
|
||||
noa let &bg = a:bg
|
||||
call theme#setStlColor(a:bg)
|
||||
let s:config.background = a:bg
|
||||
let s:config[a:bg].theme = colors_name
|
||||
noa execute("colorscheme " . colors_name)
|
||||
if &background != a:bg
|
||||
noa let &bg = a:bg
|
||||
endif
|
||||
" some theme will pick their own airline theme or airline will
|
||||
" automatically pick theme based on colorscheme
|
||||
if exists('g:airline_theme') && g:airline_theme != s:config[a:bg].airline_theme
|
||||
call theme#setStlColor(a:bg, g:airline_theme)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" Change bottom airline/lualine theme
|
||||
function! theme#setStlColor(bg, ...)
|
||||
if has('nvim-0.5')
|
||||
" lualine will change theme automatically
|
||||
function! s:Merge(defaults, override) abort
|
||||
let l:result = deepcopy(a:defaults)
|
||||
if type(a:override) != v:t_dict
|
||||
return l:result
|
||||
endif
|
||||
for [l:key, l:value] in items(a:override)
|
||||
if type(l:value) == v:t_dict && type(get(l:result, l:key)) == v:t_dict
|
||||
let l:result[l:key] = s:Merge(l:result[l:key], l:value)
|
||||
else
|
||||
if utils#hasplug('vim-airline') && exists(':AirlineTheme')
|
||||
let theme = a:0 > 0 ? a:1 : s:config[a:bg].airline_theme
|
||||
try
|
||||
execute('AirlineTheme ' . theme)
|
||||
catch
|
||||
let theme = s:default_config[a:bg].airline_theme
|
||||
execute('AirlineTheme ' . theme)
|
||||
endtry
|
||||
let s:config[a:bg].airline_theme = theme
|
||||
endif
|
||||
let l:result[l:key] = l:value
|
||||
endif
|
||||
endfor
|
||||
return l:result
|
||||
endfunction
|
||||
|
||||
function! theme#inTransparent()
|
||||
return s:config[&background].transparent
|
||||
function! s:Available(name) abort
|
||||
return !empty(globpath(&runtimepath, 'colors/' . a:name . '.vim', 1, 1))
|
||||
endfunction
|
||||
|
||||
" return 1 if link to other group
|
||||
" return 2 if not exists
|
||||
" return 0 if normal
|
||||
function! s:hiType(group)
|
||||
try
|
||||
let hi = execute('hi '.a:group)
|
||||
if hi =~# 'link'
|
||||
return 2
|
||||
endif
|
||||
catch
|
||||
return 1
|
||||
endtry
|
||||
return 0
|
||||
function! s:ApplyTransparency() abort
|
||||
if !s:config[&background].transparent
|
||||
return
|
||||
endif
|
||||
for l:group in s:transparent_groups
|
||||
execute 'highlight ' . l:group . ' guibg=NONE ctermbg=NONE'
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
function s:applyTransparent()
|
||||
let tail = ' ' . s:bgType . '=NONE term=NONE gui=NONE cterm=NONE '
|
||||
if has('nvim')
|
||||
let tail .= s:transBlendOpt
|
||||
else
|
||||
let tail .= s:bgNonType
|
||||
endif
|
||||
for group in s:transgroups
|
||||
if s:hiType(group) != 0
|
||||
continue
|
||||
endif
|
||||
" cterm and term sometimes are set to reverse so we need to clean them
|
||||
" too
|
||||
" for the last part, we can't clear all terms or it will fall back to
|
||||
" default which is not transparent
|
||||
execute('hi! '.group . tail)
|
||||
endfor
|
||||
call s:generalThemeFix()
|
||||
" for group in s:cleanbg
|
||||
" if s:hiType(group) != 0
|
||||
" continue
|
||||
" endif
|
||||
" execute('hi! '.group . tail)
|
||||
" endfor
|
||||
function! s:Load() abort
|
||||
if !filereadable(s:path)
|
||||
return deepcopy(s:defaults)
|
||||
endif
|
||||
try
|
||||
let l:saved = json_decode(join(readfile(s:path), "\n"))
|
||||
return s:Merge(s:defaults, l:saved)
|
||||
catch
|
||||
return deepcopy(s:defaults)
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
" some callback function to enable transparent background
|
||||
" for specific colorscheme
|
||||
|
||||
" or general callback for all colorscheme when specific colorscheme callback
|
||||
" is not available
|
||||
" g:dark_transparent_enable_cb
|
||||
" g:light_transparent_enable_cb
|
||||
|
||||
function! theme#enableTransparent() abort
|
||||
let colorscheme_name = utils#colorschemename()
|
||||
let bg = &background
|
||||
if exists('g:'.bg.'_transparent_enable_cb') && g:dark_transparent_enable_cb != ''
|
||||
let cb_name = get(g:, bg.'_transparent_enable_cb', '')
|
||||
if cb_name != ''
|
||||
execute('call '.cb_name.'()')
|
||||
endif
|
||||
elseif exists('g:Transparent_enable_func')
|
||||
if type(g:Transparent_enable_func) != v:t_func
|
||||
echoerr 'g:Transparent_enable_func is not a function'
|
||||
endif
|
||||
call g:Transparent_enable_func()
|
||||
else
|
||||
call s:applyTransparent()
|
||||
augroup SetTransparent
|
||||
autocmd!
|
||||
autocmd ColorScheme * call s:applyTransparent()
|
||||
augroup END
|
||||
endif
|
||||
let s:config[bg].transparent = v:true
|
||||
function! theme#save() abort
|
||||
try
|
||||
call mkdir(fnamemodify(s:path, ':h'), 'p')
|
||||
call writefile([json_encode(s:config)], s:path)
|
||||
catch
|
||||
" A read-only home directory should not prevent Vim from exiting cleanly.
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
function! theme#disableTransparent() abort
|
||||
augroup SetTransparent
|
||||
autocmd!
|
||||
augroup END
|
||||
let bg = &background
|
||||
let s:config[bg].transparent = v:false
|
||||
let colorscheme_name = utils#colorschemename()
|
||||
if exists('g:'.bg.'_transparent_disable_cb')
|
||||
let cb_name = get(g:, bg.'_transparent_disable_cb', '')
|
||||
if cb_name != ''
|
||||
execute('call '.cb_name.'()')
|
||||
endif
|
||||
elseif exists('g:Transparent_disable_func')
|
||||
if type(g:Transparent_disable_func) != v:t_func
|
||||
echoerr 'g:Transparent_disable_func is not a function'
|
||||
endif
|
||||
call g:Transparent_disable_func()
|
||||
else
|
||||
execute('colorscheme ' . s:config[bg].theme)
|
||||
endif
|
||||
function! theme#apply(name) abort
|
||||
let l:background = &background
|
||||
let l:name = s:Available(a:name) ? a:name
|
||||
\ : (l:background ==# 'dark' ? 'sunbather_dark' : 'sunbather_light')
|
||||
let s:applying = v:true
|
||||
try
|
||||
execute 'colorscheme ' . l:name
|
||||
finally
|
||||
let s:applying = v:false
|
||||
endtry
|
||||
let &background = l:background
|
||||
let s:config.background = l:background
|
||||
let s:config[l:background].theme = l:name
|
||||
call s:ApplyTransparency()
|
||||
endfunction
|
||||
|
||||
" ToggleTransparent background
|
||||
function! theme#toggleTransparent()
|
||||
if s:config[&background].transparent
|
||||
call theme#disableTransparent()
|
||||
else
|
||||
call theme#enableTransparent()
|
||||
endif
|
||||
function! theme#toggleBg() abort
|
||||
let l:background = &background ==# 'dark' ? 'light' : 'dark'
|
||||
let l:theme = s:config[l:background].theme
|
||||
let s:applying = v:true
|
||||
try
|
||||
let &background = l:background
|
||||
finally
|
||||
let s:applying = v:false
|
||||
endtry
|
||||
let s:config.background = l:background
|
||||
call theme#apply(l:theme)
|
||||
endfunction
|
||||
|
||||
" Allow to trigger background
|
||||
function! theme#toggleBg()
|
||||
" Inversion
|
||||
let newbg = &background == "dark" ? 'light' : 'dark'
|
||||
call theme#setColor(newbg)
|
||||
if s:config[&background].transparent
|
||||
call theme#enableTransparent()
|
||||
elseif !s:config[&background].transparent
|
||||
call theme#disableTransparent()
|
||||
endif
|
||||
function! theme#toggleTransparent() abort
|
||||
let s:config[&background].transparent = !s:config[&background].transparent
|
||||
if s:config[&background].transparent
|
||||
call s:ApplyTransparency()
|
||||
else
|
||||
call theme#apply(s:config[&background].theme)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! theme#saveConfig()
|
||||
let p = utils#readvar(s:path)
|
||||
if type(p) != type({})
|
||||
let p = {}
|
||||
endif
|
||||
|
||||
let vim_type = has('nvim') ? 'nvim' : 'vim'
|
||||
|
||||
let config = has_key(p, vim_type) && type(p[vim_type]) == 4
|
||||
\ ? p[vim_type] : {}
|
||||
|
||||
let config = utils#merge(config, s:config)
|
||||
|
||||
" vim and nvim may have diferenrt available plugins
|
||||
let p[vim_type] = config
|
||||
call utils#savevar(p, s:path)
|
||||
function! theme#onColorScheme(name) abort
|
||||
if s:applying
|
||||
return
|
||||
endif
|
||||
if a:name !~# '^sunbather_' && index(['everforest', 'moonfly', 'PaperColor'], a:name) < 0
|
||||
return
|
||||
endif
|
||||
let s:config.background = &background
|
||||
let s:config[&background].theme = a:name
|
||||
call s:ApplyTransparency()
|
||||
endfunction
|
||||
|
||||
function! theme#loadConfig()
|
||||
let result = utils#readvar(s:path)
|
||||
" if it is dictionary
|
||||
let vim_type = has('nvim') ? 'nvim' : 'vim'
|
||||
if type(result) == 4
|
||||
if has_key(result, vim_type)
|
||||
let config = result[vim_type]
|
||||
if type(config) == 4
|
||||
return config
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
return {}
|
||||
endfunction
|
||||
|
||||
function! theme#getHiTerms(group)
|
||||
let output = execute('hi ' . a:group)
|
||||
if stridx(output, 'links to') > 0
|
||||
let higroup = matchstr(output, 'links.to.\?\zs\S\+\ze')
|
||||
return theme#getHiTerms(higroup)
|
||||
endif
|
||||
let list = split(output, '')
|
||||
let dict = {}
|
||||
|
||||
for item in list
|
||||
if stridx(item, '=') > 0
|
||||
let splited = split(item, '=')
|
||||
let dict[splited[0]] = splited[1]
|
||||
endif
|
||||
endfor
|
||||
|
||||
for item in ['guibg', 'ctermbg', 'term', 'cterm', 'guifg', 'ctermfg']
|
||||
if ! has_key(dict, item)
|
||||
let dict[item] = 'NONE'
|
||||
endif
|
||||
endfor
|
||||
return dict
|
||||
endfunction
|
||||
|
||||
function! theme#getHiTerm(group, term)
|
||||
" Store output of group to variable
|
||||
let output = theme#getHiTerms(a:group)
|
||||
return output[a:term]
|
||||
endfunction
|
||||
|
||||
function! s:regiesterThemeFix(Func)
|
||||
call add(s:theme_fix, a:Func)
|
||||
endfunction
|
||||
|
||||
function! s:generalThemeFix()
|
||||
" The following is for getting rid of the vim split bar and match its
|
||||
" and number cols' color with backgroud
|
||||
" if theme#inTransparent()
|
||||
" return
|
||||
" endif
|
||||
if &bg != s:config.background
|
||||
execute('set bg=' . s:config.background)
|
||||
endif
|
||||
|
||||
let normal = theme#getHiTerms('normal')
|
||||
let hiTerms = ' '
|
||||
for term in ['guibg', 'ctermbg', 'term', 'cterm']
|
||||
let hiTerms .= term . '=' . normal[term] . ' '
|
||||
endfor
|
||||
|
||||
for group in s:cleanbg
|
||||
" if s:hiType(group) != 0
|
||||
" continue
|
||||
" endif
|
||||
" transBlendOpt is used to prevent hi from being clear
|
||||
execute('hi! ' . group . hiTerms)
|
||||
endfor
|
||||
|
||||
" highlight cursorline number only
|
||||
" this needs option set cursorlineopt=number
|
||||
if s:hiType('CursorLineNr') == 0
|
||||
hi! CursorLineNr guibg=NONE ctermbg=NONE cterm=bold gui=bold
|
||||
endif
|
||||
|
||||
for Func in s:themefixes
|
||||
call Func()
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
function! theme#Init()
|
||||
if has('termguicolors')
|
||||
set termguicolors
|
||||
endif
|
||||
|
||||
if has('nvim')
|
||||
set fillchars+=stl:\ ,stlnc:\ ,
|
||||
endif
|
||||
|
||||
let s:config = utils#merge(s:default_config, theme#loadConfig())
|
||||
|
||||
let bg = s:config.background
|
||||
if utils#hascolorscheme(s:config[bg].theme)
|
||||
call theme#setColor(bg)
|
||||
else
|
||||
call theme#setColor(bg, s:config[bg].default)
|
||||
endif
|
||||
|
||||
if s:config[bg].transparent
|
||||
call theme#enableTransparent()
|
||||
else
|
||||
call theme#disableTransparent()
|
||||
endif
|
||||
call s:generalThemeFix()
|
||||
|
||||
if exists('*options#add')
|
||||
let toggle_transparent = { 'desc' : 'Toggle transparent background' }
|
||||
func toggle_transparent.togglefunc(...)
|
||||
call theme#toggleTransparent()
|
||||
endfunc
|
||||
call options#add('toggle_transparent', toggle_transparent)
|
||||
endif
|
||||
|
||||
augroup GeneralTheme
|
||||
autocmd!
|
||||
autocmd ColorScheme * call s:generalThemeFix()
|
||||
autocmd ColorScheme * let s:config.background = &bg | call theme#setColor(&bg, expand('<amatch>'))
|
||||
autocmd VimLeave * call theme#saveConfig()
|
||||
augroup END
|
||||
|
||||
endfunction
|
||||
|
||||
function! theme#getConfig()
|
||||
return s:config
|
||||
function! theme#Init() abort
|
||||
let s:config = s:Load()
|
||||
let &background = get(s:config, 'background', 'dark')
|
||||
call theme#apply(s:config[&background].theme)
|
||||
augroup DotfilesTheme
|
||||
autocmd!
|
||||
autocmd ColorScheme * call theme#onColorScheme(expand('<amatch>'))
|
||||
autocmd VimLeavePre * call theme#save()
|
||||
augroup END
|
||||
endfunction
|
||||
|
||||
@@ -1,194 +0,0 @@
|
||||
|
||||
" return a python version available (from 3 to 2)
|
||||
fun! utils#get_usable_py()
|
||||
let py = ''
|
||||
if executable('python3')
|
||||
let py = 'python3'
|
||||
elseif executable('python2')
|
||||
let py = 'python2'
|
||||
elseif executable('python')
|
||||
let py = 'python'
|
||||
endif
|
||||
return py
|
||||
endfun
|
||||
|
||||
" Check if plugin exists
|
||||
function! utils#hasplug(plug_name, ...)
|
||||
let plug_dir_name = get(a:, 1, a:plug_name) " optional argument for the name of plug's folder
|
||||
if has_key(g:plugs, a:plug_name) && isdirectory(g:plugin_dir . "/" . plug_dir_name)
|
||||
if has_key(g:plugs[a:plug_name], 'for') || has_key(g:plugs[a:plug_name], 'on')
|
||||
if (has_key(g:plugs[a:plug_name], 'for') && len(g:plugs[a:plug_name]['for']) == 0) ||
|
||||
\ (has_key(g:plugs[a:plug_name], 'on') && len(g:plugs[a:plug_name]['on']) == 0)
|
||||
return v:false
|
||||
endif
|
||||
endif
|
||||
return v:true
|
||||
endif
|
||||
return v:false
|
||||
endfunction
|
||||
|
||||
" This function is used to save a variable to a file
|
||||
function! utils#savevar(var, file)
|
||||
let serialized = string(a:var)
|
||||
call writefile([serialized], a:file)
|
||||
endfun
|
||||
|
||||
" This function is used to retrieve a variable from a file
|
||||
" only first line is count
|
||||
function! utils#readvar(file)
|
||||
if !filereadable(a:file)
|
||||
return v:null
|
||||
endif
|
||||
let serialized = readfile(a:file)
|
||||
if(len(serialized) == 0)
|
||||
return v:null
|
||||
endif
|
||||
execute "let result = " . serialized[0]
|
||||
return result
|
||||
endfun
|
||||
|
||||
" Merge two dictionaries, also recursively merging nested keys.
|
||||
" Use extend() if you don't need to merge nested keys.
|
||||
fun! utils#merge(defaults, override)
|
||||
let l:new = copy(a:defaults)
|
||||
for [l:k, l:v] in items(a:override)
|
||||
let l:new[l:k] = (type(l:v) is v:t_dict && type(get(l:new, l:k)) is v:t_dict)
|
||||
\ ? utils#merge(l:new[l:k], l:v)
|
||||
\ : l:v
|
||||
endfor
|
||||
return l:new
|
||||
endfun
|
||||
|
||||
"Remove all trailing whitespace by pressing <leader>ws
|
||||
fun! utils#trimwhitespace()
|
||||
let l:save = winsaveview()
|
||||
keeppatterns %s/\s*\r\=$//e
|
||||
call winrestview(l:save)
|
||||
endfun
|
||||
|
||||
function! utils#hascolorscheme(name)
|
||||
let scheme = a:name
|
||||
let colors = globpath(&runtimepath, printf('colors/%s.vim', scheme), 1, 1)
|
||||
if len(colors) > 0 | return 1 | endif
|
||||
let colors += globpath(&packpath, printf('pack/*/start/*/colors/%s.vim', scheme), 1, 1)
|
||||
if len(colors) > 0 | return 1 | endif
|
||||
let colors += globpath(&packpath, printf('pack/*/opt/*/colors/%s.vim', scheme), 1, 1)
|
||||
if len(colors) > 0 | return 1 | endif
|
||||
if has('nvim')
|
||||
let colors = globpath(&runtimepath, printf('colors/%s.lua', scheme), 1, 1)
|
||||
if len(colors) > 0 | return 1 | endif
|
||||
let colors += globpath(&packpath, printf('pack/*/start/*/colors/%s.lua', scheme), 1, 1)
|
||||
if len(colors) > 0 | return 1 | endif
|
||||
let colors += globpath(&packpath, printf('pack/*/opt/*/colors/%s.lua', scheme), 1, 1)
|
||||
if len(colors) > 0 | return 1 | endif
|
||||
endif
|
||||
return 0
|
||||
endfunction
|
||||
|
||||
" get current colorscheme name
|
||||
" return default if not found
|
||||
function! utils#colorschemename()
|
||||
return execute('colo')[1:]
|
||||
try
|
||||
return g:colors_name
|
||||
catch /^Vim:E121/
|
||||
return "default"
|
||||
catch /.*/
|
||||
return "default"
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
" debug function print out highlight group of cursor position
|
||||
function! utils#showHiGroup(...)
|
||||
if !exists("*synstack")
|
||||
return
|
||||
endif
|
||||
let l = a:0 == 2 ? a:1 : line('.')
|
||||
let c = a:0 == 2 ? a:2 : col('.')
|
||||
echo map(synstack(l, c), 'synIDattr(v:val, "name")')
|
||||
|
||||
:echo "hi<" . synIDattr(synID(l,c,1),"name") . '> trans<'
|
||||
\ . synIDattr(synID(l,c,0),"name") . "> lo<"
|
||||
\ . synIDattr(synIDtrans(synID(l,c,1)),"name") . ">"
|
||||
|
||||
endfunc
|
||||
|
||||
" get highlight group information and return as dictionary
|
||||
function! utils#getHi(group)
|
||||
let output = execute('hi ' . a:group)
|
||||
let list = split(output, '\s\+')
|
||||
let dict = {}
|
||||
for item in list
|
||||
if match(item, '=') > 0
|
||||
let splited = split(item, '=')
|
||||
let dict[splited[0]] = splited[1]
|
||||
endif
|
||||
endfor
|
||||
return dict
|
||||
endfunction
|
||||
|
||||
function! utils#isTransparent()
|
||||
let dict = utils#getHi('Normal')
|
||||
let isGui = &termguicolors
|
||||
if isGui
|
||||
if !has_key(dict, 'guibg')
|
||||
return 1
|
||||
endif
|
||||
elseif !isGui
|
||||
if !has_key(dict, 'ctermfg')
|
||||
return 1
|
||||
endif
|
||||
endif
|
||||
return 0
|
||||
endfunction
|
||||
|
||||
function! s:scratch()
|
||||
split
|
||||
noswapfile hide enew
|
||||
setlocal buftype=nofile
|
||||
setlocal bufhidden=hide
|
||||
setlocal nobuflisted
|
||||
endfunction
|
||||
|
||||
" search highlight group with pattern
|
||||
function! utils#searchHi(pattern)
|
||||
execute("filter /" . a:pattern . "/ highlight")
|
||||
" color not working
|
||||
" let temp_reg = @"
|
||||
" redir @"
|
||||
" silent! execute("filter /" . a:pattern . "/ highlight")
|
||||
" redir END
|
||||
" let output = copy(@")
|
||||
" let @" = temp_reg
|
||||
" call s:scratch()
|
||||
" put! =output
|
||||
endfunc
|
||||
|
||||
function! utils#swapword()
|
||||
let word = expand("<cword>")
|
||||
let l1 = g:swap_dict[0]
|
||||
let l2 = g:swap_dict[1]
|
||||
let inx = index(l1, word)
|
||||
if inx != -1
|
||||
let newword = l2[inx]
|
||||
else
|
||||
let inx = index(l2, word)
|
||||
if inx != -1
|
||||
let newword = l1[inx]
|
||||
endif
|
||||
endif
|
||||
if inx != -1
|
||||
execute "normal ciw" . newword . "\<Esc>"
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! utils#files(...)
|
||||
if a:0 > 0
|
||||
let path = a:1
|
||||
else
|
||||
let path = getcwd()
|
||||
endif
|
||||
let files = glob(path . '/**', 1, 1, 1)
|
||||
return files
|
||||
endfunction
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
""" preview.py theme arg
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
class bcolors:
|
||||
HEADER = '\033[95m'
|
||||
OKBLUE = '\033[94m'
|
||||
OKCYAN = '\033[96m'
|
||||
OKGREEN = '\033[92m'
|
||||
WARNING = '\033[93m'
|
||||
RED = '\033[31m'
|
||||
YELLOW = '\033[33m'
|
||||
FAIL = '\033[91m'
|
||||
ENDC = '\033[0m'
|
||||
BOLD = '\033[1m'
|
||||
UNDERLINE = '\033[4m'
|
||||
|
||||
def is_tool(name):
|
||||
"""Check whether `name` is on PATH and marked as executable."""
|
||||
from shutil import which
|
||||
return which(name) is not None
|
||||
|
||||
def get_preview_tool():
|
||||
exec = None
|
||||
if is_tool('bat'):
|
||||
exec = 'bat'
|
||||
elif is_tool('batcat'):
|
||||
exec = 'batcat'
|
||||
elif is_tool('cat'):
|
||||
exec = 'cat'
|
||||
return exec
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
theme = sys.argv[1]
|
||||
if theme == 'light':
|
||||
theme = 'ansi'
|
||||
tcolor = '31'
|
||||
color = bcolors.RED
|
||||
else:
|
||||
theme = '1337'
|
||||
tcolor = '33'
|
||||
color = bcolors.YELLOW
|
||||
|
||||
filepath = ''.join(sys.argv[2:])
|
||||
args = filepath.split(":")
|
||||
args += [None, None]
|
||||
|
||||
file = args[0]
|
||||
center = args[1]
|
||||
# print(sys.argv[2:])
|
||||
# exit(0)
|
||||
# if os.name == 'nt':
|
||||
# file += args[1]
|
||||
# center = args[2]
|
||||
|
||||
if file == None or not os.path.isfile(file):
|
||||
print("File not found {}".format(file))
|
||||
exit(0)
|
||||
|
||||
if center is None: center = 0
|
||||
|
||||
batcmd = get_preview_tool()
|
||||
cmdstr = None
|
||||
|
||||
if file[0] == '-':
|
||||
file = './' + file
|
||||
if batcmd:
|
||||
if batcmd == 'cat':
|
||||
if center:
|
||||
cmdstr = 'cat -n {} | perl -pe "s/^.*?\s{}\s.*?$/\e[1;{}m$&\e[0m/g"'.format(file, center, tcolor)
|
||||
else:
|
||||
cmdstr = 'cat -n {}'.format(file)
|
||||
elif batcmd == 'bat':
|
||||
cmdstr = 'bat --theme={} --style=numbers --color=always \
|
||||
--pager=never --highlight-line={} "{}"'.format(theme, center, file)
|
||||
if cmdstr:
|
||||
os.system(cmdstr)
|
||||
else:
|
||||
f = open(file, 'r')
|
||||
Lines = f.readlines()
|
||||
center = int(center)
|
||||
linenr = 1
|
||||
|
||||
for line in Lines:
|
||||
if linenr == center:
|
||||
print("{}{:4d} {}{}".format(color, linenr, line, bcolors.ENDC), end='')
|
||||
else:
|
||||
print("{:4d} {}".format(linenr, line), end='')
|
||||
linenr += 1
|
||||
f.close()
|
||||
|
||||
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
if has('gui') || exists('g:neovide')
|
||||
set guifont=Hack\ Nerd\ Font:h13
|
||||
|
||||
" neovide doesn't support copy from host, so we have to map it ourselves
|
||||
|
||||
if exists('g:neovide')
|
||||
|
||||
func! s:enabletp()
|
||||
let g:neovide_transparency=0.9
|
||||
endfunc
|
||||
func! s:disabletp()
|
||||
let g:neovide_transparency=1.0
|
||||
endfunc
|
||||
let g:Transparent_disable_func = function('s:disabletp')
|
||||
let g:Transparent_enable_func = function('s:enabletp')
|
||||
|
||||
let g:neovide_transparency=0.9
|
||||
" let g:neovide_transparency_point=0.8
|
||||
if g:os == 'Darwin'
|
||||
nnoremap <D-v> "+p
|
||||
cnoremap <D-v> <c-r>+
|
||||
inoremap <D-v> <c-r>+
|
||||
else
|
||||
nnoremap <C-v> "+p
|
||||
cnoremap <C-v> <c-r>+
|
||||
inoremap <C-v> <c-r>+
|
||||
endif
|
||||
endif
|
||||
|
||||
endif
|
||||
@@ -1,276 +0,0 @@
|
||||
-- The lua implementation of the fzy string matching algorithm
|
||||
|
||||
local SCORE_GAP_LEADING = -0.005
|
||||
local SCORE_GAP_TRAILING = -0.005
|
||||
local SCORE_GAP_INNER = -0.01
|
||||
local SCORE_MATCH_CONSECUTIVE = 1.0
|
||||
local SCORE_MATCH_SLASH = 0.9
|
||||
local SCORE_MATCH_WORD = 0.8
|
||||
local SCORE_MATCH_CAPITAL = 0.7
|
||||
local SCORE_MATCH_DOT = 0.6
|
||||
local SCORE_MAX = math.huge
|
||||
local SCORE_MIN = -math.huge
|
||||
local MATCH_MAX_LENGTH = 1024
|
||||
|
||||
local fzy = {}
|
||||
|
||||
-- Check if `needle` is a subsequence of the `haystack`.
|
||||
--
|
||||
-- Usually called before `score` or `positions`.
|
||||
--
|
||||
-- Args:
|
||||
-- needle (string)
|
||||
-- haystack (string)
|
||||
-- case_sensitive (bool, optional): defaults to false
|
||||
--
|
||||
-- Returns:
|
||||
-- bool
|
||||
function fzy.has_match(needle, haystack, case_sensitive)
|
||||
if not case_sensitive then
|
||||
needle = string.lower(needle)
|
||||
haystack = string.lower(haystack)
|
||||
end
|
||||
|
||||
local j = 1
|
||||
for i = 1, string.len(needle) do
|
||||
j = string.find(haystack, needle:sub(i, i), j, true)
|
||||
if not j then
|
||||
return false
|
||||
else
|
||||
j = j + 1
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local function is_lower(c)
|
||||
return c:match("%l")
|
||||
end
|
||||
|
||||
local function is_upper(c)
|
||||
return c:match("%u")
|
||||
end
|
||||
|
||||
local function precompute_bonus(haystack)
|
||||
local match_bonus = {}
|
||||
|
||||
local last_char = "/"
|
||||
for i = 1, string.len(haystack) do
|
||||
local this_char = haystack:sub(i, i)
|
||||
if last_char == "/" or last_char == "\\" then
|
||||
match_bonus[i] = SCORE_MATCH_SLASH
|
||||
elseif last_char == "-" or last_char == "_" or last_char == " " then
|
||||
match_bonus[i] = SCORE_MATCH_WORD
|
||||
elseif last_char == "." then
|
||||
match_bonus[i] = SCORE_MATCH_DOT
|
||||
elseif is_lower(last_char) and is_upper(this_char) then
|
||||
match_bonus[i] = SCORE_MATCH_CAPITAL
|
||||
else
|
||||
match_bonus[i] = 0
|
||||
end
|
||||
|
||||
last_char = this_char
|
||||
end
|
||||
|
||||
return match_bonus
|
||||
end
|
||||
|
||||
local function compute(needle, haystack, D, M, case_sensitive)
|
||||
-- Note that the match bonuses must be computed before the arguments are
|
||||
-- converted to lowercase, since there are bonuses for camelCase.
|
||||
local match_bonus = precompute_bonus(haystack)
|
||||
local n = string.len(needle)
|
||||
local m = string.len(haystack)
|
||||
|
||||
if not case_sensitive then
|
||||
needle = string.lower(needle)
|
||||
haystack = string.lower(haystack)
|
||||
end
|
||||
|
||||
-- Because lua only grants access to chars through substring extraction,
|
||||
-- get all the characters from the haystack once now, to reuse below.
|
||||
local haystack_chars = {}
|
||||
for i = 1, m do
|
||||
haystack_chars[i] = haystack:sub(i, i)
|
||||
end
|
||||
|
||||
for i = 1, n do
|
||||
D[i] = {}
|
||||
M[i] = {}
|
||||
|
||||
local prev_score = SCORE_MIN
|
||||
local gap_score = i == n and SCORE_GAP_TRAILING or SCORE_GAP_INNER
|
||||
local needle_char = needle:sub(i, i)
|
||||
|
||||
for j = 1, m do
|
||||
if needle_char == haystack_chars[j] then
|
||||
local score = SCORE_MIN
|
||||
if i == 1 then
|
||||
score = ((j - 1) * SCORE_GAP_LEADING) + match_bonus[j]
|
||||
elseif j > 1 then
|
||||
local a = M[i - 1][j - 1] + match_bonus[j]
|
||||
local b = D[i - 1][j - 1] + SCORE_MATCH_CONSECUTIVE
|
||||
score = math.max(a, b)
|
||||
end
|
||||
D[i][j] = score
|
||||
prev_score = math.max(score, prev_score + gap_score)
|
||||
M[i][j] = prev_score
|
||||
else
|
||||
D[i][j] = SCORE_MIN
|
||||
prev_score = prev_score + gap_score
|
||||
M[i][j] = prev_score
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Compute a matching score.
|
||||
--
|
||||
-- Args:
|
||||
-- needle (string): must be a subequence of `haystack`, or the result is
|
||||
-- undefined.
|
||||
-- haystack (string)
|
||||
-- case_sensitive (bool, optional): defaults to false
|
||||
--
|
||||
-- Returns:
|
||||
-- number: higher scores indicate better matches. See also `get_score_min`
|
||||
-- and `get_score_max`.
|
||||
function fzy.score(needle, haystack, case_sensitive)
|
||||
local n = string.len(needle)
|
||||
local m = string.len(haystack)
|
||||
|
||||
if n == 0 or m == 0 or m > MATCH_MAX_LENGTH or n > m then
|
||||
return SCORE_MIN
|
||||
elseif n == m then
|
||||
return SCORE_MAX
|
||||
else
|
||||
local D = {}
|
||||
local M = {}
|
||||
compute(needle, haystack, D, M, case_sensitive)
|
||||
return M[n][m]
|
||||
end
|
||||
end
|
||||
|
||||
-- Compute the locations where fzy matches a string.
|
||||
--
|
||||
-- Determine where each character of the `needle` is matched to the `haystack`
|
||||
-- in the optimal match.
|
||||
--
|
||||
-- Args:
|
||||
-- needle (string): must be a subequence of `haystack`, or the result is
|
||||
-- undefined.
|
||||
-- haystack (string)
|
||||
-- case_sensitive (bool, optional): defaults to false
|
||||
--
|
||||
-- Returns:
|
||||
-- {int,...}: indices, where `indices[n]` is the location of the `n`th
|
||||
-- character of `needle` in `haystack`.
|
||||
-- number: the same matching score returned by `score`
|
||||
function fzy.positions(needle, haystack, case_sensitive)
|
||||
local n = string.len(needle)
|
||||
local m = string.len(haystack)
|
||||
|
||||
if n == 0 or m == 0 or m > MATCH_MAX_LENGTH or n > m then
|
||||
return {}, SCORE_MIN
|
||||
elseif n == m then
|
||||
local consecutive = {}
|
||||
for i = 1, n do
|
||||
consecutive[i] = i
|
||||
end
|
||||
return consecutive, SCORE_MAX
|
||||
end
|
||||
|
||||
local D = {}
|
||||
local M = {}
|
||||
compute(needle, haystack, D, M, case_sensitive)
|
||||
|
||||
local positions = {}
|
||||
local match_required = false
|
||||
local j = m
|
||||
for i = n, 1, -1 do
|
||||
while j >= 1 do
|
||||
if D[i][j] ~= SCORE_MIN and (match_required or D[i][j] == M[i][j]) then
|
||||
match_required = (i ~= 1) and (j ~= 1) and (
|
||||
M[i][j] == D[i - 1][j - 1] + SCORE_MATCH_CONSECUTIVE)
|
||||
positions[i] = j
|
||||
j = j - 1
|
||||
break
|
||||
else
|
||||
j = j - 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return positions, M[n][m]
|
||||
end
|
||||
|
||||
-- Apply `has_match` and `positions` to an array of haystacks.
|
||||
--
|
||||
-- Args:
|
||||
-- needle (string)
|
||||
-- haystack ({string, ...})
|
||||
-- case_sensitive (bool, optional): defaults to false
|
||||
--
|
||||
-- Returns:
|
||||
-- {{idx, positions, score}, ...}: an array with one entry per matching line
|
||||
-- in `haystacks`, each entry giving the index of the line in `haystacks`
|
||||
-- as well as the equivalent to the return value of `positions` for that
|
||||
-- line.
|
||||
function fzy.filter(needle, haystacks, case_sensitive)
|
||||
local result = {}
|
||||
local idx = 1
|
||||
for line in haystacks() do
|
||||
if fzy.has_match(needle, line, case_sensitive) then
|
||||
local p, s = fzy.positions(needle, line, case_sensitive)
|
||||
table.insert(result, vim.list({idx, vim.list(p), s}))
|
||||
end
|
||||
idx = idx + 1
|
||||
end
|
||||
table.sort(result, function(a,b) return a[3] > b[3] end)
|
||||
return vim.list(result)
|
||||
end
|
||||
|
||||
-- The lowest value returned by `score`.
|
||||
--
|
||||
-- In two special cases:
|
||||
-- - an empty `needle`, or
|
||||
-- - a `needle` or `haystack` larger than than `get_max_length`,
|
||||
-- the `score` function will return this exact value, which can be used as a
|
||||
-- sentinel. This is the lowest possible score.
|
||||
function fzy.get_score_min()
|
||||
return SCORE_MIN
|
||||
end
|
||||
|
||||
-- The score returned for exact matches. This is the highest possible score.
|
||||
function fzy.get_score_max()
|
||||
return SCORE_MAX
|
||||
end
|
||||
|
||||
-- The maximum size for which `fzy` will evaluate scores.
|
||||
function fzy.get_max_length()
|
||||
return MATCH_MAX_LENGTH
|
||||
end
|
||||
|
||||
-- The minimum score returned for normal matches.
|
||||
--
|
||||
-- For matches that don't return `get_score_min`, their score will be greater
|
||||
-- than than this value.
|
||||
function fzy.get_score_floor()
|
||||
return MATCH_MAX_LENGTH * SCORE_GAP_INNER
|
||||
end
|
||||
|
||||
-- The maximum score for non-exact matches.
|
||||
--
|
||||
-- For matches that don't return `get_score_max`, their score will be less than
|
||||
-- this value.
|
||||
function fzy.get_score_ceiling()
|
||||
return MATCH_MAX_LENGTH * SCORE_MATCH_CONSECUTIVE
|
||||
end
|
||||
|
||||
-- The name of the currently-running implmenetation, "lua" or "native".
|
||||
function fzy.get_implementation_name()
|
||||
return "lua"
|
||||
end
|
||||
|
||||
return fzy
|
||||
@@ -1,18 +0,0 @@
|
||||
|
||||
if HasPlug('github-nvim-theme') then
|
||||
require('aerial').setup({
|
||||
-- optionally use on_attach to set keymaps when aerial has attached to a buffer
|
||||
layout = {
|
||||
width = 50,
|
||||
default_direction = "right",
|
||||
preserve_equality = true,
|
||||
},
|
||||
on_attach = function(bufnr)
|
||||
-- Jump forwards/backwards with '{' and '}'
|
||||
vim.keymap.set('n', '{', '<cmd>AerialPrev<CR>', { buffer = bufnr })
|
||||
vim.keymap.set('n', '}', '<cmd>AerialNext<CR>', { buffer = bufnr })
|
||||
end
|
||||
})
|
||||
-- You probably also want to set a keymap to toggle aerial
|
||||
vim.keymap.set('n', '<leader>v', '<cmd>AerialToggle!<CR>')
|
||||
end
|
||||
@@ -1,13 +0,0 @@
|
||||
|
||||
if HasPlug('github-nvim-theme') then
|
||||
-- Example config in Lua
|
||||
require("github-theme").setup({
|
||||
-- Overwrite the highlight groups
|
||||
overrides = function(c)
|
||||
return {
|
||||
NormalFloat = { link = 'Pmenu' },
|
||||
}
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
|
||||
if HasPlug('gitsigns.nvim') then
|
||||
require('gitsigns').setup({
|
||||
signcolumn = true, -- Toggle with `:Gitsigns toggle_signs`
|
||||
numhl = false, -- Toggle with `:Gitsigns toggle_numhl`
|
||||
linehl = false, -- Toggle with `:Gitsigns toggle_linehl`
|
||||
word_diff = false, -- Toggle with `:Gitsigns toggle_word_diff`
|
||||
on_attach = function(bufnr)
|
||||
local gs = package.loaded.gitsigns
|
||||
local function map(mode, l, r, opts)
|
||||
opts = opts or {}
|
||||
opts.buffer = bufnr
|
||||
vim.keymap.set(mode, l, r, opts)
|
||||
end
|
||||
|
||||
-- Navigation
|
||||
map('n', ']c', function()
|
||||
if vim.wo.diff then return ']c' end
|
||||
vim.schedule(function() gs.next_hunk() end)
|
||||
return '<Ignore>'
|
||||
end, { expr = true })
|
||||
|
||||
map('n', '[c', function()
|
||||
if vim.wo.diff then return '[c' end
|
||||
vim.schedule(function() gs.prev_hunk() end)
|
||||
return '<Ignore>'
|
||||
end, { expr = true })
|
||||
|
||||
-- Actions
|
||||
map({ 'n', 'v' }, '<leader>hs', ':Gitsigns stage_hunk<CR>')
|
||||
map({ 'n', 'v' }, '<leader>hr', ':Gitsigns reset_hunk<CR>')
|
||||
map('n', '<leader>hS', gs.stage_buffer)
|
||||
map('n', '<leader>hu', gs.undo_stage_hunk)
|
||||
map('n', '<leader>hR', gs.reset_buffer)
|
||||
map('n', '<leader>hp', gs.preview_hunk)
|
||||
map('n', '<leader>hb', function() gs.blame_line { full = true } end)
|
||||
map('n', '<leader>tb', gs.toggle_current_line_blame)
|
||||
map('n', '<leader>hd', gs.diffthis)
|
||||
map('n', '<leader>hD', function() gs.diffthis('~') end)
|
||||
map('n', '<leader>td', gs.toggle_deleted)
|
||||
|
||||
-- Text object
|
||||
map({ 'o', 'x' }, 'ih', ':<C-U>Gitsigns select_hunk<CR>')
|
||||
end
|
||||
})
|
||||
vim.fn['theme#addCleanBg']({ 'GitSignsAdd', 'GitSignsStagedChange',
|
||||
'GitSignsStagedDelete', 'GitSignsDelete', 'GitSignsChange',
|
||||
'GitGutterAdd', 'GitGutterChange', 'GitGutterDelete', 'GitGutterChangeDelete',
|
||||
})
|
||||
end
|
||||
@@ -1,4 +0,0 @@
|
||||
|
||||
if HasPlug('impatient.nvim') then
|
||||
require('impatient')
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
|
||||
if not Animation_enable then
|
||||
if HasPlug('indent-blankline.nvim') then
|
||||
-- Example config in Lua
|
||||
require("ibl").setup {
|
||||
exclude = {
|
||||
buftypes = {"lspinfo", "packer", "checkhealth",
|
||||
"help", "man", "", "startify"},
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
@@ -1,60 +0,0 @@
|
||||
-------------------OPTIONS-----------------------
|
||||
|
||||
-- enable animation of command like "<C-u>" and "<C-d>", or cursor
|
||||
-- jump animation. (Performence will be effected)
|
||||
Animation_enable = vim.g.animation_enable
|
||||
High_performence = vim.g.high_performence
|
||||
|
||||
-- false basicly enable plugins like noice, nvim-notify etc.
|
||||
Classic_vim_ui = vim.g.classic_vim_ui
|
||||
|
||||
|
||||
------------------VIM OPTIONS-----------------------
|
||||
|
||||
vim.o.signcolumn = 'auto:2'
|
||||
|
||||
------------------UTILITIES----------------------
|
||||
|
||||
Vim_version = vim.version()
|
||||
Vim_version_minor = Vim_version['minor']
|
||||
|
||||
function HasPlug(name)
|
||||
return vim.fn['utils#hasplug'](name)
|
||||
end
|
||||
|
||||
-- use to print object
|
||||
function _G.put(...)
|
||||
local objects = {}
|
||||
for i = 1, select('#', ...) do
|
||||
local v = select(i, ...)
|
||||
table.insert(objects, vim.inspect(v))
|
||||
end
|
||||
|
||||
print(table.concat(objects, '\n'))
|
||||
return ...
|
||||
end
|
||||
|
||||
Which_key = nil
|
||||
function Wk_register(opt)
|
||||
if Which_key == nil then
|
||||
return
|
||||
end
|
||||
Which_key.register(opt)
|
||||
end
|
||||
|
||||
Show_icon = false
|
||||
if HasPlug('nvim-web-devicons') then
|
||||
Show_icon = true
|
||||
end
|
||||
|
||||
|
||||
----------------CONFIGURATION--------------------
|
||||
|
||||
local plugin_setting_paths = vim.fn.split(vim.fn.glob(vim.g.dotvimdir
|
||||
.. "/lua/lua-plugin-settings/*config.lua"), '\n')
|
||||
local plugin_settings = vim.fn.map(plugin_setting_paths, 'fnamemodify(v:val, ":t:r")')
|
||||
|
||||
for _idx, name in pairs(plugin_settings) do
|
||||
require('lua-plugin-settings.'..name)
|
||||
end
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
|
||||
if HasPlug('iron.nvim') then
|
||||
local iron = require("iron.core")
|
||||
|
||||
iron.setup {
|
||||
config = {
|
||||
-- Whether a repl should be discarded or not
|
||||
scratch_repl = true,
|
||||
-- Your repl definitions come here
|
||||
repl_definition = {
|
||||
sh = {
|
||||
-- Can be a table or a function that
|
||||
-- returns a table (see below)
|
||||
command = { "zsh" }
|
||||
}
|
||||
},
|
||||
-- How the repl window will be displayed
|
||||
-- See below for more information
|
||||
repl_open_cmd = require('iron.view').bottom(40),
|
||||
},
|
||||
-- Iron doesn't set keymaps by default anymore.
|
||||
-- You can set them here or manually add keymaps to the functions in iron.core
|
||||
keymaps = {
|
||||
send_motion = "<space>sc",
|
||||
visual_send = "<space>sc",
|
||||
send_file = "<space>sf",
|
||||
send_line = "<space>sl",
|
||||
send_mark = "<space>sm",
|
||||
mark_motion = "<space>mc",
|
||||
mark_visual = "<space>mc",
|
||||
remove_mark = "<space>md",
|
||||
cr = "<space>s<cr>",
|
||||
interrupt = "<space>s<space>",
|
||||
exit = "<space>sq",
|
||||
clear = "<space>cl",
|
||||
},
|
||||
-- If the highlight is on, you can change how it looks
|
||||
-- For the available options, check nvim_set_hl
|
||||
highlight = {
|
||||
italic = true
|
||||
},
|
||||
ignore_blank_lines = true, -- ignore blank lines when sending visual select lines
|
||||
}
|
||||
|
||||
-- iron also has a list of commands, see :h iron-commands for all available commands
|
||||
vim.keymap.set('n', '<space>rs', '<cmd>IronRepl<cr>')
|
||||
vim.keymap.set('n', '<space>rr', '<cmd>IronRestart<cr>')
|
||||
vim.keymap.set('n', '<space>rf', '<cmd>IronFocus<cr>')
|
||||
vim.keymap.set('n', '<space>rh', '<cmd>IronHide<cr>')
|
||||
end
|
||||
@@ -1,4 +0,0 @@
|
||||
|
||||
if HasPlug('leap.nvim') then
|
||||
require('leap').add_default_mappings()
|
||||
end
|
||||
@@ -1,108 +0,0 @@
|
||||
|
||||
if HasPlug('lualine.nvim') then
|
||||
|
||||
-- custom lualine plugin show coc lsp status
|
||||
local function cocstatus()
|
||||
local loading = { "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏" }
|
||||
local step = #loading
|
||||
local ok, result = pcall(vim.fn.CocAction, 'services')
|
||||
if not ok then
|
||||
return
|
||||
end
|
||||
local ft = vim.bo.filetype
|
||||
local state, id
|
||||
for _, entry in ipairs(result) do
|
||||
if entry['languageIds'][1] == ft then
|
||||
state = entry['state']
|
||||
id = entry['id']
|
||||
break
|
||||
end
|
||||
end
|
||||
local speed = 1600
|
||||
local loadidx = (vim.loop.now() % speed)
|
||||
local msg = id
|
||||
if state == "starting" then
|
||||
return msg .. " " .. loading[math.floor(loadidx / (step * (speed / 100))) + 1]
|
||||
elseif state == "running" then
|
||||
return msg
|
||||
end
|
||||
return ''
|
||||
end
|
||||
|
||||
local _section_x = {}
|
||||
local _section_y = {}
|
||||
-- if HasPlug('coc.nvim') then table.insert(_section_x, cocstatus) end
|
||||
table.insert(_section_x, cocstatus)
|
||||
local disabled_filetypes_data = {}
|
||||
if Vim_version_minor < 7 then
|
||||
-- globalstatus only work for nvim >= 0.7
|
||||
disabled_filetypes_data = { -- Filetypes to disable lualine for.
|
||||
statusline = {}, -- only ignores the ft for statusline.
|
||||
winbar = {}, -- only ignores the ft for winbar.
|
||||
'NvimTree',
|
||||
'vista',
|
||||
}
|
||||
end
|
||||
|
||||
local opt = {
|
||||
options = {
|
||||
icons_enabled = Show_icon,
|
||||
theme = 'auto', -- lualine theme
|
||||
-- component_separators = { left = '', right = ''},
|
||||
-- section_separators = { left = '', right = ''},
|
||||
component_separators = { left = '', right = '' },
|
||||
section_separators = { left = '', right = '' },
|
||||
always_divide_middle = false,
|
||||
globalstatus = true,
|
||||
disabled_filetypes = disabled_filetypes_data,
|
||||
refresh = { statusline = 200 }
|
||||
},
|
||||
sections = {
|
||||
lualine_a = { 'mode' },
|
||||
lualine_b = {},
|
||||
lualine_c = {
|
||||
{
|
||||
'buffers',
|
||||
mode = 2,
|
||||
max_length = function()
|
||||
return vim.o.columns - 30
|
||||
end,
|
||||
filetype_names = {
|
||||
TelescopePrompt = 'Telescope',
|
||||
dashboard = 'Dashboard',
|
||||
packer = 'Packer',
|
||||
fzf = 'FZF',
|
||||
alpha = 'Alpha',
|
||||
NvimTree = 'NvimTree',
|
||||
vista = 'Vista',
|
||||
},
|
||||
symbols = {
|
||||
alternate_file = '',
|
||||
},
|
||||
}
|
||||
},
|
||||
-- lualine_x = {'encoding', 'fileformat', 'filetype'},
|
||||
lualine_x = _section_x,
|
||||
lualine_y = _section_y,
|
||||
lualine_z = { 'location' }
|
||||
},
|
||||
}
|
||||
|
||||
require('lualine').setup(opt)
|
||||
|
||||
vim.fn['theme#addTransGroup']({'lualine_c_inactive', 'lualine_c_normal'})
|
||||
|
||||
vim.o.fillchars ='eob: ,vert:│,stl: ,stlnc: ,'
|
||||
|
||||
for i = 1, 9 do
|
||||
-- :nnoremap <silent> <Leader>1 :LualineBuffersJump 1<CR>
|
||||
vim.api.nvim_set_keymap('n', '<Leader>' .. i, ':LualineBuffersJump ' .. i .. '<CR>',
|
||||
{ noremap = true, silent = true, nowait = true })
|
||||
end
|
||||
for i = 10, 20 do
|
||||
-- :nnoremap <silent> <Leader>1 :LualineBuffersJump 1<CR>
|
||||
vim.api.nvim_set_keymap('n', '<Space>' .. i, ':LualineBuffersJump ' .. i .. '<CR>',
|
||||
{ noremap = true, silent = true, nowait = true })
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
|
||||
if HasPlug('mini.animate') and Animation_enable then
|
||||
local animate = require('mini.animate')
|
||||
animate.setup({
|
||||
cursor = {
|
||||
-- Whether to enable this animation
|
||||
enable = true,
|
||||
-- Timing of animation (how steps will progress in time)
|
||||
-- timing = --<function: implements linear total 250ms animation duration>,
|
||||
},
|
||||
scroll = {
|
||||
-- Whether to enable this animation
|
||||
enable = true,
|
||||
-- Timing of animation (how steps will progress in time)
|
||||
timing = animate.gen_timing.linear({ duration = 150, unit = 'total' }),
|
||||
},
|
||||
open = {
|
||||
-- Whether to enable this animation
|
||||
enable = false,
|
||||
},
|
||||
})
|
||||
vim.api.nvim_create_autocmd("FileType", {
|
||||
pattern = { "help", "alpha", "dashboard", "neo-tree", "Trouble", "lazy", "mason",
|
||||
"NvimTree", "vista", "toggleterm", "noice" },
|
||||
callback = function()
|
||||
vim.b.minianimate_disable = true
|
||||
end,
|
||||
})
|
||||
end
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
|
||||
if HasPlug('mini.colors') then
|
||||
require('mini.colors').setup()
|
||||
end
|
||||
@@ -1,21 +0,0 @@
|
||||
|
||||
if HasPlug('mini.indentscope') then
|
||||
MiniIndentscope = require('mini.indentscope')
|
||||
MiniIndentscope.setup({
|
||||
symbol = '│',
|
||||
-- draw = {
|
||||
-- animation = MiniIndentscope.gen_animation.linear({
|
||||
-- easing = 'out',
|
||||
-- duration = 150,
|
||||
-- unit = 'total'
|
||||
-- })
|
||||
-- },
|
||||
})
|
||||
vim.api.nvim_create_autocmd("FileType", {
|
||||
pattern = { "help", "alpha", "dashboard", "neo-tree", "Trouble", "lazy", "mason",
|
||||
"NvimTree", "vista", "startify", "toggleterm" },
|
||||
callback = function()
|
||||
vim.b.miniindentscope_disable = true
|
||||
end,
|
||||
})
|
||||
end
|
||||
@@ -1,47 +0,0 @@
|
||||
if not Classic_vim_ui
|
||||
and HasPlug('noice.nvim')
|
||||
and HasPlug('nvim-notify')
|
||||
and HasPlug('nui.nvim') then
|
||||
|
||||
require("noice").setup({
|
||||
lsp = {
|
||||
-- override markdown rendering so that **cmp** and other plugins use **Treesitter**
|
||||
override = {
|
||||
["vim.lsp.util.convert_input_to_markdown_lines"] = true,
|
||||
["vim.lsp.util.stylize_markdown"] = true,
|
||||
["cmp.entry.get_documentation"] = true,
|
||||
},
|
||||
},
|
||||
presets = {
|
||||
bottom_search = true, -- use a classic bottom cmdline for search
|
||||
-- command_palette = true, -- position the cmdline and popupmenu together
|
||||
long_message_to_split = true, -- long messages will be sent to a split
|
||||
inc_rename = false, -- enables an input dialog for inc-rename.nvim
|
||||
lsp_doc_border = false, -- add a border to hover docs and signature help
|
||||
},
|
||||
cmdline = {
|
||||
enabled = true, -- enables the Noice cmdline UI
|
||||
view = "cmdline", -- view for rendering the cmdline. Change to `cmdline` to get a classic cmdline at the bottom
|
||||
opts = {}, -- global options for the cmdline. See section on views
|
||||
format = {
|
||||
-- cmdline = false,
|
||||
search_down = false,
|
||||
search_up = false,
|
||||
help = { pattern = '', icon = '' },
|
||||
},
|
||||
},
|
||||
messages = {
|
||||
-- NOTE: If you enable messages, then the cmdline is enabled automatically.
|
||||
-- This is a current Neovim limitation.
|
||||
enabled = true, -- enables the Noice messages UI
|
||||
view = "notify", -- default view for messages
|
||||
view_error = "notify", -- view for errors
|
||||
view_warn = "notify", -- view for warnings
|
||||
view_history = "messages", -- view for :messages
|
||||
view_search = false, -- view for search count messages. Set to `false` to disable
|
||||
},
|
||||
})
|
||||
|
||||
vim.fn['theme#addTransGroup']({'NotifyERRORBody', 'NotifyWARNBody', 'NotifyINFOBody', 'NotifyDEBUGBody', 'NotifyTRACEBody',
|
||||
'NotifyERRORBorder', 'NotifyWARNBorder', 'NotifyINFOBorder', 'NotifyDEBUGBorder', 'NotifyTRACEBorder'})
|
||||
end
|
||||
@@ -1,17 +0,0 @@
|
||||
|
||||
if HasPlug('nvim-scrollbar') then
|
||||
require("scrollbar").setup({
|
||||
excluded_filetypes = {
|
||||
"prompt",
|
||||
"TelescopePrompt",
|
||||
"noice",
|
||||
"startify",
|
||||
"vista",
|
||||
},
|
||||
excluded_buftypes = {
|
||||
"terminal",
|
||||
"nofile",
|
||||
"help",
|
||||
},
|
||||
})
|
||||
end
|
||||
@@ -1,68 +0,0 @@
|
||||
|
||||
if HasPlug('nvim-tree.lua') then
|
||||
|
||||
local api = require('nvim-tree.api')
|
||||
local M = {}
|
||||
|
||||
function M.print_node_path()
|
||||
local node = api.tree.get_node_under_cursor()
|
||||
print(node.absolute_path)
|
||||
end
|
||||
|
||||
function M.on_attach(bufnr)
|
||||
local function opts(desc)
|
||||
return { desc = 'nvim-tree: ' .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true }
|
||||
end
|
||||
-- vim.keymap.set('n', 'u', api.node.navigate.parent, opts('Parent Directory'))
|
||||
vim.keymap.set('n', 'u', api.tree.change_root_to_parent, opts('Up'))
|
||||
vim.keymap.set('n', 'a', api.fs.create, opts('Create'))
|
||||
vim.keymap.set('n', 'dd', api.fs.remove, opts('Delete'))
|
||||
vim.keymap.set('n', 'rn', api.fs.rename_basename, opts('Rename: Basename'))
|
||||
vim.keymap.set('n', 'I', api.tree.toggle_gitignore_filter, opts('Toggle Git Ignore'))
|
||||
vim.keymap.set('n', 'cd', api.tree.change_root_to_node, opts('CD'))
|
||||
vim.keymap.set('n', 'X', api.tree.collapse_all, opts('Collapse'))
|
||||
vim.keymap.set('n', 'O', api.tree.expand_all, opts('Expand All'))
|
||||
vim.keymap.set('n', 'p', M.print_node_path, opts('Print node path'))
|
||||
vim.keymap.set('n', 'o', api.node.open.edit, opts('Open'))
|
||||
vim.keymap.set('n', '<CR>', api.node.open.edit, opts('Open'))
|
||||
end
|
||||
|
||||
vim.api.nvim_set_keymap('n', '<Leader>e', ':NvimTreeFindFileToggle<CR>',
|
||||
{ desc = 'Toggle nvim-tree', noremap = true, silent = true, nowait = true })
|
||||
|
||||
require("nvim-tree").setup({
|
||||
sync_root_with_cwd = true,
|
||||
respect_buf_cwd = true,
|
||||
update_focused_file = {
|
||||
enable = true,
|
||||
update_root = true,
|
||||
},
|
||||
sort_by = "case_sensitive",
|
||||
on_attach = M.on_attach,
|
||||
view = {
|
||||
width = 30,
|
||||
},
|
||||
filters = {
|
||||
dotfiles = false,
|
||||
},
|
||||
git = {
|
||||
ignore = false,
|
||||
},
|
||||
actions = {
|
||||
open_file = {
|
||||
quit_on_open = true,
|
||||
resize_window = true,
|
||||
window_picker = {
|
||||
exclude = {
|
||||
filetype = { "notify", "packer", "qf", "diff", "fugitive", "fugitiveblame", "vista" },
|
||||
buftype = { "nofile", "terminal", "help" },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
vim.fn['theme#addTransGroup']({'NvimTreeWinSeparator', 'NvimTreeNormal', 'NvimTreeNormalNC'})
|
||||
|
||||
end
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
if HasPlug('nvim-treesitter') then
|
||||
require('nvim-treesitter.configs').setup {
|
||||
ensure_installed = { "c", "bash", "lua", "python", "vim" },
|
||||
sync_install = false,
|
||||
auto_install = true,
|
||||
highlight = {
|
||||
enable = true,
|
||||
additional_vim_regex_highlighting = false,
|
||||
},
|
||||
indent = {
|
||||
enable = true
|
||||
}
|
||||
}
|
||||
vim.o.foldmethod = 'expr'
|
||||
vim.o.foldexpr = 'nvim_treesitter#foldexpr()'
|
||||
end
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
|
||||
if HasPlug('project.nvim') then
|
||||
require("project_nvim").setup {
|
||||
detection_methods = { "lsp", "pattern" },
|
||||
patterns = { ".git" },
|
||||
|
||||
-- Don't calculate root dir on specific directories
|
||||
-- Ex: { "~/.cargo/*", ... }
|
||||
exclude_dirs = {},
|
||||
-- Show hidden files in telescope
|
||||
show_hidden = false,
|
||||
-- When set to false, you will get a message when project.nvim changes your
|
||||
-- directory.
|
||||
silent_chdir = true,
|
||||
-- Path where project.nvim will store the project history for use in
|
||||
-- telescope
|
||||
datapath = vim.g.vim_dir .. "/.vimproject/"
|
||||
}
|
||||
|
||||
-- if HasPlug('telescope.nvim') then
|
||||
-- require('telescope').load_extension('projects')
|
||||
-- vim.keymap.set('n', '<leader>fp', require'telescope'.extensions.projects.projects,
|
||||
-- { desc = "Lists projects" })
|
||||
-- end
|
||||
|
||||
end
|
||||
@@ -1,109 +0,0 @@
|
||||
if HasPlug('telescope.nvim') then
|
||||
local actions = require("telescope.actions")
|
||||
local action_state = require "telescope.actions.state"
|
||||
local telescope = require("telescope")
|
||||
local builtin = require('telescope.builtin')
|
||||
local telescopeConfig = require("telescope.config")
|
||||
local vimgrep_arguments = { unpack(telescopeConfig.values.vimgrep_arguments) }
|
||||
table.insert(vimgrep_arguments, "--hidden")
|
||||
|
||||
require('telescope.pickers.layout_strategies').horizontal_merged = function(picker, max_columns, max_lines,
|
||||
layout_config)
|
||||
local layout = require('telescope.pickers.layout_strategies').horizontal(picker, max_columns, max_lines,
|
||||
layout_config)
|
||||
layout.prompt.title = ''
|
||||
layout.results.title = ''
|
||||
-- layout.prompt.borderchars = { '─', '│', '─', '│', '┌', '┐', '┘', '└' }
|
||||
return layout
|
||||
end
|
||||
telescope.setup {
|
||||
pickers = {
|
||||
colorscheme = {
|
||||
enable_preview = true,
|
||||
mappings = {
|
||||
i = {
|
||||
["<CR>"] = function(bufnr)
|
||||
local selection = action_state.get_selected_entry()
|
||||
actions.select_default()
|
||||
local bg = vim.o.background
|
||||
vim.fn['theme#setColor'](bg, selection.value)
|
||||
end,
|
||||
},
|
||||
},
|
||||
}
|
||||
},
|
||||
defaults = {
|
||||
hidden = true,
|
||||
vimgrep_arguments = vimgrep_arguments,
|
||||
file_ignore_patterns = {"^node_modules/", "^.git/"},
|
||||
layout_config = {
|
||||
-- prompt_position = "top",
|
||||
},
|
||||
layout_strategy = "horizontal_merged",
|
||||
},
|
||||
extensions = {
|
||||
fzf = {
|
||||
fuzzy = true, -- false will only do exact matching
|
||||
override_generic_sorter = true,
|
||||
override_file_sorter = true,
|
||||
case_mode = "smart_case", -- or "ignore_case" or "respect_case"
|
||||
}
|
||||
}
|
||||
}
|
||||
if HasPlug('telescope-fzf-native.nvim') then
|
||||
telescope.load_extension('fzf')
|
||||
end
|
||||
|
||||
vim.fn['theme#addCleanBg']({ 'TelescopeNormal', 'TelescopeBorder', 'TelescopePromptNormal',
|
||||
'TelescopePromptBorder', 'TelescopePromptPrefix', 'TelescopeResultsTitle', 'TelescopePreviewTitle',
|
||||
'TelescopePromptTitle', 'TelescopePromptCounter' })
|
||||
|
||||
vim.keymap.set('n', '<leader>ff', builtin.find_files, { desc = "Search files inside cwd" })
|
||||
-- need to install ripgrep
|
||||
vim.keymap.set('n', '<leader>fr', builtin.live_grep, { desc = "Regex search inside files" })
|
||||
vim.keymap.set('n', '<leader>fb', builtin.buffers, { desc = "Search buffers" })
|
||||
vim.keymap.set('n', '<leader>fc', builtin.colorscheme, { desc = "Search colorscheme" })
|
||||
vim.keymap.set('n', '<leader>fs', builtin.treesitter, { desc = "Lists Function names, variables, from Treesitter!" })
|
||||
vim.keymap.set('n', '<leader>fh', builtin.highlights, { desc = "Lists highlight" })
|
||||
vim.keymap.set('n', '<leader>fd', builtin.help_tags, { desc = "Lists highlight" })
|
||||
|
||||
Wk_register({ ["<leader>f"] = { name = "+Telescope" } })
|
||||
|
||||
vim.api.nvim_create_autocmd("User", {
|
||||
pattern = "TelescopePreviewerLoaded",
|
||||
command = "setlocal wrap number"
|
||||
})
|
||||
|
||||
-- options picker
|
||||
local pickers = require "telescope.pickers"
|
||||
local finders = require "telescope.finders"
|
||||
local conf = require("telescope.config").values
|
||||
|
||||
function _G.telescope_option_picker()
|
||||
local opts = require("telescope.themes").get_dropdown {}
|
||||
pickers.new(opts, {
|
||||
prompt_title = "Options",
|
||||
finder = finders.new_table {
|
||||
results = vim.fn['options#getAll'](),
|
||||
entry_maker = function(entry)
|
||||
return {
|
||||
value = entry,
|
||||
display = entry[2],
|
||||
ordinal = entry[2],
|
||||
}
|
||||
end
|
||||
},
|
||||
sorter = conf.generic_sorter(opts),
|
||||
attach_mappings = function(prompt_bufnr, map)
|
||||
actions.select_default:replace(function()
|
||||
actions.close(prompt_bufnr)
|
||||
local selection = action_state.get_selected_entry()
|
||||
vim.fn['options#toggle'](selection['value'][1])
|
||||
end)
|
||||
return true
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
vim.keymap.set('n', '<leader>fo', telescope_option_picker, { desc = "Lists Function names, variables, from Treesitter!" })
|
||||
end
|
||||
@@ -1,79 +0,0 @@
|
||||
|
||||
if HasPlug('toggleterm.nvim') then
|
||||
require("toggleterm").setup({
|
||||
|
||||
open_mapping = [[<c-\>]],
|
||||
direction = 'float',
|
||||
float_opts = {
|
||||
border = 'rounded',
|
||||
width = function(term) return math.floor(vim.o.columns * 0.5) end,
|
||||
height = function(term) return math.floor(vim.o.lines * 0.5) end,
|
||||
winblend = 20,
|
||||
row = vim.o.lines * 0.5 - 3,
|
||||
col = vim.o.columns * 0.5,
|
||||
},
|
||||
})
|
||||
function _G.set_terminal_keymaps()
|
||||
local opts = { buffer = 0 }
|
||||
vim.keymap.set('t', '<esc>', [[<C-\><C-n>]], opts)
|
||||
vim.keymap.set('t', 'jk', [[<C-\><C-n>]], opts)
|
||||
vim.keymap.set('t', '<C-h>', [[<Cmd>wincmd h<CR>]], opts)
|
||||
vim.keymap.set('t', '<C-j>', [[<Cmd>wincmd j<CR>]], opts)
|
||||
vim.keymap.set('t', '<C-k>', [[<Cmd>wincmd k<CR>]], opts)
|
||||
vim.keymap.set('t', '<C-l>', [[<Cmd>wincmd l<CR>]], opts)
|
||||
vim.keymap.set('t', '<C-w>', [[<C-\><C-n><C-w>]], opts)
|
||||
end
|
||||
|
||||
-- vim.cmd('autocmd TermOpen term://* lua set_terminal_keymaps()')
|
||||
vim.cmd('autocmd FileType toggleterm lua set_terminal_keymaps()')
|
||||
|
||||
local Terminal = require('toggleterm.terminal').Terminal
|
||||
|
||||
local ipythonId = 779
|
||||
local ipython = Terminal:new({
|
||||
size = function(term)
|
||||
if term.direction == "horizontal" then
|
||||
return 15 elseif term.direction == "vertical" then
|
||||
return vim.o.columns * 0.4
|
||||
end
|
||||
end,
|
||||
cmd = "ipython",
|
||||
hidden = true,
|
||||
direction = "vertical",
|
||||
close_on_exit = false,
|
||||
auto_scroll = true,
|
||||
id = ipythonId,
|
||||
})
|
||||
|
||||
function _ipython_toggle()
|
||||
local currentWindow=vim.fn.winnr()
|
||||
ipython:toggle(vim.o.columns * 0.5, 'vertical')
|
||||
vim.cmd(currentWindow .. "wincmd w")
|
||||
end
|
||||
|
||||
vim.api.nvim_set_keymap("n", "<leader>tp", "<cmd>lua _ipython_toggle()<CR>", { noremap = true, silent = true })
|
||||
|
||||
vim.api.nvim_set_keymap("n", "<leader>tl", string.format("<cmd>ToggleTermSendCurrentLine %d<CR>", ipythonId),
|
||||
{ noremap = true, silent = true })
|
||||
-- sends all the (whole) lines in your visual selection
|
||||
vim.api.nvim_set_keymap("v", "<leader>tl", string.format(":ToggleTermSendVisualLines %d<CR>", ipythonId),
|
||||
{ noremap = true, silent = true })
|
||||
-- sends only the visually selected text (this can be a block of text
|
||||
vim.api.nvim_set_keymap("x", "<leader>tl", string.format(":ToggleTermSendVisualSelection %d<CR>", ipythonId),
|
||||
{ noremap = true, silent = true })
|
||||
|
||||
|
||||
print(vim.o.shell)
|
||||
if vim.o.shell == 'pwsh' or vim.o.shell == 'powershell' then
|
||||
local powershell_options = {
|
||||
shellcmdflag = "-NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command [Console]::InputEncoding=[Console]::OutputEncoding=[System.Text.Encoding]::UTF8;",
|
||||
shellredir = "-RedirectStandardOutput %s -NoNewWindow -Wait",
|
||||
shellpipe = "2>&1 | Out-File -Encoding UTF8 %s; exit $LastExitCode",
|
||||
shellquote = "",
|
||||
shellxquote = "",
|
||||
}
|
||||
for option, value in pairs(powershell_options) do
|
||||
vim.opt[option] = value
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,30 +0,0 @@
|
||||
if HasPlug('vim-illuminate') then
|
||||
local illuminate = require('illuminate')
|
||||
illuminate.configure({
|
||||
providers = {
|
||||
'lsp',
|
||||
'treesitter',
|
||||
'regex',
|
||||
},
|
||||
delay = 0,
|
||||
filetype_overrides = {},
|
||||
filetypes_denylist = {
|
||||
'dirvish',
|
||||
'fugitive',
|
||||
'NvimTree',
|
||||
'help',
|
||||
'vista',
|
||||
'aerial',
|
||||
},
|
||||
filetypes_allowlist = {},
|
||||
modes_denylist = {},
|
||||
modes_allowlist = {},
|
||||
providers_regex_syntax_denylist = {},
|
||||
providers_regex_syntax_allowlist = {},
|
||||
under_cursor = true,
|
||||
large_file_cutoff = nil,
|
||||
large_file_overrides = nil,
|
||||
min_count_to_highlight = 1,
|
||||
})
|
||||
end
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
|
||||
if HasPlug('which-key.nvim') then
|
||||
Which_key = require("which-key")
|
||||
Which_key.setup({
|
||||
triggers_blacklist = {
|
||||
i = { "j", "k" },
|
||||
v = { "j", "k" },
|
||||
c = { "w" },
|
||||
},
|
||||
})
|
||||
end
|
||||
@@ -1,9 +0,0 @@
|
||||
|
||||
if exists("g:loaded_vim_config")
|
||||
finish
|
||||
endif
|
||||
let g:loaded_vim_config = 1
|
||||
|
||||
let os = os#getOS()
|
||||
|
||||
call options#init()
|
||||
@@ -1,6 +0,0 @@
|
||||
|
||||
if utils#hasplug('Copilot.vim')
|
||||
" imap <expr> <C-n> <Plug>(copilot-next)
|
||||
" imap <expr> <C-p> <Plug>(copilot-prev)
|
||||
endif
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
|
||||
if utils#hasplug('coc-fzf')
|
||||
|
||||
let g:coc_fzf_preview = 'right:50%'
|
||||
nnoremap <silent> <leader>fs :CocFzfList outline<CR>
|
||||
let s:preview_exe = expand(g:dotvimdir.'/bin/preview.py')
|
||||
let g:coc_fzf_opts = ['--border-label', 'Coc Outlines', '--border-label-pos', '9', '--no-scrollbar', '--no-hscroll', '--no-separator']
|
||||
endif
|
||||
@@ -1,184 +0,0 @@
|
||||
if utils#hasplug('coc.nvim')
|
||||
" let g:coc_global_extensions = ['coc-pyright', 'coc-tsserver', 'coc-vimlsp',
|
||||
" \ 'coc-marksman']
|
||||
|
||||
" for tabline info
|
||||
" coc-sumneko-lua offers autocomplete for neovim lua api
|
||||
let g:coc_global_extensions = ['coc-nav', 'coc-sumneko-lua']
|
||||
|
||||
" warning that coc work best for vim >= 8.3
|
||||
let g:coc_disable_startup_warning = 1
|
||||
|
||||
let g:coc_data_home = g:vim_dir . '/coc'
|
||||
let g:coc_config_home = g:vim_dir . '/coc'
|
||||
|
||||
" Use <c-space> to trigger completion.
|
||||
if has('nvim')
|
||||
inoremap <silent><expr> <c-space> coc#refresh()
|
||||
else
|
||||
inoremap <silent><expr> <c-@> coc#refresh()
|
||||
endif
|
||||
|
||||
set updatetime=300
|
||||
|
||||
" Make <CR> auto-select the first completion item and notify coc.nvim to
|
||||
" format on enter, <cr> could be remapped by other vim plugin
|
||||
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
|
||||
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"
|
||||
|
||||
" GoTo code navigation.
|
||||
nmap <silent> gd <Plug>(coc-definition)
|
||||
nmap <silent> gy <Plug>(coc-type-definition)
|
||||
nmap <silent> gi <Plug>(coc-implementation)
|
||||
nmap <silent> gr <Plug>(coc-references)
|
||||
|
||||
" Use K to show documentation in preview window.
|
||||
nnoremap <silent> K :call <SID>show_documentation()<CR>
|
||||
|
||||
function! s:show_documentation()
|
||||
if CocAction('hasProvider', 'hover')
|
||||
call CocActionAsync('doHover')
|
||||
else
|
||||
call feedkeys('K', 'in')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
" Symbol renaming.
|
||||
nmap <leader>rn <Plug>(coc-rename)
|
||||
|
||||
" Formatting selected code.
|
||||
xmap <space>f <Plug>(coc-format-selected)
|
||||
nmap <space>f <Plug>(coc-format-selected)
|
||||
|
||||
augroup mygroup
|
||||
autocmd!
|
||||
" Setup formatexpr specified filetype(s).
|
||||
autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
|
||||
" Update signature help on jump placeholder.
|
||||
autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
|
||||
augroup end
|
||||
|
||||
" Apply AutoFix to problem on the current line.
|
||||
nmap <leader>qf <Plug>(coc-fix-current)
|
||||
|
||||
" Remap <C-f> and <C-b> for scroll float windows/popups.
|
||||
if has('nvim-0.4.0') || has('patch-8.2.0750')
|
||||
nnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
|
||||
nnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
|
||||
inoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>"
|
||||
inoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>"
|
||||
vnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
|
||||
vnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
|
||||
endif
|
||||
|
||||
" Mappings for CoCList
|
||||
" Show all diagnostics.
|
||||
nnoremap <silent><nowait> <space>a :<C-u>CocList diagnostics<cr>
|
||||
" Manage extensions.
|
||||
" nnoremap <silent><nowait> <space>e :<C-u>CocList extensions<cr>
|
||||
" Show commands.
|
||||
nnoremap <silent><nowait> <space>c :<C-u>CocList commands<cr>
|
||||
" Find symbol of current document.
|
||||
nnoremap <silent><nowait> <space>o :<C-u>CocList outline<cr>
|
||||
" Search workspace symbols.
|
||||
nnoremap <silent><nowait> <space>s :<C-u>CocList -I symbols<cr>
|
||||
" Do default action for next item.
|
||||
nnoremap <silent><nowait> <space>j :<C-u>CocNext<CR>
|
||||
" Do default action for previous item.
|
||||
nnoremap <silent><nowait> <space>k :<C-u>CocPrev<CR>
|
||||
" Resume latest coc list.
|
||||
nnoremap <silent><nowait> <space>p :<C-u>CocListResume<CR>
|
||||
|
||||
"COC LSP SETTING
|
||||
let g:coc_user_config = {
|
||||
\ 'suggest.noselect': v:true,
|
||||
\ 'suggest.enablePreselect': v:false, }
|
||||
|
||||
call coc#config("java.jdt.ls.vmargs", '-javaagent:' . g:dotfiledir . '/config/coc/java/lombok-1.18.26.jar')
|
||||
call coc#config("java.jdt.ls.lombokSupport.enabled", v:false)
|
||||
call coc#config("java.inlayHints.parameterNames.enabled", v:false)
|
||||
call coc#config("inlayHint.enable", v:false)
|
||||
|
||||
if has('nvim')
|
||||
" nvim has tree-sitter
|
||||
call coc#config("semanticTokens.enable", v:false)
|
||||
else
|
||||
call coc#config("semanticTokens.enable", v:true)
|
||||
endif
|
||||
|
||||
call coc#config("sumneko-lua.enableNvimLuaDev", v:true)
|
||||
|
||||
for section in ['suggest', 'diagnostic', 'signature', 'hover']
|
||||
call coc#config(section.'.floatConfig.border', v:true)
|
||||
call coc#config(section.'.floatConfig.rounded', v:true)
|
||||
call coc#config(section.'.floatConfig.highlight', 'Normal')
|
||||
|
||||
" transparent setting (only for neovim)
|
||||
" call coc#config(section.'.floatConfig.winblend', 6)
|
||||
endfor
|
||||
|
||||
function! CocHighlight()
|
||||
hi! CocErrorHighlight guifg=#E74C3C term=underline,bold gui=underline,bold cterm=underline,bold
|
||||
hi! CocErrorSign guifg=#E74C3C
|
||||
|
||||
hi! CocWarningHighlight guifg=#E74C3C term=underline gui=underline cterm=underline
|
||||
hi! CocWarningSign guifg=#E67E22
|
||||
|
||||
hi CocInfoHighlight term=underline gui=underline cterm=underline
|
||||
hi CocHintHighlight term=underline gui=underline cterm=underline
|
||||
hi CocUnusedHighlight term=underline gui=underline cterm=underline
|
||||
endfunction
|
||||
|
||||
call theme#addCleanBg(['CocWarningSign', 'CocErrorSign'])
|
||||
|
||||
augroup CocHighlight
|
||||
autocmd!
|
||||
autocmd ColorScheme * call CocHighlight()
|
||||
augroup END
|
||||
|
||||
function! Breadcrumbs()
|
||||
if ! exists('b:coc_nav')
|
||||
return ''
|
||||
endif
|
||||
let items = b:coc_nav
|
||||
" let t = ' '
|
||||
let t = ' '
|
||||
let c = 0
|
||||
for obj in items
|
||||
let hi = obj['highlight']
|
||||
let name = obj['name']
|
||||
if c == 0
|
||||
let t ..= '%#'.. hi ..'#' .. name .. '%#Normal#'
|
||||
else
|
||||
let t ..= ' %#'.. hi ..'#' .. name .. '%#Normal#'
|
||||
endif
|
||||
let c += 1
|
||||
endfor
|
||||
return t
|
||||
endfunction
|
||||
|
||||
func! s:sigbar_enable()
|
||||
set tabline=%#Normal#🌠%{%Breadcrumbs()%}
|
||||
set showtabline=2
|
||||
endfunc
|
||||
|
||||
func! s:sigbar_disable()
|
||||
set tabline=
|
||||
set showtabline=1
|
||||
endfunc
|
||||
|
||||
" set tabline=%=%#Normal#%=%{%Breadcrumbs()%}
|
||||
" set showtabline=2
|
||||
|
||||
let sigbar_opt = {
|
||||
\ 'desc': 'Show function signature bar',
|
||||
\ 'enablefunc': function('s:sigbar_enable'),
|
||||
\ 'disablefunc': function('s:sigbar_disable'),
|
||||
\ 'isEnabled': 0,
|
||||
\ }
|
||||
call options#add('signature bar', sigbar_opt)
|
||||
|
||||
call theme#addTransGroup(['CocFloating'])
|
||||
|
||||
endif
|
||||
@@ -1,3 +0,0 @@
|
||||
if utils#hasplug('coc.nvim')
|
||||
let g:codi#virtual_text = 0
|
||||
endif
|
||||
@@ -1,4 +0,0 @@
|
||||
|
||||
if utils#hasplug('ctrlp.vim')
|
||||
let g:ctrlp_map = '<leader>ff'
|
||||
endif
|
||||
@@ -1,32 +0,0 @@
|
||||
|
||||
if utils#hasplug('everforest')
|
||||
let g:everforest_better_performance = 1
|
||||
let g:everforest_background = 'hard'
|
||||
" let g:everforest_enable_italic = 1
|
||||
function! Everforest_trans_enable()
|
||||
let g:everforest_transparent_background = 2
|
||||
colorscheme everforest
|
||||
call theme#setStlColor(&background, 'everforest')
|
||||
" hack to fix caret characters appearing in the statusline when StatusLine
|
||||
" and StatusLineNC has same highlight(https://vi.stackexchange.com/questions/15873/carets-in-status-line)
|
||||
hi StatusLine guifg=#d3c6aa ctermfg=223
|
||||
endfunction
|
||||
function! Everforest_trans_disable()
|
||||
let g:everforest_transparent_background = 0
|
||||
colorscheme everforest
|
||||
call theme#setStlColor(&background, 'everforest')
|
||||
endfunction
|
||||
function! CB_dark_tb_enable_everforest()
|
||||
call Everforest_trans_enable()
|
||||
endfunction
|
||||
function! CB_light_tb_enable_everforest()
|
||||
call Everforest_trans_enable()
|
||||
endfunction
|
||||
function! CB_dark_tb_disable_everforest()
|
||||
call Everforest_trans_disable()
|
||||
endfunction
|
||||
function! CB_light_tb_disable_everforest()
|
||||
call Everforest_trans_disable()
|
||||
endfunction
|
||||
|
||||
endif
|
||||
@@ -1,121 +0,0 @@
|
||||
|
||||
if utils#hasplug("fzf") && utils#hasplug("fzf.vim")
|
||||
" [Buffers] Jump to the existing window if possible
|
||||
let g:fzf_buffers_jump = 1
|
||||
"let $FZF_DEFAULT_COMMAND='find . \( -name node_modules -o -name .git \) -prune -o -print'
|
||||
|
||||
" - CTRL-/ will toggle preview window.
|
||||
let g:fzf_preview_window = ['right:50%']
|
||||
|
||||
hi! fzfborderhi term=bold cterm=bold ctermbg=236 gui=bold guibg=#272c42
|
||||
hi! fzfqueryhi term=underline cterm=underline gui=underline
|
||||
|
||||
let g:fzf_force_termguicolors = 1
|
||||
|
||||
if g:os != 'Windows'
|
||||
let $FZF_DEFAULT_COMMAND = "find . -type f -not -path '*/\.git/*'"
|
||||
endif
|
||||
|
||||
let s:preview_exe = expand(g:dotvimdir.'/bin/preview.py')
|
||||
let s:color_opts = ['--color', 'gutter:-1,bg+:-1,bg:-1,preview-bg:-1,preview-fg:-1,fg+:-1']
|
||||
|
||||
" check if ripgrep is installed
|
||||
function! FzfRg()
|
||||
let s:previewcmd = join([utils#get_usable_py(), s:preview_exe, &bg, '{}'])
|
||||
if ! executable('rg')
|
||||
let cmd = 'grep -R --line-number --exclude-dir=".git;.svn" --color=always -- '.shellescape('')
|
||||
else
|
||||
let cmd = "rg --column --line-number --no-heading --color=always --smart-case -- ".shellescape('')
|
||||
endif
|
||||
|
||||
let options = s:color_opts + ['--border-label', 'Grep', '--border-label-pos', '9', '--no-scrollbar',
|
||||
\ '--no-hscroll', '--no-separator', '--preview', s:previewcmd]
|
||||
let with_preview = fzf#vim#with_preview()
|
||||
if len(with_preview) == 0
|
||||
let with_preview = {'options':['--preview-window','right:50%' ] + options}
|
||||
else
|
||||
" make fzf preview repect colorsheme
|
||||
let with_preview.options = with_preview.options[:-3] + options
|
||||
endif
|
||||
call fzf#vim#grep(cmd, 1, with_preview, 0)
|
||||
endfunction
|
||||
|
||||
function! FzfFiles(...)
|
||||
let s:previewcmd = join([utils#get_usable_py(), s:preview_exe, &bg, '{}'])
|
||||
let options = s:color_opts + ['--border-label', 'Files', '--border-label-pos', '9', '--no-scrollbar',
|
||||
\ '--no-hscroll', '--no-separator', '--preview', s:previewcmd]
|
||||
let with_preview = fzf#vim#with_preview()
|
||||
if len(with_preview) == 0
|
||||
" in windows with_preview return empty dict
|
||||
let with_preview = {'options':['--preview-window','right:50%' ] + options}
|
||||
else
|
||||
let with_preview.options = with_preview.options[:-3] + options
|
||||
endif
|
||||
let dir = ''
|
||||
if a:0 >= 1 && isdirectory(expand(a:1))
|
||||
let dir = a:1
|
||||
endif
|
||||
call fzf#vim#files(dir, with_preview, 0)
|
||||
endfunction
|
||||
|
||||
function! FzfColorSelect(color_name)
|
||||
call theme#setColor(&bg, a:color_name)
|
||||
endfunction
|
||||
|
||||
function! FzfAirlineColorSelect(color_name)
|
||||
call theme#setStlColor(&background, a:color_name)
|
||||
endfunction
|
||||
|
||||
let $FZF_DEFAULT_OPTS='--color=' . s:color_opts[1]
|
||||
|
||||
function! FzfHelpTags()
|
||||
let s:previewcmd = join([utils#get_usable_py(), s:preview_exe, &bg, '{}'])
|
||||
let options = s:color_opts + ['--border-label', 'Files', '--border-label-pos', '9', '--no-scrollbar',
|
||||
\ '--no-hscroll', '--no-separator']
|
||||
let with_preview = fzf#vim#with_preview({ "placeholder": "--tag {2}:{3}:{4}" })
|
||||
if len(with_preview) == 0
|
||||
" in windows with_preview return empty dict
|
||||
let with_preview = {'options':['--preview-window','right:50%' ] + options}
|
||||
else
|
||||
let with_preview.options = with_preview.options + options
|
||||
endif
|
||||
call fzf#vim#helptags(with_preview, 0)
|
||||
endfunction
|
||||
|
||||
let s:optionmap = {}
|
||||
let s:feedfzf = []
|
||||
func! s:optioncb(str)
|
||||
call options#toggle(s:optionmap[a:str])
|
||||
endfunc
|
||||
func! FzfOptions()
|
||||
let s:feedfzf = []
|
||||
let s:optsource = options#getAll()
|
||||
for e in s:optsource
|
||||
let s:optionmap[e[1]] = e[0]
|
||||
call add(s:feedfzf, e[1])
|
||||
endfor
|
||||
call fzf#run(fzf#wrap({
|
||||
\ 'source': s:feedfzf,
|
||||
\ 'sink': function('s:optioncb'),
|
||||
\ 'options': ['--border-label', 'Options'],
|
||||
\ 'window': { 'width': 0.4, 'height': 0.6 }
|
||||
\ }))
|
||||
endfunc
|
||||
|
||||
" noremap <leader>fo :call FzfOptions()<CR>
|
||||
" noremap <leader>fr :call FzfRg()<CR>
|
||||
" noremap <leader>ff :call FzfFiles()<CR>
|
||||
noremap <leader>fh :call FzfHelpTags()<CR>
|
||||
" noremap <leader>fb :BLines<CR>
|
||||
noremap <leader>fu :call FzfFiles('~')<CR>
|
||||
|
||||
if utils#hasplug('fzf-color-preview')
|
||||
let g:FzfColorComfirmCb = function('FzfColorSelect')
|
||||
let g:FzfAirlineComfirmCb = function('FzfAirlineColorSelect')
|
||||
noremap <leader>fa :AirlinePreview<CR>
|
||||
noremap <leader>fc :ColorsPreview<CR>
|
||||
else
|
||||
noremap <leader>fc :Colors<CR>
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
|
||||
if utils#hasplug('goyo.vim')
|
||||
nnoremap <leader><leader>g :Goyo<CR>
|
||||
let g:goyo_width= floor(&co * 0.65)
|
||||
|
||||
function! s:fix()
|
||||
" resize the goyo after being messed up by other plugins
|
||||
au BufEnter * if winnr('$') == '5' | exe "normal \<c-w>=" | endif
|
||||
endfunction
|
||||
augroup GoyoAu
|
||||
au!
|
||||
augroup END
|
||||
|
||||
autocmd User GoyoEnter au GoyoAu BufEnter * if winnr('$') == '5' | exe "normal \<c-w>=" | endif
|
||||
autocmd User GoyoLeave augroup GoyoAu | au! | augroup END
|
||||
endif
|
||||
@@ -1,5 +0,0 @@
|
||||
|
||||
if utils#hasplug('indentLine')
|
||||
let g:indentLine_char = '│'
|
||||
let g:indentLine_setConceal = 0
|
||||
endif
|
||||
@@ -1,136 +0,0 @@
|
||||
|
||||
" giveup
|
||||
if utils#hasplug('lightline.vim')
|
||||
set noshowmode
|
||||
set laststatus=2
|
||||
|
||||
" enable bufferline
|
||||
" let g:bufferline_echo = 1
|
||||
|
||||
let g:bufferline_inactive_highlight = 'Search'
|
||||
let g:bufferline_active_highlight = 'Search'
|
||||
let g:bufferline_forbided_col = 32
|
||||
|
||||
let g:lightline = {
|
||||
\ 'colorscheme': 'wombat',
|
||||
\ 'active': {
|
||||
\ 'left': [ [ 'mode'],
|
||||
\ [ 'bufferline'] ],
|
||||
\ 'right': [['lineinfo'], ['cocstatus']],
|
||||
\ },
|
||||
\ 'inactive': {
|
||||
\ 'left': [],
|
||||
\ 'right': [],
|
||||
\ },
|
||||
\ 'component_expand': {
|
||||
\ 'bufferline': 'BufferlineStr',
|
||||
\ },
|
||||
\ 'component_function': {
|
||||
\ 'cocstatus': 'AirlineCocStatus',
|
||||
\ },
|
||||
\ }
|
||||
|
||||
|
||||
function! s:restore()
|
||||
let g:lightline.active = {
|
||||
\ 'left': [ [ 'mode'],
|
||||
\ [ 'bufferline'] ],
|
||||
\ 'right': [['lineinfo'], ['cocstatus']],
|
||||
\ }
|
||||
call lightline#init()
|
||||
call lightline#update()
|
||||
endfunction
|
||||
|
||||
let s:special_ft = ['nerdtree', 'vista']
|
||||
let s:special_bt = ['nofile']
|
||||
function! s:lightlineInit()
|
||||
let g:lightline.active = {
|
||||
\ 'left': [],
|
||||
\ 'right': [],
|
||||
\ }
|
||||
call lightline#init()
|
||||
call lightline#update()
|
||||
echom 'hello'. &bt
|
||||
autocmd WinLeave * ++once call s:restore()
|
||||
endfunction
|
||||
|
||||
" \ 'bufferline': 'lightline#bufferline#buffers'
|
||||
augroup Lightline
|
||||
autocmd!
|
||||
" autocmd BufWinEnter * call s:lightlineInit()
|
||||
" autocmd WinNew * call s:funck()
|
||||
autocmd FileType nerdtree call s:lightlineInit()
|
||||
" autocmd BufWritePost,TextChanged,TextChangedI,BufNew,BufEnter * call lightline#update()
|
||||
augroup END
|
||||
|
||||
function! BufferlineStr()
|
||||
call bufferline#get_echo_string()
|
||||
let s = bufferline#get_status_string()
|
||||
return s
|
||||
endfunction
|
||||
|
||||
function! s:lightline_update()
|
||||
if !exists('g:loaded_lightline')
|
||||
return
|
||||
endif
|
||||
try
|
||||
if g:colors_name =~# 'wombat\|solarized\|landscape\|jellybeans\|seoul256\|Tomorrow'
|
||||
let g:lightline.colorscheme =
|
||||
\ substitute(substitute(g:colors_name, '-', '_', 'g'), '256.*', '', '')
|
||||
call lightline#init()
|
||||
call lightline#colorscheme()
|
||||
call lightline#update()
|
||||
endif
|
||||
catch
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
augroup LightlineColorscheme
|
||||
autocmd!
|
||||
autocmd ColorScheme * call s:lightline_update()
|
||||
augroup END
|
||||
|
||||
function! AirlineCocStatus()
|
||||
if ! exists('*CocAction')
|
||||
return
|
||||
endif
|
||||
let loading = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]
|
||||
try
|
||||
let result = CocAction('services')
|
||||
catch
|
||||
" call timer_start(200, {->execute('AirlineRefresh')})
|
||||
return 'no coc '
|
||||
endtry
|
||||
let state = ''
|
||||
let id = ''
|
||||
for e in result
|
||||
if e['languageIds'][0] == &ft
|
||||
let state = e['state']
|
||||
let id = e['id']
|
||||
endif
|
||||
endfor
|
||||
if id == ''
|
||||
return 'no lsp '
|
||||
endif
|
||||
|
||||
" messy way to get time in millisecond in vim
|
||||
let time = float2nr(str2float(reltime()->reltimestr()[4:]) * 1000)
|
||||
let speed = 800
|
||||
let loadidx = time % speed
|
||||
let msg = id
|
||||
if state == "starting"
|
||||
if ! exists('s:cocstatustimer') || len(timer_info(s:cocstatustimer)) == 0
|
||||
let s:cocstatustimer = timer_start(100, {->execute('AirlineRefresh')}, {'repeat': 800})
|
||||
endif
|
||||
return msg . " " . loading[loadidx/(speed/10)] . " "
|
||||
elseif state == "running"
|
||||
if exists('s:cocstatustimer')
|
||||
call timer_stop(s:cocstatustimer)
|
||||
unlet s:cocstatustimer
|
||||
endif
|
||||
return msg . " ✔ "
|
||||
endif
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
endif
|
||||
@@ -1,13 +0,0 @@
|
||||
|
||||
if utils#hasplug('minimap.vim')
|
||||
nnoremap <silent> mm :MinimapToggle<CR>
|
||||
let g:minimap_highlight_search = 1
|
||||
let g:minimap_git_colors = 1
|
||||
let g:minimap_enable_highlight_colorgroup = 1
|
||||
let g:minimap_block_filetypes = ['fugitive', 'nvim-tree', 'tagbar', 'fzf', 'telescope', 'NvimTree', 'nerdtree']
|
||||
let g:minimap_block_buftypes = ['help', 'nerdtree', 'nofile', 'nowrite', 'quickfix', 'terminal', 'prompt', 'NvimTree']
|
||||
let g:minimap_close_filetypes = ['startify', 'netrw', 'vim-plug', 'NvimTree']
|
||||
let g:minimap_range_color = 'Visual'
|
||||
let g:minimap_cursor_color = 'Cursor'
|
||||
endif
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
if utils#hasplug('nerdtree')
|
||||
if utils#hasplug('vim-nerdtree-syntax-highlight')
|
||||
let g:NERDTreeLimitedSyntax = 1
|
||||
endif
|
||||
let g:NERDShutUp=1
|
||||
|
||||
" work around for nerdtree bug: https://github.com/preservim/nerdtree/issues/1321
|
||||
let g:NERDTreeMinimalMenu = v:true
|
||||
let g:NERDTreeMinimalUI = v:true
|
||||
|
||||
function! NERDTreeFindToggle()
|
||||
let has_nerdtree = 0
|
||||
let winfo = getwininfo()
|
||||
for obj in winfo
|
||||
let bufnr = obj['bufnr']
|
||||
let ft = getbufvar(bufnr, '&filetype')
|
||||
if ft == 'nerdtree'
|
||||
let has_nerdtree = 1
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
if has_nerdtree
|
||||
:NERDTreeClose
|
||||
else
|
||||
" we cannot use NERDTreeFind on startify as it is not a file
|
||||
if &ft == 'startify' || &ft == ''
|
||||
:NERDTreeToggle
|
||||
else
|
||||
:NERDTreeFind
|
||||
" NERDTreeToggleVCS
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
nnoremap <silent> <leader>e :call NERDTreeFindToggle()<CR>
|
||||
|
||||
"let NERDTreeShowBookmarks=1
|
||||
let NERDTreeChDirMode = 0
|
||||
let NERDTreeQuitOnOpen = 1
|
||||
let NERDTreeMouseMode = 2
|
||||
let NERDTreeShowHidden = 1
|
||||
|
||||
" remapping
|
||||
let g:NERDTreeMapOpenExpl = ''
|
||||
if utils#hasplug('vim-devicons') || utils#hasplug('nerdfont.vim')
|
||||
let NERDTreeDirArrowCollapsible = ''
|
||||
let NERDTreeDirArrowExpandable = ''
|
||||
else
|
||||
" let NERDTreeDirArrowCollapsible = ''
|
||||
" let NERDTreeDirArrowExpandable = ''
|
||||
endif
|
||||
" Exit Vim if NERDTree is the only window remaining in the only tab.
|
||||
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
|
||||
endif
|
||||
@@ -1,24 +0,0 @@
|
||||
|
||||
if utils#hasplug('papercolor-theme')
|
||||
function! CB_dark_tb_enable_PaperColor()
|
||||
let g:PaperColor_Theme_Options = {
|
||||
\ 'theme': {'default.dark': { 'transparent_background': 1 }}}
|
||||
colorscheme PaperColor
|
||||
endfunction
|
||||
function! CB_light_tb_enable_PaperColor()
|
||||
let g:PaperColor_Theme_Options = {
|
||||
\ 'theme': {'default.light': { 'transparent_background': 1 }}}
|
||||
colorscheme PaperColor
|
||||
endfunction
|
||||
function! CB_dark_tb_disable_PaperColor()
|
||||
let g:PaperColor_Theme_Options = {
|
||||
\ 'theme': {'default.dark': { 'transparent_background': 0 }}}
|
||||
colorscheme PaperColor
|
||||
endfunction
|
||||
function! CB_light_tb_disable_PaperColor()
|
||||
let g:PaperColor_Theme_Options = {
|
||||
\ 'theme': {'default.light': { 'transparent_background': 0 }}}
|
||||
colorscheme PaperColor
|
||||
endfunction
|
||||
endif
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
if utils#hasplug('tagbar')
|
||||
let g:tagbar_width = 30
|
||||
let g:tagbar_sort = 0
|
||||
let g:tagbar_compact = 2
|
||||
let g:tagbar_autoshowtag = 1
|
||||
let g:tagbar_foldlevel = 99
|
||||
let g:tagbar_no_status_line = 1
|
||||
let g:tagbar_visibility_symbols = {
|
||||
\ 'public' : '+',
|
||||
\ 'protected' : '#',
|
||||
\ 'private' : '-'
|
||||
\ }
|
||||
nnoremap <silent> <leader>v <cmd>TagbarToggle<CR>
|
||||
endif
|
||||
@@ -1,159 +0,0 @@
|
||||
|
||||
if utils#hasplug("vim-airline")
|
||||
|
||||
" Extensions
|
||||
function! AirlineCocStatus()
|
||||
if ! exists('*CocAction')
|
||||
return
|
||||
endif
|
||||
let loading = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]
|
||||
try
|
||||
let result = CocAction('services')
|
||||
catch
|
||||
" call timer_start(200, {->execute('AirlineRefresh')})
|
||||
return 'no coc '
|
||||
endtry
|
||||
let state = ''
|
||||
let id = ''
|
||||
for e in result
|
||||
if e['languageIds'][0] == &ft
|
||||
let state = e['state']
|
||||
let id = e['id']
|
||||
endif
|
||||
endfor
|
||||
if id == ''
|
||||
return 'no lsp '
|
||||
endif
|
||||
|
||||
" messy way to get time in millisecond in vim
|
||||
let time = float2nr(str2float(reltime()->reltimestr()[4:]) * 1000)
|
||||
let speed = 800
|
||||
let loadidx = time % speed
|
||||
let msg = id
|
||||
if state == "starting"
|
||||
if ! exists('s:cocstatustimer') || len(timer_info(s:cocstatustimer)) == 0
|
||||
let s:cocstatustimer = timer_start(100, {->execute('AirlineRefresh')}, {'repeat': 800})
|
||||
endif
|
||||
return msg . " " . loading[loadidx/(speed/10)] . " "
|
||||
elseif state == "running"
|
||||
if exists('s:cocstatustimer')
|
||||
call timer_stop(s:cocstatustimer)
|
||||
unlet s:cocstatustimer
|
||||
endif
|
||||
return msg . " ✔ "
|
||||
endif
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
function! AirlineBufferNumber()
|
||||
return len(g:index_to_buffer)
|
||||
endfunction
|
||||
|
||||
" This must use my fork version of bufferline
|
||||
" the number of cols bufferline cannot use out of max of screen cols
|
||||
let g:bufferline_forbided_col = 32
|
||||
|
||||
let g:airline_experimental = g:vim_v >= 900 ? 1 : 0
|
||||
|
||||
function! AirlineInit()
|
||||
" call airline#parts#define_function('bufnum', 'AirlineBufferNumber')
|
||||
call airline#parts#define_function('cocstatus', 'AirlineCocStatus')
|
||||
call airline#parts#define_minwidth('mode', 10)
|
||||
let _airline_section_y = ''
|
||||
if utils#hasplug('coc.nvim')
|
||||
" let _airline_section_y = airline#section#create(['cocstatus'])
|
||||
endif
|
||||
let g:airline_section_a = airline#section#create(['mode'])
|
||||
let g:airline_section_b = ''
|
||||
let g:airline_section_error = ''
|
||||
let g:airline_section_warning = ''
|
||||
" let g:airline_section_x = airline#section#create(['bufnum'])
|
||||
let g:airline_section_x = ''
|
||||
let g:airline_section_y = _airline_section_y
|
||||
let g:airline_section_z = airline#section#create(['cocstatus', '│ ', '%(%l:%c%)'])
|
||||
|
||||
endfunction
|
||||
|
||||
function! AirlineColouriseSplits()
|
||||
" get rid of the vertical split between two windows in statusline
|
||||
hi! link StatusLine airline_z
|
||||
hi! link StatusLineNC airline_z_inactive
|
||||
endfunction
|
||||
|
||||
augroup AirlineAu
|
||||
autocmd!
|
||||
autocmd ColorScheme * call AirlineColouriseSplits()
|
||||
autocmd User AirlineAfterInit ++once call AirlineInit()
|
||||
augroup end
|
||||
|
||||
" let g:airline_left_sep = ''
|
||||
" let g:airline_left_alt_sep = ''
|
||||
" let g:airline_right_sep = ''
|
||||
" let g:airline_right_alt_sep = ''
|
||||
|
||||
function s:airline_refresh(...)
|
||||
" this has to be set late otherwise it will cause 'mode' extension be
|
||||
" skipped at startup
|
||||
let g:airline_skip_empty_sections = 1
|
||||
endfunction
|
||||
call RegisterLateInit(function('s:airline_refresh'), 1)
|
||||
|
||||
" let g:airline_skip_empty_sections = 1
|
||||
|
||||
let g:airline_inactive_collapse = 1
|
||||
let g:airline_focuslost_inactive = 0
|
||||
let g:airline_extensions = ['bufferline']
|
||||
|
||||
let g:airline_filetype_overrides = {
|
||||
\ 'vista': ['Vista', ''],
|
||||
\ 'minimap': ['', ''],
|
||||
\ 'nerdtree': [ get(g:, 'NERDTreeStatusline', 'NERD'), ''],
|
||||
\ }
|
||||
|
||||
" hide airline in startify
|
||||
function! HideStartify(...)
|
||||
let ctx = a:2
|
||||
if ! ctx.active
|
||||
return 1
|
||||
end
|
||||
if &filetype == 'startify'
|
||||
let builder = a:1
|
||||
call builder.add_section('Normal', '')
|
||||
return 1
|
||||
endif
|
||||
if &filetype == 'help'
|
||||
let builder = a:1
|
||||
call builder.add_section('airline_a_bold', ' Help ')
|
||||
call builder.add_section('airline_c', ' %f')
|
||||
return 1
|
||||
endif
|
||||
|
||||
endfunction
|
||||
call airline#add_statusline_func('HideStartify')
|
||||
|
||||
" " without this airline will overwrite some setting like bufferline_active_buffer_left, etc.
|
||||
let g:airline#extensions#bufferline#overwrite_variables = 0
|
||||
" call theme#addTransGroup(['airline_c', 'airline_c_bold'])
|
||||
" let g:airline_mode_map = {
|
||||
" \ '__' : '-',
|
||||
" \ 'c' : 'C',
|
||||
" \ 'i' : 'I',
|
||||
" \ 'ic' : 'I',
|
||||
" \ 'ix' : 'I',
|
||||
" \ 'n' : 'N',
|
||||
" \ 'multi' : 'M',
|
||||
" \ 'ni' : 'N',
|
||||
" \ 'no' : 'N',
|
||||
" \ 'R' : 'R',
|
||||
" \ 'Rv' : 'R',
|
||||
" \ 's' : 'S',
|
||||
" \ 'S' : 'S',
|
||||
" \ '' : 'S',
|
||||
" \ 't' : 'T',
|
||||
" \ 'v' : 'V',
|
||||
" \ 'V' : 'V',
|
||||
" \ '' : 'V',
|
||||
" \ }
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
|
||||
if utils#hasplug("vim-bufferline")
|
||||
let g:bufferline_echo = 0
|
||||
let g:bufferline_modified = '+'
|
||||
|
||||
" scrolling with fixed current buffer position
|
||||
|
||||
let g:bufferline_active_buffer_left = '['
|
||||
let g:bufferline_active_buffer_right = ']'
|
||||
if utils#hasplug("vim-airline")
|
||||
let g:bufferline_inactive_highlight = 'airline_c'
|
||||
let g:bufferline_active_highlight = 'airline_c_bold'
|
||||
elseif ! utils#hasplug("vim-global-statusline")
|
||||
call bufferline#init_echo()
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
|
||||
if utils#hasplug("vim-devicons")
|
||||
let g:webdevicons_enable_airline_statusline = 0
|
||||
endif
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
|
||||
if utils#hasplug('vim-floaterm')
|
||||
let g:floaterm_keymap_toggle = '<C-\>'
|
||||
let g:floaterm_wintype = 'float'
|
||||
let g:floaterm_position = 'bottomright'
|
||||
let g:floaterm_width = 0.5
|
||||
let g:floaterm_height = 0.5
|
||||
let g:floaterm_autohide = 2
|
||||
|
||||
call theme#addCleanBg(['FloatermBorder', 'Floaterm'])
|
||||
|
||||
autocmd QuitPre * :FloatermKill!<CR>
|
||||
|
||||
" press <c-[> ener normal mode in terminal. autocmd prevent this key map
|
||||
" in other plugin like fzf
|
||||
autocmd FileType floaterm tmap <buffer> <C-[> <C-w>N
|
||||
|
||||
function! s:hasterm(name)
|
||||
let bufs = floaterm#buflist#gather()
|
||||
for bufnr in bufs
|
||||
let bufinfo = getbufinfo(bufnr)[0]
|
||||
let termname = bufinfo['variables']['floaterm_name']
|
||||
if termname == a:name
|
||||
return v:true
|
||||
endif
|
||||
endfor
|
||||
return v:false
|
||||
endfunction
|
||||
|
||||
function! ToggleRepl()
|
||||
let name = 'REPL'
|
||||
let currentWindow=winnr()
|
||||
if s:hasterm(name)
|
||||
execute('FloatermToggle ' . name)
|
||||
else
|
||||
:FloatermNew --name=REPL --width=0.5 --wintype=vsplit --position=botright --autoclose=2 ipython
|
||||
endif
|
||||
exe currentWindow . "wincmd w"
|
||||
endfunction
|
||||
|
||||
function! ToggleNormal()
|
||||
let name = 'normalterm'
|
||||
if s:hasterm(name)
|
||||
execute('FloatermToggle ' . name)
|
||||
else
|
||||
:FloatermNew --name=normalterm --width=0.5 --height=0.5 --wintype=float --position=bottomright --autoclose=2
|
||||
endif
|
||||
endfunction
|
||||
|
||||
nnoremap <silent> <leader>tp :call ToggleRepl()<CR>
|
||||
nnoremap <silent> <leader>tn :call ToggleNormal()<CR>
|
||||
vnoremap <silent> <leader>tl :FloatermSend --name=REPL<CR>
|
||||
endif
|
||||
@@ -1,5 +0,0 @@
|
||||
|
||||
if utils#hasplug('vim-gitgutter')
|
||||
call theme#addCleanBg(['GitGutterAdd', 'GitGutterChange', 'GitGutterDelete', 'GitGutterChangeDelete'])
|
||||
nnoremap <leader>gt :GitGutterBufferToggle<CR>
|
||||
endif
|
||||
@@ -1,10 +0,0 @@
|
||||
|
||||
if utils#hasplug("vim-gutentags")
|
||||
if exists("*gutentags#statusline()")
|
||||
set statusline+=%{gutentags#statusline()}
|
||||
endif
|
||||
let g:gutentags_trace = 1
|
||||
let g:gutentags_cache_dir=g:vim_dir . '/.vimtags/'
|
||||
let g:gutentags_project_root=['.git', '.hg', '.svn', '.bzr', '_darcs', '_FOSSIL_', '.fslckout', 'src']
|
||||
endif
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
|
||||
if utils#hasplug('vim-illuminate') && g:vim_type == 'vim' " nvim doesn't need this config
|
||||
let g:Illuminate_highlightUnderCursor = 1
|
||||
let g:Illuminate_ftHighlightGroups = {
|
||||
\ 'vim:blacklist': ['vimLet', 'vimFuncKey', 'vimNotFunc', 'vimOperParen', 'vimLineComment'],
|
||||
\ 'java:blacklist' : [ 'javaType', 'javaScopeDecl', 'javaMethodDecl',
|
||||
\ 'javaComment', 'javaStorageClass', 'javaClassDecl', 'javaExternal',
|
||||
\ 'javaTypedef', 'javaLineComment', 'javaStatement', 'javaCommentTitle', 'javaDocComment' ],
|
||||
\ 'lua:blacklist' : [ 'luaComment', 'luaCond', 'luaStatement', 'luaFunction' ]
|
||||
\ }
|
||||
let g:Illuminate_ftwhitelist = ['vim', 'sh', 'python', 'rust', 'java',
|
||||
\ 'c', 'cpp', 'javascript', 'typescript', 'lua']
|
||||
|
||||
" ugly workaround for the bug that illuminate not working after first enter vim
|
||||
" {
|
||||
function s:init_illuminate(...)
|
||||
let bgType = theme#getBgType()
|
||||
let bg = theme#getHiTerm('Visual', bgType)
|
||||
if bg != 'NONE' && &bg == 'dark'
|
||||
execute('hi illuminatedWord '.bgType.'='.bg)
|
||||
execute('hi illuminatedCurWord '.bgType.'='.bg)
|
||||
else
|
||||
hi illuminatedWord cterm=underline gui=underline
|
||||
hi illuminatedCurWord cterm=underline gui=underline
|
||||
end
|
||||
endfunction
|
||||
call RegisterLateInit(function('s:init_illuminate'), 0)
|
||||
" }
|
||||
|
||||
augroup illuminate_augroup
|
||||
autocmd!
|
||||
autocmd ColorScheme * call s:init_illuminate()
|
||||
augroup END
|
||||
|
||||
endif
|
||||
@@ -1,5 +0,0 @@
|
||||
|
||||
if utils#hasplug('vim-matchup')
|
||||
let g:matchup_matchparen_offscreen = {}
|
||||
call theme#addCleanBg('MatchWord')
|
||||
endif
|
||||
@@ -1,8 +0,0 @@
|
||||
|
||||
if utils#hasplug("vim-rooter")
|
||||
let g:rooter_patterns = ['.vscode', '.git', '*.sln', 'src']
|
||||
let g:rooter_change_directory_for_non_project_files = ''
|
||||
let g:rooter_silent_chdir = 0
|
||||
" let g:rooter_manual_only = 1
|
||||
endif
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
if utils#hasplug("vim-sneak")
|
||||
let g:sneak#label = 1
|
||||
" map f <Plug>Sneak_s
|
||||
" map F <Plug>Sneak_S
|
||||
endif
|
||||
@@ -1,58 +0,0 @@
|
||||
|
||||
if utils#hasplug("vim-startify")
|
||||
if has('nvim')
|
||||
let buffer_str_len = (&columns - 60) / 2
|
||||
let buf_str = repeat(' ', buffer_str_len)
|
||||
let ascii_art = [
|
||||
\ buf_str . '',
|
||||
\ buf_str . '',
|
||||
\ buf_str . ' __ __ ________ ______ __ __ ______ __ __ ',
|
||||
\ buf_str . '| \ | \| \ / \ | \ | \| \| \ / \',
|
||||
\ buf_str . '| $$\ | $$| $$$$$$$$| $$$$$$\| $$ | $$ \$$$$$$| $$\ / $$',
|
||||
\ buf_str . '| $$$\| $$| $$__ | $$ | $$| $$ | $$ | $$ | $$$\ / $$$',
|
||||
\ buf_str . '| $$$$\ $$| $$ \ | $$ | $$ \$$\ / $$ | $$ | $$$$\ $$$$',
|
||||
\ buf_str . '| $$\$$ $$| $$$$$ | $$ | $$ \$$\ $$ | $$ | $$\$$ $$ $$',
|
||||
\ buf_str . '| $$ \$$$$| $$_____ | $$__/ $$ \$$ $$ _| $$_ | $$ \$$$| $$',
|
||||
\ buf_str . '| $$ \$$$| $$ \ \$$ $$ \$$$ | $$ \| $$ \$ | $$',
|
||||
\ buf_str . ' \$$ \$$ \$$$$$$$$ \$$$$$$ \$ \$$$$$$ \$$ \$$',
|
||||
\]
|
||||
else
|
||||
let buffer_str_len = (&columns - 30) / 2
|
||||
let buf_str = repeat(' ', buffer_str_len)
|
||||
let ascii_art = [
|
||||
\ buf_str . '',
|
||||
\ buf_str . '',
|
||||
\ buf_str . ' __ __ ______ __ __ ',
|
||||
\ buf_str . '| \ | \| \| \ / \',
|
||||
\ buf_str . '| $$ | $$ \$$$$$$| $$\ / $$',
|
||||
\ buf_str . '| $$ | $$ | $$ | $$$\ / $$$',
|
||||
\ buf_str . ' \$$\ / $$ | $$ | $$$$\ $$$$',
|
||||
\ buf_str . ' \$$\ $$ | $$ | $$\$$ $$ $$',
|
||||
\ buf_str . ' \$$ $$ _| $$_ | $$ \$$$| $$',
|
||||
\ buf_str . ' \$$$ | $$ \| $$ \$ | $$',
|
||||
\ buf_str . ' \$ \$$$$$$ \$$ \$$',
|
||||
\]
|
||||
endif
|
||||
|
||||
let g:startify_padding_left = &columns / 2 - &columns / 4 - &columns / 8
|
||||
let g:startify_custom_header = ascii_art
|
||||
let g:startify_change_to_dir = 0
|
||||
let g:startify_files_number = 5
|
||||
|
||||
let g:startify_bookmarks = [ g:dotfiledir . 'main.vim' ]
|
||||
let g:startify_lists = [
|
||||
\ { 'header': startify#pad([' RECENT']), 'type': 'files' },
|
||||
\ { 'header': startify#pad([' SESSIONS']), 'type': 'sessions' },
|
||||
\ { 'header': startify#pad([' BOOKMARKS']), 'type': 'bookmarks' },
|
||||
\ ]
|
||||
|
||||
" session related KeyBinding. These KeyBinding uses function from startify
|
||||
nnoremap <silent> <leader><leader>s :SSave!<CR>
|
||||
nnoremap <silent> <leader><leader>l :SLoad<CR>
|
||||
nnoremap <silent> <leader><leader>d :SDelete!<CR>
|
||||
nnoremap <silent> <leader><leader>c :SClose<CR>
|
||||
|
||||
au VimLeave * SSave! last
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
|
||||
if utils#hasplug('vim-tmux-navigator')
|
||||
let g:tmux_navigator_no_mappings = 1
|
||||
|
||||
noremap <silent> <c-h> :<C-U>TmuxNavigateLeft<cr>
|
||||
noremap <silent> <c-j> :<C-U>TmuxNavigateDown<cr>
|
||||
noremap <silent> <c-k> :<C-U>TmuxNavigateUp<cr>
|
||||
noremap <silent> <c-l> :<C-U>TmuxNavigateRight<cr>
|
||||
" noremap <silent> {Previous-Mapping} :<C-U>TmuxNavigatePrevious<cr>
|
||||
endif
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
vim9script
|
||||
|
||||
highlight link fuzzyyMatching error
|
||||
g:fuzzyy_dropdown = 1
|
||||
g:enable_fuzzyy_MRU_files = 1
|
||||
g:fuzzyy_window_layout = {
|
||||
FuzzyFiles: {
|
||||
width: 0.8,
|
||||
},
|
||||
FuzzyMRUFiles: {
|
||||
preview: 1,
|
||||
},
|
||||
FuzzyBuffers: {
|
||||
preview: 1,
|
||||
width: 0.8,
|
||||
preview_ratio: 0.5,
|
||||
},
|
||||
FuzzyGrep: {
|
||||
preview: 1,
|
||||
width: 0.8,
|
||||
preview_ratio: 0.5,
|
||||
},
|
||||
}
|
||||
g:fuzzyy_buffers_keymap = {
|
||||
'delete_buffer': "\<c-g>",
|
||||
'close_buffer': "\<c-l>",
|
||||
}
|
||||
nnoremap <silent> <leader>fl :FuzzyCmdHistory<CR>
|
||||
@@ -1,188 +0,0 @@
|
||||
vim9script
|
||||
|
||||
if utils#hasplug('vim-global-statusline')
|
||||
|
||||
g:stl_nonbtbg = 'folded'
|
||||
g:stl_bg = 'normal'
|
||||
g:bufferline_forbided_col = 32
|
||||
|
||||
def ReverseHl(name: string, hl: string)
|
||||
var hl_terms = theme#getHiTerms(hl)
|
||||
var normal_terms = theme#getHiTerms('normal')
|
||||
for [term, val] in items(hl_terms)
|
||||
if val == 'NONE'
|
||||
hl_terms[term] = normal_terms[term]
|
||||
endif
|
||||
endfor
|
||||
exe 'hi ' .. name .. ' guibg=' .. hl_terms['guifg'] .. ' guifg='
|
||||
.. hl_terms['guibg'] .. ' ctermbg=' .. hl_terms['ctermfg']
|
||||
.. ' ctermfg=' .. hl_terms['ctermbg']
|
||||
enddef
|
||||
|
||||
def StlHighlight()
|
||||
hi normalModeGstl cterm=reverse gui=reverse
|
||||
ReverseHl('insertModeGstl', 'function')
|
||||
ReverseHl('visualModeGstl', 'statement')
|
||||
ReverseHl('commandModeGstl', 'number')
|
||||
enddef
|
||||
autocmd ColorScheme * StlHighlight()
|
||||
var mode_color = {
|
||||
n: 'normalModeGstl',
|
||||
i: 'insertModeGstl',
|
||||
v: 'visualModeGstl',
|
||||
V: 'visualModeGstl',
|
||||
c: 'commandModeGstl',
|
||||
}
|
||||
var mode_str = {
|
||||
n: ' NORMAL ',
|
||||
i: ' INSERT ',
|
||||
v: ' VISUAL ',
|
||||
V: ' V-LINE ',
|
||||
c: ' COMMAND ',
|
||||
}
|
||||
mode_str[nr2char(22)] = ' V-BLOCK '
|
||||
mode_color[nr2char(22)] = 'curSearch'
|
||||
def Modestr(): void
|
||||
var m = mode()
|
||||
if has_key(mode_str, m)
|
||||
g:StlSetPart(0, mode_str[m], mode_color[m], 'mode')
|
||||
else
|
||||
echom char2nr(m)
|
||||
g:StlSetPart(0, ' ' .. &ft .. ' ', 'TabLineSel', 'mode')
|
||||
endif
|
||||
g:StlRefresh()
|
||||
enddef
|
||||
|
||||
def Fnstr(): void
|
||||
g:StlSetPart(10, 'filename: ' .. bufname(), '', 'filename')
|
||||
g:StlRefresh()
|
||||
enddef
|
||||
|
||||
def Bufstr(): void
|
||||
var bufstr = bufferline#get_echo_string()
|
||||
g:StlSetPart(9, ' ' .. bufstr, '', 'bufstr')
|
||||
g:StlRefresh()
|
||||
enddef
|
||||
|
||||
def Lncol(): void
|
||||
var col = virtcol(".")
|
||||
var ln = line('.')
|
||||
var m = mode()
|
||||
var color = ''
|
||||
if has_key(mode_color, m)
|
||||
color = mode_color[m]
|
||||
else
|
||||
color = 'TabLineSel'
|
||||
endif
|
||||
g:StlSetPart(&co - 9, printf(" %d:%d", ln, col), color, 'linenr')
|
||||
g:StlRefresh()
|
||||
enddef
|
||||
|
||||
var cocstatustimer = -1
|
||||
|
||||
def Cocstatus(): string
|
||||
const loading = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]
|
||||
var results = []
|
||||
var result = '𐄂'
|
||||
var fticon = '𐄂'
|
||||
try
|
||||
if exists('g:CocAction')
|
||||
results = g:CocAction('services')
|
||||
endif
|
||||
catch
|
||||
endtry
|
||||
var state = ''
|
||||
var id = ''
|
||||
if len(results) == 0
|
||||
timer_start(100, function(Lsp))
|
||||
endif
|
||||
for e in results
|
||||
if e['languageIds'][0] == &ft
|
||||
state = e['state']
|
||||
id = e['id']
|
||||
endif
|
||||
endfor
|
||||
|
||||
# messy way to get time in millisecond in vim
|
||||
var time = float2nr(str2float(reltime()->reltimestr()[4 : ]) * 1000)
|
||||
var speed = 800
|
||||
var loadidx = time % speed
|
||||
var msg = id
|
||||
if state == "starting"
|
||||
if len(timer_info(cocstatustimer)) == 0
|
||||
cocstatustimer = timer_start(100, function(Lsp), {'repeat': 800})
|
||||
endif
|
||||
fticon = loading[loadidx / (speed / 10)]
|
||||
elseif state == "running"
|
||||
if len(timer_info(cocstatustimer)) != 0
|
||||
timer_stop(cocstatustimer)
|
||||
cocstatustimer = -1
|
||||
endif
|
||||
if exists('g:WebDevIconsGetFileTypeSymbol')
|
||||
fticon = g:WebDevIconsGetFileTypeSymbol()
|
||||
endif
|
||||
endif
|
||||
# return fticon .. ' ' .. result
|
||||
return 'lsp ' .. fticon
|
||||
enddef
|
||||
|
||||
def Lsp(...timer: list<any>): void
|
||||
var s = Cocstatus()
|
||||
g:StlSetPart(&co - 17, ' ' .. s .. ' ', '', 'lsp')
|
||||
g:StlRefresh()
|
||||
enddef
|
||||
|
||||
var fancytimer = 0
|
||||
def Fancy(...timer: list<any>): void
|
||||
var expressions = [' (◕_◕)', ' (◕‿◕)', '\(◕◡◕\)', ' (◣_◢)', ' (◣‿◢)', '\(◣◡◣\)', ' (◠‿◠)', ' (◠_◠)', '\(◠◡◠\)', ' (◡‿◡)', ' (◡_◡)', '\(◡◡◡\)', ' (┳Д┳)', ' (个_个)', ' ( ≧Д≦)', ' 흫_흫', ' 句_句']
|
||||
|
||||
# var letters = [𝔞 𝔟 𝔠 𝔡 𝔢 𝔣 𝔤 𝔥 𝔦 𝔧 𝔨 𝔩 𝔪 𝔫 𝔬 𝔭 𝔮 𝔯 𝔰 𝔱 𝔲 𝔳 𝔴 𝔵 𝔶 𝔷]
|
||||
|
||||
# string "I love you" using unicode letters
|
||||
var lang = ''
|
||||
if &ft == 'python'
|
||||
lang = '𝕻𝖞𝖙𝖍𝖔𝖓'
|
||||
elseif &ft == 'java'
|
||||
lang = '𝕵𝖆𝖛𝖆'
|
||||
elseif &ft == 'javascript'
|
||||
lang = '𝕵𝖆𝖛𝖆𝖘𝖈𝖗𝖎𝖕𝖙'
|
||||
elseif &ft == 'lua'
|
||||
lang = '𝕷𝖚𝖆'
|
||||
elseif &ft == 'vim'
|
||||
lang = '𝓥𝓲𝓶 𝓢𝓬𝓻𝓲𝓹𝓽'
|
||||
else
|
||||
lang = &ft
|
||||
endif
|
||||
var str = lang .. ' 𝔦𝔰 𝔱𝔥𝔢 𝔟𝔢𝔰𝔱 𝔩𝔞𝔫𝔤𝔲𝔞𝔤𝔢'
|
||||
|
||||
# fancytimer = (fancytimer + 1) % len(str)
|
||||
g:StlSetPart(&co - 27 - strcharlen(str), str, '', 'fancy')
|
||||
enddef
|
||||
|
||||
def Theme(): void
|
||||
# const light = '☀'
|
||||
# const dark = '☽'
|
||||
const light = '🌕'
|
||||
const dark = '🌑'
|
||||
var theme = &bg == 'light' ? light : dark
|
||||
g:StlSetPart(&co - 23, '│ ' .. theme, '', 'bgc')
|
||||
g:StlRefresh()
|
||||
enddef
|
||||
|
||||
def EnterInit(): void
|
||||
# Theme()
|
||||
Lncol()
|
||||
Lsp()
|
||||
# autocmd GlobalStl ColorScheme * Theme()
|
||||
enddef
|
||||
|
||||
augroup GlobalStl
|
||||
autocmd!
|
||||
autocmd VimEnter,ModeChanged * Modestr() | Lncol()
|
||||
autocmd BufEnter,BufDelete,BufWritePost * Bufstr() | Modestr()
|
||||
autocmd CursorHold * Lncol()
|
||||
autocmd BufEnter,BufReadPost * Lsp()
|
||||
autocmd VimEnter * EnterInit()
|
||||
augroup END
|
||||
|
||||
endif
|
||||
@@ -1,7 +0,0 @@
|
||||
if utils#hasplug('vimtex')
|
||||
noremap <leader>lc :VimtexCompile<CR>
|
||||
noremap <leader>lv :VimtexView<CR>
|
||||
if g:os == 'Darwin'
|
||||
let g:vimtex_view_method = 'skim'
|
||||
endif
|
||||
endif
|
||||
@@ -1,60 +0,0 @@
|
||||
|
||||
if utils#hasplug('vista.vim')
|
||||
let g:vista_default_executive = 'vim_lsp'
|
||||
if utils#hasplug('coc.nvim')
|
||||
let g:vista_default_executive = 'coc'
|
||||
elseif executable('ctags')
|
||||
let g:vista_default_executive = 'ctags'
|
||||
endif
|
||||
nnoremap <silent> <leader>v :Vista!!<CR>
|
||||
let g:vista_cursor_delay = 0
|
||||
let g:vista_echo_cursor = 0
|
||||
let g:vista_echo_cursor_strategy = 'floating_win'
|
||||
let g:vista_close_on_jump = 0
|
||||
let g:vista_floating_delay = 0
|
||||
let g:vista_ignore_kinds = ['Variable', 'Field', 'EnumMember',
|
||||
\ 'String', 'Object', 'Array', 'Constant', 'Package', 'Boolean', 'Number'
|
||||
\ ]
|
||||
let g:vista_floating_border = 'rounded'
|
||||
let g:vista_disable_statusline = 1
|
||||
" let g:vista_keep_fzf_colors = 1
|
||||
let g:vista_update_on_text_changed_delay = 0
|
||||
let g:vista_update_on_text_changed = 1
|
||||
let g:vista#renderer#enable_kind = 1
|
||||
let g:vista#renderer#enable_icon = 1
|
||||
|
||||
" return to last position of vista
|
||||
let g:vista_last_row = v:null
|
||||
function! VistaCursorJump()
|
||||
" let found = vista#util#BinarySearch(g:vista.raw, line('.'), 'line', '')
|
||||
let found = g:vista_last_row
|
||||
if empty(found)
|
||||
return
|
||||
endif
|
||||
let vlnum = get(found, 'vlnum', v:null)
|
||||
call cursor(vlnum, 3)
|
||||
endfunction
|
||||
|
||||
" save tag for VistaCursorJump use
|
||||
function! VistaH2()
|
||||
if exists('*vista#util#BinarySearch')
|
||||
let bufs = map(filter(copy(getbufinfo()), 'v:val.listed'), 'v:val.bufnr')
|
||||
if index(bufs, bufnr('%')) < 0
|
||||
return
|
||||
endif
|
||||
let found = vista#util#BinarySearch(g:vista.raw, line('.'), 'line', '')
|
||||
if empty(found)
|
||||
return
|
||||
endif
|
||||
let g:vista_last_row = found
|
||||
endif
|
||||
endfunction
|
||||
|
||||
augroup VistaAu
|
||||
autocmd!
|
||||
autocmd BufLeave * call VistaH2()
|
||||
autocmd FileType vista call VistaCursorJump()
|
||||
augroup END
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
|
||||
if utils#hasplug('wilder.nvim')
|
||||
|
||||
call wilder#setup({
|
||||
\ 'modes': [':'],
|
||||
\ 'next_key': '<tab>',
|
||||
\ 'previous_key': '<S-Tab>',
|
||||
\ 'enable_cmdline_enter': 0,
|
||||
\ })
|
||||
|
||||
call wilder#set_option('pipeline', [
|
||||
\ wilder#debounce(10),
|
||||
\ wilder#branch(
|
||||
\ wilder#cmdline_pipeline({'language': g:vim_type == 'nvim' ? 'python' : 'vim'}),
|
||||
\ ),
|
||||
\ ])
|
||||
|
||||
if g:vim_type == 'vim'
|
||||
call wilder#set_option('renderer', wilder#popupmenu_renderer())
|
||||
else
|
||||
call wilder#set_option('renderer', wilder#popupmenu_renderer(
|
||||
\ wilder#popupmenu_border_theme({
|
||||
\ 'highlights': {
|
||||
\ 'default': 'Normal',
|
||||
\ },
|
||||
\ 'pumblend': 20,
|
||||
\ 'border': 'rounded',
|
||||
\ })))
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
|
||||
if utils#hasplug("winresizer")
|
||||
let g:winresizer_vert_resize = 2
|
||||
let g:winresizer_horiz_resize = 2
|
||||
" nnoremap <C-w>r :WinResizerStartResize<CR>
|
||||
let g:winresizer_start_key = '<C-w>r'
|
||||
endif
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
if utils#hasplug("zoxide.vim")
|
||||
|
||||
endif
|
||||
@@ -1 +0,0 @@
|
||||
local wezterm = require 'wezterm'
|
||||
+127
-347
@@ -1,375 +1,155 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
############################ SETUP PARAMETERS
|
||||
set -Eeuo pipefail
|
||||
|
||||
app_name='dotfiles'
|
||||
readonly APP_NAME='dotfiles'
|
||||
readonly REPO_URI="${REPO_URI:-https://github.com/Donaldttt/dotfiles.git}"
|
||||
readonly REPO_BRANCH="${REPO_BRANCH:-main}"
|
||||
|
||||
[ -z "$APP_PATH" ] && APP_PATH="$HOME/.$app_name"
|
||||
[ -z "$REPO_URI" ] && REPO_URI="https://github.com/Donaldttt/$app_name"
|
||||
[ -z "$REPO_BRANCH" ] && REPO_BRANCH='main'
|
||||
# [ -z "$REPO_URI" ] && REPO_URI="https://gitlab.com/tangnachuan1208/$app_name"
|
||||
# [ -z "$REPO_BRANCH" ] && REPO_BRANCH='gitlab'
|
||||
[ -z "$VIM_RTPATH" ] && VIM_RTPATH="$HOME/.vim"
|
||||
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" 2>/dev/null && pwd -P || true)"
|
||||
if [[ -n "$SCRIPT_DIR" && -e "$SCRIPT_DIR/.git" ]]; then
|
||||
APP_PATH="${APP_PATH:-$SCRIPT_DIR}"
|
||||
else
|
||||
APP_PATH="${APP_PATH:-$HOME/.$APP_NAME}"
|
||||
fi
|
||||
readonly APP_PATH
|
||||
readonly VIM_PATH="${VIM_PATH:-$HOME/.vim}"
|
||||
readonly MANAGED_START='# >>> dotfiles >>>'
|
||||
readonly MANAGED_END='# <<< dotfiles <<<'
|
||||
|
||||
info() { printf '\033[34m[•]\033[0m %s\n' "$*"; }
|
||||
success() { printf '\033[32m[✔]\033[0m %s\n' "$*"; }
|
||||
warn() { printf '\033[33m[!]\033[0m %s\n' "$*" >&2; }
|
||||
die() { printf '\033[31m[✘]\033[0m %s\n' "$*" >&2; exit 1; }
|
||||
|
||||
############################ BASIC SETUP TOOLS
|
||||
msg() {
|
||||
printf '%b\n' "$1" >&2
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Usage: ./install.sh [all|vim|shell|tmux]...
|
||||
|
||||
With no arguments, installs every component. Components can be combined, for
|
||||
example: ./install.sh vim tmux
|
||||
EOF
|
||||
}
|
||||
|
||||
success() {
|
||||
msg "\33[32m[✔]\33[0m ${1}${2}"
|
||||
require() {
|
||||
command -v "$1" >/dev/null 2>&1 || die "Required program not found: $1"
|
||||
}
|
||||
|
||||
fail() {
|
||||
msg "\33[31m[✘]\33[0m ${1}${2}"
|
||||
ensure_repo() {
|
||||
require git
|
||||
if [[ -d "$APP_PATH/.git" ]]; then
|
||||
return
|
||||
fi
|
||||
[[ ! -e "$APP_PATH" ]] || die "$APP_PATH exists but is not a Git repository."
|
||||
info "Cloning $REPO_URI into $APP_PATH"
|
||||
git clone --branch "$REPO_BRANCH" --depth 1 "$REPO_URI" "$APP_PATH"
|
||||
}
|
||||
|
||||
fatal_error() {
|
||||
msg "\33[31m[✘]\33[0m ${1}${2}"
|
||||
exit 1
|
||||
backup_path() {
|
||||
local target=$1
|
||||
if [[ -e "$target" || -L "$target" ]]; then
|
||||
local backup="${target}.backup.$(date +%Y%m%d_%H%M%S)" suffix=0
|
||||
while [[ -e "$backup" || -L "$backup" ]]; do
|
||||
((suffix += 1))
|
||||
backup="${target}.backup.$(date +%Y%m%d_%H%M%S).$suffix"
|
||||
done
|
||||
mv -- "$target" "$backup"
|
||||
warn "Backed up $target to $backup"
|
||||
fi
|
||||
}
|
||||
|
||||
program_exists() {
|
||||
local ret='0'
|
||||
command -v $1 >/dev/null 2>&1 || { local ret='1'; }
|
||||
|
||||
# fail on non-zero return value
|
||||
if [ "$ret" -ne 0 ]; then
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
link_config() {
|
||||
local source=$1 target=$2 current=''
|
||||
if [[ -L "$target" ]]; then
|
||||
current=$(readlink "$target" || true)
|
||||
[[ "$current" == "$source" ]] && return
|
||||
fi
|
||||
backup_path "$target"
|
||||
ln -s "$source" "$target"
|
||||
success "Linked $target -> $source"
|
||||
}
|
||||
|
||||
# check if file $2 contain string $1
|
||||
# return 0 if exists
|
||||
# 1 not contain string
|
||||
# 2 file not exist
|
||||
# when using this function:
|
||||
# file path should not be quoted but like this:
|
||||
# file_contains 'abc' file_path
|
||||
file_contains(){
|
||||
if [ -f "$2" ]; then
|
||||
a=`grep "$1" $2`
|
||||
[ "$a" != '' ] && return 0
|
||||
return 1
|
||||
fi
|
||||
return 2
|
||||
remove_managed_block() {
|
||||
local file=$1 temp
|
||||
[[ -f "$file" ]] || return
|
||||
temp=$(mktemp)
|
||||
awk -v start="$MANAGED_START" -v end="$MANAGED_END" '
|
||||
$0 == start { managed = 1; next }
|
||||
$0 == end { managed = 0; next }
|
||||
!managed { print }
|
||||
' "$file" > "$temp"
|
||||
cat "$temp" > "$file"
|
||||
rm -f "$temp"
|
||||
}
|
||||
|
||||
program_must_exist() {
|
||||
program_exists $1
|
||||
install_vim() {
|
||||
require vim
|
||||
require curl
|
||||
if ! vim --clean -Nu NONE -n -es \
|
||||
'+if v:version < 900 | cquit | endif' '+qall'; then
|
||||
die 'Vim 9 or newer is required.'
|
||||
fi
|
||||
|
||||
# throw error on non-zero return value
|
||||
if [ "$?" -ne 0 ]; then
|
||||
fatal_error "You must have '$1' installed to continue."
|
||||
fi
|
||||
link_config "$APP_PATH/.vimrc" "$HOME/.vimrc"
|
||||
mkdir -p "$VIM_PATH/autoload"
|
||||
local temp
|
||||
temp=$(mktemp)
|
||||
curl --fail --location --silent --show-error \
|
||||
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim \
|
||||
--output "$temp"
|
||||
mv "$temp" "$VIM_PATH/autoload/plug.vim"
|
||||
vim -Nu "$APP_PATH/.vimrc" -n -es \
|
||||
'+set nomore' '+PlugInstall --sync' '+qall'
|
||||
success 'Installed Vim configuration and plugins.'
|
||||
}
|
||||
|
||||
env_set() {
|
||||
if [ -z "$1" ]; then
|
||||
fatal_error "You must have your $1 environmental variable set to continue."
|
||||
exit 1
|
||||
fi
|
||||
install_shell() {
|
||||
local bashrc="$HOME/.bashrc" quoted_source
|
||||
touch "$bashrc"
|
||||
remove_managed_block "$bashrc"
|
||||
printf -v quoted_source '%q' "$APP_PATH/bash_tools.sh"
|
||||
{
|
||||
printf '\n%s\n' "$MANAGED_START"
|
||||
printf '[ -r %s ] && source %s\n' "$quoted_source" "$quoted_source"
|
||||
printf 'command -v zoxide >/dev/null 2>&1 && eval "$(zoxide init bash)"\n'
|
||||
printf '%s\n' "$MANAGED_END"
|
||||
} >> "$bashrc"
|
||||
success "Installed managed Bash block in $bashrc"
|
||||
}
|
||||
|
||||
try_symlink() {
|
||||
local source_path="$1"
|
||||
local symlink_path="$2"
|
||||
if [ -e "$source_path" ]; then
|
||||
ln -sf "$source_path" "$symlink_path"
|
||||
msg "Create symlink $symlink_path points to $source_path"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
install_tmux() {
|
||||
require tmux
|
||||
link_config "$APP_PATH/.tmux.conf" "$HOME/.tmux.conf"
|
||||
local tpm="$HOME/.tmux/plugins/tpm"
|
||||
if [[ ! -d "$tpm/.git" ]]; then
|
||||
[[ ! -e "$tpm" ]] || die "$tpm exists but is not a Git repository."
|
||||
mkdir -p "$(dirname "$tpm")"
|
||||
git clone --depth 1 https://github.com/tmux-plugins/tpm "$tpm"
|
||||
fi
|
||||
success 'Installed tmux configuration and TPM.'
|
||||
}
|
||||
|
||||
############################ SETUP FUNCTIONS
|
||||
main() {
|
||||
case "${1:-}" in
|
||||
-h|--help) usage; return ;;
|
||||
esac
|
||||
|
||||
backup_file() {
|
||||
local original_file=$1
|
||||
if [ -f "$original_file" ] && [ ! -L "$original_file" ]; then
|
||||
today=`date +%Y%m%d_%s`
|
||||
mv -v "$original_file" "$original_file.$today";
|
||||
success "Your file $original_file has been backed up as $original_file.$today"
|
||||
fi
|
||||
ensure_repo
|
||||
local components=("$@") component
|
||||
((${#components[@]})) || components=(all)
|
||||
for component in "${components[@]}"; do
|
||||
case "$component" in
|
||||
all)
|
||||
install_vim
|
||||
install_shell
|
||||
install_tmux
|
||||
;;
|
||||
vim) install_vim ;;
|
||||
shell) install_shell ;;
|
||||
tmux) install_tmux ;;
|
||||
*) usage; die "Unknown component: $component" ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# Usage: sync_repo path url
|
||||
#
|
||||
# This function try to clone git repo host in @url
|
||||
# to @path. If @path alreay exsits, it will simply
|
||||
# update the repo
|
||||
sync_repo() {
|
||||
local repo_path="$1"
|
||||
local repo_uri="$2"
|
||||
local repo_branch="$3"
|
||||
local repo_name="$4"
|
||||
|
||||
if [ ! -e "$repo_path" ]; then
|
||||
msg "Trying to clone $repo_name"
|
||||
mkdir -p "$repo_path"
|
||||
git clone -b "$repo_branch" "$repo_uri" "$repo_path"
|
||||
ret="$?"
|
||||
success "Successfully cloned $repo_name."
|
||||
else
|
||||
msg "Trying to update $repo_name"
|
||||
cd "$repo_path" && git pull origin "$repo_branch"
|
||||
ret="$?"
|
||||
success "Successfully updated $repo_name"
|
||||
fi
|
||||
}
|
||||
|
||||
# simply clone a repo
|
||||
sync_repo_default() {
|
||||
local repo_uri="$1"
|
||||
local repo_path="$2"
|
||||
|
||||
if [ ! -e "$repo_path" ]; then
|
||||
msg "Trying to clone repo"
|
||||
mkdir -p "$repo_path"
|
||||
git clone "$repo_uri" "$repo_path"
|
||||
ret="$?"
|
||||
success "Successfully cloned repo."
|
||||
else
|
||||
msg "Trying to update repo"
|
||||
cd "$repo_path" && git pull
|
||||
ret="$?"
|
||||
success "Successfully updated repo"
|
||||
fi
|
||||
}
|
||||
|
||||
setup_vimplug() {
|
||||
|
||||
# if vimplug is already installed
|
||||
# comment out since this can update vimplug
|
||||
#if [ -e "~/.vim/autoload/plug.vim" ]; then
|
||||
# return 0
|
||||
#fi
|
||||
|
||||
mkdir -p "$VIM_RTPATH/autoload"
|
||||
# setup for vim
|
||||
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
|
||||
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim > /dev/null 2>&1
|
||||
|
||||
local system_shell="$SHELL"
|
||||
export SHELL='/bin/sh'
|
||||
|
||||
vim \
|
||||
"+set nomore" \
|
||||
"+PlugInstall!" \
|
||||
"+qall"
|
||||
|
||||
export SHELL="$system_shell"
|
||||
success "Plugins' updated/installed using vim-plug \n(Be careful some plugins may not be installed since they require to use neovim or higher vim version. To intall them, run :PlugInstall inside correct version)"
|
||||
}
|
||||
|
||||
set_up_nvim() {
|
||||
if program_exists "nvim"; then
|
||||
nvim_dir="$HOME/.config/nvim"
|
||||
nvim_config="$nvim_dir/init.vim"
|
||||
mkdir -p $nvim_dir
|
||||
msg "Found neovim."
|
||||
if [ -f "$nvim_config" ]; then
|
||||
msg "Found init.vim. backing up it"
|
||||
mv $nvim_config "${nvim_config}.backup"
|
||||
fi
|
||||
echo "set runtimepath^=~/.vim runtimepath+=~/.vim/after
|
||||
let &packpath=&runtimepath
|
||||
source ~/.vimrc" > $nvim_config
|
||||
success "Neovim config setup successed"
|
||||
else
|
||||
fail "Neovim config is not setup(neovim not installed)"
|
||||
fi
|
||||
}
|
||||
|
||||
# tmux plugin manager
|
||||
set_up_tpm() {
|
||||
|
||||
echo "Install TPM(tmux plugin manager)?('y' install; 'other keys' nope)"
|
||||
read -r respond
|
||||
if [ "$respond" = "y" ] || [ "$respond" = "yes" ]; then
|
||||
local url="https://github.com/tmux-plugins/tpm"
|
||||
sync_repo_default "$url" "$HOME/.tmux/plugins/tpm"
|
||||
success "TPM installed"
|
||||
else
|
||||
fail "TPM not installed"
|
||||
fi
|
||||
}
|
||||
|
||||
set_up_tmux() {
|
||||
if program_exists "tmux"; then
|
||||
backup_file "$HOME/.tmux.conf"
|
||||
try_symlink "$APP_PATH/.tmux.conf" "$HOME/.tmux.conf" && \
|
||||
success "Tmux config setup successed"
|
||||
set_up_tpm
|
||||
else
|
||||
fail "Tmux config is not setup(tmux not installed)"
|
||||
fi
|
||||
}
|
||||
|
||||
set_up_vim() {
|
||||
if ! program_exists "vim" && ! program_exists "nvim" ; then
|
||||
fatal_error "You must have 'vim' or 'nvim(neovim)' installed to continue."
|
||||
fi
|
||||
program_must_exist "git"
|
||||
program_must_exist "curl"
|
||||
|
||||
sync_repo "$APP_PATH" \
|
||||
"$REPO_URI" \
|
||||
"$REPO_BRANCH" \
|
||||
"$app_name"
|
||||
|
||||
backup_file "$HOME/.vimrc"
|
||||
backup_file "$HOME/.vimrc.bundles"
|
||||
|
||||
try_symlink "$APP_PATH/.vimrc" "$HOME/.vimrc"
|
||||
try_symlink "$APP_PATH/.vimrc.bundles" "$HOME/.vimrc.bundles"
|
||||
|
||||
success "Setting up symlinks for vim configuration"
|
||||
set_up_nvim
|
||||
setup_vimplug
|
||||
}
|
||||
|
||||
# zoxide requres extra shell configuration setup
|
||||
set_up_zoxide_shell_config() {
|
||||
local source_cmd_zsh='eval "$(zoxide init zsh)"'
|
||||
local source_cmd_bash='eval "$(zoxide init bash)"'
|
||||
if program_exists "zsh"; then
|
||||
# if not already contain source command
|
||||
file_contains "$source_cmd_zsh" ~/.zshrc
|
||||
status_code=$?
|
||||
if [ "$status_code" != '0' ]; then
|
||||
echo "Install zoxide source command ($source_cmd_zsh) for zsh shell?('y' install; others no)"
|
||||
read -r respond
|
||||
if [ "$respond" = "y" ] || [ "$respond" = "yes" ]; then
|
||||
echo "$source_cmd_zsh" >> $HOME/.zshrc
|
||||
success "add ($source_cmd_zsh) to zsh"
|
||||
else
|
||||
fail "not adding ($source_cmd_zsh) to zsh"
|
||||
fi
|
||||
else
|
||||
success "($source_cmd_zsh) is already in zsh"
|
||||
fi
|
||||
fi
|
||||
|
||||
if program_exists "bash"; then
|
||||
# if not already contain source command
|
||||
file_contains "$source_cmd_bash" ~/.bashrc
|
||||
status_code=$?
|
||||
if [ "$status_code" != '0' ]; then
|
||||
echo "Install zoxide source command ($source_cmd_bash) for bash shell?('y' install; others no)"
|
||||
read -r respond
|
||||
if [ "$respond" = "y" ] || [ "$respond" = "yes" ]; then
|
||||
echo "$source_cmd_bash" >> $HOME/.bashrc
|
||||
success "add ($source_cmd_bash) to bash"
|
||||
else
|
||||
fail "not adding ($source_cmd_bash) to bash"
|
||||
fi
|
||||
else
|
||||
success "($source_cmd_bash) is already in bash"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
set_up_zoxide() {
|
||||
# https://github.com/ajeetdsouza/zoxide
|
||||
|
||||
if program_exists "zoxide"; then
|
||||
success "zoxide is already installed"
|
||||
set_up_zoxide_shell_config
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "Install zoxide (smart cd like autojump)?('y' install; 'other keys' nope)"
|
||||
read -r respond
|
||||
if [ "$respond" = "y" ] || [ "$respond" = "yes" ]; then
|
||||
program_must_exist "curl"
|
||||
# This will install zoxide into ~/.local
|
||||
curl -sS https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | bash
|
||||
set_up_zoxide_shell_config
|
||||
|
||||
else
|
||||
fail "zoxide is not installed"
|
||||
fi
|
||||
}
|
||||
set_up_fish(){
|
||||
local source_cmd="source $APP_PATH/config/fish/config.fish"
|
||||
local fish_config="$HOME/.config/fish/config.fish"
|
||||
if program_exists "fish"; then
|
||||
# if not already contain source command
|
||||
file_contains "$source_cmd" $fish_config
|
||||
status_code=$?
|
||||
if [ "$status_code" != '0' ]; then
|
||||
echo "Install fish configuration script for fish shell?('y' install; 'other keys' nope)"
|
||||
read -r respond
|
||||
if [ "$respond" = "y" ] || [ "$respond" = "yes" ]; then
|
||||
echo "$source_cmd" >> $fish_config
|
||||
success "fish configuration is sourced in $fish_config"
|
||||
else
|
||||
fail "Configuration is not sourced in fish"
|
||||
fi
|
||||
else
|
||||
success "fish script is already sourced"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
set_up_bash_tool(){
|
||||
local source_cmd="source $APP_PATH/bash_tools.sh"
|
||||
local source_cmd2="source ~/.$app_name/bash_tools.sh"
|
||||
if program_exists "zsh"; then
|
||||
# if not already contain source command
|
||||
file_contains "$source_cmd" ~/.zshrc
|
||||
status_code=$?
|
||||
if [ "$status_code" != '0' ]; then
|
||||
file_contains "$source_cmd2" ~/.zshrc
|
||||
status_code=$?
|
||||
fi
|
||||
if [ "$status_code" != '0' ]; then
|
||||
echo "Install terminal configuration script for zsh shell?('y' install; 'other keys' nope)"
|
||||
read -r respond
|
||||
if [ "$respond" = "y" ] || [ "$respond" = "yes" ]; then
|
||||
echo "$source_cmd" >> $HOME/.zshrc
|
||||
success "Terminal configuration is sourced in zsh"
|
||||
else
|
||||
fail "Configuration is not sourced in zsh"
|
||||
fi
|
||||
else
|
||||
success "zsh script is already sourced"
|
||||
fi
|
||||
fi
|
||||
|
||||
if program_exists "bash"; then
|
||||
# if not already contain source command
|
||||
file_contains "$source_cmd" ~/.bashrc
|
||||
status_code=$?
|
||||
if [ "$status_code" != '0' ]; then
|
||||
file_contains "$source_cmd2" ~/.bashrc
|
||||
status_code=$?
|
||||
fi
|
||||
if [ "$status_code" != '0' ]; then
|
||||
echo "Install terminal configuration script for bash shell?('y' install; 'other keys' nope)"
|
||||
read -r respond
|
||||
if [ "$respond" = "y" ] || [ "$respond" = "yes" ]; then
|
||||
echo "$source_cmd" >> $HOME/.bashrc
|
||||
success "Terminal configuration is sourced in bash"
|
||||
else
|
||||
fail "Configuration is not sourced in bash"
|
||||
fi
|
||||
else
|
||||
success "bash script is already sourced"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
############################ MAIN()
|
||||
env_set "$HOME"
|
||||
|
||||
set_up_vim
|
||||
set_up_tmux
|
||||
set_up_bash_tool
|
||||
set_up_fish
|
||||
set_up_zoxide
|
||||
|
||||
msg "\nThanks for installing $app_name."
|
||||
main "$@"
|
||||
|
||||
@@ -1,305 +0,0 @@
|
||||
" (jump to the topic)
|
||||
"
|
||||
" OPTIONS
|
||||
" PLUGIN_INSTALL
|
||||
" UTILITIES
|
||||
" PLUGIN_CONFIGURATION " THEME_CONFIGURATION
|
||||
" KEY_MAPS
|
||||
" OTHER_CONFIGS
|
||||
|
||||
let g:high_performence = v:false
|
||||
let g:autocomplte_enable = v:true
|
||||
let g:copilot_enable = v:true
|
||||
|
||||
" only in nvim (using which-key)
|
||||
let g:key_prompt = v:false
|
||||
|
||||
" only used by neovim
|
||||
let g:classic_vim_ui = v:true
|
||||
let g:animation_enable = v:false
|
||||
|
||||
let g:swap_dict = [
|
||||
\ ['v:false', '0', 'dark', 'false' ],
|
||||
\ ['v:true' , '1', 'light', 'true']]
|
||||
" convinient function to swap between two options
|
||||
nmap <leader><leader>t :call utils#swapword()<CR>
|
||||
|
||||
"""""" PLUGIN_INSTALL """"""
|
||||
|
||||
let g:dotvimdir = expand(g:dotfiledir . 'config/vim/')
|
||||
let g:plugin_dir = expand(g:vim_dir . 'plugged/')
|
||||
|
||||
let g:theme_config_path = expand(g:vim_dir . ".config.vim")
|
||||
|
||||
call plug#begin(g:plugin_dir)
|
||||
" https://github.com/junegunn/vim-plug/wiki/tips
|
||||
function! Cond(cond, ...)
|
||||
let opts = get(a:000, 0, {})
|
||||
return a:cond ? opts : extend(opts, { 'on': [], 'for': [] })
|
||||
endfunction
|
||||
let g:animation_enable = g:high_performence ? v:false : g:animation_enable
|
||||
|
||||
if !g:high_performence
|
||||
Plug 'aditya-azad/candle-grey'
|
||||
Plug 't184256/vim-boring'
|
||||
Plug 'tek256/simple-dark'
|
||||
Plug 'sainnhe/everforest'
|
||||
Plug 'bluz71/vim-moonfly-colors', { 'as': 'moonfly' }
|
||||
Plug 'cocopon/iceberg.vim'
|
||||
Plug 'catppuccin/nvim', Cond( has('nvim-0.8.2') \|\| g:vim_v >= 900 , { 'as': 'catppuccin' })
|
||||
Plug 'NLKNguyen/papercolor-theme'
|
||||
Plug 'EdenEast/nightfox.nvim', Cond(has('nvim-0.5'))
|
||||
Plug 'projekt0n/github-nvim-theme', Cond(has('nvim-0.5'), { 'tag': 'v0.0.7' })
|
||||
Plug 'folke/tokyonight.nvim', Cond(g:vim_type == 'nvim', { 'branch': 'main' })
|
||||
Plug 'andymass/vim-matchup'
|
||||
endif
|
||||
Plug 'Donaldttt/fuzzyy'
|
||||
" Plug '~/repo/PR/fuzzyy-files'
|
||||
" let g:fuzzyy_files_ignore_file = ['configg']
|
||||
" let g:fuzzyy_files_ignore_dir = ['config', '.git']
|
||||
" let g:fuzzyy_files_ignore_file = []
|
||||
" let g:fuzzyy_files_ignore_dir = []
|
||||
Plug 'tpope/vim-repeat'
|
||||
Plug 'tpope/vim-fugitive'
|
||||
Plug 'tpope/vim-surround'
|
||||
" Plug 'lervag/vimtex'
|
||||
Plug 'github/copilot.vim', Cond(( g:vim_type == 'nvim' \|\| g:vim_v >= 900 )
|
||||
\ && g:copilot_enable && executable('node'))
|
||||
|
||||
Plug 'nanotee/zoxide.vim', Cond(executable('zoxide'))
|
||||
|
||||
Plug 'godlygeek/tabular'
|
||||
|
||||
Plug 'preservim/vim-markdown'
|
||||
|
||||
Plug 'dstein64/vim-startuptime', Cond(!g:high_performence)
|
||||
Plug 'simeji/winresizer', Cond(!g:high_performence)
|
||||
" Plug 'rust-lang/rust.vim', { 'for': ['rust'] }
|
||||
|
||||
Plug 'rhysd/conflict-marker.vim'
|
||||
|
||||
Plug 'jiangmiao/auto-pairs'
|
||||
" Plug 'mg979/vim-visual-multi'
|
||||
Plug 'RRethy/vim-illuminate', Cond(!g:high_performence)
|
||||
" Plug 'ludovicchabant/vim-gutentags'
|
||||
" Plug 'ctrlpvim/ctrlp.vim'
|
||||
|
||||
"" ESSENTIAL_PLUGINS ""
|
||||
|
||||
Plug 'mhinz/vim-startify'
|
||||
Plug 'christoomey/vim-tmux-navigator'
|
||||
" Comment stuff out
|
||||
Plug 'tpope/vim-commentary'
|
||||
Plug 'vim-scripts/restore_view.vim'
|
||||
|
||||
" vim only plugins
|
||||
Plug 'scrooloose/nerdtree', Cond(g:vim_type == 'vim' \|\| !has('nvim-0.8'), { 'on' : ['NERDTreeToggle', 'NERDTreeFind'] })
|
||||
Plug 'tiagofumo/vim-nerdtree-syntax-highlight', Cond(g:vim_type == 'vim' && !g:high_performence)
|
||||
|
||||
Plug 'neoclide/coc.nvim', Cond(g:autocomplte_enable && executable('node'), {'branch': 'release'})
|
||||
" only work with vim
|
||||
if g:vim_type == 'vim'
|
||||
if executable('ctags')
|
||||
Plug 'preservim/tagbar'
|
||||
else
|
||||
Plug 'liuchengxu/vista.vim', Cond(!g:high_performence)
|
||||
endif
|
||||
|
||||
Plug 'airblade/vim-rooter'
|
||||
" Plug 'justinmk/vim-sneak'
|
||||
Plug 'airblade/vim-gitgutter'
|
||||
Plug 'chriskempson/base16-vim'
|
||||
" Plug 'Yggdroot/indentLine'
|
||||
" Plug 'Donaldttt/fzf-color-preview', Cond(g:vim_v >= 800, { 'on': ['ColorsPreview', 'AirlinePreview'] })
|
||||
|
||||
Plug 'markonm/traces.vim'
|
||||
" Plug 'voldikss/vim-floaterm', Cond(has('terminal') && g:vim_type == 'vim')
|
||||
set encoding=UTF-8
|
||||
" Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
|
||||
" Plug 'junegunn/fzf.vim'
|
||||
" Plug 'antoinemadec/coc-fzf', Cond(g:os != 'Windows', {'on': ['CocFzfList']})
|
||||
|
||||
Plug 'Donaldttt/vim-bufferline'
|
||||
|
||||
Plug 'Donaldttt/vim-global-statusline', { 'branch': 'vim9' }
|
||||
" Plug 'vim-airline/vim-airline'
|
||||
" Plug 'vim-airline/vim-airline-themes'
|
||||
|
||||
Plug 'ryanoasis/vim-devicons'
|
||||
" Plug 'wfxr/minimap.vim', Cond(executable('code-minimap'), {'on' : ['MinimapToggle']})
|
||||
endif
|
||||
|
||||
if g:vim_type == 'nvim'
|
||||
Plug 'RRethy/nvim-base16'
|
||||
|
||||
if has('nvim-0.5')
|
||||
" Plug 'hkupty/iron.nvim'
|
||||
" Plug 'metakirby5/codi.vim'
|
||||
Plug 'lukas-reineke/indent-blankline.nvim', Cond(!g:animation_enable)
|
||||
Plug 'echasnovski/mini.indentscope', Cond(g:animation_enable)
|
||||
Plug 'echasnovski/mini.animate', Cond(g:animation_enable)
|
||||
|
||||
Plug 'nvim-lualine/lualine.nvim'
|
||||
Plug 'petertriho/nvim-scrollbar', Cond(g:animation_enable)
|
||||
Plug 'folke/which-key.nvim', Cond(!g:high_performence && g:key_prompt)
|
||||
Plug 'ahmedkhalf/project.nvim'
|
||||
endif
|
||||
if has('nvim-0.7')
|
||||
Plug 'stevearc/aerial.nvim'
|
||||
Plug 'nvim-treesitter/nvim-treesitter', Cond(executable('make'), {'do': ':TSUpdate'})
|
||||
|
||||
" for telescope
|
||||
Plug 'nvim-lua/plenary.nvim'
|
||||
Plug 'nvim-telescope/telescope.nvim', Cond(g:vim_type == 'nvim', { 'branch': '0.1.x' })
|
||||
" c plugin for telescope to make it faster
|
||||
Plug 'nvim-telescope/telescope-fzf-native.nvim', Cond(executable('make'), { 'do': 'make' })
|
||||
|
||||
" comment out this plugin if the machine doesn't have required
|
||||
" font install
|
||||
Plug 'nvim-tree/nvim-web-devicons'
|
||||
" Plug 'akinsho/toggleterm.nvim', Cond(g:vim_type == 'nvim', {'tag' : '*'})
|
||||
|
||||
Plug 'ggandor/leap.nvim'
|
||||
endif
|
||||
if has('nvim-0.8')
|
||||
Plug 'nvim-tree/nvim-tree.lua'
|
||||
Plug 'lewis6991/gitsigns.nvim'
|
||||
|
||||
Plug 'rcarriga/nvim-notify', Cond(!g:high_performence && !g:classic_vim_ui)
|
||||
Plug 'folke/noice.nvim', Cond(!g:high_performence && !g:classic_vim_ui)
|
||||
Plug 'MunifTanjim/nui.nvim', Cond(!g:high_performence && !g:classic_vim_ui)
|
||||
endif
|
||||
|
||||
" nvim theme
|
||||
if has('nvim-0.9')
|
||||
Plug 'rebelot/kanagawa.nvim'
|
||||
Plug 'rose-pine/neovim', { 'as': 'rose-pine' }
|
||||
endif
|
||||
endif
|
||||
|
||||
" custom plugin
|
||||
Plug g:dotvimdir
|
||||
call plug#end()
|
||||
|
||||
|
||||
augroup InitConfig
|
||||
" Automatically install missing plugins at startup
|
||||
autocmd VimEnter *
|
||||
\ if len(filter(values(g:plugs), '!isdirectory(v:val.dir)'))
|
||||
\| PlugInstall --sync | q
|
||||
\| endif
|
||||
augroup end
|
||||
|
||||
"""""" UTILITIES """"""
|
||||
|
||||
" a list of funcref that will be initilized late
|
||||
let g:post_init_func = []
|
||||
|
||||
function RegisterLateInit(func, delay, ...)
|
||||
let Funcref = type(a:func) == 10 ? func : function(a:func)
|
||||
let obj = [Funcref, a:delay, a:000]
|
||||
call add(g:post_init_func, obj)
|
||||
endfunction
|
||||
|
||||
function s:executeLateInit()
|
||||
function s:lateInitHelper(...)
|
||||
for obj in g:post_init_func
|
||||
let Funcref = obj[0]
|
||||
let delay = obj[1]
|
||||
let args = obj[2]
|
||||
if delay == 0
|
||||
if len(args) > 0
|
||||
call Funcref(args)
|
||||
else
|
||||
call Funcref()
|
||||
endif
|
||||
else
|
||||
call timer_start(delay, Funcref)
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
autocmd VimEnter * call s:lateInitHelper()
|
||||
endfunction
|
||||
|
||||
" source lua library
|
||||
|
||||
"""""" THEME_CONFIGURATION """"""
|
||||
nmap <Leader>db :call utils#showHiGroup()<CR>
|
||||
|
||||
""" THEME_OPTIONS """
|
||||
|
||||
call theme#Init()
|
||||
|
||||
"""""" KEY_MAPS """"""
|
||||
" (This doesn't include plugin specific mapping.
|
||||
" For them check plugin Preferences)
|
||||
|
||||
nnoremap <leader>ws :call utils#trimwhitespace()<CR>
|
||||
|
||||
" Toggle dark/light theme
|
||||
noremap <silent> <leader>cbg :call theme#toggleBg()<CR>
|
||||
|
||||
" Toggle transparent background
|
||||
noremap <silent> <leader>ctb :call theme#toggleTransparent()<CR>
|
||||
|
||||
" Buffer navigation
|
||||
nnoremap <silent> <space>q :bprevious<CR>
|
||||
nnoremap <silent> <space>e :bnext<CR>
|
||||
|
||||
" leader s change all occurence
|
||||
nnoremap <Leader>s :%s/\<<C-r><C-w>\>/<C-r><C-w>
|
||||
|
||||
noremap <leader>h :noh<CR> " turn off highlight
|
||||
|
||||
" disable two easily mispressed yet useless key
|
||||
nnoremap q: <nop>
|
||||
nnoremap Q <nop>
|
||||
|
||||
" we often press shift key by mistake
|
||||
command WQ wq
|
||||
command Wq wq
|
||||
command W w
|
||||
command Q q
|
||||
|
||||
" leader num change tab
|
||||
" only for vim or nvim without lualine
|
||||
|
||||
if (g:vim_type == 'vim' || !has('nvim-0.5')) && utils#hasplug('vim-bufferline')
|
||||
for i in range(1, 9)
|
||||
execute "nnoremap <silent> <nowait> <leader>" . i .
|
||||
\ " :call bufferline#jump(" . i . ")<CR>"
|
||||
endfor
|
||||
for i in range(10, 20)
|
||||
execute "nnoremap <silent> <nowait> <leader><leader>" . i .
|
||||
\ " :call bufferline#jump(" . i . ")<CR>"
|
||||
endfor
|
||||
end
|
||||
|
||||
" split window comform with other window management shortcuts
|
||||
nnoremap <silent> <C-w>% :vsplit<CR>
|
||||
nnoremap <silent> <C-w>" :split<CR>
|
||||
|
||||
" source all vim specific config eg. gui vim
|
||||
for f in split(glob(g:dotvimdir.'/configs/*-config.vim'), '\n')
|
||||
exe 'source' f
|
||||
endfor
|
||||
|
||||
" source all vim plugin config
|
||||
for f in split(glob(g:dotvimdir.'/vim-plugin-settings/*.config.vim'), '\n')
|
||||
exe 'source' f
|
||||
endfor
|
||||
|
||||
" source all vim9 plugin configs
|
||||
if g:vim_v >= 900
|
||||
for f in split(glob(g:dotvimdir.'/vim-plugin-settings/vim9/*.config.vim'), '\n')
|
||||
exe 'source' f
|
||||
endfor
|
||||
endif
|
||||
|
||||
" source lua plugins if in neovim
|
||||
if has('nvim')
|
||||
lua require('lua-plugin-settings')
|
||||
endif
|
||||
|
||||
|
||||
call s:executeLateInit()
|
||||
@@ -1,32 +0,0 @@
|
||||
vim9script
|
||||
|
||||
def Fuzzysearch9(li: list<string>, pattern: string, limit: number): list<any>
|
||||
var opts = {}
|
||||
if limit > 0
|
||||
opts['limit'] = limit
|
||||
endif
|
||||
var results: list<any> = matchfuzzypos(li, pattern, opts)
|
||||
var strs = results[0]
|
||||
var poss = results[1]
|
||||
var scores = results[2]
|
||||
|
||||
# if limit > 0
|
||||
# strs = strs[: limit]
|
||||
# poss = poss[: limit]
|
||||
# scores = scores[: limit]
|
||||
# endif
|
||||
|
||||
var str_list = []
|
||||
var hl_list = []
|
||||
var idx = 0
|
||||
for str in strs
|
||||
add(str_list, str)
|
||||
add(
|
||||
hl_list,
|
||||
[idx + 1, reduce(poss[idx], (acc, val) => add(acc, val + 1), [])])
|
||||
idx += 1
|
||||
endfor
|
||||
return [str_list, hl_list]
|
||||
enddef
|
||||
|
||||
Fuzzysearch9(['foo', 'bar', 'baz'], 'ba', 0)
|
||||
+34
-11
@@ -1,18 +1,41 @@
|
||||
#!/usr/bin/env sh
|
||||
#!/usr/bin/env bash
|
||||
|
||||
app_dir="$HOME/dotfiles"
|
||||
set -Eeuo pipefail
|
||||
|
||||
warn() {
|
||||
echo "$1" >&2
|
||||
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" 2>/dev/null && pwd -P || true)"
|
||||
if [[ -n "$SCRIPT_DIR" && -e "$SCRIPT_DIR/.git" ]]; then
|
||||
APP_PATH="${APP_PATH:-$SCRIPT_DIR}"
|
||||
else
|
||||
APP_PATH="${APP_PATH:-$HOME/.dotfiles}"
|
||||
fi
|
||||
readonly APP_PATH
|
||||
readonly MANAGED_START='# >>> dotfiles >>>'
|
||||
readonly MANAGED_END='# <<< dotfiles <<<'
|
||||
|
||||
remove_managed_link() {
|
||||
local target=$1 expected=$2
|
||||
if [[ -L "$target" && "$(readlink "$target")" == "$expected" ]]; then
|
||||
rm -- "$target"
|
||||
printf 'Removed %s\n' "$target"
|
||||
fi
|
||||
}
|
||||
|
||||
die() {
|
||||
warn "$1"
|
||||
exit 1
|
||||
remove_managed_block() {
|
||||
local file=$1 temp
|
||||
[[ -f "$file" ]] || return
|
||||
temp=$(mktemp)
|
||||
awk -v start="$MANAGED_START" -v end="$MANAGED_END" '
|
||||
$0 == start { managed = 1; next }
|
||||
$0 == end { managed = 0; next }
|
||||
!managed { print }
|
||||
' "$file" > "$temp"
|
||||
cat "$temp" > "$file"
|
||||
rm -f "$temp"
|
||||
}
|
||||
|
||||
rm $HOME/.vimrc
|
||||
rm $HOME/.vimrc.bundles
|
||||
rm $HOME/.vim
|
||||
remove_managed_link "$HOME/.vimrc" "$APP_PATH/.vimrc"
|
||||
remove_managed_link "$HOME/.tmux.conf" "$APP_PATH/.tmux.conf"
|
||||
remove_managed_block "$HOME/.bashrc"
|
||||
|
||||
rm -rf $app_dir
|
||||
printf '%s\n' 'Dotfile links and the managed Bash block were removed.'
|
||||
printf '%s\n' 'The repository, Vim data/plugins, TPM, and backups were retained.'
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
rm -rf ~/.vim/.vim*
|
||||
rm ~/.viminfo
|
||||
+72
-71
@@ -1,87 +1,88 @@
|
||||
""" cross platform installation script
|
||||
"""
|
||||
"""Install the Vim 9 configuration on Windows."""
|
||||
|
||||
from pathlib import Path
|
||||
from shutil import which
|
||||
import subprocess
|
||||
import os
|
||||
import time
|
||||
import urllib.request
|
||||
|
||||
from os.path import expanduser, join
|
||||
from shutil import which
|
||||
|
||||
home = expanduser("~")
|
||||
app_name = 'dotfiles'
|
||||
APP_PATH = join(home, '.' + app_name)
|
||||
REPO_URL = 'https://github.com/Donaldttt/' + app_name
|
||||
REPO_BRANCH = 'main'
|
||||
VIM_RTPATH = join(home, '.vim')
|
||||
HOME = Path.home()
|
||||
SCRIPT_PATH = Path(__file__).resolve().parent
|
||||
DEFAULT_APP_PATH = HOME / ".dotfiles"
|
||||
APP_PATH = SCRIPT_PATH if (SCRIPT_PATH / ".git").exists() else DEFAULT_APP_PATH
|
||||
REPO_URL = "https://github.com/Donaldttt/dotfiles.git"
|
||||
REPO_BRANCH = "main"
|
||||
VIM_PATH = HOME / "vimfiles"
|
||||
VIMRC = HOME / "_vimrc"
|
||||
|
||||
def exist(app):
|
||||
return which(app) is not None
|
||||
|
||||
def program_must_exist(app):
|
||||
if not exist(app):
|
||||
fatal_error("must be installed to continue")
|
||||
def run(command, cwd=None):
|
||||
subprocess.run(command, cwd=cwd, check=True)
|
||||
|
||||
def fatal_error(msg):
|
||||
print('Error:', msg)
|
||||
exit()
|
||||
|
||||
def msg(msg):
|
||||
print(msg)
|
||||
def require(program):
|
||||
if which(program) is None:
|
||||
raise SystemExit(f"Error: {program} must be installed.")
|
||||
|
||||
def execute(cmd, cwd=None):
|
||||
out = subprocess.check_output(
|
||||
cmd,
|
||||
stderr=subprocess.STDOUT,
|
||||
shell=True,
|
||||
cwd=None
|
||||
|
||||
def ensure_repo():
|
||||
if (APP_PATH / ".git").exists():
|
||||
return
|
||||
if APP_PATH.exists():
|
||||
raise SystemExit(f"Error: {APP_PATH} exists but is not a Git repository.")
|
||||
print(f"Cloning dotfiles into {APP_PATH}...")
|
||||
run(
|
||||
[
|
||||
"git",
|
||||
"clone",
|
||||
"--branch",
|
||||
REPO_BRANCH,
|
||||
"--depth",
|
||||
"1",
|
||||
REPO_URL,
|
||||
str(APP_PATH),
|
||||
]
|
||||
)
|
||||
print(out)
|
||||
|
||||
def sync_repo(repo_path, repo_url, repo_branch, repo_name):
|
||||
if not os.path.exists(repo_path):
|
||||
msg('Trying to clone ' + repo_name)
|
||||
cmd = "git clone -b {} {} {}".format(repo_branch, repo_url, repo_path)
|
||||
execute(cmd)
|
||||
else:
|
||||
msg('Trying to update ' + repo_name)
|
||||
cmd = "git pull origin {}".format(repo_branch)
|
||||
execute(cmd, cwd=APP_PATH)
|
||||
|
||||
def setup_vimplug():
|
||||
def check_vim_version():
|
||||
result = subprocess.run(
|
||||
["vim", "--clean", "-Nu", "NONE", "-n", "-es", "+if v:version < 900 | cquit | endif", "+qall"]
|
||||
)
|
||||
if result.returncode:
|
||||
raise SystemExit("Error: Vim 9 or newer is required.")
|
||||
|
||||
vimplug_path = VIM_RTPATH + "\\autoload\\plug.vim"
|
||||
if not os.path.isdir(os.path.dirname(vimplug_path)):
|
||||
os.makedirs(os.path.dirname(vimplug_path))
|
||||
urllib.request.urlretrieve("https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim", vimplug_path)
|
||||
print("Please execute :PlugInstall in vim")
|
||||
|
||||
def setup_nvim():
|
||||
if exist('nvim'):
|
||||
nvim_dir = home + '\\AppData\\Local\\nvim\\'
|
||||
nvim_config = nvim_dir + 'init.vim'
|
||||
if not os.path.isdir(nvim_dir):
|
||||
os.mkdir(nvim_dir)
|
||||
msg('Setting up neovim config')
|
||||
with open(nvim_config, 'w') as f:
|
||||
f.write('''set runtimepath^=~/.vim runtimepath+=~/.vim/after
|
||||
let &packpath=&runtimepath
|
||||
source ~/.vimrc''')
|
||||
def install_vim_plug():
|
||||
target = VIM_PATH / "autoload" / "plug.vim"
|
||||
target.parent.mkdir(parents=True, exist_ok=True)
|
||||
urllib.request.urlretrieve(
|
||||
"https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim",
|
||||
target,
|
||||
)
|
||||
|
||||
def setup_vim():
|
||||
if not exist('vim') and not exist('nvim'):
|
||||
fatal_error('Error: vim or nvim has to be installed.')
|
||||
program_must_exist('git')
|
||||
sync_repo(APP_PATH, REPO_URL, REPO_BRANCH, app_name)
|
||||
path = join(home, '.vimrc')
|
||||
if os.path.exists(path):
|
||||
os.remove(path)
|
||||
os.symlink(join(APP_PATH, '.vimrc'), join(home, '.vimrc'))
|
||||
path = join(home, '.vimrc.bundles')
|
||||
if os.path.exists(path):
|
||||
os.remove(path)
|
||||
os.symlink(join(APP_PATH, '.vimrc.bundles'), join(home, '.vimrc.bundles'))
|
||||
setup_nvim()
|
||||
setup_vimplug()
|
||||
msg("Done!")
|
||||
|
||||
setup_vim()
|
||||
def install_vimrc():
|
||||
config_path = (APP_PATH / ".vimrc").as_posix().replace("'", "''")
|
||||
source_line = f"execute 'source ' . fnameescape('{config_path}')"
|
||||
if VIMRC.exists() and VIMRC.read_text(encoding="utf-8", errors="ignore").strip() != source_line:
|
||||
backup = VIMRC.with_name(f"{VIMRC.name}.{int(time.time())}.backup")
|
||||
VIMRC.replace(backup)
|
||||
print(f"Backed up existing Vim config to {backup}")
|
||||
VIMRC.write_text(source_line + "\n", encoding="utf-8")
|
||||
|
||||
|
||||
def main():
|
||||
require("git")
|
||||
require("vim")
|
||||
check_vim_version()
|
||||
ensure_repo()
|
||||
install_vimrc()
|
||||
install_vim_plug()
|
||||
run(["vim", "-Nu", str(APP_PATH / ".vimrc"), "+set nomore", "+PlugInstall --sync", "+qall"])
|
||||
print("Vim configuration installed.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user