我想在使用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中进行等效的转换。另外,我错过了一种更简单的方法吗?
答案 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'
设置。