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
|