web-dev-qa-db-ja.com

VimはPythonコメントのインデントを自動的に削除します

私はVimを使用していて、Pythonスクリプトを編集しています。

自動インデントは一般的にはかなりうまく機能しますが、新しい行を開始して「#」と入力してコメントを入力すると、Vimはその行のインデントを解除します。

たとえば、

def foo():

enterキーを押すと、Vimは適切にインデントします

def foo():
    pass

ただし、passと入力する代わりに、#と入力すると、自動的にインデントが解除されます

def foo():
# comment

class Thing():
    def __init__(self):
         pass
# comment line gets unindented all the way

私の.vimrcファイルは次のとおりです。なぜこれが起こっているのか誰か知っていますか?

set tabstop=4
set smartindent
set shiftwidth=4
set expandtab
set backspace=indent,eol,start
set scrolloff=3
set statusline=%f%m%r%h%w\ [%Y\ %{&ff}]\ [%l/%L\ (%p%%)]
set laststatus=2
76
andylei

smartindentをオンに設定すると、Vimはあなたが説明したように動作しますが、nosmartindent(私がよく使用するもの)を使用すると、Vimはあなたが好むように動作します。

更新:smartindentのドキュメントから:

新しい行の最初の文字として「#」を入力すると、その行のインデントが削除され、「#」が最初の列に配置されます。次の行のためにインデントが復元されます。これが不要な場合は、次のマッピングを使用してください: ":inoremap#X ^ H#"、ここで^ HはCTRL-VCTRL-Hで入力します。 「>>」コマンドを使用する場合、「#」で始まる行は右にシフトされません。

それはそれのようです。


更新:おそらく次のことを気にする必要はありません...追加の情報価値のためにここに残しておきます。 ;-)

nosmartindentを設定しても問題が解決しない場合は、:setコマンド(パラメーターなし)を使用して、Vimセッションで有効なすべての設定のリストを取得し、どこかに貼り付けることができます( on Pastie おそらく)。私が覚えている限り、自動インデントに影響を与える他のいくつかのオプションがあります。

57
Michał Marczyk

Michałの投稿ではsmartindentの機能について説明していますが、単にオフにするよりもはるかに優れた方法を実行できます。好みに合わせて設定することもできますが、Vimに適切なインデントを選択させることもできます。他のインデント設定の代わりにvimrcで以下を使用します。

filetype indent on

VimはPython用の適切なインデントプラグインを自動的に使用します。これは、#行のインデントを解除しないよりもはるかに優れています。ほとんどすべてが適切にインデントされている必要があります。

18
Cascabel

pythonファイルに対してのみオプションを試すことができます:

autocmd BufRead *.py inoremap # X<c-h>#<space>
6
zzart

なんらかの理由で、上記の動作はcindentをオンにしたときに発生しました。オフにすると修正されました。上記の他の修正はどれも役に立ちません。

3
Michael Härtl