Tôi có thể xóa toàn bộ một dòng, ngoại trừ ngắt dòng không?


33

Một thao tác khá phổ biến đối với tôi trong vim, vì tôi bị ám ảnh cưỡng chế và muốn giữ các tệp của mình không có khoảng trắng, là xóa nội dung của toàn bộ một dòng, nhưng không phải là dòng (không phải là ngắt dòng).

Có một cách vim tích hợp để làm điều này? Có lẽ là một d<movement command>hoạt động?

Cho đến nay, điều tốt nhất tôi có là (trên dòng trong câu hỏi) 0d$. Có cách nào nhanh hơn không?


2
Thay thế cho việc cắt xén khoảng trắng theo cách thủ công, bạn có thể sử dụng một plugin như vim-better-whitespace , làm nổi bật khoảng trắng theo sau, cung cấp một lệnh để loại bỏ tất cả cùng một lúc và thậm chí có thể tự động lưu nó.
deltab


3
Mặc dù không có một plugin, bạn trên toàn cầu có thể xóa dấu khoảng trắng sử dụng tìm kiếm và thay thế, ví dụ như:%s/\s*$//
Kyle Strand

Câu trả lời:


34

Bạn có thể sử dụng 0Dnó sẽ đi đến ký tự đầu tiên trên dòng và xóa cho đến cuối dòng. Lưu ý rằng bạn có thể sử dụng ^Dnếu bạn muốn để lại bất kỳ khoảng trắng trước nào. Ngoài ra, các hoạt động này không thể được lặp lại bằng cách sử dụng .. Nếu bạn muốn một thao tác có thể được lặp lại bằng .lệnh, hãy tham khảo câu trả lời của David Lord.

Chủ đề trợ giúp:

  • :help 0
  • :help D
  • :help ^

4
Mặc dù điều này là trực tiếp, nhưng đến mức, và (có lẽ) ít lần nhấn phím nhất, nó không thể lặp lại bằng cách sử dụng .lệnh. Vì lý do đó, tôi nghĩ cc<Esc>hoặc S<Esc>hấp dẫn hơn nếu bạn quan tâm đến việc lặp lại.
tommcdo

Điều đó đúng. Tuy nhiên, bạn có thể ghi lại dưới dạng macro và lặp lại bằng cách sử dụng ..
EvergreenTree

Nói chung, macro không thể được lặp lại với .. Chúng hoạt động như thể những tổ hợp phím đó được nhập tương tác, vì vậy các lệnh riêng lẻ được xử lý riêng. Sử dụng .sẽ chỉ lặp lại lệnh cuối cùng trong macro.
tommcdo

Tôi đã thử nó, và đó không phải là cách nó hoạt động với tôi. Nếu bản ghi macro, sau đó sử dụng nó bằng cách sử dụng @{reg}, bạn có thể lặp lại nó .sau đó.
EvergreenTree

1
Bạn chỉ đang lặp lại lệnh cuối cùng của macro D. Sau một 0Dthao tác, con trỏ của bạn sẽ được để lại trong cột 0. Nếu con trỏ của bạn đã ở đầu dòng (sau khi bạn di chuyển sang một dòng khác), nó sẽ trông giống như macro được lặp lại đúng cách. Hãy thử di chuyển con trỏ về phía trước trong dòng và gõ .- bạn sẽ thấy rằng nó chỉ lặp lại D.
tommcdo

20

cc <Esc>sẽ làm như bạn yêu cầu, nhưng là nhiều tổ hợp phím hơn 0D. Nếu bạn muốn đặt một cái gì đó vào dòng đó sau đó, cccó thể là tốt nhất.


2
Nếu bạn bao gồm Shift thì nó giống nhau và có thể dễ dàng hơn.
Holloway

4
Mặc dù đây không phải là giải pháp "sạch nhất", nhưng nó có một ưu điểm: đó chính xác là một hành động và do đó, nó có thể lặp lại với .lệnh. Ngược lại, 0D(như được đề xuất trong câu trả lời được chọn) là hai hành động: 0chuyển động và Dlệnh.
tommcdo

@Trengot có lẽ dễ hơn 0Dđối với tôi vì tôi đã jkánh xạ <Esc>vào vimrc của mình, vì vậy tay tôi thậm chí sẽ không phải rời khỏi nhà.
EvergreenTree

1
Xem câu trả lời @Nobilis: Sđược ghi lại là "Từ đồng nghĩa cho cc"
Volker Siegel

14

Svà sau đó Ctrl+Choặc Escdường như hoàn thành chức năng chính xác tương tự.

Sau đó, nó có thể được lặp đi lặp lại .vì nó tạo thành một hành động duy nhất.


2
Tôi chỉ nghĩ đến việc thêm câu này như một câu trả lời và sau đó nhìn thấy câu trả lời của bạn
s chuông

7

0Dcó lẽ là những gì bạn muốn. Nó sẽ xóa từ con trỏ đến cuối dòng trong khi để lại dòng (và bất kỳ ký tự nào trước con trỏ).


Altho câu trả lời này là một năm tuổi, điều đáng chú ý là 0Dsẽ xóa từ đầu dòng , không phải từ vị trí con trỏ
FliiFe

4

Tôi thường sử dụng ddO. ddđể xóa dòng hiện tại và O(đó là vốn o) để thêm một dòng mới.

Đây cũng là 3 tổ hợp phím, nhưng ddchỉ được tính là 1 rưỡi và tôi thấy Odễ gõ hơn $.

Nó khác với 0Dgiải pháp ở chỗ nó tự động thụt lề, ví dụ với mã này (nơi !···là một tab và cursor con trỏ:

def asd():
!···if foo:
!···!···foo()█
!···!···foobar()

0D sẽ để lại cho bạn với:

def asd():
!···if foo:
█
!···!···foobar()

ddOsẽ để lại cho bạn với:

def asd():
!···if foo:
!···!···█
!···!···foobar()

Và nếu bạn nhấn <Esc>ngay sau đó, Vim sẽ xóa tự động thụt lề, vì vậy bạn có tương tự như với 0D.

Không có cách 'chính xác', nó sẽ phụ thuộc chính xác những gì bạn muốn làm. Tôi thích ddObởi vì nó linh hoạt hơn và bởi vì nó "trong ngón tay của tôi" :-)


2
^Dsẽ để lại khoảng trắng một mình.
EvergreenTree

Ođể bạn ở chế độ chèn, điều này tương đương với cc, ngoại trừ không có thụt lề tự động .... trừ khi dòng của bạn đã được tự động thụt lề.
Kyle Strand

Điều này sẽ hành xử khác nhau trên dòng cuối cùng của tập tin.
tommcdo

0

Và để lưu một nét phím quý giá đó, bạn có thể sử dụng 0Cnó sẽ xóa tất cả các ký tự trên dòng hiện tại và đưa bạn vào chế độ chèn.

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.