summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.vim/miniplugins/code_terminal.vim79
-rw-r--r--.vim/miniplugins/my_statusline.vim81
-rw-r--r--.vim/miniplugins/spell_check_mode.vim33
-rw-r--r--.vim/startup/mappings.vim71
-rw-r--r--.vim/startup/pluginsettings.vim146
-rw-r--r--.vim/startup/settings.vim73
-rw-r--r--.vimrc519
7 files changed, 534 insertions, 468 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
diff --git a/.vimrc b/.vimrc
index 0661808..acae5b9 100644
--- a/.vimrc
+++ b/.vimrc
@@ -1,468 +1,51 @@
-" Plugin Manager {{{
- call plug#begin('~/.vim/plugged')
-
- """ Customization
- Plug 'morhetz/gruvbox', {'rtp': 'vim'} " Color theme
- Plug 'itchyny/lightline.vim' " Statusline and tabline for Vim
- Plug 'ryanoasis/vim-devicons' " Icons on stuff like NERDTree
-
- """ Quality of life
- Plug 'tomtom/tcomment_vim' " Toggle comments (gc, gcc)
- Plug 'Raimondi/delimitMate' " Autocomplete brackets and quotes
- Plug 'preservim/nerdtree' " Browse directories (:NERDTree)
- Plug 'mbbill/undotree' " Easily interact with undo history
- Plug 'mg979/vim-visual-multi' " Multiple line cursor (and other stuff)
- Plug 'godlygeek/tabular' " Line up text by a given character (:Tabularize /CHAR)
- Plug 'tpope/vim-eunuch' " Easy UNIX shell commands
- Plug 'alvan/vim-closetag' " Automatically add HTML closing tags
- Plug 'kien/tabman.vim' " Show open buffers
- Plug 'ervandew/supertab' " Makes <Tab> be nicer to use with Omnicompletion
-
- """ Software development
- Plug 'dense-analysis/ale' " Linting with LSP
- Plug 'honza/vim-snippets' " Ready snippets for some languages
- Plug 'editorconfig/editorconfig-vim' " Support for EditorConfig
- Plug 'zivyangll/git-blame.vim' " Show who last edited a line
- Plug 'wakatime/vim-wakatime' " Time tracking via wakatime.com
-
- """ Language integration
- Plug 'dNitro/vim-pug-complete', { 'for': ['jade', 'pug'] } " Pug: Omnicompletion integration
- Plug 'digitaltoad/vim-pug' " Pug: Filetype detection, identation, syntax highlighting
- Plug 'bfrg/vim-cpp-modern' " C/C++: Better syntax highlighting
- Plug 'itchyny/vim-haskell-indent' " haskell: Adds identation
- Plug 'vim-scripts/syntaxhaskell.vim' " haskell: Better syntax highlighting
-
- call plug#end()
-" }}}
-
-" General {{{
- " 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
-
- " Thin cursor in insert mode in Gnome-Terminal (version >=3.16 ; also works with Terminator)
- if has("autocmd")
- au VimEnter,InsertLeave * silent execute '!echo -ne "\e[1 q"' | redraw!
- au InsertEnter,InsertChange *
- \ if v:insertmode == 'i' |
- \ silent execute '!echo -ne "\e[5 q"' | redraw! |
- \ elseif v:insertmode == 'r' |
- \ silent execute '!echo -ne "\e[3 q"' | redraw! |
- \ endif
- au VimLeave * silent execute '!echo -ne "\e[ q"' | redraw!
- endif
- " }}}
-
- " 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
- " }}}
-
- " Mappings {{{
- " 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
-
- " 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>
- " }}}
-
- " Command abbreviations {{{
- " 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>"
- " }}}
-
- " Other {{{
- 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
- set spelllang=en,bg_BG " Adds Bulgarian to spelling languages
- " }}}
-" }}}
-
-" Custom functionality {{{
- " Spell check mode {{{
- " 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
- " }}}
-
- " Code terminal {{{
- " 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
- " }}}
-" }}}
-
-" Plugins {{{
- " 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 {{{
- set laststatus=2
-
- 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
- " }}}
-" }}}
+call plug#begin('~/.vim/plugged')
+
+runtime startup/settings.vim
+runtime startup/mappings.vim
+
+"""
+""" Fetched plugins
+"""
+
+""" Customization
+Plug 'morhetz/gruvbox', {'rtp': 'vim'} " Color theme
+" Plug 'itchyny/lightline.vim' " Statusline and tabline for Vim
+Plug 'ryanoasis/vim-devicons' " Icons on stuff like NERDTree
+
+""" Quality of life
+Plug 'tomtom/tcomment_vim' " Toggle comments (gc, gcc)
+Plug 'Raimondi/delimitMate' " Autocomplete brackets and quotes
+Plug 'preservim/nerdtree' " Browse directories (:NERDTree)
+Plug 'mbbill/undotree' " Easily interact with undo history
+Plug 'mg979/vim-visual-multi' " Multiple line cursor (and other stuff)
+Plug 'godlygeek/tabular' " Line up text by a given character (:Tabularize /CHAR)
+Plug 'tpope/vim-eunuch' " Easy UNIX shell commands
+Plug 'alvan/vim-closetag' " Automatically add HTML closing tags
+Plug 'kien/tabman.vim' " Show open buffers
+Plug 'ervandew/supertab' " Makes <Tab> be nicer to use with Omnicompletion
+
+""" Software development
+Plug 'dense-analysis/ale' " Linting with LSP
+Plug 'honza/vim-snippets' " Ready snippets for some languages
+Plug 'editorconfig/editorconfig-vim' " Support for EditorConfig
+Plug 'zivyangll/git-blame.vim' " Show who last edited a line
+Plug 'wakatime/vim-wakatime' " Time tracking via wakatime.com
+
+""" Language integration
+Plug 'dNitro/vim-pug-complete', { 'for': ['jade', 'pug'] } " Pug: Omnicompletion integration
+Plug 'digitaltoad/vim-pug' " Pug: Filetype detection, identation, syntax highlighting
+Plug 'bfrg/vim-cpp-modern' " C/C++: Better syntax highlighting
+Plug 'itchyny/vim-haskell-indent' " haskell: Adds identation
+Plug 'vim-scripts/syntaxhaskell.vim' " haskell: Better syntax highlighting
+
+"""
+""" Manual plugins
+"""
+
+runtime miniplugins/code_terminal.vim
+runtime miniplugins/my_statusline.vim
+runtime miniplugins/spell_check_mode.vim
+
+runtime startup/pluginsettings.vim
+
+call plug#end()