2012-05-18 27 views
10

Đôi khi tôi muốn tìm kiếm và thay thế bằng Vim bằng định dạng s/search_for/replace_with/options, nhưng phần search_for trở thành một regex phức tạp mà tôi không thể có được ngay lần đầu tiên.Làm cách nào để tìm kiếm và thay thế hiệu quả trong Vim bằng phần "tìm kiếm" hoặc "xem trước" đầu tiên?

Tôi có set incsearch hlsearch trong số .vimrc vì vậy Vim sẽ bắt đầu làm nổi bật khi tôi nhập khi tôi đang tìm kiếm bằng định dạng /search_for. Điều này rất hữu ích cho lần đầu tiên "kiểm tra"/"xem trước" regex của tôi. Sau đó, một khi tôi nhận được regex tôi muốn, tôi áp dụng cho các s/ để tìm kiếm và thay thế.

Nhưng có hai hạn chế lớn đối với cách tiếp cận này:

  1. Đó là một rắc rối để sao chép và dán regex Tôi tạo ra trong chế độ / sang chế độ s/.
  2. Tôi không thể xem trước với các nhóm phù hợp trong regex (ví dụ: ()) hoặc sử dụng chế độ ảo \v trong khi ở /.

Vậy làm cách nào các bạn trên SO cố gắng thực hiện tìm kiếm regex phức tạp và thay thế bằng Vim?

+0

'/ c' là hữu ích, làm cho tôi tự tin tôi không vít điều quá tồi tệ. – sarnold

+0

Tôi sử dụng "hoàn tác" để đạt được điều này. Nếu mẫu tìm kiếm của tôi không đúng định dạng, tôi sẽ hoàn tác thao tác. – jahroy

Trả lời

16

Kiểm tra regex của bạn ở chế độ tìm kiếm với /, sau đó sử dụng s//new_value/. Khi bạn không chuyển phần nào vào phần tìm kiếm của s, nó sẽ tìm kiếm gần đây nhất.

Như @Sam Brink cũng cho biết, bạn có thể sử dụng <C-r>/ để dán nội dung của thanh ghi tìm kiếm, vì vậy, s/<C-r>//new_value/ cũng hoạt động. Điều này có thể thuận tiện hơn khi bạn có biểu thức tìm kiếm phức tạp.

+0

Được rồi vì vậy khi tôi tìm kiếm bằng '/', khi tôi thực hiện 's // new_value /', nó chỉ thay thế giá trị được tìm kiếm đầu tiên. Ngay cả với 's // new_value/g' nó vẫn chỉ thay thế giá trị đầu tiên. Tôi cũng không thể sử dụng regex được nhóm phù hợp như '\ 1' và' \ 2' bằng phương pháp này. – hobbes3

+0

Nevermind, @Jonathan Leffler đã trả lời câu hỏi của tôi. – hobbes3

6

Như đã lưu ý, bạn có thể thực hành phần tìm kiếm với /your-regex-here/. Khi hoạt động chính xác, bạn có thể sử dụng s//replacement/ để sử dụng tìm kiếm mới nhất.

Khi bạn đã thực hiện điều đó một lần, bạn có thể sử dụng & để lặp lại lệnh s/// cuối cùng, ngay cả khi bạn đã thực hiện các tìm kiếm khác nhau kể từ đó. Bạn cũng có thể sử dụng :&g để thực hiện thay thế trên toàn cầu trên dòng hiện tại. Và bạn có thể sử dụng :.,$&g để thực hiện tìm kiếm trên tất cả các kết quả phù hợp giữa đây (.) và cuối tệp ($), trong số một nhóm các khả năng khác.

Bạn cũng, tất nhiên, sẽ hoàn tác nếu thao tác không hoạt động như bạn mong đợi.

+0

Trong trường hợp không rõ ràng, ': 1, $ & g' thực hiện thay thế trên mỗi dòng. '1, $' có nghĩa là từ dòng 1 đến cuối tệp. – hobbes3

+0

Rất tiếc, tôi vừa phát hiện ra ':%' có nghĩa là giống như ': 1, $'. Tôi đã sử dụng nó trước đây cho ':% s/replace/with_this/g' mà không nhận ra ý nghĩa của nó. – hobbes3

5

Như những người khác đã lưu ý tôi thường sử dụng s//replacement/ để thực hiện các thay thế của mình nhưng bạn cũng có thể sử dụng <C-r>/ để dán nội dung vào sổ đăng ký tìm kiếm. Vì vậy, bạn có thể sử dụng s/<C-r>//replacement/ trong đó <C-r>/ sẽ dán tìm kiếm của bạn và bạn có thể thực hiện bất kỳ thay đổi phút cuối nào bạn muốn.

<C-r> chèn các nội dung của một thanh ghi nơi con trỏ là
Sổ / giữ thuật ngữ tìm kiếm gần đây nhất
:registers sẽ hiển thị nội dung của tất cả các đăng ký, do đó bạn có thể xem những gì có sẵn.

+0

'C-r' thường cũng có thể dán từ bất kỳ thanh ghi nào. – Daenyth

+0

cảm ơn vì đã chỉ ra điều đó, thêm chi tiết bổ sung về '' –

1

Kể từ Neovim 0.1.7 có Gia tăng (“trực tiếp”): thay thế chức năng. (do đó, điều này chỉ hoạt động trong Neovim!)

Để kích hoạt nó thiết lập các tùy chọn incommand:

:set inccommand=split 

Nó đã được công bố ở đây: https://neovim.io/news/2016/11/

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