Bạn có thể lấy hoặc xóa giữa các dấu ngoặc đơn trong vi / vim không?


128

Cho dòng mã này trong C:

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

Có cách nào để xóa hoặc kéo từ dấu ngoặc đậm đầu tiên sang dấu ngoặc đơn phù hợp của nó không? Tôi đã nghĩ về df) , nhưng điều đó sẽ chỉ đưa bạn đến sau 9.0.

Có một cách tương tự để có được vim để lấy tất cả mọi thứ giữa niềng răng phù hợp, bất kể dòng mới?

Câu trả lời:


167

Chuyển động khác nhau:%

Các %lệnh nhảy đến trận đấu của mặt hàng đó dưới con trỏ. Định vị con trỏ trên paren mở (hoặc đóng) và sử dụng y%để kéo hoặc d%xóa mọi thứ từ con trỏ đến paren phù hợp.

Điều này hoạt động vì %là một "lệnh chuyển động", vì vậy nó có thể được sử dụng ở bất cứ đâu vim mong đợi một lệnh như vậy. Từ :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.

Theo mặc định, "mục" bao gồm dấu ngoặc, dấu ngoặc, dấu ngoặc, nhận xét kiểu C và các câu lệnh tiền biên dịch khác nhau ( #ifdef, v.v.).

Có một plugin cho "kết hợp% mở rộng" mà bạn có thể tìm thấy trên trang chủ của Vim .

Bạn có thể đọc tài liệu trên %và các lệnh chuyển động liên quan bằng cách nhập vào :help various-motionschế độ lệnh.

chọn đối tượng

Có một bộ lệnh chuyển động khác mà bạn có thể sử dụng trong chế độ Visual để chọn các đối tượng văn bản khác nhau.

Để giải quyết vấn đề cụ thể của bạn, bạn sẽ làm như sau:

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

Giả sử con trỏ của bạn được định vị ^. Nhập trình tự sau để chọn phần bạn đang tìm kiếm:

v2a)

Đầu tiên vvào chế độ Visual, sau đó bạn xác định rằng bạn muốn 2tăng cấp độ parens lên. Cuối cùng, a)chọn "một khối". Sau đó, bạn có thể sử dụng dhoặc xxóa, vv

Nếu bạn không muốn bao gồm các ô bên ngoài, bạn có thể sử dụng "khối bên trong" thay thế:

v2i)

Xem :help object-selectđể biết danh sách đầy đủ các lệnh liên quan.


Cảm ơn! Tôi biết về% chuyển đổi giữa các mục phù hợp; không biết nó cũng hữu ích trong các lệnh. +1 và được chấp nhận.
romandas

5
Thú vị, tôi luôn nghĩ acó nghĩa là "xung quanh" chứ không phải "a". Cảm thấy như nó bổ sung "bên trong" tốt hơn. Dường như không một ngày nào trôi qua khi không học được điều gì mới về Vim.
Andrew Marshall

217

Những gì về dibhoặc di(.

Nó sẽ xóa khối bên trong (...) nơi con trỏ đang ở.

Tôi yêu các chuyển động và lựa chọn đối tượng văn bản !


10
May mắn thay, câu hỏi này là lần truy cập đầu tiên khi tôi tìm kiếm nó - tôi không biết câu trả lời này đã cứu tôi bao nhiêu lần. Và tôi luôn quên nó Ngày :-(
Konrad Rudolph

16
Có thể xóa bao gồm cả dấu ngoặc đơn? (vâng, tôi đã trả lời câu hỏi của riêng tôi:dab => xóa một khối (bao gồm cả dấu ngoặc đơn của nó)
bantic

5
Tôi bỏ phiếu lên. Ngoài ra nếu bạn muốn sửa từ trong ngoặc đơn làm ciw .
Nhà phát triển Marius ilėnas

5
+1! Tôi đã phát điên khi phát hiện ra chuyển động của đối tượng văn bản gần đây! không còn cố gắng định vị con trỏ ở vị trí bên phải để kéo dài văn bản: D
verboze

36

Để xóa tất cả những gì có trong một cặp dấu ngoặc đơn, bạn luôn có thể phát hành di( và các dẫn xuất của nó.

Ghi chú :

Như @porglezomb đã đề xuất trong nhận xét của anh ấy, bạn có thể sử dụng a("cùng với") thay vì i("bên trong") để bao gồm các dấu ngoặc đơn. Vì vậy, sử dụng da(xóa mọi thứ bên trong ()bao gồm () .

Xóa văn bản bên trong cặp dấu ngoặc đơn bên ngoài ngay lập tức:

Vì vậy, đối với dòng mã này

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

giả sử rằng con trỏ của bạn nằm trong phạm vi con trỏ được đề cập ở trên, bạn có thể đưa ra các lệnh sau:

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

Xóa văn bản bên trong cặp dấu ngoặc đơn thứ n:

Để lấy tất cả mọi thứ bên trong cặp dấu ngoặc đơn thứ n, chỉ cần thêm ntrước lệnh trên. Vì vậy, với cùng một vị trí con trỏ như trên,

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))'

3
Bạn nên thêm một ghi chú nói về ađối tác i, vì điều đó có thể sẽ giúp được rất nhiều người.
porglezomp

@romandas đây nên là câu hỏi được chấp nhận. Tôi đã tìm kiếm chính xác cùng một vấn đề ngày hôm nay và @Kevin là người duy nhất ở đây đưa ra câu trả lời thích hợp. Tất nhiên, tôi có thể "lạm dụng" %cho vấn đề này, nhưng điều này cần nhiều thời gian hơn và, theo tôi, chỉ nên được sử dụng cho các tình huống phức tạp hơn. Xóa một cái gì đó bên trong một phạm vi nhất định chính xác là trường hợp sử dụng diđược thực hiện cho.
daniel451

19

Bạn có thể sử dụng d%để xóa và y%để kéo dài.


3
% là chỉ định chuyển động cho "dấu ngoặc đơn, dấu ngoặc hoặc dấu ngoặc". Bất kỳ đặc điểm kỹ thuật chuyển động có thể được ghép nối với d và y (và nhiều thứ khác).
hỗn loạn

10

Đặt con trỏ trên dấu ngoặc đơn đầu tiên, sau đó nhấn v%yhoặc v%d.


3
Tuyệt quá! % nhảy đến paren phù hợp. Vì vậy, bạn thậm chí có thể sử dụng d% và y%.

1
Cũng lưu ý rằng 'd%' có thể bắt đầu ở đầu tên hàm và sẽ xóa toàn bộ lệnh gọi hàm. Nó cũng hoạt động cho các cặp '{}', '[]' và thậm chí '<>'.
Jonathan Leffler

@Leffler, Cảm ơn những lời khuyên! Và thật tốt khi biết% hoạt động ở chế độ trực quan.
strager

3

Hãy thử ci [block-Surrounder]

Trong trường hợp của bạn, đặt con trỏ ở bất cứ đâu giữa 2 dấu ngoặc đơn mà bạn đánh dấu và thử các phím: ci (


Gần. Kiểm tra điều này, có vẻ như con trỏ cần phải ở dấu ngoặc đơn đầu tiên, không phải giữa và 'c' là lệnh thay đổi. Với con trỏ trên dấu ngoặc đơn mở, 'di (' sẽ xóa dấu ngoặc đơn đóng phù hợp và 'yi (' yanks.
Richard Neish

ci làm việc cho tôi mọi lúc Tất cả những gì tôi cần làm là đảm bảo con trỏ nằm giữa các dấu ngoặc đơn bao quanh khối văn bản tôi cần xóa.
Justin Nguyễn

2

Như câu trả lời của David Norman nói,

Đặt con trỏ trên dấu ngoặc đơn đầu tiên, sau đó nhấn v%yhoặc v%d.

Giải thích từ http://vimdoc.sourceforge.net/htmldoc/vimindex.html :

hành động ghi chú char ở chế độ Bình thường        
-------------------------------------------------- ----------------------------
| v | v bắt đầu đặc trưng chế độ trực quan
|% | % 1 tìm khung tiếp theo (xoăn / vuông) trên
                                       dòng này và đi đến trận đấu của nó, hoặc đi đến
                                       khớp khung nhận xét hoặc đi đến khớp
| d | ["X] d {motion} 2 xóa văn bản Nmove [vào bộ đệm x]

Điều này có nghĩa là nó sẽ chọn mọi thứ ở giữa và bao gồm hai dấu ngoặc ( %) trong khi hiển thị lựa chọn cho bạn một cách trực quan ( v) và sau đó yank / sao chép yhoặc xóa / cắt dnó. (Để bộ đệm mặc định.)

Bạn có thể đặt / dán với p.

Thực hiện câu trả lời này để "dạy bản thân mình để câu cá" .


lưu ý: vimdoc.sourceforge.net được liên kết từ vim.org là trang web chính thức của vim kể từ năm 2015.
n611x007
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.