Vim函数中的变量类型

时间:2013-06-23 04:31:08

标签: vim keymapping

我想在使用vim时方便地删除意外放置的标签。跳出来的解决方案是将插入模式映射到以下vim函数:

function DeleteTab()
  redir => l:numSpaces "captures output of set
  set tabstop?
  redir END
  "Strip off non-numerical output of 'set tabstop?' 
  let l:numSpaces = substitute(l:numSpaces, "tabstop=", "", "") 
  let l:numSpaces = substitute(l:numSpaces, " ", "", "g")
    "all echom lines are for debugging purposes
  echom "1" 
  if l:numSpaces > 0
     echom "2"
  while 1:numSpaces > 0
     execute "normal i<bs>"
     let l:numSpaces = l:numSpaces - 1
  endwhile
endfunction

除了没有按照我的意图行事之外,在我的消息中调用此函数的结果是“1”,但不是“2”。这意味着l:numSpaces不会被解释为数字。我如何在vimscript中进行等效的转换。另外,我错过了一种更简单的方法吗?

2 个答案:

答案 0 :(得分:3)

使用&tabstop而不是使用let l:numSpaces = &tabstop 而不是使用&符号获取值并将其放在变量中。

while 1:numSpaces > 0

您遇到的下一个问题是此行

1

你写了一个l(一个)而不是function! DeleteTab() let l:numSpaces = &tabstop echom "1" if l:numSpaces > 0 echom "2" endif while l:numSpaces > 0 execute "normal i<bs>" let l:numSpaces = l:numSpaces - 1 endwhile endfunction (小写L)

所以固定功能看起来像这样。

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

此功能也有点无意义。我相信如果您设置以下内容(或您想要的任何值),您应该实现您想要的行为

{{1}}

如果插入意外标签,按下退格键应返回完整标签。

答案 1 :(得分:0)

如果要访问vimscript中的选项值,可以使用语法&option(请参阅:help expr-option)。这简化了函数的前半部分

let numSpaces = &tabstop

至于撤消意外标签,除非您没有插入标签字符,否则所有应该按 Backspace

如果您的意思是“删除一定级别的缩进”而不是“删除标签”,那么您应该使用内置命令,按 Ctrl + d 在插入模式下。同样,您可以使用 Ctrl + t 向当前行添加缩进级别。无论光标在当前行中的位置如何,这两种方法都有效,不像尝试使用 Backspace 手动管理缩进,以及根据'shiftwidth',{{做正确的事情1}}和'expandtab'设置。