Làm cách nào tôi có thể có được 'n' để đi tiếp ngay cả khi tôi bắt đầu tìm kiếm với '?' hoặc là '#'?


19

Vim có (ít nhất) hai bộ lệnh tìm kiếm theo hướng ngược nhau. Nhập /và sau đó một mẫu sẽ tìm kiếm chuyển tiếp qua tài liệu cho mẫu; gõ ?và sau đó một mô hình sẽ tìm kiếm lạc hậu. Mối quan hệ tương tự tồn tại giữa các lệnh *#.

Điều tôi không thích là các lệnh này cũng đặt hướng tìm kiếm cho các lệnh nN. Sau khi sử dụng /, nđi tiếp qua tài liệu và Nđi lùi; sau khi sử dụng ?, nđi lùi và Nđi về phía trước. (Nói cách khác, nluôn đi cùng hướng với tìm kiếm ban đầu và Nluôn đi theo hướng khác.)

Làm cách nào tôi có nthể đi tiếp qua tài liệu và Nđi ngược lại, bất kể tôi bắt đầu tìm kiếm theo hướng nào?

Câu trả lời:


29

Bạn có thể thay đổi hành vi của nNđể tìm kiếm liên tục xuống / lên bằng cách sử dụng như sau:

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

Cập nhật: Nó hoạt động như thế nào?

Điều này sử dụng bản đồ biểu thức, ánh xạ các lhs của bản đồ thành một biểu thức sẽ được đánh giá, mỗi khi gặp phải các lhs. Xem :h map-expressiontrong trợ giúp.

Điều gì xảy ra là, biến v: searchforward (xác định trạng thái bên trong của hướng tìm kiếm cuối cùng, xem :h v:searchforward) được sử dụng làm chỉ mục cho chuỗi phía trước nó. Vì vậy, trong trường hợp bản đồ thứ nhất, nếu hướng tìm kiếm cuối cùng được chuyển tiếp, n sẽ được ánh xạ thành 'n' (chỉ số 1, nghĩa là trả về ký tự thứ hai) và nếu ngược lại, 'n' sẽ được ánh xạ tới 'N' (vì biến v: searchforward là 0 và do đó 'N' sẽ được trả về.

Một cách khác để viết những bản đồ đó sẽ là (có thể rõ ràng hơn):

nnoremap <expr> n (v:searchforward ? 'n' : 'N')
nnoremap <expr> N (v:searchforward ? 'N' : 'n')

Ngoài ra còn có một số plugin, thực hiện điều đó (tức là plugin SearchRepeat và có thể cả các plugin khác).


Cảm ơn đã đề cập đến plugin của tôi; Tôi chỉ định giới thiệu nó như một cách thay thế :-)
Ingo Karkat

2
Khéo léo sử dụng đăng ký!
wchargein

6
Bạn có thể vui lòng thêm một lời giải thích? Tôi chưa từng thấy cú pháp này trước đây và tôi muốn biết nó hoạt động như thế nào.
EvergreenTree

1
@EvergreenTree: Đã thêm một số giải thích
Christian Brabandt

2
@ChristianBrabandt Điều đó rất thông minh. Tôi không bao giờ nghĩ về bạn sử dụng v:searchforwardnhư là một chỉ số.
EvergreenTree

1

Dựa trên giải pháp của Christian Brabandt, tôi đã đưa ra

nnoremap <expr> n 'Nn'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')
nnoremap <expr> N 'nN'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')

Những ánh xạ này cũng tuân theo các foldopenthiết lập


0

Tôi đang sử dụng plugin SearchIndex . Để sử dụng câu trả lời của Christian Brabandt nhưng vẫn giữ chức năng hiển thị số khớp của mỗi lần tôi nhập nhoặc N, tôi đặt nó trong vimrc của mình:

nnoremap <silent><expr> n (v:searchforward ? 'n' : 'N') . ":SearchIndex<CR>"
nnoremap <silent><expr> N (v:searchforward ? 'N' : 'n') . ":SearchIndex<CR>"
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.