webdevqa.jp.net

vimのタブとスペース

自動インデントがオンのときにvimがスペースをタブに置き換えるのを防ぐにはどうすればよいですか?

例:行の先頭に2つのタブと7つのスペースがあり、tabstop=3、Enterキーを押すと、次の行の最初に4つのタブと1つのスペースがありますが、それは望ましくありません...

71
RQ

タブをまったく使用しないことをお勧めします。

:set expandtab

ファイル内のすべてのタブを3つのスペースに置き換えたい場合(tabstop=3とよく似ています):

:%s/^I/   /

(ここで^Iは TAB キャラクター)

VIMオンラインヘルプから:

'tabstop' 'ts'      number  (default 8)
        local to buffer
Number of spaces that a <Tab> in the file counts for.  Also see
|:retab| command, and 'softtabstop' option.

Note: Setting 'tabstop' to any other value than 8 can make your file
appear wrong in many places (e.g., when printing it).

There are four main ways to use tabs in Vim:
1. Always keep 'tabstop' at 8, set 'softtabstop' and 'shiftwidth' to 4
   (or 3 or whatever you prefer) and use 'noexpandtab'.  Then Vim
   will use a mix of tabs and spaces, but typing <Tab> and <BS> will
   behave like a tab appears every 4 (or 3) characters.
2. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use
   'expandtab'.  This way you will always insert spaces.  The
   formatting will never be messed up when 'tabstop' is changed.
3. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use a
   |modeline| to set these values when editing the file again.  Only
   works when using Vim to edit the file.
4. Always set 'tabstop' and 'shiftwidth' to the same value, and
   'noexpandtab'.  This should then work (for initial indents only)
   for any tabstop setting that people use.  It might be Nice to have
   tabs after the first non-blank inserted as spaces if you do this
   though.  Otherwise aligned comments will be wrong when 'tabstop' is
   changed.
78
user11211

すべてのTABSPACEに変換できます

:set et
:ret!

または、すべてのSPACETABに変換します

:set et!
:ret!
42
kev

必要なのは、前の行とまったく同じインデント文字を持つ自動インデントされた行だけです。

:help copyindent

'copyindent''ci'boolean (デフォルトはオフ);バッファに対してローカル。 {Viにはない}

新しい行を自動インデントするときに、既存の行のインデントの構造をコピーします。通常、新しいインデントは、必要に応じて一連のタブとそれに続くスペースで再構築されます( 'expandtab' が有効になっている場合を除き、スペースのみが使用されます)。このオプションを有効にすると、既存の行のインデントに使用された文字が新しい行にコピーされます。新しいインデントが既存の行よりも大きい場合、残りのスペースは通常の方法で埋められます。

注: 'copyindent' は、 'compatible' が設定されている場合にリセットされます。
'preserveindent' も参照してください。

:help preserveindent

'preserveindent''pi'boolean (デフォルトはオフ);バッファに対してローカル。 {Viにはない}

現在の行のインデントを変更するときは、インデント構造をできるだけ多く保持します。通常、インデントは、必要に応じて一連のタブとそれに続くスペースに置き換えられます( 'expandtab' が有効になっている場合を除き、スペースのみが使用されます)。このオプションを有効にすると、インデントはインデントのためにできるだけ多くの既存の文字を保持し、必要に応じて追加のタブまたはスペースのみを追加します。

注:「>>」を複数回使用すると、結果のインデントはタブとスペースが混在します。気に入らないかもしれません。
注: 'preserveindent' は、 'compatible' が設定されるとリセットされます。
'copyindent' 」も参照してください。
:retabを使用して、空白をクリーンアップします。

41

ここに私の.vimrc

set autoindent
set expandtab
set softtabstop=4
set shiftwidth=4

これは、ソースコードにタブが絶対に必要ないため、うまく機能します。あなたの質問から、次の行に2つのタブと7つのスペースを残したいのですが、そのスタイルに対応するためにvimを教える方法があるかどうかはわかりません。

25
Greg Hewgill

たぶんこれの一番下があなたを助けることができますか?

標準のviはタブキーを文字通り解釈しますが、vimのような、よりスマートな人気のvi派生の代替があります。 vimにtabをinsert-a-tabコマンドではなく「インデント」コマンドとして解釈させるには、次のようにします:

set softtabstop=2
1
svrist

'ts'の設定に基づいて、すべてのタブをスペースに置き換える場合は、:retabを使用できます。逆もできます。

1
graywh