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はカーソルを右側のインデントに配置します)。
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#->フォーマットの下):
class MyClass
{
public void Method()
{
goto MyLabel;
MyLabel:
return;
}
}
これも重要かどうかはわかりませんが、インデントをスマート、サイズ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インデント」を使用しないため、振り返ってみると、これはそれほど驚くべきことではありません。
最も参考になるコメント
この簡単な回避策により、vimに期待する動作が得られます。