ksh, git, vim, set_time
[dotfiles_afify.git] / .vim / vimrc
blobe89d81efcb7494768eda9b4f8ff658a6f4c589bb
1 "==============================================================================
2 " Main
3 "==============================================================================
4 set nocompatible
5 let mapleader=" "
6 set shell=bash
7 set encoding=utf-8
8 set fileformat=unix
9 set noswapfile
10 set backspace=indent,eol,start
11 set viminfo=
12 set shortmess-=S
14 "==============================================================================
15 " Plugins
16 "==============================================================================
17 source ~/.vim/comment.vim
19 call plug#begin('~/.vim/plugged')
20 Plug 'airblade/vim-gitgutter'
21 Plug 'maralla/completor.vim'
22 Plug 'rhysd/vim-clang-format'
23 " Plug 'neoclide/coc.nvim', {'branch': 'release'}
24 Plug 'vim-syntastic/syntastic'
25 Plug 'ap/vim-css-color'
26 call plug#end()
28 "==============================================================================
29 " Display
30 "==============================================================================
31 colorscheme minimal
32 set list
33 set listchars=tab:>—,nbsp:␣,trail:.
34 set tabstop=8
35 set shiftwidth=8
36 set noexpandtab    " Use tabs, not spaces
37 set splitbelow splitright
38 set wildmenu
39 set wildmode=list:full,full
40 set ignorecase
41 set smartcase
43 autocmd FileType python  set tabstop=4 softtabstop=4 shiftwidth=4 textwidth=79 expandtab autoindent foldmethod=indent
44 autocmd FileType html,css set ts=4 sw=4
45 autocmd FilterWritePre * if &diff | set foldcolumn=0 | endif
47 " set noautoindent
48 " set linebreak
49 filetype plugin indent on
51 "==============================================================================
52 " Keymaping
53 "==============================================================================
54 noremap ; :
56 " write to sudo files
57 cnoremap w!! w !sudo tee % >/dev/null
59 "copy to global clipboard
60 vmap <C-c> y:call system("xclip -i -selection clipboard", getreg("\""))<cr>:call system("xclip -i", getreg("\""))<cr>
62 " replace word with yanked
63 nnoremap <C-p> cw<C-r>0<ESC>
65 " paste
66 nnoremap <C-c> :set invpaste paste?<CR>
67 set pastetoggle=<C-c>
68 set showmode
70 "Move lines up and down with controle + k or j
71 nnoremap <silent> <C-j> :move +1 <CR>
72 nnoremap <silent> <C-k> :move -2 <CR>
74 "Disable keys in Normal mode
75 no <Up>        <Nop>
76 no <Down>      <Nop>
77 no <Left>      <Nop>
78 no <Right>     <Nop>
79 no <Space>     <Nop>
80 no <PageUp>    <Nop>
81 no <PageDown>  <Nop>
82 no <BackSpace> <Nop>
83 no <F1>        <Nop>
84 no q           <Nop>
85 no Q           <Nop>
87 "Disable keys in Insert mode
88 ino <Up>       <Nop>
89 ino <Down>     <Nop>
90 ino <PageUp>   <Nop>
91 ino <PageDown> <Nop>
92 ino <End>      <Nop>
93 ino <Home>     <Nop>
94 ino <F1>       <Nop>
96 " Add new line
97 noremap J o<esc>k
98 noremap K O<esc>j
100 " Go (start|end) of line
101 noremap H ^
102 noremap L $
104 " Split
105 nnoremap <Leader><CR> <Esc>:vsplit
107 nnoremap <silent> <Leader>= :vertical resize +1<CR>
108 nnoremap <silent> <Leader>- :vertical resize -1<CR>
109 nnoremap <silent> <Leader>0 :vertical resize 87<CR>
111 nnoremap <Left>  <C-w>h
112 nnoremap <Down>  <C-w>j
113 nnoremap <Up>    <C-w>k
114 nnoremap <Right> <C-w>l
116 " Move the split
117 nnoremap <Leader><Left>  <C-w>H
118 nnoremap <Leader><Down>  <C-w>J
119 nnoremap <Leader><Up>    <C-w>K
120 nnoremap <Leader><Right> <C-w>L
122 " Search
123 nnoremap <Leader>f :set hlsearch<CR>/^[a-z*].*(.*)$<CR>
124 nnoremap <Leader>o :set hlsearch!<CR>/\%80v.\+/<CR>
125 nnoremap <Leader>s :set hlsearch!<CR>
126 nnoremap * *zz
127 vnoremap * y/\V<C-R>=escape(@",'/\')<CR><CR>
128 nnoremap n nzz
129 nnoremap N Nzz
131 " Quit
132 nnoremap <Leader>q :qa!<CR>
134 " Fold
135 nnoremap <Leader>z zM
136 nnoremap <Leader>Z zR
138 " Syntastic
139 nnoremap <Leader>a :SyntasticCheck<CR>
140 nnoremap <Leader>A :SyntasticToggleMode<CR>
141 nnoremap <Leader>n :lnext<CR>
143 " Custom functions
144 " nnoremap <Leader>c :call Clean_file()<CR><CR>
145 nnoremap <Leader>c :ClangFormat<CR>
147 nnoremap <Leader>r :set rightleft<CR>
148 nnoremap <Leader>R :set norightleft<CR>
150 " Git
151 nnoremap <Leader>g :GitGutterSignsToggle<CR>
152 nmap <Enter> <Plug>(GitGutterPreviewHunk)
153 nmap <Leader>1 <Plug>(GitGutterPrevHunk)
154 nmap <Leader>2 <Plug>(GitGutterNextHunk)
156 " surround word
157 nnoremap <Leader>; i"<ESC>lea"<ESC>l
158 nnoremap <Leader>' i"<ESC>A"<ESC>l
159 nnoremap <Leader>[ i[<ESC>lea]<ESC>l
160 nnoremap <Leader>] i{<ESC>lea}<ESC>l
162 "==============================================================================
163 " Status Line
164 "==============================================================================
165 set laststatus=2
166 set statusline=\ %F%#StatusLine_g#\ %m%#StatusLine_r#\ %r%*%=
167 set statusline+=%y\ %{&encoding}\ %{&fileformat}\ %c
169 " Warnings
170 set statusline+=%#StatusLine_o#
171 set statusline+=%{StatuslineTabWarning()}
172 set statusline+=%{StatuslineTrailingSpaceWarning()}
173 set statusline+=%*
175 "recalculate the tab warning flag when idle and after writing
176 autocmd cursorhold,bufwritepost * unlet! b:statusline_tab_warning
177 autocmd cursorhold,bufwritepost * unlet! b:statusline_trailing_space_warning
179 function! StatuslineTrailingSpaceWarning()
180         if !exists("b:statusline_trailing_space_warning")
181                 let result = search('\s\+$', 'nw') != 0
182                 if result
183                         let b:statusline_trailing_space_warning = ' [TS]'
184                 else
185                         let b:statusline_trailing_space_warning = ''
186                 endif
187         endif
188         return b:statusline_trailing_space_warning
189 endfunction
191 function! StatuslineTabWarning()
192         if !exists("b:statusline_tab_warning")
193                 let b:statusline_tab_warning = ''
194                 if !&modifiable
195                         return b:statusline_tab_warning
196                 endif
197                 let tabs = search('^\t', 'nw') != 0
198                 "find spaces that arent used as alignment in the first indent column
199                 let spaces = search('^ \{' . &ts . ',}[^\t]', 'nw') != 0
200                 if tabs && spaces
201                         let b:statusline_tab_warning =  ' [MI]'
202                 elseif (spaces && !&et) || (tabs && &et)
203                         let b:statusline_tab_warning = '[&et]'
204                 endif
205         endif
206         return b:statusline_tab_warning
207 endfunction
209 "==============================================================================
210 " Linting
211 "==============================================================================
212 let g:syntastic_python_checkers = ["pylint"]
213 let g:syntastic_sh_checkers     = ["shellcheck"]
214 let g:syntastic_c_checkers      = ["splint"]
215 let g:syntastic_c_splint_args   = "-checks +posixlib +matchanyintegral +enumint -nullpass -nullret ./util.c -DVERSION=\\\"VERSION\\\""
217 set statusline+=%#statusline_r#
218 set statusline+=\ %{SyntasticStatuslineFlag()}
219 set statusline+=%*
221 let g:syntastic_check_on_wq              = 0
222 let g:syntastic_auto_loc_list            = 0
223 let g:syntastic_check_on_open            = 1
224 let g:syntastic_enable_highlighting      = 0 "underline word
225 let g:syntastic_always_populate_loc_list = 1
226 let g:syntastic_auto_jump                = 0
228 " Symbols icon
229 let g:syntastic_error_symbol         = ''
230 let g:syntastic_warning_symbol       = ''
231 let g:syntastic_style_error_symbol   = ''
232 let g:syntastic_style_warning_symbol = '!'
234 "==============================================================================
235 " clang format
236 "==============================================================================
237 let g:clang_format#detect_style_file = 1
239 "==============================================================================
240 " git
241 "==============================================================================
242 let g:gitgutter_grep=''
243 let g:gitgutter_enabled = 1
244 let g:gitgutter_map_keys = 0
246 "==============================================================================
247 " Folding
248 "==============================================================================
249 " set nofen
250 set foldnestmax=1
251 set foldmethod=syntax
252 set foldtext=trim(getline(v:foldstart),&commentstring)
253 set fillchars=""
255 "==============================================================================
256 " File type highlight
257 "==============================================================================
258 setf dosini
259 augroup filetypedetect
260         autocmd BufNewFile,BufRead *.h     set filetype=c
261         autocmd BufNewFile,BufRead *.csv   set filetype=csv
262         autocmd BufNewFile,BufRead *.gpg   set filetype=gpg
263         autocmd BufNewFile,BufRead *.log   set filetype=log
264         autocmd BufNewFile,BufRead *.s     set filetype=nasm
265         autocmd BufNewFile,BufRead LICENSE set filetype=text
266         autocmd BufNewFile,BufRead README  set filetype=markdown
267 augroup END
269 "==============================================================================
270 " Auto Completor
271 "==============================================================================
272 let g:completor_auto_trigger = 1
273 let g:completor_clang_binary = '/usr/bin/clang'
274 let g:completor_nasm_omni_trigger = '/bin/nasm'
275 let g:completor_complete_options = 'menuone,noselect,preview'
277 set dictionary+="~/.vim/dict/text.dict"
278 au FileType * execute 'setlocal dict+=~/.vim/dict/'.&filetype.'.dict'
280 inoremap <expr> <Tab>   pumvisible() ? "\<C-n>" : "\<Tab>"
281 inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
282 inoremap <C-f> <C-X><C-K>
284 "==============================================================================
285 " Remove characters function
286 "==============================================================================
287 function! Clean_file()
288         " Save cursor line
289         let save_pos = getpos(".")
290         " Remove spaces from begin & end of line
291         " Remove spaces after tab
292         " Remove tab\n
293         " Remove file last line if empty
294         " Remove more than 2 empty lines
295         " Remove empty comment lines
296         " TODO remove 2 spaces between words
297 "       \%s/^ \+//e |
298         %s/ \+$//e |
299         \%s/^\/\/$//e |
300         \%s/\t\+\n/\r/e |
301         \%s/\t \+/\t/e |
302         \%s/\($\n\)\+\%$//e |
303         \%s/^\n\{1,\}/\r/e
304         " Return to saved cursor
305         call setpos(".", save_pos)
306         normal !k
307 endfunction
309 "==============================================================================
310 " File Templates
311 "==============================================================================
312 let g:filename      = expand("%:r")
313 let g:filename_ext  = expand("%:e")
314 let g:upperfilename = toupper(filename)
316 autocmd BufNewFile *.sh normal!ggi#!/bin/sh\r
317 autocmd BufNewFile *.py normal!ggi#!/usr/bin/env python3\r
318 autocmd BufNewFile *.s  exe "normal!ggiBITS 64\rglobal _start\rsection"
319         \".text\r\r_start:\r\rexit:\r        mov rax, 60       ; "
320         \"exit(\r        mov rdi, 0        ;   EXIT_SUCCESS\r     syscall           ; );"
321 autocmd BufNewFile *.h  exe "normal!ggi/* See LICENSE file for copyright and "
322         \"license details. */\r\r#ifndef ".g:upperfilename."_H\r#define "
323         \.g:upperfilename."_H\r\r\r\r\#endif /* ".g:upperfilename."_H */" | normal!kk
324 autocmd BufNewFile *.c  exe "normal!ggi/* See LICENSE file for copyright and license"
325         \"details. */\r\r#include <stdio.h>\r\r/* macros */\r/* typedef */\r/*"
326         \"function declarations */\r/*"
327         \"global variables */\r/* function implementations */\r\rint\rmain(int argc,"
328         \" char *argv[])\r{\r\rreturn 0;\r}" | normal!kk