Xóa cho đến khi kết thúc bên phải của khối bên trong hiện tại


21

Hãy nói rằng tôi có một mã như thế này ( |đại diện cho vị trí con trỏ ):

func1(x|, func2(), y); 

Tôi muốn có được:

func1(x|);

Có cách nào để xóa mã từ vị trí của con trỏ đến vị trí trước đầu bên phải của khối bên trong hiện tại không?

Tôi biết rằng tôi có thể đi cùng dt).nhưng tôi tự hỏi liệu có cách nào để trộn nó với những gì di)không.


1
Tôi muốn biết liệu có một cách dễ dàng để "xóa nửa bên trái / bên phải của khối bên trong / bên ngoài", như bạn đã hỏi. Nhưng như một lưu ý phụ, tôi có thể sẽ làm C);trong trường hợp cụ thể này.
Shahbaz

1
Đôi khi %chuyển động có thể làm những gì bạn đang tìm kiếm (tức là d%).
alxndr

Câu trả lời:


29

tôi sẽ dùng

d])

có nghĩa là xóa ( d) sang lần tiếp theo chưa từng có ')' ( ])).

Xem :help ]).


5

Chuyển động chỉ đi theo một hướng trong khi các đối tượng văn bản chỉ đi theo hai hướng.

Điều này có nghĩa là bạn không thể có một nửa đối tượng văn bản trừ khi bạn tạo một chuyển động chờ xử lý tùy chỉnh sử dụng đối tượng văn bản đó dưới mui xe hoặc bắt chước hành vi của nó.

Trong ví dụ của bạn, văn bản được bao phủ bởi i)khá dễ hình dung:

func1(x, func2(), y);
      ^^^^^^^^^^^^^

nhưng làm thế nào bạn sẽ bảo Vim hoạt động từ con trỏ đến cuối văn bản đó? Người ta sẽ cần phải tạo các toán tử tùy chỉnh như obi)oei)(ví dụ bán ngẫu nhiên).

" ()
onoremap oei) :normal! vi)o``<CR>
onoremap obi) :normal! vi)``<CR>

" []
onoremap oei] :normal! vi]o``<CR>
onoremap obi] :normal! vi]``<CR>

" {}
onoremap oei} :normal! vi}o``<CR>
onoremap obi} :normal! vi}``<CR>

" ""
onoremap oei" :normal! vi"o``<CR>
onoremap obi" :normal! vi"``<CR>

" ''
onoremap oei" :normal! vi'o``<CR>
onoremap obi" :normal! vi'``<CR>

4
Sẽ rất thú vị khi tạo một chuyển động chung sử dụng lại tất cả các đối tượng văn bản đã được xác định, kết hợp với vị trí con trỏ hiện tại; ví dụ, thay vì ib, imbbên phải và iMbbên trái, v.v. (tự động).
VanLaser

3

Đối với trường hợp cụ thể này, tôi sẽ dfy

Đối với trường hợp chung:

  • dT( xóa từ con trỏ đến đầu khối
  • vib chọn phần còn lại của khối bên trong
  • p thay thế khối bên trong bằng những gì bạn vừa xóa

Bạn có thể làm cho nó thành một bản đồ.

 :map K dt(vibp

3

Các câu trả lời hiện có khác đều phụ thuộc vào định nghĩa và phát hiện khối của vim. Chiến lược của tôi cho loại xóa này là sử dụng clệnh kết hợp với fchuyển động và nhân vật thực tế để dừng lại. Điều này sau đó sẽ thực sự xóa ký tự dừng, nhưng vì đó cũng là phím cuối cùng bạn nhấn lặp lại, hai lần có chi phí bằng 0 và sẽ chèn lại nó khi cthay đổi chế độ chèn.


Để giải thích với các ví dụ, cho

func1(x|, func2(), y); 

lệnh c2f))sẽ đưa ra

func1(x)|;

lúc đầu có vẻ kém thanh lịch hơn một số câu trả lời khác, tuy nhiên lưu ý rằng chiến lược này là phổ biến và không phụ thuộc vào bất kỳ định nghĩa khối nào.


Ví dụ với

<div| class="some-class">text</div>

lệnh cf>>sẽ đưa ra

<div>|text</div>

Hoặc khi chỉnh sửa tập tin csv như

2016-11-29,question,vi|.stackexchange.com,10435

lệnh cf,,sẽ đưa ra

2016-11-29,question,vi,|10435

Tôi thường sử dụng điều này để xóa phần còn lại của chuỗi, từ

printf("Hello world| - a boring example\n");

đến

printf("Hello world\|n");

với cf\\

hoặc từ

print("Hello world| - a boring example");

đến

print("Hello world"|);

với cf"".


Điều này không thay đổi vị trí hiện tại thành một nơi hơi khác so với yêu cầu và cũng thay đổi thành chế độ chèn. Nhưng tôi muốn chia sẻ giải pháp đi để xóa phần còn lại của mọi thứ.


1
Vấn đề với cfgiải pháp là tôi phải chỉ định ký tự mà tôi muốn dừng xóa. Các câu hỏi hỏi phải làm gì nếu bạn không thể đơn giản làm cf)vì có một câu hỏi khác )trước khi )bạn thực sự muốn tiếp cận (ví dụ khi bạn muốn thay đổi func(x|, g(x, x), x, x, g(x, x))thành func(x)). Về cơ bản, tôi muốn biết nếu tôi có thể tránh nhấn .sau cf).
Mateusz Piotrowski

Lưu ý rằng bạn cũng có thể sử dụng tthay vì fxóa tối đa nhưng không bao gồm ký tự đã cho, vì vậy đối với ví dụ đầu tiên của bạn ( func1(x|, func2(), y);), bạn chỉ có thể sử dụng d2t). Như @MateuszPiotrowski đã đề cập, đây không phải là một giải pháp chung và đòi hỏi bạn phải biết nhân vật nào bạn muốn xóa. Như bạn thường biết nhân vật nào kết thúc khối mà bạn tham gia cho một ngôn ngữ nhất định, điều đó không quá tệ.
Haegin

3

Các vim-ninja-chân cắm có thể là những gì bạn đang tìm kiếm. Theo những gì tôi hiểu, nó thực hiện d[d]thành "xóa từ con trỏ đến bắt đầu / kết thúc đối tượng văn bản", do đó d]i)nên "xóa cho đến hết dấu ngoặc đơn xung quanh".

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.