Bisakah Anda mengambil atau menghapus di antara tanda kurung di vi / vim?

128

Diberikan baris kode ini dalam C:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));

Apakah ada cara untuk menghapus atau menarik dari tanda kurung yang tebal ke tanda kurung yang cocok? Saya berpikir tentang df) , tapi itu hanya akan membuat Anda setelah 9.0.

Apakah ada cara serupa untuk mendapatkan vim untuk merebut segala sesuatu antara kawat gigi yang cocok, terlepas dari baris baru?

romansa
sumber

Jawaban:

167

Berbagai Gerakan:%

The %perintah melompat ke pertandingan item di bawah kursor. Posisikan kursor pada paren pembuka (atau penutup) dan gunakan y%untuk menarik atau d%menghapus semuanya dari kursor ke paren yang cocok.

Ini berfungsi karena %merupakan "perintah gerak", sehingga dapat digunakan di mana saja vim mengharapkan perintah seperti itu. Dari :help y:

["x]y{motion}       Yank {motion} text [into register x].  When no
                    characters are to be yanked (e.g., "y0" in column 1),
                    this is an error when 'cpoptions' includes the 'E'
                    flag.

Secara default, "item" termasuk tanda kurung, kawat gigi, paren, komentar gaya-C dan berbagai pernyataan precompiler ( #ifdef, dll.).

Ada plugin untuk "extended% matching" yang dapat Anda temukan di beranda Vim .

Anda dapat membaca dokumentasi %dan perintah gerakan terkait dengan memasukkan :help various-motionsdalam mode perintah.

objek-pilih

Ada satu set perintah gerak yang dapat Anda gunakan dalam mode Visual untuk memilih berbagai objek teks.

Untuk mengatasi masalah spesifik Anda, Anda akan melakukan hal berikut:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                   ^

Katakanlah kursor Anda diposisikan di ^. Masukkan urutan berikut untuk memilih bagian yang Anda cari:

v2a)

Pertama vmemasuki mode Visual, maka Anda menentukan bahwa Anda ingin naik 2tingkat parens. Akhirnya a)memilih "blok". Setelah itu Anda bisa menggunakan datau xmenghapus, dll.

Jika Anda tidak ingin memasukkan paren luar, Anda dapat menggunakan "blok dalam" sebagai gantinya:

v2i)

Lihat :help object-selectdaftar lengkap perintah terkait.


sumber
Terima kasih! Saya tahu tentang% pengalihan di antara item yang cocok; tidak tahu itu berguna dalam perintah juga. +1 dan diterima.
romandas
5
Menarik, saya selalu berpikir aberarti "di sekitar" daripada "a". Merasa seperti itu melengkapi "batin" dengan lebih baik. Sepertinya tidak ada hari berlalu dengan tidak mempelajari sesuatu yang baru tentang Vim.
Andrew Marshall
217

Bagaimana dengan dibatau di(.

Ini akan menghapus blok bagian dalam (...) tempat kursor berada.

Saya suka gerakan dan pilihan objek teks !

CMS
sumber
10
Untungnya, pertanyaan ini adalah hit pertama ketika saya mencari di google - Saya tidak tahu berapa kali jawaban ini menyelamatkan saya. Dan saya selalu melupakannya ... :-(
Konrad Rudolph
16
Apakah mungkin untuk menghapus termasuk tanda kurung? (ya, saya jawab pertanyaan saya sendiri: dab=> hapus satu blok (termasuk tanda kurung)
bantic
5
Saya memilih. Selain itu jika Anda ingin memperbaiki kata dalam kurung do ciw .
Pengembang Marius Žilėnas
5
+1! Saya terpesona ketika saya menemukan gerakan objek teks baru-baru ini! tidak lagi mencoba memposisikan kursor di tempat yang tepat untuk menarik teks: D
verboze
36

Untuk menghapus semua yang ada di dalam tanda kurung, Anda selalu dapat mengeluarkan di(dan turunannya.

Catatan :

Seperti yang disarankan @porglezomb dalam komentarnya, Anda dapat menggunakan a("bersama dengan") alih-alih i("di dalam") untuk memasukkan tanda kurung. Jadi, menggunakan da(menghapus semua yang ada di dalamnya (dan )termasuk (dan ).

Menghapus teks di dalam pasangan kurung langsung di luar:

Jadi, untuk baris kode ini

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                ^       ^
                                |       |
                                 \_______\___---> Cursor range

dengan asumsi bahwa kursor Anda berada di dalam kisaran kursor yang disebutkan di atas, Anda dapat mengeluarkan perintah berikut:

di(   --> Deletes '5.0/9.0'
ci(   --> Substitutes '5.0/9.0'
yi(   --> Yanks '5.0/9.0'

Menghapus teks di dalam pasangan kurung luar ke-n:

Untuk mengambil semua yang ada di dalam pasangan kurung luar ke-n, cukup tambahkan nsebelum perintah di atas. Jadi, dengan posisi kursor yang sama seperti di atas,

2di(   --> Deletes '(5.0/9.0) * (fahr-32)'
2ci(   --> Substitutes '(5.0/9.0) * (fahr-32)'
2yi(   --> Yanks '(5.0/9.0) * (fahr-32)'

3di(   --> Deletes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3ci(   --> Substitutes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3yi(   --> Yanks '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
Kevin
sumber
3
Anda harus menambahkan catatan yang dibicarakan asebagai lawan bicara i, karena itu mungkin membantu banyak orang.
porglezomp
@romanda ini seharusnya menjadi pertanyaan yang diterima. Saya sedang mencari masalah yang sama persis hari ini dan @Kevin adalah satu-satunya di sini yang memberikan jawaban yang tepat. Tentu saja, saya bisa "menyalahgunakan" %untuk masalah ini, tetapi ini membutuhkan lebih banyak waktu dan, menurut saya, seharusnya hanya digunakan untuk skenario yang lebih kompleks. Menghapus sesuatu di dalam lingkup tertentu adalah persis use-case didibuat.
daniel451
19

Anda dapat menggunakannya d%untuk menghapus dan y%untuk menarik.

ahy1
sumber
3
% adalah specifier gerakan untuk "kurung, kurung, atau kurung yang cocok". Setiap spesifikasi gerakan dapat dipasangkan dengan d dan y (dan banyak hal lainnya).
kekacauan
10

Tempatkan kursor Anda pada tanda kurung pertama, lalu tekan v%yatau v%d.

David Norman
sumber
3
Bagus! % melompat ke paren yang cocok. Jadi Anda bahkan dapat menggunakan d% dan y%.
1
Perhatikan juga, bahwa 'd%' dapat dimulai pada awal nama fungsi, dan akan menghapus seluruh panggilan fungsi. Ini juga berfungsi untuk pasangan '{}', '[]' dan bahkan '<>'.
Jonathan Leffler
@Leffler, Terima kasih atas tipsnya! Dan ada baiknya mengetahui% berfungsi dalam mode visual juga.
strager
3

Coba ci [blok-surrounder]

Dalam kasus Anda, tempatkan kursor di mana saja di antara tanda kurung 2 yang Anda sorot dan coba tombol: ci (

Justin Nguyen
sumber
Hampir. Menguji ini, sepertinya kursor harus berada pada tanda kurung pertama, bukan antara, dan 'c' adalah perintah perubahan. Dengan kursor pada tanda kurung buka, 'di (' menghapus tanda kurung penutup yang cocok, dan 'yi (' yanks.
Richard Neish
ci bekerja untuk saya sepanjang waktu. Yang perlu saya lakukan adalah memastikan kursor berada di antara tanda kurung yang mengelilingi blok teks yang perlu saya hapus.
Justin Nguyen
2

Seperti jawaban David Norman,

Tempatkan kursor Anda pada tanda kurung pertama, lalu tekan v%yatau v%d.

Penjelasan dari http://vimdoc.sourceforge.net/htmldoc/vimindex.html :

beri tag char note action dalam mode Normal        
-------------------------------------------------- ----------------------------
| v | v mulai karakter Visual mode
|% | % 1 menemukan braket (keriting / persegi) berikutnya menyala
                                       baris ini dan pergi ke pertandingannya, atau pergi ke
                                       mencocokkan braket komentar, atau pergi ke pencocokan
| d | ["x] d {gerakan} 2 hapus teks pindah [ke buffer x]

Ini berarti ia akan memilih segala sesuatu di antara dan termasuk dua tanda kurung ( %) sambil menunjukkan pilihan kepada Anda secara visual ( v) dan kemudian menarik / menyalin yatau menghapus / memotongnya d. (Ke buffer default.)

Anda dapat menempatkan / menempel dengan p.

Membuat jawaban ini untuk "belajar sendiri untuk memancing" .

n611x007
sumber
catatan: vimdoc.sourceforge.net ditautkan dari vim.org yang merupakan situs resmi vim pada 2015.
n611x007