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
|
""""""""""""""""""""""""""
" Plugins
""""""""""""""""""""""""""
" Install vim-plug if not found
if empty(glob('~/.config/vim/autoload/plug.vim'))
silent !curl -fLo ~/.config/vim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
endif
" Run PlugInstall if there are missing plugins
autocmd VimEnter * if len(filter(values(g:plugs), '!isdirectory(v:val.dir)'))
\| PlugInstall --sync | source $MYVIMRC
\| endif
call plug#begin('~/.config/vim/plugged')
" UI & Themes
Plug 'joshdick/onedark.vim' " Onedark themes for vim
Plug 'liuchengxu/vim-which-key' " Show leader mapping cheatsheet
" Git integration
Plug 'airblade/vim-gitgutter' " Git diff
" Autocompletion, linter, syntax
Plug 'dense-analysis/ale'
" Tools
Plug 'ap/vim-css-color' " rgb, hex color preview
call plug#end()
filetype plugin indent on " Allow filetype detection, plugins, indentation
"""""""""""""""""""""""""
" Configuration
"""""""""""""""""""""""""
" LSP
let g:ale_python_auto_virtualenv = 1
let g:ale_completion_enabled = 1
let g:ale_floating_preview = 1 " Show hover doc & detail in a popup
let g:ale_fix_on_save = 1
" Stop linting when writing
let g:ale_lint_on_text_changed = 'never'
let g:ale_lint_on_insert_leave = 0
let g:ale_hover_cursor = 1
let g:ale_set_balloons = 1 " Show error when mouse over it
" Linters and fixers (don't forget to setup LSP as linters)
let g:ale_linters = {
\ 'python': ['pylsp', 'flake8', 'pylint', 'mypy']
\}
let g:ale_fixers = {
\ 'python': ['black', 'isort', 'autopep8']
\}
" Netrw (filetree built-in vim)
let g:netrw_keepdir = 0 " Reload buffer usefull when moving or removing file
let g:netrw_winsize = 10 " Size of filetree buffer
let g:netrw_banner = 0 " Removing netrw banner
let g:netrw_localcopydircmd = 'cp -r' " Changing copy command to add recursive copy
" Statusline
let g:currentmode={
\ 'n' : 'NORMAL ',
\ 'v' : 'VISUAL ',
\ 'V' : 'V·Line ',
\ "\<C-V>" : 'V·Block ',
\ 'i' : 'INSERT ',
\ 'R' : 'R ',
\ 'Rv' : 'V·Replace ',
\ 'c' : 'Command ',
\}
" Getting numbers of errors in ALE
function! LinterStatus() abort
let l:counts = ale#statusline#Count(bufnr(''))
let l:all_errors = l:counts.error + l:counts.style_error
let l:all_non_errors = l:counts.total - l:all_errors
return l:counts.total == 0 ? 'OK' : printf(
\ '%dW %dE',
\ all_non_errors,
\ all_errors
\)
endfunction
set laststatus=2
set statusline=
" VIM Mode
set statusline+=\ %{toupper(g:currentmode[mode()])}%{&spell?'[SPELL]':''}\|
" File (path, modified, readonly ? )
set statusline+=%h\ %F
set statusline+=%{&modified?'\ [+]':''}
set statusline+=%{&readonly?'\ ':''}
" Filetype
set statusline+=%=%y
set statusline+=\ \|\ %{&fileencoding?&fileencoding:&encoding}
set statusline+=\ \|\ [%{&fileformat}\]
set statusline+=\ \|\ %{LinterStatus()}
" Line count and percentage
set statusline+=\ \|\ %l:%c
set statusline+=\ [%p%%]\
" Which Key
call which_key#register('<Space>', "g:which_key_map")
let g:which_key_map = {}
" Buffer key help
let g:which_key_map.b = {
\ 'name' : '+buffer',
\ 'd' : 'current buffer close',
\ 'a' : 'close all buffers',
\ 'n' : 'go to next buffer',
\ 'p' : 'go to previous buffer',
\ }
" Tab key help
let g:which_key_map.t = {
\ 'name' : '+tab',
\ 't<leader>' : 'go to next tab',
\ 'n' : 'open new tab',
\ 'o' : 'close other tabs',
\ 'c' : 'close current tab',
\ 'm' : 'move tab after another',
\ 'l' : 'switch between this & last tab',
\ 'e' : 'open new tab with current buffer',
\ }
" Spell key help
let g:which_key_map.s = {
\ 'name' : '+spell',
\ 's' : 'toggle spell check',
\ 'n' : 'next spell word',
\ 'p' : 'previous spell word',
\ 'a' : 'add word in dict',
\ '?' : 'list word alternatives',
\ }
" Hunk key help
let g:which_key_map.h = {
\ 'name' : '+git hunk',
\ 'l' : 'remove highlight',
\ 'p' : 'go previous hunk',
\ 'n' : 'go next hunk',
\ 't' : 'enable/disable gitgutter',
\ 's' : 'stage hunk',
\ 'u' : 'undo hunk',
\ 'P' : 'preview hunk',
\ }
" LSP key help
" Activer WhichKey pour ALE
let g:which_key_map.g = {
\ 'name' : '+LSP',
\ 'd' : [':ALEGoToDefinition', 'go to definition'],
\ 'n' : [':ALENext', 'next diagnostic'],
\ 'p' : [':ALEPrevious', 'previous diagnostic'],
\ 'r' : [':ALEFindReferences', 'go to reference'],
\ 'R' : [':ALERename', 'rename object'],
\ 'y' : [':ALEType', 'type definition'],
\ 'i' : [':ALEGoToImplementation', 'go to implementation'],
\ 'h' : [':ALEHover', 'documentation'],
\ 'f' : [':ALEFix', 'format document'],
\ }
|