aboutsummaryrefslogtreecommitdiff
path: root/vim/vimrc
blob: 6b85ea3767132aadf21f5e94118d4c6882bc0a13 (plain) (blame)
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
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
" Tom Ryder (tejr)'s vimrc: <https://sanctum.geek.nz/cgit/dotfiles.git>
" Requires Vim 7.0 or newer with +eval.

" Undo anything the operating system's vimrc may have broken
runtime system.vim

" Set an environment variable for the user runtime directory
if !exists('$MYVIMRUNTIME')
  if has('win32') || has('win64')
    let $MYVIMRUNTIME = expand('~/vimfiles')
  else
    let $MYVIMRUNTIME = expand('~/.vim')
  endif
endif

" Load filetype settings, plugins, and maps
if has('autocmd')
  let maplocalleader = ','
  filetype plugin indent on
endif

" Options dependent on the syntax feature
if has('syntax')

  " Use syntax highlighting
  if !exists('syntax_on')
    syntax enable
  endif

  " Colorscheme handling
  try

    " Use sahara.vim colorscheme, if using gVim or a 256-color term
    if has('gui_running') || &t_Co >= 256
      colorscheme sahara
    else
      throw 'Not loading sahara on this terminal'
    endif

    " Use the colorscheme's subtle 'cursorline', if it loaded
    if exists('+cursorline')
      set cursorline
    endif

  " Otherwise, use the default colorscheme with a dark background
  catch
    set background=dark
  endtry

endif

" The all-important default indent settings; filetypes to tweak
set autoindent     " Use indent of previous line on new lines
set expandtab      " Use spaces instead of tabs
set shiftwidth=4   " Indent with four spaces
set softtabstop=4  " Insert four spaces with tab key

" Let me backspace over pretty much anything
set backspace+=eol     " Line breaks
set backspace+=indent  " Spaces from 'autoindent'
set backspace+=start   " The start of current insertion

" Try to keep backups in one system-appropriate dir, including full encoded
" path in filename (trailing double slash) if supported (8.1.0251)
set backup
if v:version > 801
      \ || v:version == 801 && has('patch251')
  set backupdir^=$MYVIMRUNTIME/cache/backup//
else
  set backupdir^=$MYVIMRUNTIME/cache/backup
endif

" Add some paths not to back up
if has('unix')
  set backupskip^=/dev/shm/*  " Shared memory RAM disk
  set backupskip^=/usr/tmp/*  " Hardcoded path for `sudo -e`
  set backupskip^=/var/tmp/*  " Hardcoded path for `sudo -e`
endif

" Indent wrapped lines if supported
if exists('+breakindent')
  set breakindent
endif

" Clear default 'comments' value, let the filetype handle it
set comments=

" Add completion options
if exists('+completeopt')
  set completeopt+=longest  " Insert longest common substring
  set completeopt+=menuone  " Show the menu even if only one match
endif

" Give me a prompt instead of just rejecting risky :write, :saveas
set confirm

" Require two spaces for sentence objects
" Yes, I have become a filthy two-spacer
set cpoptions+=J

" Try to keep swapfiles in one system-appropriate dir, including full encoded
" path in filename (trailing double slash)
set directory^=$MYVIMRUNTIME/cache/swap//

" Use UTF-8 if we can and env LANG didn't tell us not to
if has('multi_byte') && !exists('$LANG') && &encoding ==# 'latin1'
  set encoding=utf-8
endif

" Don't wait for a key after Escape in insert mode
" Not in NeoVim
if exists('+esckeys')
  set noesckeys
endif

" Fold based on indent, but only when I ask
if has('folding')
  set foldlevelstart=99
  set foldmethod=indent
endif

" Delete comment leaders when joining lines, if supported
if v:version > 703
      \ || v:version == 703 && has('patch541')
  set formatoptions+=j
endif

" Don't break a single space after a period, if supported
if v:version > 801
      \ || v:version == 801 && has('patch728')
  set formatoptions+=p
endif

" Don't load GUI menus; set here before GUI starts
if has('gui_running')
  set guioptions+=M
endif

" Allow buffers to have changes without being displayed
set hidden

" Keep much more command and search history
set history=2000

" Highlight completed searches; clear on reload
set hlsearch
nohlsearch

" Don't assume I'm editing C; let the filetype set this
set include=

" Show search matches as I type my pattern
set incsearch

" Don't show a statusline if there's only one window
" This is the Vim default, but NeoVim changed it
if &laststatus != 1
  set laststatus=1
endif

" Don't redraw the screen during batch execution
set lazyredraw

" Break lines at word boundaries
set linebreak

" Define extra 'list' display characters
set listchars+=extends:>   " Unwrapped text to screen right
set listchars+=precedes:<  " Unwrapped text to screen left
set listchars+=tab:>-      " Tab characters, preserve width
set listchars+=trail:_     " Trailing spaces
set listchars+=nbsp:+      " Non-breaking spaces

" Don't allow setting options via buffer content
set nomodeline

" Treat numbers with a leading zero as decimal, not octal
set nrformats-=octal

" Options for file search with gf/:find
set path-=/usr/include  " Let the C/C++ filetypes set that
set path+=**            " Search current directory's whole tree

" Disable command line display of file position
" This is the Vim default, but NeoVim changed it
if &ruler
  set noruler
endif

" Make sessions usable
if exists('+sessionoptions')
  set sessionoptions-=localoptions  " No buffer options or mappings
  set sessionoptions-=options       " No global options or mappings
endif

" Don't show startup splash screen (I donated)
set shortmess+=I

" Prefix wrapped rows with three dots
set showbreak=...

" New window positioning
set splitbelow  " Below the current window, not above
set splitright  " Right of the current window, not left

" No terminal mouse, even if we could
" The manual says to set 't_RV', but I don't like that
if exists('+ttymouse') && &ttymouse !=# ''
  set ttymouse=
endif

" Try to keep persistent undo files in one system-appropriate dir, including
" full encoded path in filename (trailing double slash)
if has('persistent_undo')
  set undofile
  set undodir^=$MYVIMRUNTIME/cache/undo//
endif

" Wildmenu settings; see also plugin/wildignore.vim
set wildmenu               " Use wildmenu
set wildmode=list:longest  " Tab press completes and lists
if exists('+wildignorecase')
  set wildignorecase  " Case insensitive, if supported
endif

" Let me move beyond buffer text in visual block mode
if exists('+virtualedit')
  set virtualedit+=block
endif

" Never beep at me
set visualbell t_vb=

" Stack normal/visual/select Ctrl-L to clear search highlight
nnoremap <silent> <C-L> :<C-U>nohlsearch<CR><C-L>
vnoremap <silent> <C-L> :<C-U>nohlsearch<CR>gv<C-L>

" Remap insert Ctrl-C to undo the escaped insert operation
if &loadplugins  " Don't break the key if we won't be loading the plugin
  imap <C-C> <Plug>(InsertCancel)
endif

" Map double Ctrl-K in insert mode to search digraph names
imap <C-K><C-K> <Plug>(DigraphSearch)

" Remap normal space to scroll down a page
nnoremap <Space> <PageDown>
" Do a :next after hitting the last line
if &loadplugins  " Don't change the mapping if we won't be loading the plugin
  nmap <Space> <Plug>(ScrollNext)
endif

" Remap normal/visual & and g& to preserve substitution flags
nnoremap <silent> & :&&<CR>
xnoremap <silent> & :&&<CR>
nnoremap <silent> g& :<C-U>%&&<CR>

" Map g: as a 'colon operator'
nmap g: <Plug>(ColonOperator)

" Cycle through argument list
nnoremap [a :previous<CR>
nnoremap ]a :next<CR>
" Cycle through buffers
nnoremap [b :bprevious<CR>
nnoremap ]b :bnext<CR>
" Cycle through quicklist/:helpgrep items
nnoremap [c :cprevious<CR>
nnoremap ]c :cnext<CR>
" Cycle through location list items
nnoremap [l :lprevious<CR>
nnoremap ]l :lnext<CR>

" Insert blank lines around current line
nmap [<Space> <Plug>(PutBlankLinesAbove)
nmap ]<Space> <Plug>(PutBlankLinesBelow)

" \a toggles 'formatoptions' 'a' flag using a plugin
nnoremap <Leader>a :<C-U>ToggleFlagLocal formatoptions a<CR>

" \b toggles copy-pasteable linebreak settings
nmap <Leader>b <Plug>(CopyLinebreakToggle)

" \c toggles 'cursorline'; no visual mode map as it doesn't work
nnoremap <Leader>c :<C-U>setlocal cursorline! cursorline?<CR>
" \C toggles 'cursorcolumn'; works in visual mode
nnoremap <Leader>C :<C-U>setlocal cursorcolumn! cursorcolumn?<CR>
xnoremap <Leader>C :<C-U>setlocal cursorcolumn! cursorcolumn?<CR>gv

" \d inserts the local date (POSIX date)
nnoremap <Leader>d :read !date<CR>
" \D inserts the UTC date (POSIX date)
nnoremap <Leader>D :read !date -u<CR>

" \e forces a buffer to be editable
nnoremap <Leader>e :<C-U>setlocal modifiable noreadonly<CR>

" \f shows the current 'formatoptions' at a glance
nnoremap <Leader>f :<C-U>setlocal formatoptions?<CR>

" \F reloads filetype plugins
nnoremap <Leader>F :<C-U>doautocmd filetypedetect BufRead<CR>

" \g changes directory to the current file's location
nnoremap <Leader>g :<C-U>cd %:h<CR>:pwd<CR>

" \h toggles highlighting search results
nnoremap <Leader>h :<C-U>set hlsearch! hlsearch?<CR>

" \H shows command history
nnoremap <Leader>H :<C-U>history :<CR>

" \i toggles showing matches as I enter my pattern
nnoremap <Leader>i :<C-U>set incsearch! incsearch?<CR>

" \j jumps to buffers (jetpack)
nnoremap <Leader>j :<C-U>buffers<CR>:buffer<Space>

" \k shows my marks
nnoremap <Leader>k :<C-U>marks<CR>

" \l toggles showing tab, end-of-line, and trailing whitespace
nnoremap <Leader>l :<C-U>setlocal list! list?<CR>
xnoremap <Leader>l :<C-U>setlocal list! list?<CR>gv

" \m shows normal maps
nnoremap <Leader>m :<C-U>map<CR>
" \M shows buffer-local normal maps
nnoremap <Leader>M :<C-U>map <buffer><CR>

" \n toggles line number display
nnoremap <Leader>n :<C-U>setlocal number! number?<CR>
xnoremap <Leader>n :<C-U>setlocal number! number?<CR>gv
" \N toggles position display in bottom right
nnoremap <Leader>N :<C-U>set ruler! ruler?<CR>
xnoremap <Leader>N :<C-U>set ruler! ruler?<CR>gv

" \o opens a line below in paste mode
nmap <Leader>o <Plug>(PasteOpenBelow)
" \O opens a line above in paste mode
nmap <Leader>O <Plug>(PasteOpenAbove)

" \p toggles paste mode
nnoremap <Leader>p :<C-U>set paste! paste?<CR>

" \q formats the current paragraph
nnoremap <Leader>q gqap

" \r acts as a replacement operator
nmap <Leader>r <Plug>(ReplaceOperator)
xmap <Leader>r <Plug>(ReplaceOperator)

" \R reloads ~/.vimrc
nnoremap <Leader>R :<C-U>source $MYVIMRC<CR>

" \s toggles spell checking
nnoremap <Leader>s :<C-U>setlocal spell! spell?<CR>

" \S shows loaded scripts
nnoremap <Leader>S :<C-U>scriptnames<CR>

" \t shows current filetype
nnoremap <Leader>t :<C-U>setlocal filetype?<CR>
" \T clears filetype
nnoremap <Leader>T :<C-U>setlocal filetype=<CR>

" \u sets US English spelling (compare \z)
nnoremap <Leader>u :<C-U>setlocal spelllang=en_us<CR>

" \v shows all global variables
nnoremap <Leader>v :<C-U>let g: v:<CR>
" \V shows all local variables
nnoremap <Leader>V :<C-U>let b: t: w:<CR>

" \w toggles wrapping
nnoremap <Leader>w :<C-U>setlocal wrap! wrap?<CR>
xnoremap <Leader>w :<C-U>setlocal wrap! wrap?<CR>gv

" \x strips trailing whitespace via a custom plugin
nmap <Leader>x :StripTrailingWhitespace<CR>
xmap <Leader>x :StripTrailingWhitespace<CR>

" \X squeezes repeated blank lines via a custom plugin
nmap <Leader>X :SqueezeRepeatBlanks<CR>
xmap <Leader>X :SqueezeRepeatBlanks<CR>

" \y shows all registers
nnoremap <Leader>y :<C-U>registers<CR>

" \z sets NZ English spelling (compare \u)
nnoremap <Leader>z :<C-U>setlocal spelllang=en_nz<CR>

" \= runs the whole buffer through =, preserving position
nnoremap <Leader>= :<C-U>call vimrc#Anchor('1G=G')<CR>
" \+ runs the whole buffer through gq, preserving position
nnoremap <Leader>+ :<C-U>call vimrc#Anchor('1GgqG')<CR>

" \. runs the configured make program into the location list
nnoremap <Leader>. :<C-U>lmake!<CR>

" \< and \> adjust indent of last edit; good for pasting
nnoremap <Leader><lt> :<C-U>'[,']<lt><CR>
nnoremap <Leader>> :<C-U>'[,']><CR>

" \_ uses last changed or yanked text as a characterwise object
onoremap <Leader>_ :<C-U>normal! `[v`]<CR>

" \% uses entire buffer as a linewise object
onoremap <Leader>% :<C-U>normal! 1GVG<CR>

" \{ and \} move to lines with non-space chars before current column
nmap <Leader>{ <Plug>(VerticalRegionUp)
nmap <Leader>} <Plug>(VerticalRegionDown)
omap <Leader>{ <Plug>(VerticalRegionUp)
omap <Leader>} <Plug>(VerticalRegionDown)
xmap <Leader>{ <Plug>(VerticalRegionUp)
xmap <Leader>} <Plug>(VerticalRegionDown)

" \/ types :vimgrep for me ready to enter a search pattern
nnoremap <Leader>/ :<C-U>vimgrep /\c/j **<S-Left><S-Left><Right>
" \? types :lhelpgrep for me ready to enter a search pattern
nnoremap <Leader>? :<C-U>lhelpgrep \c<S-Left>

" \\ escapes regex metacharacters
nmap <Leader>\ <Plug>(RegexEscape)
xmap <Leader>\ <Plug>(RegexEscape)

" \DEL deletes the current buffer
nnoremap <Leader><Delete> :bdelete<CR>
" \INS edits a new buffer
nnoremap <Leader><Insert> :<C-U>enew<CR>

" Execution mappings; each of these clobbers register z

" \@ executes line in normal mode
nnoremap <Leader>@ ^"zyg_@z
" \: executes line in command mode
nnoremap <Leader>: ^"zyg_:<C-R>z<CR>
" \! executes line with 'shell'
nnoremap <Leader>! ^"zyg_:!<C-R>z<CR>

" Source any .vim files from ~/.vim/config
runtime! config/*.vim