" Make more like emacs cnoremap <C-A> <Home> cnoremap <C-B> <Left> cnoremap <C-F> <Right> cnoremap <C-P> <Up> cnoremap <C-N> <Down> cnoremap <M-r> <C-F>? " Maps to old shortcuts using Ctrl-O as a prefix cnoremap <C-O><C-A> <C-A> cnoremap <C-O><C-E> <C-E> cnoremap <C-O><C-B> <C-B> cnoremap <C-O><C-F> <C-F> cnoremap <C-O><C-P> <C-P> cnoremap <C-O><C-D> <C-D> cnoremap <C-O><C-K> <C-K> cnoremap <C-O><C-U> <C-U> cnoremap <C-O><C-W> <C-W> cnoremap <C-O><C-Y> <C-Y> cnoremap <C-O><C-Z> <C-Z> cnoremap <C-O><C-_> <C-_> cnoremap <C-O><C-X><C-U> <C-X><C-U> cnoremap <C-O><Del> <Del> cnoremap <C-O><BS> <BS> " This piece is from rsi.vim by Tim Pope noremap! <expr> <SID>transposition getcmdpos()>strlen(getcmdline())?"\<Left>":getcmdpos()>1?'':"\<Right>" noremap! <expr> <SID>transpose "\<BS>\<Right>".matchstr(getcmdline()[0 : getcmdpos()-2], '.$') cmap <script> <C-T> <SID>transposition<SID>transpose cnoremap <M-f> <C-\>e<SID>ForwardWord()<CR> function! <SID>ForwardWord() let l:loc = strpart(getcmdline(), 0, getcmdpos() - 1) let l:roc = strpart(getcmdline(), getcmdpos() - 1) if (l:roc =~ '\v^\s*\w') let l:rem = matchstr(l:roc, '\v^\s*\w+') elseif (l:roc =~ '\v^\s*[^[:alnum:]_[:blank:]]') let l:rem = matchstr(l:roc, '\v^\s*[^[:alnum:]_[:blank:]]+') else call setcmdpos(strlen(getcmdline()) + 1) return getcmdline() endif call setcmdpos(strlen(l:loc) + strlen(l:rem) + 1) return getcmdline() endfunction cnoremap <M-b> <C-\>e<SID>BackwardWord()<CR> function! <SID>BackwardWord() let l:loc = strpart(getcmdline(), 0, getcmdpos() - 1) let l:roc = strpart(getcmdline(), getcmdpos() - 1) if (l:loc =~ '\v\w\s*$') let l:rem = matchstr(l:loc, '\v\w+\s*$') elseif (l:loc =~ '\v[^[:alnum:]_[:blank:]]\s*$') let l:rem = matchstr(l:loc, '\v[^[:alnum:]_[:blank:]]+\s*$') else call setcmdpos(1) return getcmdline() endif let @c = l:rem call setcmdpos(strlen(l:loc) - strlen(l:rem) + 1) return getcmdline() endfunction cnoremap <Del> <C-\>e<SID>DeleteChar()<CR> cmap <C-D> <Del> function! <SID>DeleteChar() call <SID>saveUndoHistory(getcmdline(), getcmdpos()) let l:cmd = getcmdline() " Get length of character to be deleted (in bytes) let l:charlen = strlen(substitute(strpart(l:cmd, getcmdpos() - 1), '^\(.\).*', '\1', '')) let l:rem = strpart(l:cmd, getcmdpos() - 1, l:charlen) if ('' != l:rem) let @c = l:rem endif let l:ret = strpart(l:cmd, 0, getcmdpos() - 1) . strpart(l:cmd, getcmdpos() + l:charlen - 1) call <SID>saveUndoHistory(l:ret, getcmdpos()) return l:ret endfunction cnoremap <BS> <C-\>e<SID>BackwardDeleteChar()<CR> cmap <C-H> <BS> function! <SID>BackwardDeleteChar() call <SID>saveUndoHistory(getcmdline(), getcmdpos()) if (getcmdpos() < 2) return getcmdline() endif let l:cmd = getcmdline() " Get length of character to be deleted (in bytes) let l:charlen = strlen(substitute(strpart(l:cmd, 0, getcmdpos() - 1), '.*\(.\)$', '\1', '')) let l:pos = getcmdpos() - l:charlen let l:rem = strpart(l:cmd, getcmdpos() - l:charlen - 1, l:charlen) let @c = l:rem let l:ret = strpart(l:cmd, 0, l:pos - 1) . strpart(l:cmd, getcmdpos() - 1) call <SID>saveUndoHistory(l:ret, l:pos) call setcmdpos(l:pos) return l:ret endfunction cnoremap <C-K> <C-\>e<SID>KillLine()<CR> function! <SID>KillLine() call <SID>saveUndoHistory(getcmdline(), getcmdpos()) let l:cmd = getcmdline() let l:rem = strpart(l:cmd, getcmdpos() - 1) if ('' != l:rem) let @c = l:rem endif let l:ret = strpart(l:cmd, 0, getcmdpos() - 1) call <SID>saveUndoHistory(l:ret, getcmdpos()) return l:ret endfunction cnoremap <C-U> <C-\>e<SID>BackwardKillLine()<CR> function! <SID>BackwardKillLine() call <SID>saveUndoHistory(getcmdline(), getcmdpos()) let l:cmd = getcmdline() let l:rem = strpart(l:cmd, 0, getcmdpos() - 1) if ('' != l:rem) let @c = l:rem endif let l:ret = strpart(l:cmd, getcmdpos() - 1) call <SID>saveUndoHistory(l:ret, 1) call setcmdpos(1) return l:ret endfunction cnoremap <M-d> <C-\>e<SID>KillWord()<CR> function! <SID>KillWord() call <SID>saveUndoHistory(getcmdline(), getcmdpos()) let l:loc = strpart(getcmdline(), 0, getcmdpos() - 1) let l:roc = strpart(getcmdline(), getcmdpos() - 1) if (l:roc =~ '\v^\s*\w') let l:rem = matchstr(l:roc, '\v^\s*\w+') elseif (l:roc =~ '\v^\s*[^[:alnum:]_[:blank:]]') let l:rem = matchstr(l:roc, '\v^\s*[^[:alnum:]_[:blank:]]+') elseif (l:roc =~ '\v^\s+$') let @c = l:roc return l:loc else return getcmdline() endif let @c = l:rem let l:ret = l:loc . strpart(l:roc, strlen(l:rem)) call <SID>saveUndoHistory(l:ret, getcmdpos()) return l:ret endfunction cnoremap <M-BS> <C-\>e<SID>BackwardKillWord()<CR> function! <SID>BackwardKillWord() " Do same as in-built Ctrl-W, except assign deleted text to @c call <SID>saveUndoHistory(getcmdline(), getcmdpos()) let l:loc = strpart(getcmdline(), 0, getcmdpos() - 1) let l:roc = strpart(getcmdline(), getcmdpos() - 1) if (l:loc =~ '\v\w\s*$') let l:rem = matchstr(l:loc, '\v\w+\s*$') elseif (l:loc =~ '\v[^[:alnum:]_[:blank:]]\s*$') let l:rem = matchstr(l:loc, '\v[^[:alnum:]_[:blank:]]+\s*$') elseif (l:loc =~ '\v^\s+$') let @c = l:loc call setcmdpos(1) return l:roc else return getcmdline() endif let @c = l:rem let l:pos = getcmdpos() - strlen(l:rem) let l:ret = strpart(l:loc, 0, strlen(l:loc) - strlen(l:rem)) . l:roc call <SID>saveUndoHistory(l:ret, l:pos) call setcmdpos(l:pos) return l:ret endfunction cnoremap <C-Y> <C-\>e<SID>Yank()<CR> function! <SID>Yank() let l:cmd = getcmdline() call setcmdpos(getcmdpos() + strlen(@c)) return strpart(l:cmd, 0, getcmdpos() - 1) . @c . strpart(l:cmd, getcmdpos() - 1) endfunction cnoremap <C-Z> <C-\>e<SID>ToggleExternalCommand()<CR> function! <SID>ToggleExternalCommand() let l:cmd = getcmdline() if ('!' == strpart(l:cmd, 0, 1)) call setcmdpos(getcmdpos() - 1) return strpart(l:cmd, 1) else call setcmdpos(getcmdpos() + 1) return '!' . l:cmd endif endfunction let s:oldcmdline = [ ] function! <SID>saveUndoHistory(cmdline, cmdpos) if len(s:oldcmdline) == 0 || a:cmdline != s:oldcmdline[0][0] call insert(s:oldcmdline, [ a:cmdline, a:cmdpos ], 0) else let s:oldcmdline[0][1] = a:cmdpos endif if len(s:oldcmdline) > 100 call remove(s:oldcmdline, 100) endif endfunction cnoremap <C-_> <C-\>e<SID>Undo()<CR> cmap <C-X><C-U> <C-_> function! <SID>Undo() if len(s:oldcmdline) == 0 return getcmdline() endif if getcmdline() == s:oldcmdline[0][0] call remove(s:oldcmdline, 0) if len(s:oldcmdline) == 0 return getcmdline() endif endif let l:ret = s:oldcmdline[0][0] call setcmdpos(s:oldcmdline[0][1]) call remove(s:oldcmdline, 0) return l:ret endfunction if !has("gui_running") silent! exe "set <F31>=\<Esc>r" silent! exe "set <F32>=\<Esc>f" silent! exe "set <F33>=\<Esc>b" silent! exe "set <F34>=\<Esc>d" silent! exe "set <F35>=\<Esc>\<C-?>" silent! exe "set <F36>=\<Esc>\<C-H>" map! <F31> <M-r> map! <F32> <M-f> map! <F33> <M-b> map! <F34> <M-d> map! <F35> <M-BS> map! <F36> <M-BS> map <F31> <M-r> map <F32> <M-f> map <F33> <M-b> map <F34> <M-d> map <F35> <M-BS> map <F36> <M-BS> endif