vim Map< Shift>-选择字符/行的箭头

vatpfxk5  于 2022-12-29  发布在  其他
关注(0)|答案(9)|浏览(168)

我最近开始使用vim,但是我怀念其他文本编辑器的字符/行选择方法,默认情况下,vimMap<S-Up><S-Down>到上下跳转一页,我想重新Map这些到文本选择。
有办法做到吗?

uujelgoq

uujelgoq1#

我用插入模式的Map完成了@ escrawfordMap:

" 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>

同样,像这样Map通常的复制/剪切/粘贴,您可以在选择+复制后返回插入模式。

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撤销。
我认为这更接近于于所要求的文本编辑器的“预期标准”行为。

hs1ihplo

hs1ihplo2#

对此有一个特定的选项: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

如果您还想在使用<Up><Down>时退出可视模式,而不按下<Shift>,则可以使用:

set keymodel=startsel,stopsel
3gtaxfhh

3gtaxfhh3#

与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>

不同之处在于切换到视觉模式而不是视觉线模式,并且不会丢失初始上/下等按键。

w1jd8yoj

w1jd8yoj4#

在我看来,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
gstyhher

gstyhher5#

我发现了另一个更容易执行的解决方案。命令':behavior mswin'做了所有需要使用shift加光标键来选择文本的事情。可以在任何模式下工作。它还支持Cmd-c,Cmd-v和Cmd-x。它可以在MacVim中工作,但我没有尝试过其他平台。

anauzrmj

anauzrmj6#

强烈建议您不要重新Map此功能。简单地切换到可视化模式并使用v和箭头键是一个更好的主意。V将选择整行。v$将选择到行尾,vw将选择下一个单词。还有很多命令可以用来选择不同的行和单词。学习这些命令不仅有助于选择文件,而且有助于更有效地编辑文件。

d7v8vwbk

d7v8vwbk7#

此Map在选择期间保持插入模式(视觉模式),并从正确的位置开始。您也可以使用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>

这对于在插入模式下快速选择小零件可能很有用,但我建议使用默认命令来选择较大的零件。

9rnv2umw

9rnv2umw8#

我写这篇文章是为了能够在插入、可视和正常模式下使用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
slmsl1lt

slmsl1lt9#

修改自@RubenCaro的回答。
问题是:when escaping from insert mode, the cursor will be shifted to the left by one.当使用或时,这会导致不直观的选择。如果你碰巧也在插入模式下使用条形光标,这会更明显。
以下代码中的vlvv补偿了该偏移。

" 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>pi
imap <C-z> <Esc>ui

相关问题