Vim - chọn văn bản được tô sáng bởi tìm kiếm?


53

Trong vim, tôi thường thực hiện các tìm kiếm để nhảy đến một từ hoặc cụm từ thay vì điều hướng ở đó với h/j/k/l. Sau đó, tôi nhấn nđể nhảy giữa các lần xuất hiện.

Nói rằng tôi đã có văn bản này:

Time flies like an arrow; fruit flies like a banana. - Groucho Marx

Tôi gõ /an arrowvà nhấn enter. Cụm từ đó được tô sáng, và tôi nhảy theo nó n.

Bây giờ tôi muốn trực quan chọn văn bản đó , có thể thay đổi nó hoặc xóa nó. (Vâng, tôi biết về :slệnh thay thế.)

Vì con trỏ của tôi nằm ở chữ "a" ở đầu "mũi tên", tôi có thể nhấn v, sau đó nhấn emột vài lần để tô sáng toàn bộ cụm từ. Nhưng tôi có cảm giác có một cách ngắn hơn và ngữ nghĩa hơn. Rốt cuộc, tôi đã chỉ định văn bản tôi quan tâm.

Làm cách nào tôi có thể soạn một lệnh để nói "chọn trực quan lựa chọn tìm kiếm hiện tại?"

Câu trả lời:


38

Bạn có thể sử dụng gntrong phiên bản 7.4 trở đi (và gNđể quay ngược). Nó thay thế cho v//emánh khóe.

Tìm kiếm phía trước cho mẫu tìm kiếm được sử dụng cuối cùng, như với `n` và bắt đầu chế độ Trực quan để chọn kết quả khớp.

Xem :help gnhoặc Vimcast này để biết thêm thông tin.


Điều này trùng lặp một nhận xét cho một câu trả lời khác và không hữu ích lắm. Nó có thể là một ý tưởng tốt nếu bạn trích dẫn tài liệu để câu trả lời của bạn có thể tự đứng vững.
bwDraco

2
Rất vui khi làm cho câu trả lời tốt hơn nhưng tôi không chắc liệu điều đó có giúp ích gì không. Câu hỏi đặt ra mục tiêu gọn gàng ("trực quan chọn kết quả tìm kiếm tiếp theo") và gnthực hiện chính xác như đã hỏi. Gửi nó như một câu trả lời riêng biệt nhấn mạnh rằng đó là một sự thay thế hoàn toàn cho v//e. Tôi chỉ chỉnh sửa câu trả lời của tôi để thêm tài liệu, điều đó có tốt hơn không?
David Lord

Điều đó thật tốt, cảm ơn. Nếu bạn cần giúp đỡ, hãy chắc chắn kiểm tra các tour du lịchtrung tâm trợ giúp . Chào mừng bạn đến với Super User và chúng tôi hy vọng bạn thích ở lại.
bwDraco

1
Tuyệt vời! Cảm ơn đã cập nhật chủ đề này với mới nhất và lớn nhất. :)
Nathan Long

29

Thử đi:

/an arrow
v//e

Nó đi vào chế độ trực quan, lặp lại tìm kiếm cuối cùng và chọn cho đến khi kết thúc.


1
Từ Vim 7.4 trở đi gncũng vậy (không thay đổi nnghĩa là gì )
smathy 19/11/14

8

Tôi thấy rằng v//ebản thân nó là không đủ vì sau khi bạn thoát khỏi chế độ trực quan, việc chuyển sang kết quả tìm kiếm tiếp theo / trước đó đặt con trỏ ở cuối kết quả, thay vì ở đầu như bạn thường mong đợi.

Để khắc phục điều này, trước tiên chúng ta nên nhảy đến cuối kết quả tìm kiếm ( //e) và sau đó chọn trực quan để bắt đầu ( v??):

" visually select a search result
nnoremap g/ //e<Enter>v??<Enter>

Chúc mừng.


Đối với tính đối xứng: nnoremap g? ??b<cr>v//e<cr>(thực hiện tương tự nhưng tìm kiếm ngược thay vì chuyển tiếp)
Kyle Strand

2

Hiện tại đã có plugin Vim-Search-Object giúp Vim coi các kết quả tìm kiếm là đối tượng văn bản thông thường, do đó bạn có thể chỉ cần va/(trực quan chọn một trận đấu) sau khi bạn thực hiện tìm kiếm.


1

Một cách "ngu ngốc" để làm điều đó là ánh xạ một khóa (trong trường hợp này là F5) như dưới đây:

nnoremap <F5> v/<c-r>=strpart(@/,1) . '/e+1'<CR><CR>

Sau khi /an arrowđạt F5.


Điều đó chọn thêm một nhân vật vì +1. Bỏ qua điều đó và nó sẽ chỉ chọn phần được tìm kiếm. Mặt khác, nnoremap <F5> v//e<CR>dường như chỉ hoạt động tốt.
Dennis Williamson

@Dennis Williamson, + 1 là cần thiết để chọn chính xác những gì đã tìm kiếm, nếu bạn xóa +1 thì ký tự cuối cùng sẽ không được chọn vì nó không chọn ký tự có con trỏ. Mọi cách nnoremap <F5> v // e <CR> đều tốt hơn nhiều.
Johnny

Nó không chọn nhân vật cho tôi. Nếu tôi nhấn xhoặc csau khi thực hiện F5nhưng không có +1toàn bộ chuỗi tìm kiếm, bao gồm cả ký tự bên dưới con trỏ, sẽ bị xóa.
Dennis Williamson

@Dennis Williamson, tôi mới biết rằng tùy chọn 'lựa chọn' của tôi được đặt thành "độc quyền", nhưng giá trị mặc định là "bao gồm". Đó là lý do tại sao nó làm việc cho bạn mà không +1. (Xem: lựa chọn trợ giúp)
Johnny
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.