Hapus sampai ujung kanan blok dalam saat ini

21

Katakanlah saya memiliki kode seperti ini ( |mewakili posisi kursor ):

func1(x|, func2(), y); 

Saya ingin mendapatkan:

func1(x|);

Apakah ada cara untuk menghapus kode dari posisi kursor ke posisi sebelum ujung kanan blok dalam saat ini ?

Saya tahu bahwa saya bisa pergi dengan dt).tetapi saya bertanya-tanya apakah ada cara untuk mencampurnya dengan apa di).

Mateusz Piotrowski
sumber
1
Saya tertarik mengetahui apakah ada cara mudah untuk "menghapus bagian kiri / kanan dari blok dalam / luar", seperti yang Anda tanyakan. Tetapi sebagai catatan, saya mungkin akan melakukannya C);dalam kasus khusus ini.
Shahbaz
1
Terkadang %gerakan dapat melakukan apa yang Anda cari (yaitu d%).
alxndr

Jawaban:

29

Saya akan menggunakan

d])

yang berarti hapus ( d) ke '' '( ])) berikutnya yang tidak cocok.

Lihat :help ]).

Ryichiro
sumber
5

Gerakan hanya berjalan dalam satu arah sedangkan objek teks hanya berjalan dalam dua arah.

Ini berarti bahwa Anda tidak dapat memiliki setengah dari objek teks kecuali Anda membuat gerakan tertunda operator kustom yang menggunakan objek teks di bawah tenda atau meniru perilakunya.

Dalam contoh Anda, teks yang dicakup oleh i)cukup mudah untuk divisualisasikan:

func1(x, func2(), y);
      ^^^^^^^^^^^^^

tetapi bagaimana Anda memberi tahu Vim untuk beroperasi dari kursor ke akhir teks itu? Orang perlu membuat operator khusus suka obi)dan oei)(contoh semi-acak).

" ()
onoremap oei) :normal! vi)o``<CR>
onoremap obi) :normal! vi)``<CR>

" []
onoremap oei] :normal! vi]o``<CR>
onoremap obi] :normal! vi]``<CR>

" {}
onoremap oei} :normal! vi}o``<CR>
onoremap obi} :normal! vi}``<CR>

" ""
onoremap oei" :normal! vi"o``<CR>
onoremap obi" :normal! vi"``<CR>

" ''
onoremap oei" :normal! vi'o``<CR>
onoremap obi" :normal! vi'``<CR>
romainl
sumber
4
Akan menarik untuk membuat gerakan umum yang menggunakan kembali semua objek teks yang sudah didefinisikan, dikombinasikan dengan posisi kursor saat ini; misalnya, alih-alih ib, imbke kanan dan iMbke kiri, dan seterusnya (secara otomatis).
VanLaser
3

Untuk kasus khusus ini saya akan melakukannya dfy

Untuk kasus umum:

  • dT( hapus dari kursor ke awal blok
  • vib pilih sisa blok dalam
  • p ganti blok dalam dengan apa yang baru saja Anda hapus

Anda bisa membuatnya menjadi pemetaan.

 :map K dt(vibp
Nathan Wilson
sumber
3

Jawaban lain yang ada semua tergantung pada definisi vim dan deteksi blok. Strategi saya untuk penghapusan semacam ini adalah menggunakan cperintah yang dikombinasikan dengan fgerakan dan karakter aktual untuk dihentikan. Ini kemudian akan benar-benar menghapus karakter berhenti, tetapi karena itu juga merupakan tombol terakhir yang Anda tekan mengulanginya dua kali memiliki biaya nol, dan itu akan memasukkannya lagi sejak cperubahan ke mode penyisipan.


Untuk menjelaskan dengan contoh, untuk

func1(x|, func2(), y); 

perintah c2f))akan memberi

func1(x)|;

yang pada awalnya mungkin tampak kurang elegan daripada beberapa jawaban lain, namun perhatikan bahwa strategi ini bersifat universal dan tidak tergantung pada definisi blok.


Misalnya dengan

<div| class="some-class">text</div>

perintah cf>>akan memberi

<div>|text</div>

Atau saat mengedit file csv suka

2016-11-29,question,vi|.stackexchange.com,10435

perintah cf,,akan memberi

2016-11-29,question,vi,|10435

Saya sering menggunakan ini untuk menghapus sisa string, dari

printf("Hello world| - a boring example\n");

untuk

printf("Hello world\|n");

dengan cf\\

atau dari

print("Hello world| - a boring example");

untuk

print("Hello world"|);

dengan cf"".


Ini memang mengubah posisi saat ini ke tempat yang sedikit berbeda dari yang diminta, dan juga berubah menjadi mode penyisipan. Tetapi saya ingin berbagi solusi masuk saya untuk menghapus apa pun yang tersisa.

hlovdal
sumber
1
Masalah dengan cfsolusi adalah bahwa saya harus menentukan karakter di mana saya ingin berhenti menghapus. Pertanyaan bertanya apa yang harus dilakukan jika Anda tidak bisa hanya melakukan cf)karena ada lain )sebelum )Anda benar-benar ingin mencapai (misalnya ketika Anda ingin perubahan func(x|, g(x, x), x, x, g(x, x))ke func(x)). Pada dasarnya, saya ingin tahu apakah saya dapat menghindari menekan .setelah cf).
Mateusz Piotrowski
Perhatikan bahwa Anda juga dapat menggunakan talih-alih fmenghapus hingga tetapi tidak menyertakan karakter yang diberikan, jadi untuk contoh pertama Anda ( func1(x|, func2(), y);), Anda bisa menggunakan d2t). Seperti @MateuszPiotrowski menyebutkan, itu bukan solusi umum dan mengharuskan Anda untuk mengetahui karakter yang ingin Anda hapus. Seperti yang biasanya Anda ketahui, karakter mana yang mengakhiri blok Anda menggunakan bahasa tertentu, itu tidak terlalu buruk.
Haegin
3

The vim-ninja-kaki Plugin mungkin apa yang Anda cari. Dari apa yang saya mengerti, itu membuat d[dan d]menjadi "hapus dari kursor untuk memulai / akhir objek teks", jadi d]i)harus "hapus sampai akhir kurung sekitarnya".

Caagr98
sumber