2013-06-23 60 views
0

我想在使用vim時方便地刪除意外放置的選項卡。那跳出來我的解決方法是爲插入模式映射到下面的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中投射。另外,我錯過了一個更簡單的方法嗎?

回答

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 

擊中退格鍵,如果你插入一個偶然的標籤應該回到一個完整的標籤應達到你想要的行爲。

0

如果要訪問vimscript中某個選項的值,可以使用語法&option(請參閱:help expr-option)。你的函數上半年簡化爲

let numSpaces = &tabstop 

至於撤消意外的標籤,都應該要求緊迫Backspace鍵,除非你不插入製表符。

如果你的意思是你想要的,而不是爲「刪除縮進的水平」,「刪除標籤」,那麼你應該使用內置的命令是,按下Ctrl鍵+d插入模式。同樣,您可以使用Ctrl + t將縮進級別添加到當前行。這兩個工作不管你的光標在當前行中的位置,不像試圖用Backspace手動管理縮進,以及根據你的'shiftwidth','expandtab''tabstop'設置做正確的事情。