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

Why does vim map with number argument execute more times than expected?

我正在尝试在 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

当您将数字放在映射命令的前面时,就像您在数字后立即键入该映射命令一样。

特别是,您的命令 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 以获取相关参考。

看起来这个映射是为了缩进。最好是我们 Vim 的原生缩进命令:

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

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

例如假设文件类型为 javascript 然后将以下内容添加到 ~/.vim/after/ftplugins/javascript.vim

setlocal shiftwidth = 4

sleuth.vim 自动调整缩进设置可能也值得一看。

要了解更多信息,请参阅以下内容:

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