为什么带有数字参数的vim map执行的次数比预期的多?

时间:2015-02-17 05:30:12

标签: vim

我试图在vim中创建一个简单的地图,让z键插入4个空格。我有

map z 4i <esc>l

如果我输入z,它会按预期工作。即使多次键入z也可按预期工作。但是当我使用类似2z的内容时,它会插入24个空格,1z会插入14个空格。每次我尝试使用中继器时,它会插入10倍的中继器空间,然后再插入4个空格。

我的地图有问题吗?我希望2z插入8个空格,3z插入12个空格,依此类推。

编辑: @ merlin2011弄清楚为什么我的映射行为不端并提出了解决问题的方法。 @PeterRincker正确地推断出地图的意图是缩进。使用>>的建议优于使用.vimrc次修改的映射:

set expandtab
set tabstop=4
set softtabstop=4
set shiftwidth=4

以上选项使我无需重新映射任何密钥,并充分利用已经正常运行的><>><<命令。我认为这是解决问题的更好方法。

来自:Converting tabs to spaces

2 个答案:

答案 0 :(得分:5)

当您在映射命令前放置一个数字时,就好像您在数字后面紧接着输入了map命令一样。

特别是,您的命令2z变为24i <esc>l,这将为您提供24个空格。

:help map-examples中记录了此行为。

一种解决方法是在映射中使用4个文字空间。

map z i    <Esc>l

另一种方法是使用函数并使用映射调用函数。

function! Insert(m)
    let l:count = a:m*4
    execute "normal a" . repeat (" ", l:count)
endfunction

map z :<C-U>call Insert(v:count1)<CR>

有关此问题的参考,请参阅this page

答案 1 :(得分:0)

看起来这个映射是为了缩进。我们最好使用Vim的本机压缩命令:

  • >>向右移动
  • <<向左移动
  • 使用> / <移动视觉选择

常见错误是在'shiftwidth'文件中设置~/.vimrc等缓冲区本地选项。最好按文件类型设置这些,并在设置这些选项时使用setlocal。通过以下方式获取缓冲区的文件类型::set filetype?

E.g。假设文件类型为javascript,则将以下内容添加到~/.vim/after/ftplugins/javascript.vim

setlocal shiftwidth = 4

查看sleuth.vim以自动调整缩进设置也是值得的。

要了解详情,请参阅以下内容:

:h :setl
:h options
:h after-directory
:h >>
:h 'shiftwidth'