2013-08-30 25 views
7

Tôi hầu như luôn tìm kiếm trong Vim với / và sau đó tiếp tục tìm kiếm chuyển tiếp với n và ngược lại với N. Tuy nhiên, đôi khi, tôi sử dụng ? để chuyển đến một mục chỉ một vài dòng phía trên dòng tôi hiện đang ở và trong trường hợp đó, nếu tôi muốn tìm kiếm cùng một mục, tôi phải sử dụng N thay vì n, gây phiền nhiễu về tốc độ tinh thần.Làm cho 'n' luôn tìm kiếm chuyển tiếp, bất kể có hay không? đã được sử dụng để tìm kiếm

Vì vậy, câu hỏi của tôi là: có thể thực hiện n luôn chuyển tiếp và N ngược?

P.S. Tài liệu dường như gợi ý rằng điều đó là không thể, vì n chỉ cần "Lặp lại" mới nhất "/" hoặc "?" [Đếm] lần ", nhưng ai biết được.

Trả lời

9

Điều này được lấy từ ZyX's post trên danh sách gửi thư vim.

noremap <expr> n 'Nn'[v:searchforward] 
noremap <expr> N 'nN'[v:searchforward] 

Nó bản đồ n đến N gốc hoặc n dựa tắt của biến v:searchforward bởi indexing 'Nn' như một danh sách của hai yếu tố. Điều này chỉ hoạt động vì ánh xạ là không đệ quy. Nếu nó được đệ quy, điều này sẽ gọi nó là tự và bạn sẽ ở trong một vòng lặp vô hạn.

Khi v:searchforward == 1 (tìm kiếm về phía trước) ánh xạ tương đương với

noremap <expr> n n 
noremap <expr> N N 

và khi v:searchfoward == 0 (tìm kiếm ngược) ánh xạ tương đương với

noremap <expr> n N 
noremap <expr> N n 

lập bản đồ này hoạt động tại Normal, Visual, và Chế độ chờ xử lý.


Tôi có thể đã viết nó như thế này. (Mặc dù tôi không chắc chắn điều này là rõ ràng hơn)

noremap <expr> n (v:searchforward ? 'n' : 'N') 
noremap <expr> N (v:searchforward ? 'N' : 'n') 
+0

Whoa, đó là một bản đồ khéo léo. – dorserg

+0

Nhân tiện, khi chủ đề này xuất hiện, tôi có giải pháp mới cho “Bạn nói đúng, nhưng ngay từ đầu tôi muốn /pattern d // e (nhấn Enter khi cần) để có thể lặp lại với nnnn ”khiếu nại. – ZyX

6

Đó chỉ là cách nó được, mặc dù một số cuộc tranh luận về danh sách gửi thư của nhà phát triển ...

Đây là những gì bạn có thể làm gì về nó:

:noremap n /<CR> 
:noremap N ?<CR> 

liên quan chủ đề mailing list với rất nhiều thông tin thú vị hơn: https://groups.google.com/d/msg/vim_dev/8jSoA931P2Y/JklYtxFOiAYJ

+0

Tôi dường như không đánh dấu cờ '/ e'. – FDinoff

+0

Ah, bạn nói đúng, tôi đã nhầm lẫn nó với ': s' và không kiểm tra đủ. Tôi tự hỏi nếu có một vấn đề khác, giải pháp có vẻ gần như quá đơn giản ... – glts

+0

Tôi thích câu trả lời của Zyx ở cuối luồng. (Và nơi tôi đã đi nếu tôi có thể tìm thấy biến đó nếu bạn chưa đăng đầu tiên) 'noremap n 'Nn' [v: searchforward]' và 'noremap N 'nN' [v: searchforward]' – FDinoff

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