2

次のコードを使用してcc、行が空でない場合は既存のインデントを保持し、行が空の場合は ( を使用してindentexpr) 計算されたインデントを使用します。

function SmartCC()
  if getline('.') !~# '\S'
    return 'cc'
  else
    let spaces = repeat(' ', indent('.'))
    return '0d$i' . spaces
  endif
endfunction
nnoremap <expr> cc SmartCC()

私が抱えている唯一の問題は、組み込みの とは異なり、ccこれは「実際の」スペースを挿入し、その行に何も入力されていない場合に自動的に削除される「一時的な」スペースを挿入しないことです。

そのような一時的なスペースを挿入する方法はありますか?

それとも、秘密のオプションを設定することで、私が達成しようとしていることがすでに利用可能になっているのでしょうか?

明確にするために、末尾のスペースをすべて削除するプラグインは解決策ではありません。

4

3 に答える 3

1

次のハックを試してください。

function SmartCC_IndentExpr(indent, savedindentexpr)
    let &l:indentexpr=a:savedindentexpr
    return a:indent
endfunction
function SmartCC()
    if getline('.')=~#'\S'
        let &l:indentexpr='SmartCC_IndentExpr('.indent('.').', '.string(&l:indentexpr).')'
    endif
    return 'cc'
endfunction
nnoremap <expr> cc SmartCC()

. アイデアは&l:indentexpr、評価の期間のみ設定することccです。インデントのチェックは 1 回だけであり、そのような状況でccは何も前にチェックをトリガーしないことが知られているため、別の理由でインデントが 2 回目にチェックされる前に、それ自体を使用して元に戻すことができます。cc&l:indentexpr&l:indentexpr

于 2012-11-07T17:45:49.490 に答える
0

cc現在の行のインデントを保持するのに十分スマートです。持ってautoindentいますか?

于 2012-11-07T10:21:23.050 に答える
0

オンデマンド スペース ストリッピングとは言えませんが、保存時に末尾のスペースを削除するためにこれを持っています。これで十分でしょうか?

autocmd BufWritePre *.{c,cpp,h}  %s/\s\+$//e
于 2012-11-08T00:17:54.053 に答える