. . .
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 signcolumn=yes
92
93" tabbing
94set shiftwidth=4
95set tabstop=4
96set softtabstop=4
97set smartindent
98set expandtab
99
100" make line breaks traversable
101set backspace=indent,eol,start
102set whichwrap+=<,>,h,l
103
104" use system clipboard
105set clipboard=unnamed
106set clipboard+=unnamedplus
107
108" nerd shit / &c
109set encoding=utf-8
110set backupdir=~/.vim/backup
111set directory=~/.vim/swap
112set updatetime=200
113set history=1000
114set backup
115set ruler " column / row number
116set showcmd
117set showmode
118set showmatch
119set hlsearch
120set incsearch
121set wildmenu
122set wildmode=list:longest
123set foldmethod=indent
124set foldlevel=99
125
126" Highlighting
127
128" highlight spaces at end of line (when not in insert mode)
129:highlight ExtraWhitespace ctermbg=red guibg=red
130:match ExtraWhitespace /\s\+\%#\@<!$/
131:au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
132:au InsertLeave * match ExtraWhitespace /\s\+$/
133
134:highlight DiagnosticVirtualTextError guifg=red
135:highlight DiagnosticVirtualTextWarn guifg=yellow
136:highlight DiagnosticVirtualTextInfo guifg=white
137:highlight DiagnosticVirtualTextHint guifg=#CCDDFF
138
139" Keymapping
140
141let mapleader = ","
142
143" replace word
144nnoremap <leader>re lbdei
145
146" find & replace
147nnoremap <leader>rr :%s/\<<c-r><c-w>\>//g<left><left>
148
149" word count
150nnoremap <leader>wc g<c-g>
151
152" enter insert mode directly from visual mode
153vnoremap i <esc>i
154" copy from visual mode
155vnoremap <c-c> "+y
156
157" ctrl+f to find files
158nnoremap <c-f> :Files<cr>
159
160" alt+direction to move lines up/down
161nnoremap <silent><m-j> mz:m+<return>`z
162nnoremap <silent><m-k> mz:m-2<return>`z
163" & the same for multiple lines in visual mode
164" no idea how this works, took it from nori's dotfiles (https://nori.gay)
165vnoremap <silent><m-j> :m'>+<return>`<my`>mzgv`yo`z
166vnoremap <silent><m-k> :m'<-2<return>`>my`<mzgv`yo`z
167
168" same as above but for up/down instead of j/k
169nnoremap <silent><m-down> mz:m+<return>`z
170nnoremap <silent><m-up> mz:m-2<return>`z
171vnoremap <silent><m-down> :m'>+<return>`<my`>mzgv`yo`z
172vnoremap <silent><m-up> :m'<-2<return>`>my`<mzgv`yo`z
173
174" ctrl-z as undo, per my muscle memory
175nnoremap <c-z> u
176" +shift for redo
177nnoremap <c-s-z> <c-r>
178
179" undo current insert operation with ctrl-z
180inoremap <c-z> <esc>ui
181" & redo with ctrl-shift-z
182inoremap <c-s-z> <esc><c-r>i
183
184" paste in insert mode
185inoremap <c-v> <esc>:set paste<return>a<c-r>+<esc>:set nopaste<return>a
186" paste in normal mode
187nnoremap <c-v> :set paste<return>i<c-r>+<esc>:set nopaste<return>
188" jj to quickly exit insert
189inoremap jj <esc>l
190inoremap ;; <esc>l
191
192" cycle through completion options
193inoremap <leader><tab> <c-n>
194inoremap <leader><s-tab> <c-p>
195
196
197" navigate to errors
198"nnoremap <leader>er :Semshi goto error<return>:Semshi error<return>
199"nnoremap <leader>rr :Semshi error<return>
200"nnoremap <leader>ss :Semshi toggle<return>
201"nnoremap <leader>re :Semshi rename<return>
202
203" back to previous place
204nnoremap <leader>. ``
205
206" nerdtree - maybe make this a 2-key command instead of 3
207nnoremap <silent><leader>nt :NERDTreeToggle<return>
208
209" some niceties for editing this file
210nnoremap <leader>src :source ~/.config/nvim/init.vim<return>
211nnoremap <leader>erc :e ~/.config/nvim/init.vim<return>
212nnoremap <leader>plug :PlugInstall<return>
213
214" launch a terminal at cwd
215nnoremap <leader>tt :!alacritty &<return><return>
216
217" splits
218nnoremap <leader>hh :vsplit<return><c-w>l
219nnoremap <leader>vv :split<return><c-w>
220
221" folding
222nnoremap <space> za
223
224" insert lines above/below without entering insert mode
225nnoremap o o<esc>
226nnoremap O O<esc>
227
228" center the cursor when jumping between search results
229nnoremap n nzz
230nnoremap N Nzz
231
232" search for tab to clear search results
233nnoremap /<tab> :noh<return>
234
235" shift+direction to move between splits
236nnoremap <s-j> <c-w>j
237nnoremap <s-h> <c-w>h
238nnoremap <s-k> <c-w>k
239nnoremap <s-l> <c-w>l
240
241" ctrl+left/right to hop entire words at a time
242nnoremap <c-l> <c-right>
243nnoremap <c-h> <c-left>
244
245" ctrl+shift+right to hop to end of line
246nnoremap <c-s-l> $
247nnoremap <c-s-right> $
248
249" & similar for hopping to the start
250nnoremap <c-s-h> ^
251nnoremap <c-s-left> ^
252
253" maybe figure out how to make this terminal-mode only; makes ctrl-c work in
254" normal mode
255nnoremap <c-c> i<c-c><esc>
256
257" exit the terminal the same way as exiting insert mode
258tnoremap <esc> <C-\><C-n>
259tnoremap jj <C-\><C-n>
260
261" quick quit
262nnoremap <leader>q :q<return>
263" just close the whole damn editor
264"nnoremap <leader><leader><leader>q :qa!<return>
265
266" ctrl-s to save, normal & insert modes
267nnoremap <C-s> :w<return>
268inoremap <c-s> <esc>:w<return>li
269
270" clean up whitespace
271function! CleanupWhitespace()
272 " remove trailing whitespace
273 %s/\s\+$//ge
274 " ensure file starts with exactly one blank line
275 0put =''
276 " ensure file ends with exactly one blank line
277 $put =''
278 " remove multiple blank lines at start/end
279 %s/\%^\n\+/\r/ge
280 %s/\n\+\%$/\r/ge
281endfunction
282
283"nnoremap spaces :call CleanupWhitespace()<return>
284"nnoremap quotes :%s/'\([^']*\)'/"\1"/g<return>
285
286"function! QuickFixes()
287
288
289
290"endfunction
291
292" Goyo
293nnoremap <silent><leader>zen :Goyo<return>
294
295function! IntoZen()
296 setlocal linebreak
297 :Limelight
298 " navigate by actual position on screen instead of by row/column
299 nnoremap <buffer> j gj
300 nnoremap <buffer> k gk
301 nnoremap <buffer> $ g$
302 nnoremap <buffer> ^ g^
303 " undos break on punctuation
304 inoremap <buffer> . .<c-g>u
305 inoremap <buffer> ! !<c-g>u
306 inoremap <buffer> ? ?<c-g>u
307 inoremap <buffer> , ,<c-g>u
308 inoremap <buffer> ; ;<c-g>u
309 inoremap <buffer> : :<c-g>u
310endfunction
311
312function! ExitZen()
313 setlocal nolinebreak
314 :Limelight!
315 unmap <buffer> j
316 unmap <buffer> k
317 unmap <buffer> $
318 unmap <buffer> ^
319 iunmap <buffer> .
320 iunmap <buffer> !
321 iunmap <buffer> ?
322 iunmap <buffer> ,
323 iunmap <buffer> ;
324 iunmap <buffer> :
325endfunction
326
327autocmd! User GoyoEnter nested call IntoZen()
328autocmd! User GoyoLeave nested call ExitZen()
329
330" CoC
331"inoremap <silent><expr> <TAB>
332" \ coc#pum#visible() ? coc#pum#next(1) :
333" \ CheckBackspace() ? "\<Tab>" :
334" \ coc#refresh()
335"inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"
336
337" Make <CR> to accept selected completion item or notify coc.nvim to format
338" <C-g>u breaks current undo, please make your own choice
339"inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
340 \: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"
341
342"function! CheckBackspace() abort
343" let col = col('.') - 1
344" return !col || getline('.')[col - 1] =~# '\s'
345"endfunction
346
347" Use <c-space> to trigger completion
348"if has('nvim')
349" inoremap <silent><expr> <c-space> coc#refresh()
350"else
351" inoremap <silent><expr> <c-@> coc#refresh()
352"endif
353
354"nmap <silent> gd <Plug>(coc-definition)
355"nmap <silent> gy <Plug>(coc-type-definition)
356"nmap <silent> gi <Plug>(coc-implementation)
357"nmap <silent> gr <Plug>(coc-references)
358
359" show docs in preview window
360"nnoremap <silent> <leader>k :call ShowDocumentation()<CR>
361
362"function! ShowDocumentation()
363" if CocAction('hasProvider', 'hover')
364" call CocActionAsync('doHover')
365" else
366" call feedkeys('K', 'in')
367" endif
368"endfunction
369
370" Highlight the symbol and its references when holding the cursor
371"autocmd CursorHold * silent call CocActionAsync('highlight')
372
373" Symbol renaming
374"nmap <leader><leader>r <Plug>(coc-rename)
375
376
377" Without this line, search results get highlighted whenever I source the file
378:noh
379