我最近开始使用vim,但我错过了其他文本编辑器中的字符/行选择方法。默认情况下,vim将<S-Up>
、<S-Down>
映射为向上/向下跳一页,我想将它们重新映射为文本选择。
有办法做到这一点吗?
我用插入模式的完成了@scrafford映射
" shift+arrow selection
nmap <S-Up> v<Up>
nmap <S-Down> v<Down>
nmap <S-Left> v<Left>
nmap <S-Right> v<Right>
vmap <S-Up> <Up>
vmap <S-Down> <Down>
vmap <S-Left> <Left>
vmap <S-Right> <Right>
imap <S-Up> <Esc>v<Up>
imap <S-Down> <Esc>v<Down>
imap <S-Left> <Esc>v<Left>
imap <S-Right> <Esc>v<Right>
同样,像这样映射通常的复制/剪切/粘贴,例如,您可以在选择+复制后返回到插入模式。
vmap <C-c> y<Esc>i
vmap <C-x> d<Esc>i
map <C-v> pi
imap <C-v> <Esc>pi
imap <C-z> <Esc>ui
现在,您可以从任何模式开始shift+箭头选择,然后C-C进行复制,然后C-v进行粘贴。您总是以插入模式结束,因此您还有C-z要撤消。
我认为这更接近于你所要求的文本编辑的"期望标准"行为。
有一个特定的选项:keymodel
:
'keymodel' 'km' string (default "")
global
{not in Vi}
List of comma separated words, which enable special things that keys
can do. These values can be used:
startsel Using a shifted special key starts selection (either
Select mode or Visual mode, depending on "key" being
present in 'selectmode').
stopsel Using a not-shifted special key stops selection.
Special keys in this context are the cursor keys, <End>, <Home>,
<PageUp> and <PageDown>.
The 'keymodel' option is set by the |:behave| command.
TL;DR:要启用您想要的行为,请使用:
set keymodel=startsel
如果在不按<Shift>
的情况下使用<Up>
或<Down>
时也想退出视觉模式,可以使用:
set keymodel=startsel,stopsel
与progo的答案略有不同-这给人的感觉与mac应用程序通常具有的相同:
nmap <S-Up> v<Up>
nmap <S-Down> v<Down>
nmap <S-Left> v<Left>
nmap <S-Right> v<Right>
vmap <S-Up> <Up>
vmap <S-Down> <Down>
vmap <S-Left> <Left>
vmap <S-Right> <Right>
不同之处在于切换到视觉模式而不是视觉线条模式,并且不会丢失最初的向上/向下等按键。
Vim在我看来并不容易屈服于此。在我的情况下,终端甚至都不认识Shift Up!我认为v
(按字符选择)或V
(按行选择)是更容易了解vi/vim的概念之一。
如果这有效(现在无法测试),这就是你想要的:
" activate visual mode in normal mode
nmap <S-Up> V
nmap <S-Down> V
" these are mapped in visual mode
vmap <S-Up> k
vmap <S-Down> j
"
" etc...
" similarly <S-Left>, <S-Right> for v
我找到了另一个更容易执行的解决方案。命令":behavior mswin"执行使用shift加光标键选择文本所需的所有操作。可在任何模式下工作。它还支持Cmd-c、Cmd-v和Cmd-x。它在MacVim中工作,但我没有尝试其他平台。
绝对建议您不要重新映射此功能。简单地切换到视觉模式并使用v
和箭头键是一个更好的主意。V
将选择整行,v$
将选择行尾,vw
将选择下一个字。您可以使用更多的命令来选择不同的行和单词。学习这些命令不仅有助于选择,而且有助于更有效地编辑文件。
此映射在选择期间保持插入模式(视觉模式),并从正确的位置开始。您也可以使用Ctrl-Shift left/right(如果您的终端支持)向左或向右选择一个单词:
" Select with shift + arrows
inoremap <S-Left> <Left><C-o>v
inoremap <S-Right> <C-o>v
inoremap <S-Up> <Left><C-o>v<Up><Right>
inoremap <S-Down> <C-o>v<Down><Left>
imap <C-S-Left> <S-Left><C-Left>
imap <C-S-Right> <S-Right><C-Right>
vnoremap <S-Left> <Left>
vnoremap <S-Right> <Right>
vnoremap <S-Up> <Up>
vnoremap <S-Down> <Down>
" Auto unselect when not holding shift
vmap <Left> <Esc>
vmap <Right> <Esc><Right>
vmap <Up> <Esc><Up>
vmap <Down> <Esc><Down>
这对于在插入模式下快速选择小零件可能很有用,但我建议使用默认命令来选择较大的零件。
我写这篇文章是为了能够在插入、视觉和正常模式下使用Alt+hjkl
(和朋友)进行导航并选择使用Alt+HJLK
。
因此,这同样适用于普通箭头键以及
let hjklfriends = ['h','j','k','l','w','e','b','W','E','B', 'n', 'N', 'y', 'Y', 'p', 'P']
" define if using alt (it works in neovim) or Escape key.
function! Meta(key)
if has('nvim')
return "<A-" . a:key . ">"
else
return "<Esc>" . a:key
endif
endfunction
execute 'noremap! ' . Meta('h') . ' <left>'
execute 'noremap! ' . Meta('j') . ' <down>'
execute 'noremap! ' . Meta('k') . ' <up>'
execute 'noremap! ' . Meta('l') . ' <right>'
execute 'noremap! ' . Meta('b') . ' <C-Left>'
execute 'noremap! ' . Meta('w') . ' <C-Right>'
execute 'noremap! ' . Meta('e') . ' <C-Right>'
for k in hjklfriends
execute 'imap ' . Meta(k) . ' <C-o>' . k
if k =~ '[a-z]'
execute 'imap ' . Meta(toupper(k)) . ' <C-o>v' . k
execute 'vmap ' . Meta(toupper(k)) . ' ' . k
execute 'nmap ' . Meta(toupper(k)) . ' v' . k
endif
endfor
根据@RubenCaro的回答修改。
问题是:当退出插入模式时,光标将向左移动一个。这使得键的行为和插入模式与其他通用文本编辑器的行为不同。假设目标是让这些键表现得像通用编辑器,那么映射应该稍微修改为:
" shift+arrow selection
nmap <S-Up> v<Up>
nmap <S-Down> v<Down>
nmap <S-Left> v<Left>
nmap <S-Right> v<Right>
vmap <S-Up> <Up>
vmap <S-Down> <Down>
vmap <S-Left> <Left>
vmap <S-Right> <Right>
imap <S-Up> <Esc>v<Up>
imap <S-Down> <Esc>vlvv<Down>
imap <S-Left> <Esc>v<Left>
imap <S-Right> <Esc>vlvv<Right>
vmap <C-c> y<Esc>i
vmap <C-x> d<Esc>i
map <C-v> pi
imap <C-v> <Esc>pli
imap <C-z> <Esc>ui