Vsvim: cc tidak meletakkan kursor pada indentasi jika pada baris kosong

Dibuat pada 8 Mei 2012  ·  10Komentar  ·  Sumber: VsVim/VsVim

cc menghapus baris saat ini dan menempatkan kursor dalam mode penyisipan (opsi 'autoindent' menentukan posisinya).

VsVim tidak selalu menempatkan kursor pada posisi yang benar. Satu kasus yang secara konsisten berhasil saya tiru adalah jika Anda meng-cc pada baris kosong itu akan menempatkan kursor di kolom pertama daripada di indentasi.
Pertimbangkan kode C # awal berikut ([] adalah ncursor, | icursor):

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

Tekan o untuk membuka baris di bawah ini:

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

Sekarang tekan Esc :

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

Sekarang tekan cc . Di sinilah Vim dan VsVim berbeda: Vim akan menempatkan kursor di dalam Bilah:

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

sedangkan VsVim akan menempatkannya di baris 0:

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

Alternatifnya, gunakan kode ini:

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

Di Vim dan VsVim, satu cc akan menempatkan kursor pada posisi menjorok, tetapi cc<Esc>cc akan menempatkan kursor di kolom 0 di VsVim (sementara Vim meletakkannya di indentasi kanan).

bug

Komentar yang paling membantu

Solusi sederhana ini memberi saya perilaku yang saya harapkan dari vim:

nmap S ddO
nmap cc S

Semua 10 komentar

Perilaku yang saya lihat di VsVim mencerminkan apa yang saya lihat di gVim.

Saya pikir kami memiliki pengaturan yang berbeda untuk beralih. Saya benar-benar melihat perbedaan perilaku setelah langkah 'o' di atas. Kursor saya akan muncul di kolom yang sama dengan { dan tidak menjorok ke dalam seperti milik Anda.

Dapatkah Anda menjalankan :set dan menempelkan hasilnya?

autoindent tampaknya menjadi salah satu opsi yang telah saya tetapkan di vimrc saya, yang kemudian saya source di vsvimrc.

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

Apakah VsVim memperhitungkan pengaturan indentasi di VS? Jika demikian, ini milik saya (di bawah Opsi -> Editor Teks -> C # -> Pemformatan):

  1. Indentasi (isi blok indentasi, case, label, jangan indent open / close braces)
class MyClass
{
    public void Method()
    {
        goto MyLabel;
MyLabel:
        return;
    }
}
  1. Di bawah Garis Baru saya telah memeriksa semuanya
  2. Spasi: semuanya tidak dicentang kecuali untuk "Setel opsi spasi lainnya" - Sisipkan spasi setelah kata kunci dalam pernyataan aliran kontrol; "Setel spasi untuk pembatas" -: setelah titik dua untuk basis, setelah koma, setelah titik koma untuk, sebelum titik dua untuk basis; "Atur jarak untuk operator": sebelum dan sesudah.

Saya juga tidak tahu apakah ini penting, tetapi saya telah mengatur indentasi ke Smart, ukuran 4, Tab Jaga.

HTH

Ya, autoindent tampaknya menjadi perbedaannya. Setelah saya menetapkan + menyimpannya sebagai file .c saya bisa mendapatkan perilaku yang Anda lihat.

Melihat sekilas kode dan tampaknya ada masalah dengan baris kosong. Kode tidak menghormati autoindent ketika baris yang dihapus kosong yang seharusnya.

Secara umum VsVim lebih memilih indentasi Visual Studio daripada indentasi Vim. Ini dapat ditimpa dengan menonaktifkan opsi vsvim_useeditorindent .

Ini sebagian besar berhasil. Sayangnya pada tahun 2010, meskipun tidak semua bahasa menyediakan API yang baik untuk layanan indentasi. C # memiliki yang terbaik, VB praktis tidak memiliki dan C ++ adalah lemparan dadu. Saya percaya itu menjadi lebih baik di VS11 tetapi belum cukup bermain-main untuk melihat seberapa banyak.

Akan mencoba memeras perbaikan ini menjadi 1,3

Bermain-main sedikit lagi dan perilaku ini sebenarnya adalah kunci dari cindent dan bukan autoindent . Inilah salah satu alasan mengapa saya butuh waktu lama untuk melaporkan masalah ini. Saya sedang bereksperimen dalam file teks di mana saya mengaktifkan autoindent . Ini hanya repro dalam file C dengan cindent .

Anda benar, saya berhasil memperbanyaknya juga setelah Anda menyebutkannya dengan vim -U NONE -u NONE -cmd 'set cindent' index.cs

Dalam pengaturan normal, Vim tampaknya secara otomatis mengatur cindent saat berada di file seperti C (muncul di :setl di C # dan JS).
Namun, perilaku yang sama - hapus indentasi pada <Esc> , indentasi ulang pada cc - tampaknya terjadi pada file bukan cindent : muncul untuk saya di CSS dan HTML, tetapi dalam kasus-kasus itu mungkin efek spesifik indentexpr .

@tokopedia
@jaredpar

Hai teman-teman, saya bertemu dengan masalah yang sama.
Apakah sudah diperbaiki dalam rilis terbaru?
Keluaran setelah :set

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

@lookforit saat ini tidak. Perilaku ini sebenarnya adalah bagian dari cindent yang tidak didukung oleh VsVim saat ini.

Solusi sederhana ini memberi saya perilaku yang saya harapkan dari vim:

nmap S ddO
nmap cc S

Ini masih akan menyenangkan untuk dimiliki. Pengertian intuitif saya adalah bahwa 'cc' untuk menghapus baris dan mulai mengedit harus dimulai pada tingkat indentasi yang sama seperti membuat baris baru. Apakah ada alasan internal Vim / VS bahwa seharusnya tidak demikian? Saya mungkin mengatasinya sebagai jalan masuk untuk mengerjakan proyek.

Solusi untuk masalah ini secara dangkal tidak lebih dari "lakukan untuk cc apa pun yang sudah dilakukan o " (itulah sebabnya solusi @shkm berhasil), tetapi operasi yang diperlukan membuatnya cukup sedikit lebih banyak pekerjaan.

VsVim sudah melakukan hal yang benar untuk apa yang disebut "vim indent", jenis indentasi yang digunakan VsVim saat tidak ada layanan bahasa yang tersedia. Untuk menambahkan tes untuk masalah ini, saya harus menambahkan infrastruktur ke tes untuk mensimulasikan layanan bahasa. Jadi putuskannya adalah bahwa semua tes yang ada menggunakan "vim indent" tetapi 99% pengguna menggunakan "host indent", yaitu mengedit file di mana Visual Studio menyediakan layanan indentasi.

Untuk memperumit masalah lebih jauh, ada bug yang tidak pernah dilaporkan oleh siapa pun dengan "vim indent" yang tidak berfungsi dengan benar saat tab tidak diperluas (lihat masalah # 2302). Sekali lagi, dari sudut pandang praktis tidak ada yang menggunakan "vim indent" jadi setelah direnungkan, ini tidak terlalu mengejutkan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

DanielKeogh picture DanielKeogh  ·  3Komentar

myopicmage picture myopicmage  ·  5Komentar

keithn picture keithn  ·  3Komentar

prat0088 picture prat0088  ·  4Komentar

jaredpar picture jaredpar  ·  5Komentar