summaryrefslogtreecommitdiffstats
path: root/vim/vimrc
blob: 415212ea545d5fd70611a34a9b697b18e8141706 (plain)
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
" mitsuo's vimrc
" Created c. 2019-11-11
" Last update (after destroying it accidentally): 2020-09-02
"
"                               ┌─┬─┬─┬─┬─┬─┐           
"                               │m│i│t│s│u│o│✓x       け が
"                               ├─┼─┼─┼─┼─┼─┤            ん
"                               │v│i│m│r│c│←│█▓▒░     り ば
"                               └─┴─┴─┴─┴─┴─┘         こ れ

" XDG compliant REMOVED :D (what a pain)
" - For new installs just copy (or link) this file into  ~/.vimrc  and create
"   the  ~/.vim  directory
" TODO: - sort sections


" Variables
" ----------------------------------------------------------------------
"  Get the first directory from the list in $VIMRUNTIMEPATH
let $VIMFILES=split(&rtp,",")[0]
set undodir=$VIMFILES/undo
set viminfofile=$VIMFILES/viminfo
set viewdir=$VIMFILES/view
set directory=$VIMFILES/swap
set viminfofile=$VIMFILES/viminfo


" Useful
" ----------------------------------------------------------------------
set nocompatible
" Auto-recognize files and apply pluggins 
filetype plugin indent on       " See :h vimrc-filetype
syntax on

" Search files
set wildmenu        " command-line <Tab> completion     <-- soo good
set wildignore+=*.o,*.obj,.git,*.rbc,*.class
set path+=./**30    " For gf and :find, add all subdirectories relative to
                    " current file (30 max) to the "search space"

set scrolloff=5     " show a few lines of context

set backspace=indent,eol,start  " Allow <BS> and <Del> in insert mode

" number gutter
set nonumber
set norelativenumber

" Store session information
set viminfo+='1000

" Tag Jumping   <-- so cool
" Instructions: create tag index (e.g. $ ctags -R .)
"               place cursor on tag
"               ^]  to jump to definition
"               g^] if more than 1 definition
"               ^T  to return (or ^O)
" TODO: create tags automatically (:!ctags -R . after :w if ft=c)


" Status line
" ----------------------------------------------------------------------
set showcmd         " show partial command on last line (below status bar)
" just add buffer number to the default
set statusline=%<%f\ %h%m%r%=b%02n\ \ %-14.(%l,%c%V%)\ %P


" Search
" ----------------------------------------------------------------------
set hlsearch    " highlight search (this can be annoying if no shortcut to then
                " clear the highlight
set incsearch   " Incrementally move cursor while typing search-string
" stop highlight only for current search.  
" (Still preserve <C-L> updating directory in netrw)
nnoremap <C-L> :nohl<CR><C-L>
" Ignore case only when pattern is lowercase (both needed)
set ignorecase
set smartcase


" Indentation
" ----------------------------------------------------------------------
" 4 column softtabs (uses ' ', not '\t').
"   TODO: move this 'guide' to somewhere apropiate
"   tab->softtab    :set tabstop=n      :set expandtab  :retab
"   softtab->tab    :set noexpandtab    :set tabstop={softtabstop}  :retab!
"   Caution: 
"       - This will insert a tab wherever it can, even between words
"         separated by as few as 2 spaces if ts=2!  
"       - Not recommended at all.  Use some other program to only translate
"         leading indenting from space to tabs.  Also using tabs is not very
"         good.  My opinion is that they are good as a special character to
"         separate data (like comma for CSV).
set tabstop=8           " '\t' or HT = 8 virtual columns
set shiftwidth=4        " Indentation with >> and C-T and C-D (insert mode)
set softtabstop=4       " For "inserted tabs" (inserts <Space> and <Tab>
                        " minimizing <Space>)
set expandtab           " Expand with <Space> the inserted <Tab>s
"set smarttab           " Use shiftwidth for inserted <Tabs> in the front of
                        " a line (Maybe useful for YAML)
" autoindent -> smartindent -> cindent -> indentexpr 
" (from simple/less general to complex/more general)
set smartindent         " This is a really nice and simple one
"set cindent            
"set cinoptions=:0,g0   " See C-indenting


" Automatic formatting
" ----------------------------------------------------------------------
" see fo-table
set formatoptions=l         " Don't break long lines that are already typed
set formatoptions+=q        " Allow formatting of comments with "gq"
set formatoptions+=r        " Insert current leader after <Enter> in Insert mode
set formatoptions-=o        " Automatically insert the current comment leader 
                            " after hitting 'o'.
set formatoptions+=t        " auto-wrap text (when inserting)
set formatoptions+=c        " auto-wrap comments (when inserting)
set formatoptions+=p        " Don't break honorifics like Prof. Smith
set formatoptions+=n        " Allow lists
set formatoptions+=j        " Removes comment leader when joining lines


" Word wrap
" ----------------------------------------------------------------------
set wrap            " Visual wrapping of lines wider than window
set linebreak       " Works with previous option to not break words
" To 'justify' comments or block of text (paragraph) use "gq{motion}" or
" "gp{motion}", where {motion} can be "[/", "]/", "ip", "i{", "a{".
set textwidth=80    " auto break inserted text longer than 80 colums


" Other settings
" ----------------------------------------------------------------------
set mouse=a             " Enable for all modes
" set cmdheight=1
" Always display the status line, even if only one window is displayed
set laststatus=2
set ruler
set encoding=utf-8
set more                " Enable more-prompt for listings that don't fit in
                        " screen
"hint: g< command can be used to see the last page of previous command.


" Mappings
" ----------------------------------------------------------------------
"  F1 is help, F11 is full screen (terminal emulator)
map <F5> :source $VIMFILES/vimrc<CR>
map <S-F5> :e $VIMFILES/vimrc<CR>
map <F7> :tabp<CR>
map <F8> :tabn<CR>
map <F9> :w<CR>:make<CR>
"map <F10> :!./%:r<CR>
map <F10> :!./a.out<CR>
map <F11> :cnext<CR>
map <S-F11> :cprev<CR>
" One has to do :E first in order for this to work
"map <F12> :Rex<CR>
" <Leader> = '\' when 'mapleader' is empty
" Change to the directory of the current file and generate tags recursively
" there.

""" Usage of utilities
"" ctags
" TODO: make the change of directory whenever a .c .cpp .h file is opened
map <Leader>rt :cd %:h<CR>:!ctags -R .<CR>
map <C-\> :tnext<CR>
" Motion to go to beggining of function while cursor is inside
nmap [f [m[{k0

" pandoc (& website)
nnoremap mm :w<CR>:Md2Html<CR><CR><CR>
nmap mM mm:!updatewebsite_zaz<CR><CR>
" asciidoc
nnoremap ma :w<CR>:!asciidoctor %<CR><CR>
nmap mA ma:!updatewebsite_zaz<CR><CR>

" Funcionallity of the following depends on terminal (8bit input enabled needed
" for <Meta> = Alt key combos
" From: https://vim.fandom.com/wiki/Get_Alt_key_to_work_in_terminal

nmap <M-H> <C-W>h
nmap <M-J> <C-W>j
nmap <M-K> <C-W>k
nmap <M-L> <C-W>l

" Go Title Case (and clear highlighted matches)
" Ref.: vim.fandom.com
vmap gt :s/\<\(\w\)\(\w*\)\>/\u\1\L\2/g<CR><C-L>

"
" Not mapings but useful commands:
"
" Autoformat JSON jumbled data.  (Selects the whole file as range to pass as
" standard input to `jq .` which pretty prints JSON.  Then replace range with
" output.)
" Thankyou: https://stackoverflow.com/questions/26214156/how-to-auto-format-json-on-save-in-vim
nnoremap gJ :%!python3 -m json.tool<CR>
" :%!jq .

" NERDTree plugin
nnoremap <C-t> :NERDTreeToggle<CR>


" Yanking and pasting
" ----------------------------------------------------------------------
" TODO: map something to "+y (cut buffer) and "*y (selection buffer) while in
" visual mode.
"vmap <++> "+y      " The yank to the cut buffer (clipboard)
"vmap <++> "*y      " The yank to the selection buffer


" Buffers
" ----------------------------------------------------------------------
set hidden
map <S-F7> :bNext<LF>
map <S-F8> :bnext<LF>


" Printing
" ----------------------------------------------------------------------
set printoptions=paper:A4,duplex:long
" set printoptions+=number:y
" TODO: Figure out how to print multibyte encodings.  Enabling this settings
" produces errors.
set encoding=utf-8
set fileencoding=utf-8
" set printmbcharset=JIS_X_1990 " This allows Japanese characters to be printed
" set printmbfont=r:Noto-Sans-CJK-JP


" Functions
" ----------------------------------------------------------------------
" TODO: maybe replace with $runtimepath
source $VIMFILES/fun.vim


" Views and Sessions (Window layout and Line folding)
" ----------------------------------------------------------------------
" It is possible to create folds automatically but idk how to do it.
" :mkview so save them :loadview to load them (zo open one, zc close one,
" zR to open all, zM to close all, zx to restore))

" Views saves folds.  Sessions saves all windows configuration and layout
" Load Sessions with $ vim -S Session.vim

" To automatically save and restore views for *.c *.cpp files: 
au BufWinLeave *.c mkview
au BufWinEnter *.c silent loadview
au BufWinLeave *.cpp mkview
au BufWinEnter *.cpp silent loadview


" Snippets
" ----------------------------------------------------------------------
" I deleted the file accidently
"nnoremap ,ch :-1r $VIMFILES/snippets/cheader.c<CR>


" File Browsing
" ----------------------------------------------------------------------
" Use netrw out of the box file browser plugin.
"   :e .            open file browser on current directory
"   V or t          open file on vsplit or new tab. 
"   :bd or :Rex     to return
"   More mappings on |netrw-browse-maps|
"let g:netrw_banner=0        " disable banner
"let g:netrw_browse_split=4  " open in prior window
let g:netrw_altv=1          " open splits to the right
"let g:netrw_list_hide=netrw_gitignore#Hide()
"let g:netrw_list_hide.=',\(^\|\s\s\)\zs\.\S\+'  " wtf? (?)
" Learned from Max Cantor talk https://youtu.be/XA2WjJbmmoM


" Additions
" ----------------------------------------------------------------------
" Replaces previous WORD arithmetic expression with result (from Vim
" fandom-wiki)
inoremap <C-A> <Esc>diWi<C-R>=<C-R>"<CR>


" Plugins
" ----------------------------------------------------------------------
" I disabled it bc I think it interferes with formatoptions
"" Automatic vim-plug install
"if empty(glob('~/.vim/autoload/plug.vim'))
"  silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
"    \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
"  autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
"endif
"
"call plug#begin()
"Plug 'ARM9/arm-syntax-vim'
"autocmd BufNewFile,BufRead *.s,*.S set filetype=arm " arm = armv6/7
"
"call plug#end()

" Other plugins
" I used to use IndexedSearch plugin.  Functionality was incorporated into Vim
" since Vim 8.1.1270.
set shortmess-=S


" Colors
" ----------------------------------------------------------------------
" I like desert, murphy, pablo, industry
" (default is OK for most cases but when using vimdiff, highlighted numbers are
" unreadable)
:colorscheme industry


" Ducktape (place this in ~/.vim/after (after directory))
" ----------------------------------------------------------------------
" Not even the ducktape worked for this one on C files TODO
set formatoptions-=o            " Automatically insert the current comment leader 
" TODO: fix this shit getting reset in a markdown text
set formatoptions+=r            " auto insert comment leader after <Enter>