Mengapa ci "berada di luar area kutipan dan ci (hanya berfungsi di dalam tanda kurung?

27

Saat menggunakan ci"kursor tidak harus berada di area yang dikutip ganda.

|String somestring = "some text";

Dengan asumsi pipa adalah posisi kursor, ci"akan membuatnya melompat ke area yang dikutip.

Di sisi lain, saat menggunakan ci(, kursor harus berada di dalam tanda kurung agar berfungsi dan tidak akan memindahkan kursor di dalamnya.

Apa alasan perbedaan perilaku ini? Saya berasumsi ada cara untuk memetakan kunci sehingga perilaku ini ada. Apakah ada kelemahan untuk melakukan ini?

Perampok
sumber

Jawaban:

25

Perbedaan utama di sini adalah bahwa pernyataan tanda kurung (ditargetkan oleh ci() dapat disarangkan, sedangkan string yang dikutip (ditargetkan oleh ci") tidak dapat.

Jika kursor Anda berada di luar beberapa pernyataan tanda kurung, itu mungkin masih di dalam dari yang lain. Misalnya ( *menandai posisi kursor):

$foo = array(
    'x' => ar*ray(1, 2, 3),
);

Baris tempat kursor berada (1, 2, 3), tetapi kursor juga berada di dalam array(...)blok yang lebih besar . Dalam hal ini, yang lebih besar adalah target yang tepat ci(.

Jika kursor Anda berada di luar string yang dikutip, karena mereka tidak dapat disarangkan, tidak ada hal yang masuk akal untuk dilakukan. Jadi, Vim mengambil keuntungan dan menemukan string yang dikutip pertama di telepon.

tommcdo
sumber
10

Keluarga kutipan dari objek teks ( i', i", a', dan a") yang berbeda dari sisa dari objek teks dalam bahwa mereka hanya melihat baris saat ini. Karena ini, pilihan dibuat untuk tidak memerlukan kursor berada dalam tanda kutip. Sebagai gantinya, Vim akan mencari ke depan dalam baris untuk menemukan string yang dikutip ketika kursor belum ada di dalam satu.

Ada diskusi di sekitar beberapa tambalan yang akan memungkinkan perilaku pencarian maju ini diimplementasikan untuk objek teks berbasis blok juga.

jamessan
sumber
8

Jawaban lain mencakup mengapa ini terjadi. Ini cara yang bagus untuk mengatasinya.

wellle / target.vim . Saya baru saja menemukan plugin ini, dan saya pikir itu sangat diremehkan. Ini menyediakan objek teks baru: din(Mnemonic:. (D) apus (i) nside (n) ext "(" ini kompatibel dengan operator lain dan beberapa objek yang berbeda, seperti an(, in", il((dalam kurung terakhir)

Ini juga mengesampingkan perilaku default i(sehingga pertama kali terlihat untuk melihat apakah kursor ada dalam tanda kurung, dan kemudian jika tidak berfungsi dengan cara yang sama in(. Perilaku ini dapat dihidupkan atau dimatikan. Sebagai contoh:

def foo(bar):
^cursor here

Mengetik ci(bertindak sama dengan cin(, karena kursor tidak ada dalam tanda kurung.

def foo( ):
        ^Cursor here, and in insert mode

Ini juga menerima hitungan:

def foo(bar):           #Define function foo(bar)
^cursor here

Mengetik c2in(:

def foo(bar):           #Define function foo( )
                                             ^cursor here

Ini juga menyediakan objek baru, "argumen". Misalnya, danaberarti "Hapus di sekitar argumen berikutnya". Ini juga menerima hitungan. Sebagai contoh:

def foo(arg1, arg2, BADarg3):
^ cursor here

Mengetik d3ana:

def foo(arg1, arg2):
                  ^ cursor here

Ada banyak fitur lain yang dimiliki plugin ini, tetapi ini adalah yang mendasar.

DJMcMayhem
sumber
1
Bagus! Ini adalah tambahan yang bagus. Saya mungkin harus memeriksanya.
Reaver
Jawaban yang bagus 10/10 tapi saya harus memberikannya 9/10 karena contohnya adalah python
Downgoat