aboutsummaryrefslogtreecommitdiff
path: root/.vim/vimrc
blob: ce034e969193dbb0221f5784a773d6a35f4edc9b (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
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
"===============================================================================
"                          Mappings/Keybindings/Commands
"===============================================================================

let mapleader = ";" " map leader to Semi colon

inoremap jk <Esc> " Use <jk> to escape

" Easier split navigations, just ctrl-j instead of ctrl-w then j
nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>

" Recent files (MRU)
nnoremap <leader>m :browse old<cr>
" Search files by name
"nnoremap <leader>p :find **/**<left>
" browse files from same dir as current file
nnoremap <leader>e :e %:p:h<CR>

" Combine buffers list with buffer name
"nnoremap <Leader>b :buffers<CR>:buffer<Space>

" Jump to a buffer
nnoremap <leader>b :ls t<cr>:b

" Map buffer next, prev and delete to <leader+(n/p/d)>
map <leader>n :bn<cr>
map <leader>p :bp<cr>
map <leader>d :bd<cr>

" tab navigation
noremap <C-t>h :tabprevious<CR>
noremap <C-t>l :tabnext<CR>
noremap <C-t>k :tabfirst<CR>
noremap <C-t>j :tablast<CR>
noremap <C-t>n :tabnew<CR>
noremap <C-t>e :tabedit<Space>
noremap <C-t>c :tabclose<CR>
noremap <C-t>m :tabm<Space>

" Swap two pieces of text, use x to cut in visual mode, then use Ctrl-x in
" visual mode to select text to swap with
:vnoremap <C-X> <Esc>`.``gvP``P

" To resize in different steps, you can create maps that will adjust the window
" size differently. For example to increase the window size by a factor of 1.5
" and decrease the window size by 0.67, you can map this:
"nnoremap <silent> <Leader>+ :exe "resize " . (winheight(0) * 3/2)<CR>
"nnoremap <silent> <Leader>- :exe "resize " . (winheight(0) * 2/3)<CR>
nnoremap <Leader>+ :resize +5<CR>
nnoremap <Leader>- :resize -5<CR>
nnoremap <Leader>> :vertical resize +5<CR>
nnoremap <Leader>< :vertical resize -5<CR>

" Toggle set number
"nnoremap <leader>$ :NumbersToggle<CR>
"nnoremap <leader>% :NumbersOnOff<CR>

" Copy and Paste with <C-c> and <C-v>
"vmap <C-c> y:call system("xclip -i -selection clipboard", getreg("\""))<CR>:call system("xclip -i", getreg("\""))<CR>
"nmap <C-v> :call setreg("\"",system("xclip -o -selection clipboard"))<CR>p
nnoremap <expr> p (v:register == '"' && &clipboard =~ 'unnamed' ? '"*p' : '"' . v:register . 'p')

" Use command :Vb for Visual Block or <C-q> since <C-v> is used for Copy
command! Vb normal! <C-v>

" Map <w!!> to save/edit a root permission/read-only file, only works in
" traditional vim and not neovim
cmap w!! %!sudo tee > /dev/null

nnoremap <leader>x :silent !chmod +x %<CR>

"nnoremap <[-p> m`o<ESC>p``
" Paste on next line
"nnoremap <]-p> m`O<ESC>p``

"inoremap <C-CR> <C-R>"
"set keywordprg=:help
"runtime ftplugin/man.vim


"===============================================================================
"                                    Settings
"===============================================================================

" Neovim requires xclip, check if normal vim has +clipboard by
" <:echo has('clipboard')> from within Vim (if the output is 1, good to
" go otherwise 0 then need a build that has it
" Next two commands make vim use X11 clipboard
set clipboard+=unnamedplus
let g:clipbrdDefaultReg = '+'

"let g:loaded_clipboard_provider = 1
" <:e %:h/filename> will create a new file named filename in the same
" directory as the currently open file, and write it.
set autochdir " or use this to use <:e> to create a file in current directory
set splitright " make vsplit put the new buffer on the right of the current buffer
set splitbelow " make split put the new buffer below the current buffer
" :Bclose script (delete a buffer without closing the window) sourced as a
" plugin in ~/.config/nvim/plugin/bclose.vim | keymap: <leader>bd
"let bclose_multiple = 1
"set syntax
" Compute syntax highlighting from beginning of file. (By default, vim only
" looks 200 lines back, which can make it highlight code incorrectly in some
" long files.)
autocmd BufEnter * :syntax sync fromstart
" Don't syntax highlight markdown because it's often wrong
autocmd! FileType mkd setlocal syn=off
set ttyfast
set lazyredraw
" Set lazyredraw to false
"let &lazyredraw = 0
set timeout timeoutlen=1000 ttimeoutlen=100 " fix slow O inserts
set scrolloff=8 sidescrolloff=8
set tabstop=4 softtabstop=4 shiftwidth=4 expandtab
set autoindent
set smartindent
" Also load indent files, to automatically do language-dependent indenting.
filetype plugin indent on
set exrc
set relativenumber
set hidden
set noerrorbells
set nowrap
set ignorecase
set smartcase
set noswapfile
set nobackup
set incsearch
"set cursorline
set showmatch
set showcmd
set incsearch
set hlsearch
set laststatus=2
let g:python3_host_prog = '/usr/bin/python3'
"let g:loaded_python3_provider = 1
let g:sh_noisk=1
set modeline
set modelines=3 " modelines (comments that set vim options on a per-file basis)
set foldmethod=manual
set nofoldenable " turn folding off
" Insert only one space when joining lines that contain sentence-terminating
" punctuation like `.`.
set nojoinspaces
set autoread " if a file is changed outside of vim, automatically reload it without asking
set diffopt=vertical " diffs are shown side-by-side not above/below
set signcolumn=no " always show the sign column
set textwidth=80
set mouse=a

" FILE BROWSING:
let g:netrw_banner=0        " disable annoying banner
let g:netrw_browse_split=4  " open in prior window
let g:netrw_altv=1          " open splits to the right
let g:netrw_liststyle=3     " tree view
let g:netrw_fastbrowse = 0
autocmd FileType netrw setl bufhidden=wipe

" Faster vimgrep/grep via ripgrep
if executable("rg")
  set grepprg=rg\ --vimgrep\ --no-heading
  set grepformat=%f:%l:%c:%m,%f:%l:%m
endif


"===============================================================================
"                                  Colorscheme
"===============================================================================

" enable syntax, plugins (for netrw) and indentation
syntax enable

"set shell=zsh
set termguicolors
set guicursor=
let &t_SI = "\e[6 q"
let &t_EI = "\e[2 q"

"colorscheme desert
"colorscheme city-lights
set background=dark
highlight Normal guibg=NONE ctermbg=NONE
highlight EndOfBuffer ctermfg=NONE ctermbg=NONE


"-------------------------------------------------------------------------------


"===============================================================================
"                               Functions/Scripts
"===============================================================================

" Enable mouse scrollback
"---------------------------------------
set mouse=a
tnoremap <Esc> <C-\><C-n>
tnoremap <c-b> <c-\><c-n>
function! ClearTerminal()
    set scrollback=1
    let &g:scrollback=1
    echo &scrollback
    call feedkeys("\i")
    call feedkeys("clear\<CR>")
    call feedkeys("\<C-\>\<C-n>")
    call feedkeys("\i")
    sleep 100m
    let &scrollback=s:scroll_value
endfunction

"-------------------------------------------------------------------------------

" :Rename {newname}
"---------------------------------------
function! RenameFile()
    let old_name = expand('%')
    let new_name = input('New file name: ', expand('%'), 'file')
    if new_name != '' && new_name != old_name
        exec ':saveas ' . new_name
        exec ':silent !rm ' . old_name
        redraw!
    endif
endfunction
map <leader>r :call RenameFile()<cr>

"-------------------------------------------------------------------------------

" Return to the same line when we reopen a file
"---------------------------------------
  augroup line_return
      au!
      au BufReadPost *
          \ if line("'\"") > 0 && line("'\"") <= line("$") |
          \     execute 'normal! g`"zvzz' |
          \ endif
  augroup END

"-------------------------------------------------------------------------------
"
" Function to update tmux status and .vi-mode file
"---------------------------------------
function! UpdateTmuxStatus() abort
  " Check if the current buffer has a man filetype
  if &filetype ==# 'man'
    return
  endif

  " Determine the mode name based on the mode value
  let mode = mode()
  let mode_name = ''
  if mode ==# 'n'
    let mode_name = '-- NORMAL --'
  elseif mode ==# 'i' || mode ==# 'ic'
    let mode_name = '-- INSERT --'
  else
    let mode_name = '-- NORMAL --'
  endif

  " Write the mode name to the file
  call writefile([mode_name], expand('$HOME') . '/.vi-mode')

endfunction

" Function to refresh tmux status
function! s:UpdateTmux() abort
  call system('tmux refresh-client -S')
endfunction

" Set up autocommands for tmux status update
if !empty($TMUX) && system('command -v tmux >/dev/null 2>&1') == 0
augroup TmuxStatus
  autocmd!
  autocmd ModeChanged * call UpdateTmuxStatus() | call s:UpdateTmux()
augroup END
endif

"-------------------------------------------------------------------------------


"===============================================================================
"                          Statusline Configuration
"===============================================================================

" Autoload statusline
"---------------------------------------
" Load statusline script
if filereadable(expand("~/.vim/autoload/statusline.vim"))
    source ~/.vim/autoload/statusline.vim
endif

" Call the statusline activation function
call autoload#statusline#ActivateStatusline()

"-------------------------------------------------------------------------------