aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjdhao <jdhao@hotmail.com>2020-11-24 22:55:39 +0800
committerjdhao <jdhao@hotmail.com>2020-11-24 22:55:39 +0800
commit9a7ac4c9d191117aa86808de8c056338bca1dc09 (patch)
tree42efcb86b31953a037aa365ba9776f3adde7691b
parent3e25d9283e240c5ebfe195d6edd871b5279252eb (diff)
Using jk to escape insert mode without lagging.
See https://jdhao.github.io/2020/11/23/neovim_better_mapping_for_leaving_insert_mode/.
-rw-r--r--autoload/utils.vim30
-rw-r--r--core/mappings.vim2
2 files changed, 31 insertions, 1 deletions
diff --git a/autoload/utils.vim b/autoload/utils.vim
index c0eab5f..4bab8b9 100644
--- a/autoload/utils.vim
+++ b/autoload/utils.vim
@@ -145,3 +145,33 @@ function! utils#Get_titlestr() abort
return l:title_str
endfunction
+
+function! utils#EscapeInsertOrNot() abort
+ " If k is preceded by j, then remove j and go to normal mode.
+ let line_text = getline('.')
+ let cur_ch_idx = utils#CursorCharIdx()
+ let pre_char = utils#CharAtIdx(line_text, cur_ch_idx-1)
+ if pre_char ==# 'j'
+ return "\<BS>\<ESC>"
+ else
+ return 'k'
+ endif
+endfunction
+
+function! utils#CharAtIdx(str, idx) abort
+ " Get char at idx from str. Note that this is based on character index
+ " instead of the byte index.
+ return strcharpart(a:str, a:idx, 1)
+endfunction
+
+function! utils#CursorCharIdx() abort
+ " See https://vi.stackexchange.com/a/28144/15292
+ " A more concise way to get character index under cursor.
+ let cursor_byte_idx = col('.')
+ if cursor_byte_idx == 1
+ return 0
+ endif
+
+ let pre_cursor_text = getline('.')[:col('.')-2]
+ return strchars(pre_cursor_text)
+endfunction
diff --git a/core/mappings.vim b/core/mappings.vim
index abcd18c..ee51d53 100644
--- a/core/mappings.vim
+++ b/core/mappings.vim
@@ -9,7 +9,7 @@ xnoremap ; :
nnoremap q; q:
" Quicker <Esc> in insert mode
-inoremap jk <Esc>
+inoremap <expr> k utils#EscapeInsertOrNot()
" Turn the word under cursor to upper case
inoremap <c-u> <Esc>viwUea