summaryrefslogtreecommitdiff
path: root/vimrc
blob: 34b95e8ef7c5359dfbf4dd24e000d16e34d9223a (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
" General {{{1
set nocompatible
let g:use_dvorak = 1
let g:leave_my_cursor_position_alone = ''
let PHP_vintage_case_default_indent = 1
let c_no_comment_fold = 1
set fileformats=unix,dos,mac
set spelllang=en_us
set switchbuf=useopen

" Colors and Syntax {{{1
set background=dark
colorscheme zlg
if has('syntax') && !exists('g:syntax_on')
	syntax enable
endif

" Plugin-Specific {{{1
call pathogen#infect('bundle/{}')
Helptags

" Formatting {{{1
set formatprg=par-format\ w80
set printoptions=paper:letter,top:0.5in,left:0.5in,right:0.5in,bottom:0.5in,syntax:n,header:0
set tabstop=4
set softtabstop=4
set shiftwidth=4
set noexpandtab
set formatoptions=tcqn

" Usability {{{1
set whichwrap=<,>,[,],h,l
set scrolloff=2
set backspace=indent,eol,start
set ttimeout
set ttimeoutlen=50
set timeoutlen=3000
set incsearch
set number
set numberwidth=5
set hidden
set mouse=n

" Interface {{{1
set display+=lastline
" I changed my mind... a toggle is best
set nolist
"set listchars=tab:⇥\ ,trail:␣,extends:⇉,precedes:⇇,nbsp:⚭
if &termencoding ==# 'utf-8' || &encoding ==# 'utf-8'
	let &listchars = "tab:\u21e5 ,extends:\u21c9,precedes:\u21c7,nbsp:\u26ad"
else
	set listchars=tab:>\ ,extends:>,precedes:<,nbsp:+
endif
set splitright
set splitbelow
set laststatus=2
" Example: (1) .vimrc [vim][+] 48,22 123L 0x20
set statusline=(%n)\ %f\ %y%r%m\ %l,%v\ %LL\ 0x%B
set fillchars=fold:\ ,vert:\|
set wrap
set linebreak

" Anti-Annoyance {{{1
set nostartofline
set novisualbell
set noautoindent

" Folding {{{1
set foldmethod=expr
set foldtext=MyFoldText()

function! MyFoldText()
	let indent = repeat('	', indent(v:foldstart))
	let line = substitute(getline(v:foldstart), '\v^\s+', '', '')
	let folded_lines = v:foldend - v:foldstart
	return indent . line . ' (' . folded_lines . 'L)'
endfunction


" Autocommands {{{1
if has("autocmd")
	filetype plugin indent on
	autocmd BufNewFile,BufRead /media/sd/Games/*.[0123456789].txt setfiletype sctxt
	autocmd BufNewFile,BufRead *.txt setfiletype text
	" All Markdown and TXT files need to be hard wrapped to 80 characters.
	autocmd FileType text,markdown setlocal nonumber tabstop=4 softtabstop=4 shiftwidth=4 expandtab formatoptions=tcqwn textwidth=80 nolist colorcolumn=81
	autocmd FileType python setlocal expandtab
	autocmd BufNewFile,BufRead *.ledger setlocal nonumber iskeyword+=: filetype=ledger
	autocmd FileType help setlocal colorcolumn=0
	autocmd FileType vim setlocal keywordprg=:help
	autocmd FileType c setlocal foldmethod=syntax
	" Needed for game guides on the SuperCard DSTWO; this is also true of
	" homebrew apps that use monospace fonts at normal scale. The DSTWO throws
	" up on linebreaks if it's not DOS, iso8859-1 text. The limit is set to
	" allow for a character or two that might be wider than an M or W.
	autocmd FileType sctxt setlocal enc=latin1 ff=dos tw=30 cc=31 fo=tcqwn nolist et ts=4 sts=4 sw=4
endif

" Key Bindings {{{1
nnoremap <leader>i :call <SID>SynStack()<CR>
nnoremap <leader>l :set list!<CR>
nnoremap <leader>n :set number!<CR>
nnoremap <leader>t :setfiletype text<CR>
nnoremap <leader>s :set spell!<CR>
nnoremap <leader>c :call <SID>CountCodeLines()<CR>
nnoremap <leader>d :call <SID>InsertDOW()<CR>
nnoremap <leader>D "=strftime("%Y-%m-%d %H:%M", localtime())<CR>p
nnoremap <Space> za
nnoremap <silent> <F5> :call <SID>StripTrailingWhitespaces()<CR>

" Thanks to /u/spupy for these short and sweet mappings that replace the
" simpler functions of tpope's surround.vim plugin. Each of these will
" surround the current (or last) visual selection with the specified 
" character.
noremap <Leader>w" <ESC>`>a"<ESC>`<i"<ESC>
noremap <Leader>w' <ESC>`>a'<ESC>`<i'<ESC>
noremap <Leader>w( <ESC>`>a)<ESC>`<i(<ESC>
noremap <Leader>w[ <ESC>`>a]<ESC>`<i[<ESC>
noremap <Leader>w{ <ESC>`>a}<ESC>`<i{<ESC>
noremap <Leader>w< <ESC>`>a><ESC>`<i<<ESC>
noremap <Leader>w` <ESC>`>a`<ESC>`<i`<ESC>


" Dvorak Hackery {{{1
if (exists("g:use_dvorak") && g:use_dvorak == 1)
	" I use a Dvorak keyboard, so standard vim movement keys are a hassle.
	" Since mnemonics are helpful all around, I need a mapping that gives me
	" pain-free file navigation without screwing up mnemonics (too much).
	"
	" Thus:
	" (D)elete is now (K)ill: d2w == k2w "kill 2 words"
	" Un(T)il is now (J)ump-To: dt( == kj( "kill, jump-to paren"
	" (N)ext is now (L)eap: cn == cl "change up to leap point"

	" Standard movement, which is the true focus of this hack.
	" Mnemonics are awesome, so let's preserve as much as possible.
	noremap d h
	noremap h j
	noremap t k
	noremap n l
	noremap D H
	noremap H J
	noremap T K
	noremap N L

	noremap gh gj
	noremap gt gk

	" I work with tabs every now and then. No, I don't have a mnemonic, so
	" stfu.
	noremap gj gt
	noremap gJ gT

	" Window movement, equally important
	noremap <C-w>d <C-w>h
	noremap <C-w>h <C-w>j
	noremap <C-w>t <C-w>k
	noremap <C-w>n <C-w>l

	nnoremap <C-w><C-d> <C-w><C-h>
	nnoremap <C-w><C-h> <C-w><C-j>
	nnoremap <C-w><C-t> <C-w><C-k>
	nnoremap <C-w><C-n> <C-w><C-l>

	nnoremap <C-d> <C-w>h
	nnoremap <C-h> <C-w>j
	nnoremap <C-t> <C-w>k
	nnoremap <C-n> <C-w>l

	" Account for tag jumping
	nnoremap <C-j> <C-t>

	" Remappings for the D key
	noremap k d
	noremap K D

	" Remappings for the T key
	noremap j t
	noremap J T

	" Remapping for the L key
	noremap l n
	noremap L N

	" General purpose help; the originals remain for convenience
	noremap - 0
	noremap _ $

	" Fold-related keybindings
	noremap zh zj
	noremap zt zk

endif

" Functions {{{1
" Credit to Drew Neil of vimcasts.org
function! <SID>StripTrailingWhitespaces() " {{{2
	" Save last search and cursor position
	let _s=@/
	let l = line(".")
	let c = col(".")
	" Do the business:
	%s/\s\+$//e
	" Restore previous search history and cursor position
	let @/=_s
	call cursor(l, c)
endfunction

" Credit to Drew Neil of vimcasts.org
function! <SID>SynStack() " {{{2
	if !exists("*synstack")
		return
	endif
	echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')
endfunction

function! <SID>CountCodeLines() " {{{2
	let code_count = 0
	for line in getbufline("%", 1, "$")
		if (len(line) > 0 && match(line, '\S\+') > -1)
			if (s:IsCommentLine(line) == 1)
				continue
			endif
			let code_count += 1
		endif
	endfor
	echo code_count . ' lines of code.'
endfunction

function! s:IsCommentLine(line) " {{{2
	let l:comtypes = []
	let l:comlist = split(&comments, ',')
	for i in comlist
		let l:type = split(i, ':')
		if len(type) > 1
			let l:opt = type[1]
		else
			let l:opt = type[0]
		endif
		call add(comtypes, opt)
	endfor
	let i = 0
	while i < len(comtypes)
		if match(a:line, '^\s*' . escape(comtypes[i], '/*')) > -1
			return 1
		endif
		let i += 1
	endwhile
	return 0
endfunction

function! <SID>InsertDOW() " {{{2
	" Let's backup a random register
	let tmpx = @x
	let @x = system("date +\"%a \" -d" . strftime("%Y") . "-" . substitute(expand("<cWORD>"), ":", "", ""))
	normal "xP
	" Join, since it apparently is on a line instead of just a string
	j 1
	" Return the value in the x register
	let @x = tmpx
endfunction
" vim: foldmethod=marker