aboutsummaryrefslogtreecommitdiff
path: root/.vimrc
blob: 2d8da9bcb338eb397d81c851869409849ef3e75f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
set nocompatible " This fixes the problem where arrow keys do not function properly on some systems.
let mapleader=' ' " Use space for leader key

" General visual look of Vim
set number
set ruler
set noerrorbells
set laststatus=2
set noshowmode " Don't show mode in bottom status line
let &fillchars ..= ',eob: ' " Hide tildes at EOF
set splitbelow splitright
set cursorline " Highlight the active cursor line
set termguicolors
colorscheme gruvbox

" Clipboard
set clipboard=unnamedplus

" Text searching options
set incsearch
set ignorecase
set smartcase
set showmatch

" Syntax and formatting
syntax on
set encoding=utf-8
set hidden

" Tabs and indenting
set smartindent
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
set noshiftround
set scrolloff=3

" Command line completion options
set showcmd
set wildmenu
filetype plugin on
set omnifunc=syntaxcomplete#Complete
set completeopt=menuone,noselect " Don't autoselect the completion

" Setup undo history
if !isdirectory($HOME."/.vim")
    call mkdir($HOME."/.vim", "", 0770)
endif
if !isdirectory($HOME."/.vim/undo-dir")
    call mkdir($HOME."/.vim/undo-dir", "", 0700)
endif
set undodir=~/.vim/undo-dir
set undofile

" Colors
set background=dark
hi Normal guibg=NONE ctermbg=NONE " Set background transparent
" Setup terminal with gruvbox dark
let g:terminal_ansi_colors = [
    \ '#282828', '#cc241d',
    \ '#98971a', '#d79921',
    \ '#458588', '#b16286',
    \ '#689d6a', '#a89984',
    \ '#928374', '#fb4934',
    \ '#b8bb26', '#fabd2f',
    \ '#83a598', '#d3869b',
    \ '#8ec07c', '#ebdbb2',
    \]

" Setup netrw
let g:netrw_banner = 0
let g:netrw_liststyle = 3
let g:netrw_browse_split = 3
let g:netrw_altv = 1
let g:netrw_winsize = 25

" Setup custom statusline
function! GitBranch()
  return system("git rev-parse --abbrev-ref HEAD 2>/dev/null | tr -d '\n'")
endfunction

function! StatuslineGit()
  let l:branchname = GitBranch()
  return strlen(l:branchname) > 0?'  '.l:branchname.' ':''
endfunction

function! StatuslineMode()
  let l:mode=mode()
  if l:mode==#"n"
    return "Normal"
  elseif l:mode==#"v"
   return "Visual"
  elseif l:mode==#"V"
    return "Visual line"
  elseif l:mode==#"\<C-V>"
    return "Visual block"
  elseif l:mode==#"i"
   return "Insert"
  elseif l:mode==#"R"
    return "Replace"
  elseif l:mode==#"s"
    return "Select"
  elseif l:mode==#"t"
    return "Terminal"
  elseif l:mode==#"c"
    return "Enter command"
  elseif l:mode==#"!"
    return "Shell"
  endif
endfunction

let g:mode_colors = {
      \ 'n':  'StatusLineSection',
      \ 'v':  'StatusLineSectionV',
      \ "\<C-V>": 'StatusLineSectionV',
      \ 'i':  'StatusLineSectionI',
      \ 'c':  'StatusLineSectionC',
      \ 'r':  'StatusLineSectionR',
      \ 's':  'StatusLine',
      \ 't':  'StatusLineNC'
      \ }

fun! StatusLineRenderer()
  let hl = '%#' . get(g:mode_colors, tolower(mode()), g:mode_colors.n) . '#'

  return hl
        \ . ' %{StatuslineMode()} '
        \ . '%#DiffAdd#'
        \ . '%{StatuslineGit()}'
        \ . '%#DiffAdd#'
        \ . ' %F '
        \ . (&readonly ? ' r ' : '')
        \ . (&modified ? ' + ' : '') 
        \ . '%#CursorColumn#%='
        \ . ' %Y '
        \ . '%#DiffAdd#'
        \ . ' %{&fileencoding?&fileencoding:&encoding}'
        \ . ' [%{&fileformat}]'
        \ . ' %p%%'
        \ . ' %l:%c '
endfun

fun! <SID>StatusLineHighlights()
  hi StatusLine         ctermbg=8  guibg=#313131 ctermfg=15 guifg=#cccccc
  hi StatusLineNC       ctermbg=0  guibg=#313131 ctermfg=8  guifg=#999999
  hi StatusLineSection  ctermbg=11 guibg=#928374 ctermfg=0  guifg=#000000
  hi StatusLineSectionC ctermbg=8  guibg=#b8bb26 ctermfg=0  guifg=#333333
  hi StatusLineSectionI ctermbg=10 guibg=#83a598 ctermfg=0  guifg=#000000
  hi StatusLineSectionV ctermbg=12 guibg=#fabd2f ctermfg=0  guifg=#000000
  hi StatusLineSectionR ctermbg=12 guibg=#fb4934 ctermfg=0  guifg=#000000
endfun

call <SID>StatusLineHighlights()

" only set default statusline once on initial startup.
" ignored on subsequent 'so $MYVIMRC' calls to prevent
" active buffer statusline from being 'blurred'.
if has('vim_starting')
  let &statusline = ' %F%= %l:%c '
endif

augroup vimrc
  au!
  " show focussed buffer statusline
  au FocusGained,VimEnter,WinEnter,BufWinEnter *
    \ setlocal statusline=%!StatusLineRenderer()

  " show blurred buffer statusline
  au FocusLost,VimLeave,WinLeave,BufWinLeave *
    \ setlocal statusline&

  " restore statusline highlights on colorscheme update
  au Colorscheme * call <SID>StatusLineHighlights()
augroup END

" Setup BufferLine with Tabs
set showtabline=2

function! SpawnBufferLine()
  let s = ''

  " Get the list of buffers. Use bufexists() to include hidden buffers
  let bufferNums = filter(range(1, bufnr('$')), 'buflisted(v:val)')
  " Making a buffer list on the left side
  for i in bufferNums
    " Highlight with yellow if it's the current buffer
    let s .= (i == bufnr()) ? ('%#TabLineSel#') : ('%#TabLine#')
    let s .= i . ' '  " Append the buffer number
    if bufname(i) == ''
      let s .= '[No Name]'  " Give a name to a new buffer
    endif
    if getbufvar(i, "&modifiable")
      let s .= fnamemodify(bufname(i), ':t')  " Append the file name
      " let s .= pathshorten(bufname(i))  " Use this if you want a trimmed path
      " If the buffer is modified, add + and separator. Else, add separator
      let s .= (getbufvar(i, "&modified")) ? (' [+] | ') : (' | ')
    else
      let s .= fnamemodify(bufname(i), ':t') . ' [RO] | '  " Add read only flag
    endif
  endfor
  let s .= '%#TabLineFill#%T'  " Reset highlight

  let s .= '%=' " Spacer

  " Making a tab list on the right side
  for i in range(1, tabpagenr('$'))  " Loop through the number of tabs
    " Highlight with yellow if it's the current tab
    let s .= (i == tabpagenr()) ? ('%#TabLineSel#') : ('%#TabLine#')
    let s .= '%' . i . 'T '  " set the tab page number
    let s .= i . ''          " set page number string
  endfor
  let s .= '%#TabLineFill#%T'  " Reset highlight
  return s
endfunction

set tabline=%!SpawnBufferLine()  " Assign the tabline

" Add UpdateVimPackages command using the internal package system of vim
function! UpdatePackages()
    " Gather all top-level package directories from both start and opt
    let l:packages = globpath('~/.vim/pack/*/start/*', '', 0, 1) + globpath('~/.vim/pack/*/opt/*', '', 0, 1)

    " Open a new tab for output
    tabnew | setlocal buftype=nofile | setlocal bufhidden=delete | setlocal noswapfile
    setlocal nonumber  " Disable line numbers
    setlocal norelativenumber  " Disable relative line numbers
    call setline(1, ['Updating Vim Packages...'] + repeat([''], 9))

    let l:output = []
    for package in l:packages
        let l:cmd = 'cd ' . package . ' && git pull'
        let l:result = system(l:cmd)

        " Remove trailing newlines from the command output
        let l:result = substitute(l:result, '\n\+$', '', '')

        " Extract text between slashes from package directory
        let l:package_name = matchstr(package, '/\zs[^/]\+/$')
        let l:package_name = substitute(l:package_name, '/\zs$\S\+$\ze/', '\1', '')
        " Remove the last slash if it exists
        let l:package_name = substitute(l:package_name, '/\s*$', '', '')

" Append the full command output to the list
        call add(l:output, package_name . ': ' . l:result)
    endfor

    " Show the collected output starting from line 3
    call setline(3, l:output)
endfunction

command! UpdateVimPackages call UpdatePackages()

" To add plugins see examples below
" git clone https://github.com/BourgeoisBear/clrzr ~/.vim/pack/plugins/start/clrzr
"
" git clone https://github.com/morhetz/gruvbox ~/.vim/pack/colorschemes/opt/gruvbox