【问题标题】:Mapping <Shift>-Arrows to selecting characters/lines映射 <Shift>-箭头以选择字符/行
【发布时间】:2012-04-01 01:54:01
【问题描述】:

我最近开始使用vim,但是我错过了其他文本编辑器的字符/行选择方法。默认情况下,vim 将&lt;S-Up&gt;&lt;S-Down&gt; 映射到向上/向下跳转一页,我想将它们重新映射到文本选择。

有没有办法做到这一点?

【问题讨论】:

  • 你的键盘上没有向上翻页和向下翻页吗??
  • 问题不同。我想将 - 映射为行选择,将 - 映射为字符选择。
  • 关于vim的“keymodel”选项的答案是这个问题的最佳答案

标签: vim vi


【解决方案1】:

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

【讨论】:

  • 谢谢,按预期工作。我知道你不会推荐它?
  • @AlexeiDanchenkov,确实我不推荐它。它打破了不必反复破解单个键即可前进的 vim 模型。你也会错过文本对象。
  • 我会在从正常模式到可视模式的移动中添加额外的向上/向下,而不是使用可视线模式来让它感觉就像在其他所有 mac 应用程序中一样 - “nmap v"
【解决方案2】:

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

【讨论】:

  • 我不知道这种模式。谢谢!
【解决方案3】:

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

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

【讨论】:

  • 我更喜欢这个答案,在我看来更好的方法。在 Linux 上也能很好地工作。
  • 漂亮的小费兄弟!
  • 这绝对是耶稣一直在等待的正确答案!
【解决方案4】:

我用插入模式完成了@escrafford 映射:

" 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 撤消。

我认为这更接近于你所要求的文本编辑器的“预期标准”行为。

【讨论】:

  • 很抱歉很密集,但是你在哪里添加这些映射?
  • vim --version | grep vimrc 提到的任何文件中。只需将它添加到文件中的某个位置(您可能需要创建它)
【解决方案5】:

我找到了另一个更容易执行的解决方案。命令 ':behave mswin' 完成了使用 shift 加光标键选择文本所需的所有操作。适用于任何模式。它还支持 Cmd-c、Cmd-v 和 Cmd-x。它适用于 MacVim,但我没有尝试其他平台。

【讨论】:

    【解决方案6】:

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

    如果您还想在使用&lt;Up&gt;&lt;Down&gt; 而不按下&lt;Shift&gt; 时离开可视模式,您可以使用:

    set keymodel=startsel,stopsel
    

    【讨论】:

    • 心疼!为什么这没有被标记为答案并被赞成?有什么问题吗?它工作得很好,感谢您的精彩解释!那么keymodel只是shift键吗?
    • 这是这个问题的最佳答案
    • 你刚刚救了我的命和我的理智!谢谢^______^
    【解决方案7】:

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

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

    【讨论】:

      【解决方案8】:

      我写这个是为了能够使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-23
        • 2013-12-20
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多