Vsvim: 空の行にある場合、ccはカーソルをインデントに置きません

作成日 2012年05月08日  ·  10コメント  ·  ソース: VsVim/VsVim

ccは現在の行を削除し、カーソルを挿入モードにします(「自動インデント」オプションがその位置を決定します)。

VsVimは、カーソルを常に正しい位置に置くとは限りません。 私が一貫してそれを再現することができた1つのケースは、空の行でccを実行すると、カーソルがインデントではなく最初の列に配置されることです。
次の開始C#コード([]はncursor、| icursor)について考えてみます。

class Foo {
    public void Bar()
    [{]
    }
}

oを押して、以下の行を開きます。

class Foo {
    public void Bar()
    {
        |
    }
}

ここでEsc押します:

class Foo {
    public void Bar()
    {
[ ]
    }
}

ここでcc押します。 これがVimとVsVimの違いです。Vimはカーソルをバー内にインデントして配置します。

class Foo {
    public void Bar()
    {
        |
    }
}

VsVimはそれを0行目に配置します:

class Foo {
    public void Bar()
    {
|
    }
}

または、次のコードを使用します。

class Foo {
    public void Bar()
    {
        throw new NotImplementedException()[;]
    }
}

VimとVsVimの両方で、単一のccはカーソルをインデントされた位置に配置しますが、 cc<Esc>ccはカーソルをVsVimの列0に配置します(Vimはカーソルを右側のインデントに配置します)。

bug

最も参考になるコメント

この簡単な回避策により、vimに期待する動作が得られます。

nmap S ddO
nmap cc S

全てのコメント10件

VsVimで見た動作は、gVimで見た動作を反映しています。

別の設定が切り替えられていると思います。 上部の「o」ステップの後、実際に動作の違いが見られます。 私のカーソルは{と同じ列に表示され、あなたのカーソルのようにインデントされません。

:setを実行して、出力を貼り付けることはできますか?

autoindentは、vimrcで設定したオプションの1つであるようです。次に、vsvimrcでsourceしました。

hlsearch
ignorecase
incsearch
scrolloff=5
smartcase
vimrc="C:\Users\pmateescu\_vsvimrc"
vimrcpaths="C:\Users\pmateescu;C:\Users\pmateescu"
autoindent
number
tabstop=4

VsVimはVSのインデント設定を考慮していますか? もしそうなら、ここに私のものがあります(オプション->テキストエディタ-> C#->フォーマットの下):

  1. インデント(ブロックの内容、ケース、ラベルをインデントし、中括弧を開閉しないでください)
class MyClass
{
    public void Method()
    {
        goto MyLabel;
MyLabel:
        return;
    }
}
  1. 新しい行の下で私はすべてをチェックしました
  2. 間隔:「他の間隔オプションを設定する」を除くすべてのチェックを外します-制御フローステートメントのキーワードの後に​​スペースを挿入します。 「区切り文字の間隔を設定する」-:ベースのコロンの後、コンマの後、セミコロンの後、ベースのコロンの前。 「演算子の間隔を設定する」:前後。

これも重要かどうかはわかりませんが、インデントをスマート、サイズ4、[タブを保持]に設定しています。

HTH

ええ、自動インデントは違いのようです。 +それを設定して.cファイルとして保存すると、表示されている動作を取得できます。

コードをざっと見てみると、空の行に問題があるようです。 削除された行が空の場合、コードはautoindent尊重しません。

一般に、VsVimはVimインデントよりもVisualStudioインデントを優先します。 これは、オプションvsvim_useeditorindent無効にすることで上書きできます。

これはほとんどうまくいきます。 残念ながら2010年には、すべての言語がインデントサービスに適したAPIを提供しているわけではありません。 C#が最高で、VBは事実上ありません。また、C ++はサイコロの目です。 VS11で良くなると思いますが、まだ十分に遊んでいません。

この修正を1.3に絞り込もうとします

もう少し遊んだら、この動作は実際にはautoindentではなくcindentからキーオフされています。 これが、問題を再現するのに非常に長い時間がかかった理由の1つです。 autoindent有効にしたテキストファイルで実験していました。 これは、 cindentオンになっているCファイルでのみ再現されます。

そうです、 vim -U NONE -u NONE -cmd 'set cindent' index.cs言及した後、私もそれを再現することができました

通常の設定では、VimはCのようなファイルの場合に自動的にcindentオンに設定しているようです(C#とJSの両方で:setlに表示されます)。
しかし、同じ行動-リムーブにインデント<Esc> 、再インデントにcc -非で発生するように見えるcindentファイル:CSSとHTMLの両方で私のために現れました、ただし、そのような場合は、特定のindentexprの影響である可能性があります。

@philipmat
@jaredpar

こんにちはみんな、私は同じ問題に遭遇しました。
最新リリースで修正されていますか?
:set後の出力

backspace="indent,eol,start"
hlsearch
ignorecase
incsearch
autoindent

現時点ではcindent一部であり、現時点ではVsVimではサポートされていません。

この簡単な回避策により、vimに期待する動作が得られます。

nmap S ddO
nmap cc S

これはまだ持っているといいでしょう。 私の直感的な感覚は、行をクリアして編集を開始するための「cc」は、改行を作成するのと同じインデントレベルで開始する必要があるということです。 これがそうであるべきではないという内部のVim / VSの理由はありますか? 私はプロジェクトでの作業への侵入としてそれに取り組むかもしれません。

この問題の解決策は、表面的には「 oがすでに行っていることは何でも、 ccに対して行う」にすぎませんoが(これが、 @ shkmの回避策が機能する理由

VsVimは、いわゆる「vimインデント」、つまり言語サービスが利用できないときにVsVimが使用する種類のインデントに対してすでに正しいことを行っていました。 この問題のテストを追加するには、言語サービスをシミュレートするインフラストラクチャをテストに追加する必要がありました。 そのため、既存のすべてのテストで「vimインデント」が使用されていますが、99%のユーザーが「ホストインデント」を使用しています。つまり、VisualStudioがインデントサービスを提供するファイルを編集しています。

問題をさらに複雑にするために、タブが展開されていないときに正しく機能しなかった「vimインデント」で誰も報告しなかったバグがありました(問題#2302を参照)。 繰り返しになりますが、実用的な観点からは、誰も「vimインデント」を使用しないため、振り返ってみると、これはそれほど驚くべきことではありません。

このページは役に立ちましたか?
0 / 5 - 0 評価