]>
Commit | Line | Data |
---|---|---|
39d7f74f | 1 | """ paths |
2 | "" config dir in xdg config | |
afd175d7 | 3 | let x = ($XDG_CONFIG_HOME??($HOME.'/.config')).'/vim' |
8d4a98e1 | 4 | execute 'set runtimepath='.x.','.&runtimepath.','.x.'/after' |
5 | execute 'set packpath='.x.','.&packpath.','.x.'/after' | |
1b8a4102 | 6 | |
39d7f74f | 7 | "" state files in xdg state |
afd175d7 | 8 | let x = ($XDG_STATE_HOME??($HOME.'/.local/state')).'/vim' |
4850f4c2 | 9 | if !isdirectory(x) |
afd175d7 | 10 | call mkdir(x, 'p', 0700) |
11 | endif | |
afd175d7 | 12 | |
39d7f74f | 13 | " backup |
14 | " NOTE: keep backup files in vim state dir for both vim and neovim | |
afd175d7 | 15 | let y = x.'/backup' |
16 | if !isdirectory(y) | |
17 | call mkdir(y, 'p', 0700) | |
8d4a98e1 | 18 | endif |
afd175d7 | 19 | execute 'set backupdir='.y.'//' |
58a8dbcc | 20 | set backup backupcopy=yes |
afd175d7 | 21 | |
58a8dbcc | 22 | " NOTE: neovim uses ShaDa (SHAred DAta) format for viminfo and swap, and uses a |
39d7f74f | 23 | " different version of undo file, so these types of files when created by |
24 | " vim cannot be used with neovim, and the 'viminfofile', 'directory', and | |
3567d091 | 25 | " 'undodir' directories cannot be shared. since neovim has a nice default |
26 | " for these directories and files, customizing them is not necessary. | |
58a8dbcc | 27 | if !has('nvim') |
39d7f74f | 28 | " viminfo |
58a8dbcc | 29 | execute 'set viminfofile='.x.'/.viminfo' |
30 | ||
39d7f74f | 31 | " swap |
58a8dbcc | 32 | let y = x.'/swap' |
33 | if !isdirectory(y) | |
34 | call mkdir(y, 'p', 0700) | |
35 | endif | |
36 | execute 'set directory='.y.'//' | |
37 | ||
39d7f74f | 38 | " undo |
58a8dbcc | 39 | let y = x.'/undo' |
40 | if !isdirectory(y) | |
41 | call mkdir(y, 'p', 0700) | |
42 | endif | |
43 | execute 'set undodir='.y.'//' | |
8d4a98e1 | 44 | endif |
58a8dbcc | 45 | |
4850f4c2 | 46 | unlet x |
afd175d7 | 47 | unlet y |
1b8a4102 | 48 | |
0bffb4be | 49 | |
39d7f74f | 50 | """ vim-only defaults |
51 | if !has('nvim') | |
52 | " neovim defaults are already set | |
53 | source $VIMRUNTIME/defaults.vim | |
b3b23234 | 54 | |
39d7f74f | 55 | " disable jumping to last edit, we use vim-lastplace instead |
56 | autocmd! vimStartup | |
58a8dbcc | 57 | |
39d7f74f | 58 | " packages |
01aaaf66 | 59 | packadd! matchit " included with [n]vim but disabled by default |
60 | packadd! editorconfig " now included with [n]vim but disabled by default | |
61 | packadd! vim-commentary " nvim has this built in now, vim still needs it | |
39d7f74f | 62 | |
63 | " options | |
64 | set hlsearch | |
65 | autocmd BufRead * set autoindent | |
66 | endif | |
67 | ||
0bffb4be | 68 | |
39d7f74f | 69 | """ styling |
70 | " nice default theme | |
71 | colorscheme murphy | |
72 | ||
73 | " always use color column with less intrusive colors | |
58a8dbcc | 74 | autocmd VimEnter,WinNew * set colorcolumn=80 |
39d7f74f | 75 | " always use cursor line for better visibility |
58a8dbcc | 76 | autocmd VimEnter,WinNew * set cursorline |
58a8dbcc | 77 | |
39d7f74f | 78 | " unique highlighting for leading spaces and in-line spaces |
79 | " NOTE: this leaves tabs and other special whitespace untouched intentionally | |
1ac43be8 | 80 | autocmd VimEnter,ColorScheme * highlight SpaceInner ctermfg=Grey guifg=#686868 |
81 | autocmd VimEnter,ColorScheme * highlight link SpaceOuter NonText | |
82 | autocmd VimEnter,WinNew * match SpaceInner / / | |
83 | autocmd VimEnter,WinNew * 2match SpaceOuter /\(^ \+\)\|\( \+$\)/ | |
39d7f74f | 84 | |
85 | " always show statusline | |
86 | set laststatus=2 | |
87 | ||
88 | " truncate > lastline; lastline is nvim default, sensible.vim may also set it | |
89 | set display=truncate | |
90 | ||
91 | " more context while scrolling | |
92 | set scrolloff=5 | |
93 | set sidescrolloff=8 | |
94 | ||
95 | " show number column on all buffers | |
96 | autocmd VimEnter,WinNew * set number | |
97 | " use relative numbers in normal modes when focused, but not if number is off | |
98 | function! s:SetRelativeNumber(enable) | |
99 | if !getwinvar(winnr(), '&number') | |
100 | return | |
101 | endif | |
102 | if a:enable | |
103 | set relativenumber | |
104 | else | |
105 | set norelativenumber | |
106 | endif | |
107 | endfunction | |
108 | autocmd InsertEnter,FocusLost,WinLeave * call s:SetRelativeNumber(0) | |
109 | autocmd VimEnter,WinNew, | |
110 | \InsertLeave,FocusGained,WinEnter * call s:SetRelativeNumber(1) | |
111 | ||
112 | " always show custom listchars | |
58a8dbcc | 113 | autocmd VimEnter,WinNew * set list |
1b8a4102 | 114 | set listchars=tab:├─,extends:»,precedes:«,space:·,trail:∙,nbsp:■ |
58a8dbcc | 115 | |
0bffb4be | 116 | |
39d7f74f | 117 | """ editor |
118 | " always save undo file for all file buffers | |
01aaaf66 | 119 | autocmd BufReadPre * setlocal undofile |
120 | ||
ec9f2140 | 121 | " explicitly use modeline, even on systems where it's disabled by system vimrc |
6ebc1fca | 122 | autocmd BufRead * set modeline |
ec9f2140 | 123 | " should be default disabled but just in case |
124 | set nomodelineexpr | |
125 | ||
3567d091 | 126 | "" enable editorconfig parsing for new buffers |
127 | let g:EditorConfig_enable_for_new_buf = 1 | |
128 | ||
39d7f74f | 129 | "" indent |
130 | " always use shiftwidth instead of tabsize | |
131 | set smarttab | |
132 | " filetype preferences | |
58a8dbcc | 133 | autocmd FileType python set softtabstop=4 shiftwidth=4 expandtab |
134 | autocmd FileType markdown set softtabstop=4 shiftwidth=4 expandtab | |
135 | autocmd FileType javascript set softtabstop=2 shiftwidth=2 expandtab | |
136 | autocmd FileType json set softtabstop=2 shiftwidth=2 expandtab | |
137 | autocmd FileType html set softtabstop=2 shiftwidth=2 expandtab | |
58a8dbcc | 138 | |
39d7f74f | 139 | "" syntax |
fbdf3d0e | 140 | autocmd Syntax php syn clear phpHereDoc phpNowDoc |
b3b23234 | 141 | |
39d7f74f | 142 | "" mappings |
143 | " use more accessible escapes, as C-n and C-o are shadowed by some terminals | |
b3b23234 | 144 | if has('nvim') |
145 | tnoremap <C-\>n <C-\><C-N> | |
146 | tnoremap <C-\>o <C-\><C-O> | |
147 | endif | |
148 | ||
39d7f74f | 149 | " move windows any time |
b3b23234 | 150 | if has('nvim') |
151 | " terminal | |
152 | tnoremap <A-h> <C-\><C-N><C-w>h | |
153 | tnoremap <A-j> <C-\><C-N><C-w>j | |
154 | tnoremap <A-k> <C-\><C-N><C-w>k | |
155 | tnoremap <A-l> <C-\><C-N><C-w>l | |
156 | endif | |
157 | " insert | |
158 | inoremap <A-h> <C-\><C-N><C-w>h | |
159 | inoremap <A-j> <C-\><C-N><C-w>j | |
160 | inoremap <A-k> <C-\><C-N><C-w>k | |
161 | inoremap <A-l> <C-\><C-N><C-w>l | |
162 | " normal | |
163 | nnoremap <A-h> <C-w>h | |
164 | nnoremap <A-j> <C-w>j | |
165 | nnoremap <A-k> <C-w>k | |
166 | nnoremap <A-l> <C-w>l | |
39d7f74f | 167 | |
168 | "" CTRL-L to clear highlighting and also update diff | |
169 | " NOTE: sensible.vim and nvim already do this, so copy sensible.vim | |
170 | " functionality if it hasn't been set or we aren't nvim. taken from | |
171 | " sensible.vim by Tim Pope, under Vim license; see :help license | |
172 | " https://github.com/tpope/vim-sensible/blob/0ce2d843d6f588bb0c8c7eec6449171615dc56d9/plugin/sensible.vim#L57 | |
173 | if !has('nvim') && maparg('<C-L>', 'n') ==# '' | |
174 | nnoremap <silent> <C-L> :nohlsearch<C-R>=has('diff')?'<Bar>diffupdate':''<CR><CR><C-L> | |
175 | endif | |
8aac59d6 | 176 | |
177 | ||
178 | """ package config | |
179 | "" suda | |
180 | " https://github.com/lambdalisue/vim-suda/issues/32#issuecomment-829608925 | |
181 | if ! &diff | |
182 | let g:suda_smart_edit = 1 | |
183 | endif | |
184 | " re-enable backup, swap, undo for suda buffers that we can read | |
185 | " https://github.com/lambdalisue/vim-suda/issues/25 | |
186 | function s:SudaSettingsSave() | |
6cd24ad1 | 187 | let b:sev_suda_swapfile = &swapfile |
188 | let b:sev_suda_undofile = &undofile | |
b758c100 | 189 | " fix https://github.com/lambdalisue/vim-suda/issues/87 |
190 | setlocal noswapfile | |
8aac59d6 | 191 | endfunction |
192 | function s:SudaSettingsRestore() | |
193 | if filereadable(expand('<afile>')[7:]) | |
6cd24ad1 | 194 | if exists('b:sev_suda_swapfile') && b:sev_suda_swapfile |
b758c100 | 195 | try |
196 | setlocal swapfile | |
197 | catch | |
198 | " ignore swapfile errors, they should have been shown already | |
199 | echohl ErrorMsg | |
200 | for line in split(v:exception, '\n') | |
201 | echomsg printf('[suda] %s', line) | |
202 | endfor | |
203 | echohl None | |
204 | endtry | |
8aac59d6 | 205 | endif |
6cd24ad1 | 206 | if exists('b:sev_suda_undofile') && b:sev_suda_undofile |
8aac59d6 | 207 | setlocal undofile |
208 | endif | |
209 | endif | |
210 | endfunction | |
b758c100 | 211 | function s:SudaProcessUndo(cmd) |
3dc35911 | 212 | let p = expand('<afile>')[7:] |
213 | if has('win32') || !&undofile || !filereadable(p) | |
214 | return | |
215 | endif | |
216 | let p = resolve(p) | |
217 | " XXX: comments are from :help backupdir to mark implementation details | |
218 | let x = &undodir | |
219 | " For backwards compatibility with Vim version 3.0 a '>' at the start | |
220 | " of the option is removed. | |
221 | if stridx(x, '>') == 0 | |
222 | let x = x[1:] | |
223 | endif | |
224 | " To include a comma in a directory name precede it with a backslash. | |
225 | for u in split(x, '\v\\@1<!,') | |
226 | " Spaces after the comma are ignored, other spaces are considered part | |
227 | " of the directory name. | |
228 | let u = trim(u, ' ', 1) | |
229 | " To have a space at the start of a directory name, precede it with a | |
230 | " backslash. | |
231 | if stridx(u, '\ ') == 0 | |
232 | let u = u[1:] | |
233 | endif | |
234 | " Empty means that no backup file will be created. | |
235 | if empty(u) | |
236 | continue | |
237 | elseif u == '.' | |
238 | " A directory "." means to put the backup file in the same | |
239 | " directory as the edited file. | |
240 | let d = fnamemodify(p, ':p:h') | |
241 | elseif stridx(u, './') == 0 | |
242 | " A directory starting with "./" (or ".\" for MS-Windows) means to | |
243 | " put the backup file relative to where the edited file is. | |
244 | let d = printf('%s%s', fnamemodify(p, ':p:h'), expand(u)) | |
245 | else | |
246 | let d = u | |
247 | endif | |
248 | " NOTE: env vars are not expanded, and backslashes are not handled... | |
249 | if u[-2:-1] == '//' | |
250 | let f = fnamemodify(p, ':p:gs?/?%?') | |
251 | else | |
252 | let f = printf('.%s.un~', fnamemodify(p, ':t')) | |
253 | endif | |
254 | " A directory name may end in an '/'. | |
255 | let d = trim(d, '/', 2) | |
256 | if !isdirectory(d) | |
257 | continue | |
258 | endif | |
259 | try | |
b758c100 | 260 | execute printf('%s %s/%s', a:cmd, fnameescape(d), fnameescape(f)) |
3dc35911 | 261 | break |
262 | catch | |
263 | continue | |
264 | endtry | |
265 | endfor | |
266 | endfunction | |
8aac59d6 | 267 | autocmd BufReadPre suda://* call s:SudaSettingsSave() |
268 | autocmd BufReadPost suda://* call s:SudaSettingsRestore() | |
b758c100 | 269 | autocmd BufReadPost suda://* call s:SudaProcessUndo('silent! rundo') |
270 | autocmd BufWritePost suda://* call s:SudaProcessUndo('wundo!') |