Có lệnh nào trong Vim / Vi để di chuyển con trỏ đến cuối vùng đánh dấu tìm kiếm không?


84

Có lệnh nào trong Vim / Vi để di chuyển trong phân đoạn tìm kiếm đã chọn không?

Ví dụ: nếu tôi tìm kiếm một từ, có lệnh nào để di chuyển con trỏ đến cuối đoạn được đánh dấu không? Giả sử tôi có một từ, "FishTaco" và tôi muốn tìm kiếm tất cả các phiên bản của "Fish" và chèn một cái gì đó sau nó. Tôi biết tôi có thể thực hiện thay thế toàn cục, nhưng nếu tôi chỉ muốn thực hiện thay đổi trong một vài trường hợp không tuần tự thì sao?

Tôi có thể thấy nơi thuận tiện để có thể di chuyển con trỏ đến cuối đoạn được đánh dấu hiện tại để thực hiện một hành động.


3
Đây không phải là câu trả lời cho câu hỏi, nhưng để đạt được mục tiêu cuối cùng của bạn là thay thế tất cả Fishbằng FishTaco, bạn có thể làm :%s/Fish\(Taco\)\@!/&Taco/, điều này sẽ tìm thấy mọi thứ Fishchưa theo sau Tacovà thay thế nó bằng FishTaco. Kết hợp tìm kiếm theo kiểu phủ định với tìm kiếm thay thế bao gồm cụm từ phù hợp theo sau Taco.
Jim Stewart

@JimStewart Tôi không biết tại sao nhận xét này không có ít nhất nhiều +1 như câu trả lời. Đây là vim cấp ninja.
Vẫn còn.Tony

Câu trả lời:


133

Bạn có thể làm điều đó với điều này:

/Fish/e

/ecuối đặt con trỏ của bạn ở cuối vùng tìm kiếm (thay vì ký tự đầu tiên theo mặc định.


32
Lưu ý rằng bạn có thể thêm + n hoặc -n để đặt con trỏ n ký tự trước hoặc sau khi kết thúc.
Nathan Fellman

10
Cần lưu ý rằng sau khi thực hiện xong /Fishtìm kiếm, bạn có thể chuyển đến phần cuối //evà từ Vim 7.4, bạn có thể sử dụng gnđể đánh dấu trực quan kết quả tìm được.
smathy

Hãy xem cả câu trả lời @ghbarratt , nhiều tùy chọn hơn để định vị con trỏ trên kết quả phù hợp được đánh dấu.
Nima

81

Nếu bạn chỉ muốn đặt con trỏ sau ký tự cuối cùng của Cá thì bạn có thể sử dụng

/Fish/e+1

mà sẽ đặt con trỏ của bạn sau h. (Không có +1con trỏ sẽ kết thúc ở bên trái của ký tự cuối cùng.)

Nếu bạn đặc biệt quan tâm đến việc đặt con trỏ sau Fish, nhưng chỉ khi nó xuất hiện trong "FishTaco" thì bạn có thể thử một trong các tùy chọn sau:

Bạn có thể dùng

/FishTaco/s+4

và con trỏ của bạn sẽ kết thúc giữa Fish và Taco. Con /s+4trỏ đặt 4 vị trí sau khi bắt đầu cụm từ tìm kiếm.

Bạn cũng có thể sử dụng

/FishTaco/e-3

sẽ đặt con trỏ của bạn 3 vị trí bên trái của ký tự cuối cùng (kết thúc).

Bạn cũng có thể dùng

/FishTaco/b+4 

bởi vì /b+4sẽ được coi là /s+4.


13
Lời giải thích tuyệt vời, nhưng bây giờ tôi chỉ đói.
kenny

27

Nếu bạn đã tìm kiếm /Fish, bạn có thể nhanh chóng thay đổi tìm kiếm để đi đến cuối trận đấu qua //etìm kiếm này lặp lại tìm kiếm cuối cùng, nhưng thêm vào ebổ trợ đã được giải thích.


1
// e + số chính xác là những gì tôi đang tìm kiếm! tuyệt vời.
arkod

12

/ long-regexp1 \zs long-regexp2 / .. con trỏ sẽ dừng tại \ zs , hãy xem: help \ zs


11

Khi bạn có một lựa chọn trực quan, bạn có thể sử dụng ođể chuyển đổi vị trí con trỏ giữa đầu và cuối của khối đã chọn. Khi lựa chọn theo dòng, điều này sẽ chuyển đổi vị trí dòng , có nghĩa là con trỏ di chuyển đến dòng bắt đầu và kết thúc của lựa chọn nhưng không di chuyển đến ký tự bắt đầu hoặc kết thúc. Khi việc lựa chọn phù hợp với tính cách thì chuyển động cũng phù hợp với tính cách.

Bạn cũng có thể sử dụng `<`>để chuyển đổi con trỏ giữa phần đầu và phần cuối của khối trực quan, tuy nhiên, điều này ảnh hưởng đến chính vùng chọn, vì vậy nó được sử dụng để đặt lại hoặc điều chỉnh giới hạn lựa chọn.

Chỉnh sửa: À, nhưng đối với điểm nổi bật tìm kiếm, điều này sẽ không hoạt động, vì osẽ bắt đầu chèn dòng. Tôi đoán điểm nổi bật tìm kiếm không giống như một lựa chọn trực quan, xin lỗi :)


Tôi cũng không biết điều đó. Điều này là tuyệt vời để sửa đổi đầu của một lựa chọn mà không cần bắt đầu lại. (ví dụ: bạn bắt đầu lựa chọn một từ quá sớm hoặc quá muộn)
Timothée Boucher

8

Phần "con trỏ ở cuối trận đấu" trong câu hỏi của bạn đã được trả lời.

Bạn có thể làm được :%s/Fish/FishTaco/c. Điều này mang lại cho bạn cơ hội xác nhận hoặc từ chối mọi sự thay thế và bỏ qua toàn bộ nghiệp vụ "con trỏ ở cuối trận đấu".


Mẹo tuyệt vời. Nếu tôi nhập 'y', nó chỉ thực hiện thay thế vào đầu tiên. Làm cách nào để xác nhận nó cho từng cái?
Jordan Parmer

1
Nó chuyển sang trận đấu tiếp theo và đợi bạn nhập yhoặc nv.v. cho đến khi không còn kết quả phù hợp nào. Để chấp nhận tất cả các thay thế khác, hãy nhập a, để từ chối chúng, hãy nhập q.
romainl

1
Trên thực tế, tôi đã bỏ lỡ gsau trận chung kết /nên nó không tiếp tục trong dòng của tôi. Cảm ơn vì tiền hỗ trợ.
Jordan Parmer
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.