diff options
Diffstat (limited to '.vim')
| -rw-r--r-- | .vim/miniplugins/code_terminal.vim | 79 | ||||
| -rw-r--r-- | .vim/miniplugins/my_statusline.vim | 81 | ||||
| -rw-r--r-- | .vim/miniplugins/spell_check_mode.vim | 33 | ||||
| -rw-r--r-- | .vim/startup/mappings.vim | 71 | ||||
| -rw-r--r-- | .vim/startup/pluginsettings.vim | 146 | ||||
| -rw-r--r-- | .vim/startup/settings.vim | 73 |
6 files changed, 483 insertions, 0 deletions
diff --git a/.vim/miniplugins/code_terminal.vim b/.vim/miniplugins/code_terminal.vim new file mode 100644 index 0000000..86ed1e6 --- /dev/null +++ b/.vim/miniplugins/code_terminal.vim @@ -0,0 +1,79 @@ +" Program in which build actions are executed. If no value, build commands are executes as bash commands. +" This is only really useful in languages with interpreters +let g:codeenvs = { +\ 'scheme' : 'racket', +\ 'lisp' : 'rlwrap sbcl --noinform', +\ } + +" The following two dictionaries support certain substitutions: +" %F - location of current file (relative path) +" %D - directory of current file (full path) + +" Building the current file only +let g:codebuildsingle = { +\ 'scheme' : '(enter! "%F")', +\ 'cpp' : "g++ -g -pedantic '%F' && ./a.out", +\ 'yacc' : 'bison -t -d %F', +\ 'lex' : 'flex %F', +\ 'haskell' : 'runhaskell "%F"', +\ 'lisp' : '(load "%F")', +\ } +" Building all files in the directory (and subdirectories) of the current file +let g:codebuildproject = { +\ 'cpp' : "g++ -g -pedantic '%D/'**/*.cpp && ./a.out" +\ } + +noremap <F3> :call CodeTerminal(g:codebuildsingle)<CR> +noremap <F4> :call CodeTerminal(g:codebuildproject)<CR> +inoremap <F3> <C-O>:call CodeTerminal(g:codebuildsingle)<CR> +inoremap <F4> <C-O>:call CodeTerminal(g:codebuildproject)<CR> +" We assume that the last accessed window is the one with the source code, otherwise it gets complicated +tnoremap <F3> <C-W><C-P>:call CodeTerminal(g:codebuildsingle)<CR><C-W><C-P> +tnoremap <F4> <C-W><C-P>:call CodeTerminal(g:codebuildproject)<CR><C-W><C-P> + + +let t:codetermbufnr = -1 +let t:codetermft = "" +let t:codetermhadenv = 0 +function! OpenCodeTerminal() + if !bufexists(t:codetermbufnr) + term + " Latest buffer is the terminal buffer we just opened + let t:codetermbufnr = bufnr("$") + " We go back to the file from which this was called + wincmd p + let t:codetermft = "" + let t:codetermhadenv = 0 + endif + + if &filetype != t:codetermft + if t:codetermhadenv + " This is kinda bad, since certain environments might not close with this only + call term_sendkeys(t:codetermbufnr, "\<C-D>") + " The sleep is kinda bad, but it fixes the next term_sendkeys not working properly + sleep 500m + endif + + let t:codetermft = &filetype + if has_key(g:codeenvs, &filetype) + call term_sendkeys(t:codetermbufnr, g:codeenvs[&filetype] . "\<CR>") + let t:codetermhadenv = 1 + else + let t:codetermhadenv = 0 + endif + endif +endfunction + +function! CodeTerminal(builddict) + call OpenCodeTerminal() + + if has_key(a:builddict, &filetype) + let buildcomm = a:builddict[&filetype] . "\<CR>" + let buildcomm = substitute(buildcomm, "%F", @%, "") + let buildcomm = substitute(buildcomm, "%D", expand('%:p:h'), "") + call term_sendkeys(t:codetermbufnr, buildcomm) + echo "[CodeTerminal] Sent build command!" + else + echo "[CodeTerminal] No value in build dictionary!" + endif +endfunction diff --git a/.vim/miniplugins/my_statusline.vim b/.vim/miniplugins/my_statusline.vim new file mode 100644 index 0000000..92b9f10 --- /dev/null +++ b/.vim/miniplugins/my_statusline.vim @@ -0,0 +1,81 @@ +" Needed settings +set laststatus=2 +set timeoutlen=1000 ttimeoutlen=10 +set noshowmode + +" call hlset([#{name: 'StatusLine', ctermfg: '252', ctermbg: '239'}]) + +" Logic + +let leftcap = '' +let rightcap = '' +let leftmcap = '' +let rightmcap = '' + +set statusline= +" Mode + +" Values are, in order, for: normal (default), insert, replace, visual modes +" [ctermfg, ctermbg] +let s:modecolors = [ +\ ['236', '117'], +\ ['236', '119'], +\ ['236', '203'], +\ ['236', '216'], +\] + +let modestring = '' + +hi SLMode ctermfg=1 ctermbg=0 +hi SLModeC ctermfg=1 ctermbg=0 + + +function! SLModeSetter() + let cm = mode() + let ind = 0 + + if cm == 'i' + let ind = 1 + elseif cm == 'R' + let ind = 2 + let cm = 'r' + elseif cm == 'v' + let ind = 3 + endif + + call hlset([#{name: 'SLMode', ctermfg: s:modecolors[l:ind][0], ctermbg: s:modecolors[l:ind][1]}]) + call hlset([#{name: 'SLModeC', ctermfg: s:modecolors[l:ind][1], ctermbg: '239'}]) + let g:modestring = l:cm + + return '' +endfunction + +set statusline+=%{SLModeSetter()}%#SLModeC#%{leftcap}%#SLMode#%{modestring}%#SLModeC#%{rightcap} +" \______leftcap______/\________mode_______/\______rightcap_____/ + +" Filename + +set statusline+=%#StatusLine#\ %f\ %{rightmcap} + +" File stat + +function! SLReadonly() + return (&ft !~? 'vimfiler' && &readonly) ? ' ' : '' +endfunction + +function! SLModified() + return (&ft =~ 'vimfiler') ? '' : (&modified ? '' : (&modifiable ? '' : '')) +endfunction + +set statusline+=\ %{SLReadonly()}%{SLModified()}\ + +" Middle separator +set statusline+=%= + +" Filetype +set statusline+=%{leftmcap}\ %{WebDevIconsGetFileTypeSymbol()}\ %{&ft}\ + +" Line and column count +hi SLRowCol ctermfg=238 ctermbg=244 +hi SLRowColC ctermfg=244 ctermbg=239 +set statusline+=%#SLRowColC#%{leftcap}%#SLRowCol#%l:%c%#SLRowColC#%{rightcap} diff --git a/.vim/miniplugins/spell_check_mode.vim b/.vim/miniplugins/spell_check_mode.vim new file mode 100644 index 0000000..cfdd46a --- /dev/null +++ b/.vim/miniplugins/spell_check_mode.vim @@ -0,0 +1,33 @@ +" When you press F6 it will toggle a "spell check mode", +" spell is activated and the colour scheme is changed +nmap <F6> :call SpellCheckModeToggle()<CR> + +function! SpellCheckModeToggle() + if g:colors_name == 'gruvbox' + set spell + colorscheme darkblue + else + set nospell + colorscheme gruvbox + endif +endfunction + +" Scrolling (shows history) in terminal (except in lazygit) +" Scroll up to activate it, and press a to deactivate it +" Slightly modified version of: https://github.com/vim/vim/issues/2490#issuecomment-393973253 +tmap <silent> <ScrollWheelUp> <c-w>:call EnterNormalMode()<CR> + +function! ExitNormalMode() + unmap <buffer> <silent> <RightMouse> + call feedkeys("a") +endfunction + +function! EnterNormalMode() + if @% == '!lazygit' + tunmap <silent> <ScrollWheelUp> + elseif &buftype == 'terminal' && mode('') == 't' + call feedkeys("\<c-w>N") + call feedkeys("\<c-y>") + map <buffer> <silent> <RightMouse> :call ExitNormalMode()<CR> + endif +endfunction diff --git a/.vim/startup/mappings.vim b/.vim/startup/mappings.vim new file mode 100644 index 0000000..4aec7f1 --- /dev/null +++ b/.vim/startup/mappings.vim @@ -0,0 +1,71 @@ +" Don't get into insert mode after adding a line with o/O +nnoremap o o<Esc> +nnoremap O O<Esc> + +" Ctrl-Backspace deletes the previous word in insert mode. +inoremap <C-h> <C-w> +inoremap <C-BS> <C-w> + +" Ctrl+s; Ctrl+c, Ctrl+v, Ctrl+x; Ctrl+z, Ctrl+r; Ctrl+a bindings that work on GUI applications +" Partly taken from: https://gist.github.com/jshih/3423345 +imap <C-s> <Esc>:w<CR>a +nmap <C-S> <Esc>:w<CR> +"imap <C-S-z> <C-r> An impossible dream +vmap <C-c> "+yi<Esc> +vmap <C-v> c<ESC>"+p<Esc> +imap <C-v> <ESC>"+pa +vmap <C-x> "+c<Esc> +imap <C-z> <ESC>ui +imap <C-r> <ESC><C-r>i +map <C-a> ggVG + +" Show all buffers and be able to just type in the number of the buffer +map <C-f> :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space> + +" Move a line up and down with Alt+k and Alt-j +execute "set <M-j>=\ej" +nnoremap <M-j> <ESC>:m+1<CR> +execute "set <M-k>=\ek" +nnoremap <M-k> <ESC>:m-2<CR> + +" Make session file +nnoremap <F1> <ESC>:mksession! .vim-session<CR> +" Show who edited the current line from git history +nnoremap <F8> :<C-u>call gitblame#echo()<CR> +" Open lazygit in a new tab with = +nnoremap = :tab ter ++close lazygit<CR> + +" Cyrillic (Bulgarian yawerty layout) support +ca в w +ca ва wa +ca ь x +ca ьа xa + +" Make x and xa just save and quit without saving. This allows for closing all tabs and terminals. +ca x w <bar> q! +ca xa wa <bar> qa! + +" Open a terminal vim tab with tt and open a blank tab with te +ca tt tab ter +ca te tabe + +" Omni completion {{{ + " Omni completion supports C, HTML, CSS, JavaScript, PHP, Python, Ruby, SQL, XML + set omnifunc=syntaxcomplete#Complete " Completion for all supported languages + + " Do omni completion from Ctrl+Space + inoremap <C-@> <C-X><C-O> + + " Thanks to: https://vim.fandom.com/wiki/Make_Vim_completion_popup_menu_work_just_like_in_an_IDE + " set completeopt=longest,menuone + " [ The following are disabled, because they conflict with delimitMate's autobracket feature ] + " inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>" + " inoremap <expr> <C-n> pumvisible() ? '<C-n>' : '<C-n><C-r>=pumvisible() ? "\<lt>Down>" : ""<CR>' + + " "Disables" arrow navigation in completion menu + inoremap <expr> <up> pumvisible() ? '<c-y><up>' : '<up>' + inoremap <expr> <down> pumvisible() ? '<c-y><down>' : '<down>' + + " Pressing tab goes from top to bottom + let g:SuperTabContextDefaultCompletionType = "<c-n>" +" }}} diff --git a/.vim/startup/pluginsettings.vim b/.vim/startup/pluginsettings.vim new file mode 100644 index 0000000..633cfe7 --- /dev/null +++ b/.vim/startup/pluginsettings.vim @@ -0,0 +1,146 @@ +" DelimitMate {{{ + let delimitMate_expand_cr = 1 + " Don't autocomplete diamond brackets in HTML (compatibility with closetag plugin) + autocmd FileType html let b:delimitMate_matchpairs='(:),[:],{:}' +" }}} + +" NERDTree {{{ + " Toggle NERDTree with Tab + nmap <Tab> :NERDTreeToggle<CR> + + let NERDTreeCustomOpenArgs = {'file':{'where':'t'}} " Open file in new tab, doesn't work only for double-click + let NERDTreeShowHidden = 1 + let NERDTreeWinPos = "right" + let NERDTreeIgnore = ['\.swp$', '\~$'] " Ignore file, ending with .swp and ~ +" }}} + +" Undotree {{{ + " Toggle undotree with F5 + nmap <F5> :UndotreeToggle<CR> + + let g:undotree_WindowLayout = 2 + let g:undotree_ShortIndicators = 1 " e.g. using 'd' instead of 'days' to save some space. + let g:undotree_SetFocusWhenToggle = 1 " if set, let undotree window get focus after being opened, otherwise focus will stay in current window. + let g:undotree_TreeNodeShape = '*' + let g:undotree_DiffCommand = "diff" +" }}} + +" Tabman {{{ + let g:tabman_toggle = '<S-Tab>' + let g:tabman_side = 'right' +" }}} + +" SuperTab {{{ + let g:SuperTabDefaultCompletionType = "context" +" }}} + +" Lightline {{{ + " Settings {{{ + + if !has('gui_running') + set t_Co=256 + endif + + let g:lightline = { + \ 'enable': { + \ 'statusline': 1, + \ 'tabline': 1 + \ }, + \ 'colorscheme': 'wombat', + \ 'active': { + \ 'left': [ [ 'mode', 'paste' ], + \ [ 'gitbranch', 'filename', 'charvaluehex', 'readonly', 'modified' ] ], + \ 'right': [ [ 'lineinfo' ], + \ [ 'fileencoding', 'filetype'] ] + \ }, + \ 'component': { + \ 'charvaluehex': '0x%B', + \ }, + \ 'component_function': { + \ 'gitbranch': 'LightlineFugitive', + \ 'readonly': 'LightlineReadonly', + \ 'modified': 'LightlineModified', + \ 'filetype': 'LightlineFileType' + \ }, + \ 'tabline': { + \ 'right': [[]] + \ }, + \ 'tab': { + \ 'active': [ 'iconFilename','iconReadonly', 'iconModified' ], + \ 'inactive': [ 'iconFilename', 'iconReadonly', 'iconModified' ] + \ }, + \ 'tab_component_function': { + \ 'iconFilename': 'LightlineTabFilename', + \ 'iconReadonly': 'LightlineTabReadonly', + \ 'iconModified': 'LightlineTabModified' + \ }, + \ 'separator': { 'left': '', 'right': '' }, + \ 'subseparator': { 'left': '', 'right': '' }, + \ 'tabline_separator': { 'left': '', 'right': '' }, + \ 'tabline_subseparator': { 'left': '' } + \ } + " }}} + + " Function overrides {{{ + " Most of the following functions are just modification of source: + " Examples from doc file - https://github.com/itchyny/lightline.vim/blob/53176a0b75d6389d775d7bce0d494e58fc654f38/doc/lightline.txt#L583 + " Tab source code - https://github.com/itchyny/lightline.vim/blob/master/autoload/lightline/tab.vim + + function! LightlineFugitive() + if exists('*FugitiveHead') + let branch = FugitiveHead() + return branch !=# '' ? ' '.branch : '' + endif + return '' + endfunction + + function! LightlineReadonly() + return &ft !~? 'help\|vimfiler' && &readonly ? '' : '' + endfunction + + function! LightlineModified() + return &ft =~ 'help\|vimfiler' ? '' : &modified ? '' : &modifiable ? '' : '' + endfunction + + function! LightlineFileType() + return strlen(&filetype) ? WebDevIconsGetFileTypeSymbol() . ' ' . &filetype : '' + endfunction + + " Adds the file type icon in tabs and limit their width + function! LightlineTabFilename(n) abort + let buflist = tabpagebuflist(a:n) + let winnr = tabpagewinnr(a:n) + let _ = (expand('#'.buflist[winnr - 1].':t') !=# '' ? expand('#'.buflist[winnr - 1].':t') : '[No Name]') + + " Limit the width of tabs, so they don't go out of the screen + let tabNameLengthMax = &columns/((tabpagenr('$') > 0 ? tabpagenr('$') : 0) + 5) + + return WebDevIconsGetFileTypeSymbol(_) . ' ' . _[0:tabNameLengthMax] + endfunction + + function! LightlineTabReadonly(n) abort + let winnr = tabpagewinnr(a:n) + return gettabwinvar(a:n, winnr, '&readonly') ? '' : '' + endfunction + + function! LightlineTabModified(n) abort + let winnr = tabpagewinnr(a:n) + return gettabwinvar(a:n, winnr, '&modified') ? '' : gettabwinvar(a:n, winnr, '&modifiable') ? '' : '' + endfunction + " }}} +" }}} + +" ALE {{{ + map <F2> <ESC>:ALERename<CR> + map gd <ESC>:ALEGoToDefinition<CR> + map gi <ESC>:ALEHover<CR> + map ge <ESC>:ALEDetail<CR> + + set omnifunc=ale#completion#OmniFunc + let g:ale_completion_enabled = 1 + + let g:ale_floating_preview = 1 " Use floating window + let g:ale_floating_window_border = ['│', '─', '╭', '╮', '╯', '╰'] " Nicer borders + + let g:ale_typescript_tsserver_use_global = 1 " Use global tsserver package +" }}} diff --git a/.vim/startup/settings.vim b/.vim/startup/settings.vim new file mode 100644 index 0000000..217b40f --- /dev/null +++ b/.vim/startup/settings.vim @@ -0,0 +1,73 @@ +" Color scheme {{{ + colorscheme gruvbox + let g:gruvbox_contrast_dark = 'hard' + set background=dark " Setting dark mode +" }}} + +" Character visuals {{{ + set list " Enabled customization of white space characters, so spaces, tabs, EOL, etc. (:h 'list') + + " Show tabs as a | with three spaces + " DO NOT remove the trailing space in the next line! + set listchars=tab:│\ ,extends:>,precedes:< + + autocmd BufReadPre,FileReadPre * call NoWrapOnLong() + function! NoWrapOnLong() + let maxline = system("wc -L " . bufname("%") . " | awk '{print $1}'") + if maxline > 840 + set nowrap + endif + endfunction +" }}} + +" Backspace and cursor {{{ + set cul " Highlight current cursor line + autocmd InsertEnter,InsertLeave * set cul! " Don't highlight current line, when in insert mode + set backspace=indent,eol,start " Better backspace functionality + + set number " Show line numbers to the left + set scrolloff=0 " Don't keep any screen lines above or below the cursor + set mouse=a " Mouse support + + set showmatch " Cursor jumps to matching opening bracket automatically + + let &t_SI = "\e[5 q" " thin cursor on insert mode + let &t_SR = "\e[4 q" " underline on replace mode + let &t_EI = "\e[1 q" " block on normal mode + " Don't move cursor one character back on esc key press + inoremap <silent> <Esc> <C-O>:stopinsert<CR> +" }}} + +" Indentation {{{ + set tabstop=4 " Show tabs as 4 wide + set shiftwidth=4 " Indent with 4 spaces + + autocmd BufRead,BufNewFile *.component.css set filetype=css + autocmd FileType css,ts setlocal ts=2 sw=2 sts=0 expandtab " Transform tabs in CSS and TS into 2 spaces + autocmd FileType lisp,scheme,haskell setlocal ts=2 sw=2 sts=0 expandtab +" }}} + +" Folding {{{ + filetype plugin indent on + syntax on " Syntax highlighting + autocmd FileType * set foldmethod=syntax " Syntax folding for all + autocmd FileType vim,text,sh,zsh,xdefaults setlocal foldmethod=marker " Overrides folding to marker for types + + set foldlevel=99 " Open all folds by default + autocmd FileType vim,sh,zsh,xdefaults setlocal foldlevel=0 " Close all folds by defualt on filetypes + + set foldtext=MyFoldText() " Custom text for a fold + function MyFoldText() + let line = substitute(getline(v:foldstart), "\t", repeat(" ", shiftwidth(0)), "") " Gets the first fold line and replace tabs with spaces (as many as shiftwidth is set to) + let linecount = v:foldend - v:foldstart " Calculates amount of folded lines + return line . repeat(" ", winwidth('%') - strlen(line) - 10 - strlen(linecount)) + \ . " " . linecount . " " " Shows our line, then a lot of spaces, and at the very end we have line number and arrows + endfunction +" }}} + +" Language mapping for (bulgarian) cyrillic characters to english +set langmap=АA,аa,БB,бb,ВW,вw,ГG,гg,ДD,дd,ЕE,еe,ЖV,жv,ЗZ,зz,ИI,иi,ЙJ,йj,КK,кk,ЛL,лl,МM,мm,НN,нn,ОO,оo,ПP,пp,РR,рr,СS,сs,ТT,тt,УU,уu,ФF,фf,ХH,хh,ЦC,цc,Ч~,ч`,Ш{,ш[,Щ},щ],ЪY,ъy,ЬX,ьx,Ю\|,ю\\,ЯQ,яq +set spelllang=en,bg_BG " Adds Bulgarian to spelling languages + +autocmd BufRead,BufNewFile * set tw=0 " Sets textwidth to 0 for all files (set with autocmd since just doing "set tw=0" can be overridden) +set signcolumn=number " Show signs and numbers on the same column |
