Trong vim, tìm kiếm ngược để tìm dấu ngoặc / parens phù hợp


9

Như hầu hết các bạn có thể biết, bạn có thể sử dụng %để tìm kiếm chuyển tiếp trên dòng để tìm nẹp / ngoặc / paren được ghép nối tiếp theo và di chuyển đến đối tác phù hợp của nó:

|a|rray[index] = value;
" |e| is the cursor; hit %:
array[index|]| = value;

Tôi hy vọng có một khóa tương tự tìm kiếm ngược trên dòng, ví dụ:

array[index] = value|;|
" |;| is the cursor again, hit the key I'm looking for:
array|[|index] = value;

Hầu hết các lệnh vim có cả ngược và xuôi, vì vậy có vẻ như điều này nên. Nó không có đối tác? Nếu vậy, có phải vì một khi vào nhân vật được ghép đôi, họ sẽ hành động giống nhau không?


Cần lưu ý rằng %không chỉ tìm kiếm khung được ghép nối trên cùng một dòng, mà tiếp tục xuống tệp. Tôi thích nó đặc biệt là các vòng lặp vv trong bất kỳ ngôn ngữ chương trình nào được lựa chọn.
Bernhard

1
@Bernhard Có, nhưng chỉ khi nó tìm thấy một trong những dấu ngoặc trên dòng.
Kevin

Nếu bạn không phản đối các tập lệnh addon, addon matchit cung cấp một g%lệnh có vẻ giống với những gì bạn đang tìm kiếm.
jw013

Ngớ ngẩn nhưng, câu hỏi của bạn nói rằng bạn muốn biết tại sao không có đối tác. Ý bạn là "có một số đối tác mà tôi không biết về?" :)
rjewell

@rjewell OK, tôi đã tách nó ra nên về mặt kỹ thuật không còn yêu cầu điều đó nữa.
Kevin

Câu trả lời:


4

Nếu bạn thực sự muốn tìm kiếm ngược các ký tự khớp phổ biến, bạn có thể sử dụng một trong các vimlệnh cụ thể sau:

  • [(... (đi đến (nhân vật chưa từng có trước đây )
  • [{... (đi đến {nhân vật chưa từng có trước đây )

Hai lệnh này có đối tác chuyển tiếp phù hợp:

  • ])... (đi đến )nhân vật chưa từng có )
  • ]}... (đi đến }nhân vật chưa từng có )

Có các lệnh tương tự khác cho #ifdefvà cho ý kiến ​​C.

Bạn có thể tìm thấy nhiều hơn khi vào vimbằng cách sử dụng lệnh :help %.


Tôi biết những điều này, vấn đề là họ tìm thấy những cặp chưa từng có , tôi cần tìm những cặp tương xứng .
Kevin

@Kevin: Tôi hiểu nhầm tài liệu (thở dài). Tất nhiên, một khi bạn đã sử dụng %thì nó đi cả hai chiều - tìm kiếm đối tác phù hợp. Ngoài ra, nếu bên trong một khối, thì các lệnh trên sẽ tìm thấy sự phù hợp.
Mei

3

% tìm khung phù hợp. Vì vậy, nếu bạn đang trên (hoặc {nó sẽ tìm kiếm về phía trước.

Nếu bạn đang ở trên một} hoặc) nó sẽ tìm kiếm ngược.

% không phải là định hướng, nó chỉ tìm khung phù hợp.


Nếu tôi đứng sau một bên của một cặp,% sẽ tìm thấy nó là đối tác. Nếu tôi ở cuối dòng, nó sẽ không tìm thấy cặp trước đó trên dòng.
Kevin

Không nên chọn câu trả lời đúng?
Jack

2

Tôi vừa thử :map ^] ^%%(với ^]= Ctrl+ v Ctrl+ 5ở đây, như một sự tương tự với %= Shift+ 5).

Nó hoạt động cho trường hợp cụ thể được cung cấp, nhưng vì nó không tìm kiếm ngược từ con trỏ, nên nó sẽ luôn chọn dấu ngoặc đơn mở đầu tiên trên dòng và để con trỏ của bạn ở đầu dòng nếu nó không tìm thấy bất kỳ kết quả khớp nào .


Đây là một giải pháp tốt hơn; nó xấu và có lẽ có rất nhiều chỗ để đơn giản hóa, nhưng tôi nghĩ rằng ngữ nghĩa là hoàn toàn chính xác (không di chuyển con trỏ nếu không có paren mở và di chuyển đến paren mở đầu tiên trước cột hiện tại).

:map ^] ^[:call search("[({[]", "bes", line("."))^M

cho

  • ^]= Ctrl+ v Ctrl+5
  • ^[= Ctrl+v Esc
  • ^M= Ctrl+v Return

Điều này sẽ không hoàn toàn giống nhau nếu có hai cặp không lồng nhau trên một dòng, nhưng chắc chắn đó là gợi ý tốt nhất cho đến nay, cảm ơn.
Kevin

Điều này sẽ chỉ hoạt động trong một khối, phải không? Nếu vậy, thì [(nó cũng sẽ hoạt động tốt và không yêu cầu a map.
Mei

Phải có một khối bắt đầu trên dòng hiện tại, vâng. Tôi đã tìm thấy một giải pháp hoàn chỉnh hơn, chỉnh sửa sắp tới ...
Vô dụng
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.