Vim - kéo vào thanh ghi tìm kiếm


80

Có cách nào dễ dàng / nhanh chóng để "kéo" vào thanh ghi "tìm kiếm cuối cùng" của vim ("/) không?

Từ tài liệu vim, có vẻ như câu trả lời là không, nhưng nó có thể được chỉ định thông qua lệnh "let":

It is writable with ":let", you can change it to have 'hlsearch' highlight
other matches without actually searching.  You can't yank or delete into this
register.

Lý tưởng nhất là những gì tôi muốn làm là:

"/5yw

sẽ kéo 5 từ tiếp theo dưới con trỏ và đặt chúng vào bộ đệm tìm kiếm cuối cùng

Ngoài ra, nếu có một cách để tìm kiếm nội dung của một sổ đăng ký được đặt tên, cách đó cũng sẽ hoạt động. Nói cách khác, nếu tôi có thể làm:

"A5yw

và sau đó tìm kiếm những gì trong thanh ghi A, điều đó cũng sẽ hoạt động.

Cách gần nhất mà tôi có thể đến là kéo vào một thanh ghi có tên và sau đó sao chép thanh ghi đó vào thanh ghi tìm kiếm cuối cùng, ví dụ:

"A5yw
:let @/=@A

Trước nguy cơ làm một câu hỏi dài hơn, tôi muốn nói rằng không phải lúc nào tôi cũng muốn "kéo và tìm kiếm" là 5 từ - đôi khi là 17 ký tự, đôi khi là ở cuối dòng, v.v. vì vậy một macro được mã hóa cứng không mang lại cho tôi sự linh hoạt mà tôi mong muốn.

Câu trả lời:


109

Sau khi nhấn /để nhập chuỗi tìm kiếm, bạn có thể sử dụng Ctrl-Rrồi nhập ký tự đại diện cho thanh ghi mà bạn muốn sử dụng.

ví dụ.

  • Đầu tiên, "Ayw để kéo một từ vào thanh ghi A
  • Sau đó, / ^R A đưa nội dung của thanh ghi A vào chuỗi tìm kiếm.

1
Điều này tất nhiên hiệu quả, nhưng có vẻ như OP có thể không thực sự muốn tìm kiếm, chỉ lấy phần đánh dấu. Nếu đúng như vậy, một toán tử tùy chỉnh sẽ là cách tốt nhất.
Cascabel

1
Siêu - cảm ơn ar ... đó chính xác là những gì tôi cần (tốt, dưới những ràng buộc mà giải pháp hoàn hảo thực sự không thể thực hiện được ngay từ đầu.) Cảm ơn vì giải pháp ngắn gọn.
Dan

11
Chỉ là một nhận xét ... "Ayw không kéo từ vào sổ đăng ký 'A' .... nó gắn thứ đang được kéo vào sổ đăng ký 'a'.
jkerian 10/12/10

1
+1 đã tìm kiếm điều này trong một thời gian, giải pháp hoàn hảo cho vấn đề tôi đang cố gắng giải quyết - cảm ơn.
iblamefish

8
Vì lý do rõ ràng - vim sử dụng trường hợp của sổ đăng ký để xác định xem nó gắn vào hay thay thế nội dung, vì vậy "ayw(chữ thường) sẽ thay thế nội dung của thanh ghi 'a', trong khi "Aywsẽ thêm vào đăng ký 'a'
Peter Gibson

39

Nếu bạn không sử dụng bất kỳ đăng ký nào để lưu trữ văn bản bị kéo dài, vim sử dụng 0đăng ký. Bạn có thể tìm kiếm điều đó bằng cách gõ Ctrl-R 0sau /.

Một ví dụ phức tạp hơn. Giả sử bạn muốn tìm kiếm trong một vùng đệm khác cho văn bản bên trong dấu ngoặc kép nằm dưới con trỏ ngay bây giờ:

  • Bạn có thể làm điều đó với yi"(kéo dấu ngoặc kép bên trong)
  • Chuyển đến vùng đệm nơi bạn muốn tìm kiếm
  • Kiểu /Ctrl-R 0

1
Tôi thấy giải pháp này hữu ích hơn giải pháp a'r vì liên tục tiến hành "Ayw tạo ra một chuỗi được nối thêm vào thanh ghi A. Nhưng chỉ cần gõ ywvà sau đó gõ Ctrl-R 0sau /luôn cho chính xác những gì tôi đã kéo.
David Jung

10

Tôi đang sử dụng mã sau cho điều đó:

vnoremap <silent>* <ESC>:call VisualSearch('/')<CR>/<CR>
vnoremap <silent># <ESC>:call VisualSearch('?')<CR>?<CR>

    function! VisualSearch(dirrection)
        let l:register=@@
        normal! gvy
        let l:search=escape(@@, '$.*/\[]')
        if a:dirrection=='/'
            execute 'normal! /'.l:search
        else
            execute 'normal! ?'.l:search
        endif
        let @/=l:search
        normal! gV
        let @@=l:register
    endfunction

Trong trường hợp không rõ ràng, điều này cho phép bạn chọn một số văn bản ở chế độ trực quan và sử dụng * hoặc # để tìm kiếm văn bản đó.
Edward Anderson

6

Tìm kiếm lựa chọn:

nếu bạn muốn kéo một phần của dòng trước tiên, sau đó sử dụng "v" và di chuyển bằng con trỏ cho đến khi bạn đánh dấu những gì bạn muốn, sau đó nhấn y để kéo và bây giờ lựa chọn đang ở trong thanh ghi 0

sau đó bạn có thể gõ /Ctrl-R 0


5

Vì vậy, về cơ bản là một phiên bản mở rộng của lệnh # và *, phải không? Có vẻ như bạn muốn xác định một toán tử tùy chỉnh (một lệnh mong đợi một chuyển động). Tôi chưa bao giờ thực sự làm điều này, nhưng tôi đã tìm thấy một plugin có vẻ như nó có thể giúp bạn làm như vậy dễ dàng hơn. Có một số ví dụ được cung cấp.

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.