Bagaimana cara menghapus banyak baris di vi?


129

Saya telah mencoba mengikuti yang berikut ini:

Cara menghapus teks yang dipilih di editor VI

tapi

5dd

memberi

E492: Bukan perintah editor: 5dd

Saya kemudian mencoba:

5d

Yang hanya menghapus satu baris. Bagaimana cara menghapus beberapa baris?


2
Sejauh yang saya ingat, 5dd harus merupakan sintaks yang valid dan harus menghapus 5 baris yang dimulai dengan kursor aktif. Adakah kemungkinan CAPS LOCK aktif dan Anda menggunakan tata letak keyboard yang menyebabkan tombol numerik bergeser saat itu?
Eric J.

Jawaban:


132

Kedengarannya seperti Anda memasukkan perintah dalam mode perintah (alias. "Mode Ex"). Dalam konteks itu :5dakan menghapus baris nomor 5, tidak ada yang lain. Agar 5ddberfungsi sebagaimana mestinya - yaitu, hapus lima baris konsekuen yang dimulai dari kursor - masukkan dalam mode normal dan jangan awali perintah dengan :.



142

Anda dapat menghapus beberapa baris (rentang) jika Anda mengetahui nomor barisnya:

:[start_line_no],[end_line_no]d

Catatan: d singkatan dari delete

dimana,
start_line_no adalah baris awal no yang ingin anda hapus dan end_line_no adalah baris akhir no yang ingin anda hapus. Garis antara awal dan akhir, termasuk awal dan akhir akan dihapus.

Misalnya:

:45,101d

Garis antara 45 dan 101 termasuk 45 dan 101 akan dihapus.


14
Anda juga dapat menggunakan $untuk menunjukkan baris terakhir dalam file. Jadi :45,$dakan menghapus setiap baris dari 45 sampai akhir.
freethebees

Anda bahkan dapat menggunakan Pola seperti/<\/div>/
Björn

1
Jika Anda ingin memulai rentang dari lne Anda saat ini, Anda dapat melakukannya:.,[end_line_no]d
Joe

15

Perintah terdaftar untuk digunakan dalam mode normal (awalan dengan :untuk mode perintah).
Diuji di Vim.

Berdasarkan jumlah baris:

  • numdd - akan menghapus jumlah baris DOWN mulai menghitung dari posisi kursor saat ini (misalnya 5ddakan menghapus baris saat ini dan 4 baris di bawahnya => menghapus baris saat ini dan ( num-1 ) baris di bawahnya )
  • numdk - akan menghapus num baris UP dari baris saat ini dan baris saat ini itu sendiri (misalnya 3dkakan menghapus baris saat ini dan 3 baris di atasnya => menghapus baris saat ini dan baris nomor di atasnya )

Dengan nomor baris:

  • dnumG - akan menghapus baris dari baris saat ini (inklusif) UP ke baris nomor num (inklusif) (misalnya jika kursor saat ini di baris 5 d2Gakan menghapus baris 2-5 inklusif)
  • dnumgg - akan menghapus baris dari baris saat ini (inklusif) BAWAH ke baris nomor num (inklusif) (misalnya jika kursor saat ini di baris 2 d6ggakan menghapus baris 2-6 inklusif)
  • ( hanya mode perintah ) :num1 ,num2d - akan menghapus baris nomor baris num1 (inklusif) BAWAH ke nomor baris num2 (inklusif) . Catatan: jika num1 lebih besar dari num2 - vim akan bereaksi denganBackwards range given, OK to swap (y/n)?

1
Ini membantu saya karena saya tidak menyadari num 'd' 'd' mencoba menghapus kursor di bawah. Saya menempatkan kursor saya di bagian bawah file mencoba menghapus baris di atas kursor saya! Terima kasih untuk bantuannya!
Jonathan Chad Faling

Menghapus menurut nomor linen: ': <start>, $ d' akan menghapus hingga akhir file.
Devolus

11

Jika Anda lebih suka metode mode non-visual dan mengetahui nomor baris, saya ingin menyarankan Anda cara langsung lainnya.

Contoh

Saya ingin menghapus teks dari baris 45 ke baris 101.

Metode saya menyarankan Anda untuk mengetikkan perintah di bawah ini dalam mode perintah:

45Gd101G

Bunyinya:

Pergi ke baris 45 ( 45G) lalu hapus teks ( d) dari baris saat ini ke baris 101 ( 101G).

Perhatikan bahwa vimAnda mungkin menggunakan ggsebagai gantinya G.

Bandingkan dengan jawaban @Bonnie Varghese yaitu:

:45,101d[enter]

Perintah diatas dari jawabannya membutuhkan 9 kali pengetikan termasuk enterdimana jawaban saya membutuhkan 8 - 10 kali pengetikan. Jadi, kecepatan metode saya sebanding.

Secara pribadi, saya sendiri lebih suka 45Gd101Glebih :45,101dkarena saya seperti untuk tongkat untuk sintaks dari perintah vi, dalam hal ini adalah:

+---------+----------+--------------------+
| syntax  | <motion> | <operator><motion> |
+---------+----------+--------------------+
| command |   45G    |        d101G       |
+---------+----------+--------------------+

8

d5d "memotong" lima baris

Saya biasanya hanya membuang nomor di tengah seperti:

d7l = hapus 7 huruf


7

Tekan Esctombol untuk memastikan Anda tidak dalam mode edit. Tempatkan kursor pada baris pertama yang akan dihapus. Masuk :5dd. Baris saat ini, dan empat baris berikutnya harus dihapus.

Bergantian, jika Anda mengaktifkan penomoran baris ...

Tekan Esctombol untuk memastikan Anda tidak dalam mode edit. Masukkan :#,#d'#' untuk awal dan akhir nomor baris yang akan dihapus.


Saya tidak berpikir bahwa ini bekerja dengan titik dua di awal.
Diasingkan

@Poeteaudit Itu adalah perintah vi yang valid. Titik dua menyebabkan vi memindahkan kursor ke bagian bawah layar dan menerima perintah editor baris.
Kenster

5
  1. Esc untuk keluar dari mode penyisipan
  2. :1enter pergi ke baris 1 (ganti '1' dengan baris yang Anda minati)
  3. 5dd hapus 5 baris (dari baris saat ini)

Ketik (untuk baris bernomor).:set number


3

Jika Anda ingin menghapus rentang SETELAH pemicu baris tertentu Anda dapat menggunakan sesuatu seperti ini

:g/^TMPDIR/ :.,+11d

Itu menghapus 11 baris (inklusif) setelah setiap pertemuan ^TMPDIR.


0

itu dxd, bukan ddx

jika Anda ingin menghapus 5 baris, arahkan kursor ke awal baris pertama untuk menghapus dan d5d


0

Untuk menghapus semua baris gunakan - ESC gg dG Untuk menghapus beberapa baris katakanlah 5 lalu gunakan ESC 5dd


-1

Itu bisa dilakukan sebagai berikut ..

  1. Posisikan kursor di tempat yang ingin Anda hapus.
  2. Tekan "v" untuk memulai pemilihan visual.
  3. Arahkan kursor ke posisi yang ingin Anda hapus menggunakan tombol panah.
  4. Tekan "d" yang akan menghapus garis.
  5. Sekarang simpan dan keluar menggunakan ": x!"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.