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

(小文字の L)1の代わりに (one) を書きました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使用して、現在の行にインデントのレベルを追加できます。これらは両方とも、カーソルが現在の行のどこにあるかに関係なく機能します。 を使用して手動でインデントを管理しようとしたり、 、、および の設定に基づいて正しいことを実行したりするのとは異なります。CtrltBackspace'shiftwidth''expandtab''tabstop'

于 2013-06-23T04:57:08.220 に答える