Làm thế nào tôi có thể xóa nhiều dòng trong vi?


129

Tôi đã cố gắng làm theo như sau:

Cách xóa văn bản đã chọn trong trình chỉnh sửa VI

nhưng

5dd

cho

E492: Không phải là lệnh biên tập: 5dd

Sau đó tôi đã thử:

5d

Mà chỉ xóa một dòng duy nhất. Làm thế nào tôi có thể xóa nhiều dòng?


2
Theo như tôi nhớ, 5dd phải là cú pháp hợp lệ và nên xóa 5 dòng bắt đầu bằng một con trỏ đang bật. Bất kỳ cơ hội nào CAPS LOCK được bật và bạn sử dụng bố trí bàn phím làm cho các phím số thay đổi khi có?
Eric J.

Câu trả lời:


132

Âm thanh như bạn đang nhập lệnh trong chế độ lệnh (hay còn gọi là "Chế độ Ex"). Trong bối cảnh :5dđó sẽ loại bỏ dòng số 5, không có gì khác. Để 5ddhoạt động như dự định - nghĩa là xóa năm dòng kết quả bắt đầu từ con trỏ - nhập nó vào chế độ bình thường và không đặt tiền tố cho các lệnh với :.



142

Bạn có thể xóa nhiều dòng (phạm vi) nếu bạn biết số dòng:

:[start_line_no],[end_line_no]d

Lưu ý: d là viết tắt của xóa

trong đó,
start_line_no là dòng bắt đầu không bạn muốn xóa và end_line_no là dòng kết thúc mà bạn không muốn xóa. Các dòng giữa bắt đầu và kết thúc, bao gồm bắt đầu và kết thúc sẽ bị xóa.

Ví dụ:

:45,101d

Các dòng giữa 45 và 101 bao gồm 45 và 101 sẽ bị xóa.


14
Bạn cũng có thể sử dụng $để biểu thị dòng cuối cùng trong tệp. Vì vậy, :45,$dsẽ xóa mọi dòng từ 45 cho đến hết.
freethebees

Bạn thậm chí có thể sử dụng các mẫu như/<\/div>/
Bjorn

1
Nếu bạn muốn bắt đầu phạm vi từ lne bạn hiện đang làm bạn có thể làm:.,[end_line_no]d
Joe

15

Các lệnh được liệt kê để sử dụng trong chế độ bình thường (tiền tố với :chế độ lệnh).
Đã thử nghiệm ở Vim.

Theo số lượng dòng:

  • numdd - sẽ xóa các dòng num bắt đầu đếm từ vị trí con trỏ hiện tại (ví dụ: 5ddsẽ xóa dòng hiện tại và 4 dòng bên dưới nó => xóa dòng hiện tại và ( num-1 ) dòng bên dưới nó )
  • numdk - sẽ xóa dòng num UP khỏi dòng hiện tại và chính dòng hiện tại (ví dụ: 3dksẽ xóa dòng hiện tại và 3 dòng trên nó => xóa dòng hiện tại và dòng num trên nó )

Theo số dòng:

  • dnumG - sẽ xóa các dòng khỏi dòng hiện tại (đã bao gồm) LÊN đến số dòng num (đã bao gồm) (ví dụ: nếu con trỏ hiện trên dòng 5 d2Gsẽ xóa các dòng 2-5
  • dnumgg - sẽ xóa các dòng từ dòng hiện tại (đã bao gồm) XUỐNG đến số dòng num (đã bao gồm) (ví dụ: nếu con trỏ hiện ở dòng 2 d6ggsẽ xóa các dòng 2-6)
  • ( chỉ chế độ lệnh ) :num1 ,num2d - sẽ xóa dòng số num1 (đã bao gồm) DOWN sang số dòng num2 (đã bao gồm) . Lưu ý: nếu num1 lớn hơn num2 - vim sẽ phản ứng vớiBackwards range given, OK to swap (y/n)?

1
Điều này giúp tôi vì tôi không nhận ra num 'd' 'd' đang cố xóa con trỏ bên dưới. Tôi đã có con trỏ ở dưới cùng của tệp cố gắng xóa các dòng trên con trỏ của tôi! cảm ơn đã giúp đỡ!
Jonathan Chad Faling

Xóa bằng vải lanh: ': <start>, $ d' sẽ xóa cho đến khi kết thúc tệp.
Devolus

11

Nếu bạn thích một phương thức chế độ không trực quan và thừa nhận số dòng, tôi muốn gợi ý cho bạn một cách đơn giản khác.

Thí dụ

Tôi muốn xóa văn bản từ dòng 45 đến dòng 101.

Phương pháp của tôi gợi ý bạn nhập lệnh dưới đây trong chế độ lệnh:

45Gd101G

Nó đọc:

Chuyển đến dòng 45 ( 45G) sau đó xóa văn bản ( d) khỏi dòng hiện tại sang dòng 101 ( 101G).

Lưu ý rằng vimbạn có thể sử dụng ggthay cho G.

So sánh với câu trả lời của @Bonnie Varghese là:

:45,101d[enter]

Lệnh trên từ câu trả lời của anh ta yêu cầu 9 lần gõ bao gồm enter, trong đó câu trả lời của tôi yêu cầu gõ 8 - 10 lần. Vì vậy, một tốc độ của phương pháp của tôi là tương đương.

Cá nhân, bản thân tôi thích 45Gd101Ghơn :45,101dvì tôi thích theo cú pháp của lệnh vi, trong trường hợp này là:

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

8

d5d "cắt" năm dòng

Tôi thường chỉ ném số ở giữa như:

d7l = xóa 7 chữ cái


7

Nhấn Escphím để đảm bảo bạn không ở chế độ chỉnh sửa. Đặt con trỏ trên dòng đầu tiên sẽ bị xóa. Nhập :5dd. Dòng hiện tại và bốn dòng tiếp theo sẽ bị xóa.

Thay phiên, nếu bạn đã bật đánh số dòng ...

Nhấn Escphím để đảm bảo bạn không ở chế độ chỉnh sửa. Nhập :#,#dnơi '#' là viết tắt của số dòng bắt đầu và kết thúc sẽ bị xóa.


Tôi không nghĩ rằng nó hoạt động với dấu hai chấm lúc đầu.
Bị ruồng bỏ

@PoeteMaudit Đó là những lệnh vi hợp lệ. Dấu hai chấm khiến vi di chuyển con trỏ xuống dưới cùng của màn hình và chấp nhận lệnh biên tập dòng.
Kenster

5
  1. Esc để thoát chế độ chèn
  2. :1enter đi đến dòng 1 (thay thế '1' bằng dòng bạn quan tâm)
  3. 5dd xóa 5 dòng (từ dòng hiện tại)

Nhập (cho các dòng được đánh số).:set number


3

Nếu bạn muốn xóa một phạm vi SAU một kích hoạt dòng cụ thể, bạn có thể sử dụng một cái gì đó như thế này

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

Điều đó xóa 11 dòng (bao gồm) sau mỗi lần gặp ^TMPDIR.


0

nó là dxd, không phải ddx

nếu bạn muốn xóa 5 dòng, con trỏ đến đầu dòng đầu tiên để xóa và d5d


0

Để xóa tất cả các dòng sử dụng - ESC gg dG Để xóa một vài dòng, hãy nói 5 sau đó sử dụng ESC 5dd


-1

Nó có thể được thực hiện như sau ..

  1. Định vị con trỏ tại vị trí bạn muốn xóa.
  2. Nhấn "v" để bắt đầu lựa chọn trực quan.
  3. Đưa con trỏ đến vị trí bạn muốn xóa bằng phím mũi tên.
  4. Nhấn "d" sẽ xóa các dòng.
  5. Bây giờ lưu và thoát bằng ": x!"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.