. . .
1
2" Plugins
3
4call plug#begin('~/.local/share/nvim/plugged')
5
6" General
7Plug 'preservim/nerdtree'
8Plug 'scrooloose/nerdcommenter'
9Plug 'tmhedberg/SimpylFold'
10Plug 'Maan2003/lsp_lines.nvim'
11
12" fuzzy find
13Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
14Plug 'junegunn/fzf.vim'
15
16" Appearance
17Plug 'vim-airline/vim-airline'
18Plug 'vim-airline/vim-airline-themes'
19Plug 'bluz71/vim-nightfly-colors', { 'as': 'nightfly' }
20Plug 'junegunn/goyo.vim'
21Plug 'junegunn/limelight.vim'
22
23" Web
24Plug 'othree/html5.vim'
25Plug 'pangloss/vim-javascript'
26Plug 'evanleck/vim-svelte', {'branch': 'main'}
27
28" wgsl
29Plug 'DingDean/wgsl.vim'
30
31" Rust
32"Plug 'rust-lang/rust.vim'
33"Plug 'neoclide/coc.nvim', {'branch': 'release'}
34
35call plug#end()
36
37:lua require('autumn')
38
39" Neovide / Plugin Config
40
41if exists("g:neovide")
42 let g:neovide_scale_factor = 1
43 let g:neovide_opacity = 0.7
44 let g:neovide_floating_blur_amount_x = 5.0
45 let g:neovide_floating_blur_amount_y = 5.0
46 let g:neovide_padding_left = 0
47 set linespace=1
48endif
49
50let g:SimpylFold_docstring_preview=1
51
52let g:NERDTreeWinPos = 'right'
53let g:NERDTreeFileLines = 1
54let g:NERDTreeShowHidden = 1
55let g:NERDTreeMinimalUI = 1
56let g:NERDTreeShowBookmarks = 1
57let g:NERDTreeChDirMode = 2
58
59let g:fzf_preview_window = 'right:60%'
60let g:fzf_action = {
61 \ 'ctrl-h': 'vsplit',
62 \ 'ctrl-v': 'split'
63 \ }
64augroup fzf
65 autocmd!
66 autocmd! FileType fzf
67 autocmd FileType fzf set laststatus=0 noshowmode noruler
68 \| autocmd BufLeave <buffer> set laststatus=2 showmode ruler
69augroup END
70
71" General Settings
72
73if exists("g:neovide")
74 " ctrl+scroll & control+0 to adjust scale & reset to default
75 nnoremap <C-ScrollWheelDown> :let g:neovide_scale_factor *= 0.9<return>
76 nnoremap <C-ScrollWheelUp> :let g:neovide_scale_factor *= 1.11111111<return>
77 nnoremap <c-0> :let g:neovide_scale_factor = 1.0<return>
78endif
79
80" theme / appearance
81colorscheme nightfly
82syntax on
83filetype on
84filetype plugin on
85filetype indent on
86set t_Co=256
87set guifont=Source\ Code\ Pro:h10
88set termguicolors
89set number
90set cursorline
91set colorcolumn=95
92" set textwidth=95 annoying automatic line break bullshit
93set signcolumn=yes
94
95" tabbing
96set shiftwidth=4
97set tabstop=4
98set softtabstop=4
99set smartindent
100set expandtab
101
102" make line breaks traversable
103set backspace=indent,eol,start
104set whichwrap+=<,>,h,l
105
106" use system clipboard
107set clipboard=unnamed
108set clipboard+=unnamedplus
109
110" nerd shit / &c
111set encoding=utf-8
112set backupdir=~/.vim/backup
113set directory=~/.vim/swap
114set updatetime=200
115set history=1000
116set backup
117set ruler " column / row number
118set showcmd
119set showmode
120set showmatch
121set hlsearch
122set incsearch
123set wildmenu
124set wildmode=list:longest
125set foldmethod=indent
126set foldlevel=99
127set formatoptions-=ro
128
129" Highlighting
130
131highlight ExtraWhitespace ctermbg=red guibg=red
132highlight OverLength ctermbg=darkred guibg=red
133
134augroup Whitespace
135 autocmd!
136 autocmd VimEnter,WinEnter * call matchadd('ExtraWhitespace', '\s\+$')
137 autocmd VimEnter,WinEnter * call matchadd('OverLength', '\%95v.\+')
138
139 autocmd InsertEnter * call clearmatches()
140 autocmd InsertEnter * call matchadd('ExtraWhitespace', '\s\+\%#\@<!$')
141 autocmd InsertEnter * call matchadd('OverLength', '\%95v.\+')
142
143 autocmd InsertLeave * call clearmatches()
144 autocmd InsertLeave * call matchadd('ExtraWhitespace', '\s\+$')
145 autocmd InsertLeave * call matchadd('OverLength', '\%95v.\+')
146augroup END
147
148:highlight DiagnosticVirtualTextError guifg=red
149:highlight DiagnosticVirtualTextWarn guifg=yellow
150:highlight DiagnosticVirtualTextInfo guifg=white
151:highlight DiagnosticVirtualTextHint guifg=#CCDDFF
152
153" Keymapping
154
155let mapleader = ","
156
157" replace word
158nnoremap <leader>re lbdei
159
160" find & replace
161nnoremap <leader>rr :%s/\<<c-r><c-w>\>//g<left><left>
162
163" word count
164nnoremap <leader>wc g<c-g>
165
166" enter insert mode directly from visual mode
167vnoremap i <esc>i
168" copy from visual mode
169vnoremap <c-c> "+y
170
171" ctrl+f to find files
172nnoremap <c-f> :Files<cr>
173
174" alt+direction to move lines up/down
175nnoremap <silent><m-j> mz:m+<return>`z
176nnoremap <silent><m-k> mz:m-2<return>`z
177" & the same for multiple lines in visual mode
178" no idea how this works, took it from nori's dotfiles (https://nori.gay)
179vnoremap <silent><m-j> :m'>+<return>`<my`>mzgv`yo`z
180vnoremap <silent><m-k> :m'<-2<return>`>my`<mzgv`yo`z
181
182" same as above but for up/down instead of j/k
183nnoremap <silent><m-down> mz:m+<return>`z
184nnoremap <silent><m-up> mz:m-2<return>`z
185vnoremap <silent><m-down> :m'>+<return>`<my`>mzgv`yo`z
186vnoremap <silent><m-up> :m'<-2<return>`>my`<mzgv`yo`z
187
188" ctrl-z as undo, per my muscle memory
189nnoremap <c-z> u
190" +shift for redo
191nnoremap <c-s-z> <c-r>
192
193" undo current insert operation with ctrl-z
194inoremap <c-z> <esc>ui
195" & redo with ctrl-shift-z
196inoremap <c-s-z> <esc><c-r>i
197
198" paste in insert mode
199inoremap <c-v> <esc>:set paste<return>a<c-r>+<esc>:set nopaste<return>a
200" paste in normal mode
201nnoremap <c-v> :set paste<return>i<c-r>+<esc>:set nopaste<return>
202" jj to quickly exit insert
203inoremap jj <esc>l
204inoremap ;; <esc>l
205
206" cycle through completion options
207inoremap <leader><tab> <c-n>
208inoremap <leader><s-tab> <c-p>
209
210
211" navigate to errors
212"nnoremap <leader>er :Semshi goto error<return>:Semshi error<return>
213"nnoremap <leader>rr :Semshi error<return>
214"nnoremap <leader>ss :Semshi toggle<return>
215"nnoremap <leader>re :Semshi rename<return>
216
217" back to previous place
218nnoremap <leader>. ``
219
220" nerdtree - maybe make this a 2-key command instead of 3
221nnoremap <silent><leader>nt :NERDTreeToggle<return>
222
223" some niceties for editing this file
224nnoremap <leader>src :source ~/.config/nvim/init.vim<return>
225nnoremap <leader>erc :e ~/.config/nvim/init.vim<return>
226nnoremap <leader>plug :PlugInstall<return>
227
228" launch a terminal at cwd
229nnoremap <leader>tt :!alacritty &<return><return>
230
231" splits
232nnoremap <leader>hh :vsplit<return><c-w>l
233nnoremap <leader>vv :split<return><c-w>
234
235" folding
236nnoremap <space> za
237
238" insert lines above/below without entering insert mode
239nnoremap o o<esc>
240nnoremap O O<esc>
241
242" center the cursor when jumping between search results
243nnoremap n nzz
244nnoremap N Nzz
245
246" search for tab to clear search results
247nnoremap /<tab> :noh<return>
248
249" shift+direction to move between splits
250nnoremap <s-j> <c-w>j
251nnoremap <s-h> <c-w>h
252nnoremap <s-k> <c-w>k
253nnoremap <s-l> <c-w>l
254
255" ctrl+left/right to hop entire words at a time
256nnoremap <c-l> <c-right>
257nnoremap <c-h> <c-left>
258
259" ctrl+shift+right to hop to end of line
260nnoremap <c-s-l> $
261nnoremap <c-s-right> $
262
263" & similar for hopping to the start
264nnoremap <c-s-h> ^
265nnoremap <c-s-left> ^
266
267" maybe figure out how to make this terminal-mode only; makes ctrl-c work in
268" normal mode
269nnoremap <c-c> i<c-c><esc>
270
271" exit the terminal the same way as exiting insert mode
272tnoremap <esc> <C-\><C-n>
273tnoremap jj <C-\><C-n>
274
275" quick quit
276nnoremap <leader>q :q<return>
277" just close the whole damn editor
278"nnoremap <leader><leader><leader>q :qa!<return>
279
280" ctrl-s to save, normal & insert modes
281nnoremap <C-s> :w<return>
282inoremap <c-s> <esc>:w<return>li
283
284" clean up whitespace
285function! CleanupWhitespace()
286 " remove trailing whitespace
287 %s/\s\+$//ge
288 " ensure file starts with exactly one blank line
289 0put =''
290 " ensure file ends with exactly one blank line
291 $put =''
292 " remove multiple blank lines at start/end
293 %s/\%^\n\+/\r/ge
294 %s/\n\+\%$/\r/ge
295endfunction
296
297"nnoremap spaces :call CleanupWhitespace()<return>
298"nnoremap quotes :%s/'\([^']*\)'/"\1"/g<return>
299
300"function! QuickFixes()
301
302
303
304"endfunction
305
306" Goyo
307nnoremap <silent><leader>zen :Goyo<return>
308
309function! IntoZen()
310 setlocal linebreak
311 :Limelight
312 " navigate by actual position on screen instead of by row/column
313 nnoremap <buffer> j gj
314 nnoremap <buffer> k gk
315 nnoremap <buffer> $ g$
316 nnoremap <buffer> ^ g^
317 " undos break on punctuation
318 inoremap <buffer> . .<c-g>u
319 inoremap <buffer> ! !<c-g>u
320 inoremap <buffer> ? ?<c-g>u
321 inoremap <buffer> , ,<c-g>u
322 inoremap <buffer> ; ;<c-g>u
323 inoremap <buffer> : :<c-g>u
324endfunction
325
326function! ExitZen()
327 setlocal nolinebreak
328 :Limelight!
329 unmap <buffer> j
330 unmap <buffer> k
331 unmap <buffer> $
332 unmap <buffer> ^
333 iunmap <buffer> .
334 iunmap <buffer> !
335 iunmap <buffer> ?
336 iunmap <buffer> ,
337 iunmap <buffer> ;
338 iunmap <buffer> :
339endfunction
340
341autocmd! User GoyoEnter nested call IntoZen()
342autocmd! User GoyoLeave nested call ExitZen()
343
344" CoC
345"inoremap <silent><expr> <TAB>
346" \ coc#pum#visible() ? coc#pum#next(1) :
347" \ CheckBackspace() ? "\<Tab>" :
348" \ coc#refresh()
349"inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"
350
351" Make <CR> to accept selected completion item or notify coc.nvim to format
352" <C-g>u breaks current undo, please make your own choice
353"inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
354 \: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"
355
356"function! CheckBackspace() abort
357" let col = col('.') - 1
358" return !col || getline('.')[col - 1] =~# '\s'
359"endfunction
360
361" Use <c-space> to trigger completion
362"if has('nvim')
363" inoremap <silent><expr> <c-space> coc#refresh()
364"else
365" inoremap <silent><expr> <c-@> coc#refresh()
366"endif
367
368"nmap <silent> gd <Plug>(coc-definition)
369"nmap <silent> gy <Plug>(coc-type-definition)
370"nmap <silent> gi <Plug>(coc-implementation)
371"nmap <silent> gr <Plug>(coc-references)
372
373" show docs in preview window
374"nnoremap <silent> <leader>k :call ShowDocumentation()<CR>
375
376"function! ShowDocumentation()
377" if CocAction('hasProvider', 'hover')
378" call CocActionAsync('doHover')
379" else
380" call feedkeys('K', 'in')
381" endif
382"endfunction
383
384" Highlight the symbol and its references when holding the cursor
385"autocmd CursorHold * silent call CocActionAsync('highlight')
386
387" Symbol renaming
388"nmap <leader><leader>r <Plug>(coc-rename)
389
390
391" Without this line, search results get highlighted whenever I source the file
392:noh
393