0

我想在使用 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 中进行强制转换。另外,我错过了更简单的方法吗?

4

2 回答 2

3

而不是做redir,只需使用&tabstop&符号获取值并将其放入变量中。

let l:numSpaces = &tabstop

你遇到的下一个问题是这条线

while 1:numSpaces > 0

你写了一个1(一)而不是l(小写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

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

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

如果您意外插入了一个制表符,按下退格键应该返回一个完整的制表符。

于 2013-06-23T04:52:01.500 回答
0

如果要访问 vimscript 中选项的值,可以使用语法&option(请参阅参考资料:help expr-option)。这将您功能的前半部分简化为

let numSpaces = &tabstop

至于撤消意外的制表符,只需要按Backspace,除非您不插入制表符。

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

于 2013-06-23T04:57:08.220 回答