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
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
|
let mapleader=" "
" Install plugin manager
if ! filereadable(expand('~/.config/nvim/autoload/plug.vim'))
echo "Downloading junegunn/vim-plug to manage plugins..."
silent !mkdir -p ~/.config/nvim/autoload/
silent !curl "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" > ~/.config/nvim/autoload/plug.vim
autocmd VimEnter * PlugInstall
endif
" Plugins
call plug#begin('~/.config/nvim/plugged')
" Features
Plug '907th/vim-auto-save'
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'
Plug 'airblade/vim-gitgutter'
Plug 'haya14busa/incsearch.vim'
Plug 'qpkorr/vim-bufkill'
Plug 'tpope/vim-unimpaired'
Plug 'tpope/vim-commentary'
Plug 'tpope/vim-surround'
Plug 'tpope/vim-repeat'
Plug 'tpope/vim-salve'
Plug 'tpope/vim-projectionist'
Plug 'tpope/vim-dispatch'
Plug 'tpope/vim-fireplace'
Plug 'tpope/vim-fugitive'
Plug 'tpope/vim-rhubarb'
Plug 'guns/vim-clojure-static'
Plug 'guns/vim-clojure-highlight'
Plug 'venantius/vim-cljfmt'
Plug 'w0rp/ale'
Plug 'peterhoeg/vim-qml'
Plug 'dermusikman/sonicpi.vim'
Plug 'sheerun/vim-polyglot'
"Plug 'ananagame/vimsence'
" Menus
Plug 'scrooloose/nerdtree'
" Plug 'Xuyuanp/nerdtree-git-plugin'
Plug 'bling/vim-airline'
Plug 'majutsushi/tagbar'
Plug 'junegunn/fzf.vim'
" Appearance
"Plug 'flazz/vim-colorschemes'
"Plug 'tomasiser/vim-code-dark'
Plug 'joshdick/onedark.vim'
Plug 'vim-airline/vim-airline-themes'
Plug 'kien/rainbow_parentheses.vim'
call plug#end()
" Basics
nnoremap c "_c
filetype plugin indent on
syntax on
set autoindent
set autoread
set autowrite
set backspace=indent,eol,start
set bg=dark
set cindent
set cinkeys-=0#
set cino=
set clipboard=unnamedplus
set copyindent
set encoding=utf-8
set ff=unix
set fileformats=unix,dos,mac
set formatoptions=tcqn1
set go=a
set hidden
set history=200
set hlsearch
set ignorecase
set incsearch
set infercase
set laststatus=2
set linebreak
set list
set listchars=tab:\ \ ,extends:›,precedes:‹,nbsp:·,trail:·
set matchtime=2
set mouse=a
set nobackup
set nocompatible
set noexpandtab
set nomodeline
set nonumber
set noro
set noshowmode
set notimeout
set nowritebackup
set number relativenumber
set ruler
set scroll=4
set sessionoptions=folds
set shiftround
set shiftwidth=8
set shortmess+=A
set showbreak=
set showmatch
set showtabline=2
set sidescrolloff=3
set smartcase
set softtabstop=8
set suffixes+=.pyc
set t_Co=256
set tabstop=8
set termguicolors
set timeoutlen=100
set ttimeout
set updatetime=100
set viewoptions=folds,cursor
set visualbell t_vb=
set wildignore=*.class,*.o,*~,*.pyc,.git,node_modules
set wildmenu
set wildmode=list:longest,full
" Basic keymaps
nmap j gj
nmap k gk
nmap <Leader>w :w<CR>
nmap <Leader>q :q<CR>
nmap <C-q> :BD<CR>
nmap <C-j> :bn<CR>
nmap <C-k> :bp<CR>
nmap <Leader>S :nohlsearch<CR>
nmap <Leader>z :setlocal foldmethod=syntax<CR>
nnoremap S :%s//g<Left><Left>
" Fix dumb deletion register
nnoremap d "_d
vnoremap d "_d
" Several non-retard options
nnoremap ' `
autocmd VimResized * :wincmd =
" Autosave
let g:auto_save=0
let g:auto_save_silent=1
autocmd BufWinLeave,BufLeave,BufWritePost ?* nested silent! mkview!
autocmd BufWinEnter ?* silent! loadview
" Tagbar
nmap <Leader>T :TagbarToggle<CR>
let g:tagbar_compact=1
" Splitting
set splitbelow splitright
nmap <Leader>h <C-w>h
nmap <Leader>j <C-w>j
nmap <Leader>k <C-w>k
nmap <Leader>l <C-w>l
" Terminal
nmap <Leader>t :term<CR>
tnoremap <C-q> <C-\><C-n>:BD!<CR>
tnoremap <Leader><ESC> <C-\><C-n>
autocmd TermOpen * startinsert
" Execution
nmap <Leader>a :!echo <c-r>% \| entr compile <c-r>% &<CR><CR>
nmap <Leader>c :w! \| !compile <c-r>%<CR>
nmap <Leader>p :!preview <c-r>%<CR><CR>
nmap <Leader>r :w! \| terminal<CR>./run<CR>
" FZF
nmap ; :Files<CR>
nmap <Leader>B :Buffers<CR>
nmap <Leader>C :Commits<CR>
nmap <Leader>s :Rg!<CR>
let $FZF_DEFAULT_COMMAND = 'rg --files --follow -g "!{.git,node_modules}/*" 2>/dev/null'
command! -bang -nargs=* Rg
\ call fzf#vim#grep(
\ 'rg --column --line-number --no-heading --color=always --smart-case -g "!{*.lock,*-lock.json}" '.shellescape(<q-args>), 1,
\ <bang>0 ? fzf#vim#with_preview('up:40%')
\ : fzf#vim#with_preview('right:50%:hidden', '?'),
\ <bang>0)
" Git implementation
let g:gitgutter_enabled=1
let g:gitgutter_map_keys=0
let g:gitgutter_sign_added='+'
let g:gitgutter_sign_modified='~'
let g:gitgutter_sign_removed='-'
let g:gitgutter_sign_modified_removed='~'
let g:gitgutter_grep='rg'
nmap ghs <Plug>(GitGutterStageHunk)
nmap ghu <Plug>(GitGutterUndoHunk)
nmap ghp <Plug>(GitGutterPreviewHunk)
nmap ]g :GitGutterNextHunk<CR>
nmap [g :GitGutterPrevHunk<CR>
augroup VimDiff
autocmd!
autocmd VimEnter,FilterWritePre * if &diff | GitGutterDisable | endif
augroup END
" Better search highlighting TODO: Fix neovim specific double caret
nmap / <Plug>(incsearch-forward)
nmap ? <Plug>(incsearch-backward)
nmap g/ <Plug>(incsearch-stay)
" ALE
let g:ale_sign_warning = '▲'
let g:ale_sign_error = '✗'
highlight link ALEWarningSign String
highlight link ALEErrorSign Title
nmap ]w :ALENextWrap<CR>
nmap [w :ALEPreviousWrap<CR>
nmap <Leader>F <Plug>(ale_fix)
augroup VimDiff
autocmd!
autocmd VimEnter,FilterWritePre * if &diff | ALEDisable | endif
augroup END
let g:ale_linters = {
\ 'asm': ['gcc'],
\ 'c': ['clangtidy'],
\ 'clj': ['joker'],
\ 'cpp': ['clangtidy'],
\ 'elixir': ['credo', 'dialyxir', 'dogma'],
\ 'go': ['gofmt', 'golint', 'go vet'],
\ 'hack': ['hack'],
\ 'javascript': ['eslint'],
\ 'perl': ['perlcritic'],
\ 'python': ['flake8', 'mypy', 'pylint'],
\ 'rust': ['cargo'],
\ 'sh': ['shellcheck'],
\ 'vue': ['eslint', 'vls'],
\ 'zsh': ['shell'],
\}
let g:ale_fixers = {
\ '*': ['remove_trailing_lines', 'trim_whitespace'],
\ 'c': ['clang-format'],
\ 'cpp': ['clang-format'],
\ 'cs': ['uncrustify'],
\ 'css': ['prettier'],
\ 'd': ['uncrustify'],
\ 'html': ['prettier'],
\ 'java': ['uncrustify'],
\ 'javascript': ['prettier'],
\ 'json': ['jq'],
\ 'markdown': ['prettier'],
\ 'sh': ['shfmt'],
\ 'tex': ['latexindent'],
\ 'typescript': ['prettier'],
\}
let g:ale_fix_on_save = 1
autocmd FileType cs let g:ale_c_uncrustify_options = '-l CS'
autocmd FileType java let g:ale_c_uncrustify_options = '-l JAVA'
autocmd FileType d let g:ale_c_uncrustify_options = '-l D'
" Something about clojure
let g:clj_fmt_autosave=0
" Custom actions for different filetypes
augroup ft_files
au!
au FileType clojure nmap <Leader>F :Cljfmt<CR>
au FileType clojure RainbowParenthesesLoadRound
au FileType clojure RainbowParenthesesActivate
augroup END
" File explorer
nnoremap <silent> <Leader>n :NERDTreeToggle<CR>
nnoremap <silent> <Leader>f :NERDTreeFind<CR>
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | exe 'cd '.argv()[0] | endif
let g:NERDTreeDirArrowExpandable = ''
let g:NERDTreeDirArrowCollapsible = ''
let NERDTreeMinimalUI=1
let NERDTreeIgnore=['node_modules', 'cross']
let g:NERDTreeMarkBookmarks=0
let g:NERDTreeAutoDeleteBuffer=1
let g:NERDTreeStatusLine=-1
au BufEnter * if bufname('#') =~ 'NERD_tree' && bufname('%') !~ 'NERD_tree' && winnr('$') > 1 | b# | exe "normal! \<c-w>\<c-w>" | :blast | endif
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
" Root master super save
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
" Airline config
let g:airline_theme = 'onedark'
let g:airline_extensions = ['tabline', 'tagbar', 'ale', 'term']
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#formatter = 'unique_tail'
let g:airline_powerline_fonts = 1
let g:airline_section_b = ''
let g:airline_section_x = ''
let g:airline_section_y = ''
let g:airline_section_z = '%3p%% (%l/%L)'
" Sonic Pi
let g:sonicpi_command = 'sonic-pi-tool'
let g:sonicpi_send = 'eval-stdin'
let g:sonicpi_stop = 'stop'
let g:vim_redraw = 1
" Colorscheme
let $NVIM_TUI_ENABLE_TRUE_COLOR = 1
colorscheme onedark
"highlight GitGutterAdd guifg=#009900 ctermfg=2
"highlight GitGutterChange guifg=#bbbb00 ctermfg=3
"highlight GitGutterDelete guifg=#ff2222 ctermfg=1
" TODOs
command Td :Rg! TODO
command TD :Rg! TODO
command Todo :Rg! TODO
command ToDo :Rg! TODO
command TODO :Rg! TODO
" Better vim diff
if &diff
highlight! link DiffText MatchParen
endif
" File extension actions
autocmd BufRead,BufNewFile *.ms,*.me,*.mom,*.man set filetype=groff
autocmd BufRead,BufNewFile *.asm set filetype=nasm
autocmd BufReadPre *.doc silent set ro
autocmd BufReadPost *.doc silent %!antiword "%"
autocmd BufReadPre *.odt,*.odp silent set ro
autocmd BufReadPost *.odt,*.odp silent %!odt2txt "%"
autocmd BufReadPre *.pdf silent set ro
autocmd BufReadPost *.pdf silent %!pdftotext -nopgbrk -layout -q -eol unix "%" - | fmt -w78
autocmd BufReadPre *.rtf silent set ro
autocmd BufReadPost *.rtf silent %!unrtf --text
autocmd BufReadPre *.jpg,*.jpeg silent set ro
autocmd BufReadPost *.jpg,*.jpeg silent %!jp2a --width=78 "%"
autocmd BufReadPre *.png,*.gif,*.bmp silent set ro
autocmd BufReadPost *.png,*.gif,*.bmp silent %!convert "%" jpg:- | jp2a --width=78 -
|