summaryrefslogtreecommitdiff
path: root/.vim/mappings.vim
blob: 406c1129322ef3b359bdc8da4cf98d2841e1d3a1 (plain) (blame)
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
" Ctrl-C, Ctrl-V, ... {{{
	" Partly taken from: https://gist.github.com/jshih/3423345
	inoremap <C-S> <C-O>:w<CR>
	inoremap <C-V> <C-R>+
	inoremap <C-A> <Esc>ggVG
	inoremap <C-R> <C-O><C-r>
	inoremap <C-U> <C-O>u

	nnoremap <C-S> :w<CR>
	nnoremap <C-A> ggVG

	xnoremap <C-V> c<C-R>+
	xnoremap <C-A> ggVG
	xnoremap <C-C> "+y
	xnoremap <C-X> "+d
" }}}

" Move lines with Alt-J, Alt-K {{{
	execute "set <M-j>=\ej"
	nnoremap <M-j> <ESC>:m+1<CR>
	execute "set <M-k>=\ek"
	nnoremap <M-k> <ESC>:m-2<CR>

	xnoremap <A-j> :m '>+1<CR>gv=gv
	xnoremap <A-k> :m '<-2<CR>gv=gv
" }}}

" Omni completion (really needs a rework) {{{
	" Omni completion supports C, HTML, CSS, JavaScript, PHP, Python, Ruby, SQL, XML
	set omnifunc=syntaxcomplete#Complete " Completion for all supported languages
	
	" Do omni completion from Ctrl+Space
	inoremap <C-@> <C-X><C-O>
	
	" Thanks to: https://vim.fandom.com/wiki/Make_Vim_completion_popup_menu_work_just_like_in_an_IDE
	" set completeopt=longest,menuone
	" [ The following are disabled, because they conflict with delimitMate's autobracket feature ]
	" inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
	" inoremap <expr> <C-n> pumvisible() ? '<C-n>' : '<C-n><C-r>=pumvisible() ? "\<lt>Down>" : ""<CR>'

	" "Disables" arrow navigation in completion menu
	inoremap <expr> <up> pumvisible() ? '<c-y><up>' : '<up>'
	inoremap <expr> <down> pumvisible() ? '<c-y><down>' : '<down>'

	" Pressing tab goes from top to bottom
	let g:SuperTabContextDefaultCompletionType = "<c-n>"
" }}}

" When line is wrapped, going up or down will also go into the wrapped part
" move in wrapped lines when no count prefix
nnoremap <expr> k (v:count == 0 ? 'gk' : 'k')
xnoremap <expr> k (v:count == 0 ? 'gk' : 'k')
nnoremap <expr> j (v:count == 0 ? 'gj' : 'j')
xnoremap <expr> j (v:count == 0 ? 'gj' : 'j')

" Don't move cursor one character back on esc key press
" inoremap <silent> <Esc> <C-O>:stopinsert<CR>

" Don't get into insert mode after adding a line with o/O
" nnoremap o o<Esc>
" nnoremap O O<Esc>

" Thanks https://github.com/drzel/vim-split-line
nnoremap K :keep s/\s*\%#\s*/\r/e <bar> noh<CR>

" Better resizing when navigating splits
nnoremap <C-L> <C-W>l<C-W>=
nnoremap <C-H> <C-W>h<C-W>=
nnoremap <C-J> <C-W>j<C-W>=
nnoremap <C-K> <C-W>k<C-W>=
tnoremap <C-L> <C-W>l<C-W>=
tnoremap <C-H> <C-W>h<C-W>=
tnoremap <C-J> <C-W>j<C-W>=
tnoremap <C-K> <C-W>k<C-W>=

" Ctrl-Backspace deletes the previous word in insert mode.
inoremap <C-h>  <C-w>
cnoremap <C-h>  <C-w>
inoremap <C-BS> <C-w>
cnoremap <C-BS> <C-w>

" Make session file
nnoremap <F1> <ESC>:mksession! .vim-session<CR>

" Show who edited the current line from git history
nnoremap <F8> :<C-u>call gitblame#echo()<CR>

" Open lazygit in a new tab with =
nnoremap <silent> \| :tab ter ++close lazygit<CR>

" Tab navigtion
execute "set <M-o>=\eo"
nnoremap <M-o> gT
inoremap <M-o> <C-O>gT
tnoremap <M-o> <C-W>gT
execute "set <M-p>=\ep"
nnoremap <M-p> gt
inoremap <M-p> <C-O>gt
tnoremap <M-p> <C-W>gt

" Arrows = bad
inoremap <Up> <Nop>
inoremap <Down> <Nop>
inoremap <Left> <Nop>
inoremap <Right> <Nop>
nnoremap <Up> <Nop>
nnoremap <Down> <Nop>
nnoremap <Left> <Nop>
nnoremap <Right> <Nop>

" Cyrillic (Bulgarian yawerty layout) support
ca в w
ca ва wa
ca ь x
ca ьа xa

" Make x and xa just save and quit without saving. This allows for closing all tabs and terminals.
ca x  w <bar> q!
ca xa wa <bar> qa!

" Open a terminal vim tab with tt and open a blank tab with te
ca tt tab ter
ca te tabe