2011-08-24 37 views
16

Nói rằng tôi có dòng này của văn bản trong vim:Xóa từ con trỏ đến cuối ngoặc (vv) trong vim

(foo bar (baz) qux) 
    ^

và con trỏ của tôi là vào khoảng trống giữa foobar như đã nêu. Tôi thường thấy rằng, trong các tình huống như thế này, tôi muốn xóa toàn bộ bên phải của biểu thức được viết ngoặc đơn bên ngoài (nghĩa là, ở bên phải con trỏ của tôi), trong khi vẫn giữ nguyên phần bên trái. Đó là, tôi muốn kết thúc với:

(foo) 

Thông thường, tôi muốn thực hiện điều này với dt) ("xóa cho đến khi )"), nhưng việc bổ sung một ngoặc lồng nhau những điều phức tạp: lệnh đó sẽ để lại tôi với (foo) qux). Tôi cũng có thể sử dụng d2t), nhưng tôi không muốn phải tự đếm số lượng dấu ngoặc ôm lồng nhau. Tôi cũng có thể sử dụng di), nhưng xóa toàn bộ toàn bộ bên trong dấu ngoặc đơn, để lại cho tôi ().

Có chuyển động vim nào với nhận thức về số dư của i- and a-modified motions nhưng có liên quan đến vị trí con trỏ hiện tại không?

Trả lời

14

Bạn có thể sử dụng chuyển động ]) với d.

d]) 
+0

Tôi không biết về '])'; đó là chắc chắn đơn giản hơn giải pháp của tôi (nhưng tôi vẫn nên làm việc cho các phiên bản không vim của vi). –

+0

@Keith Thompson: Giải pháp của bạn chắc chắn là vi tương thích mà là tốt đẹp.Nỗi sợ của tôi với giải pháp của bạn là nó phụ thuộc vào 'F (' tìm kiếm thích hợp '(' để nhảy tới. Tôi nghĩ tôi thích làm 'df)' và lặp lại w/'.' và sau đó là' a) ' . Hoặc 'mxF (' sau đó lặp lại 'F' chuyển động với', 'cho đến khi chính xác' ('được tìm thấy sau đó' '% d'x'' –

+0

Vâng, tôi chỉ nghĩ về một trường hợp mà giải pháp của tôi sẽ không hoạt động:' ((trước) foo^(sau)) '.' F ('hoặc'? ( 'sẽ tìm dấu ngoặc trái trước' trước', không phải dấu ngoặc đơn gần nhất bao quanh vị trí con trỏ. (Tôi nhớ một ': set lisp 'lệnh từ nhiều năm trước. Tôi thấy vim vẫn có nó. Nó làm gì? Yeah, tôi nên RTFM.) –

3
mxF(%d`x 

Breaking nó xuống:

mx 

Đặt một dấu x (chọn bất kỳ thư bạn thích)

F(

Tìm trước đó ( nhân vật

% 

Chuyển đến phù hợp với )

d`x 

Xóa từ đây để đánh dấu x

đó làm việc đối với trường hợp cụ thể của bạn; Tôi không chắc nó nói chung như thế nào. Nếu trước đó ( không nằm trên dòng hiện tại, hãy sử dụng ?(<return> thay vì F(.

EDIT:
Tôi không đề cập đến d]) vì tôi không biết.

Giải pháp của tôi sẽ không làm việc cho trường hợp này:

((before) foo (after)) 
      ^

vì nó nhảy trở lại gần nhất (, không phải là khu vực gần kèm(.

Các vấn đề liên quan