Làm thế nào tôi có thể tự động tập trung vào kết quả tìm kiếm đầu tiên?


7

Tôi muốn có kết quả tìm kiếm đầu tiên tập trung vào màn hình. Tôi biết về :nnoremap n nzzánh xạ, nhưng nó chỉ hoạt động để định tâm các trận đấu tiếp theo , không phải lần đầu tiên.

Tôi nghĩ rằng có lẽ tôi có thể sử dụng một số AutoCmd, nhưng tôi chưa tìm thấy một sự kiện thích hợp.

Câu trả lời:


14

Bạn có thể sử dụng ánh xạ sau:

cnoremap <expr> <CR> getcmdtype() == '/' ? '<CR>zz' : '<CR>'

Điều này có thể được giải thích như thế này:

  • cnoremap Tạo ánh xạ trong chế độ dòng lệnh
  • <expr> Ánh xạ sẽ đánh giá một biểu thức (cho phép sử dụng điều kiện)
  • <CR> Chìa khóa để ánh xạ lại ( Enter)
  • getcmdtype() Trả về một ký tự cho biết chế độ dòng lệnh nào được sử dụng
  • == '/' Đã getcmdtype()trả lại /có nghĩa là chúng ta đang ở chế độ tìm kiếm?
  • '<CR>zz' Nếu chúng ta đang ở chế độ tìm kiếm, hãy thực hiện zzsau khi nhấn<CR>
  • '<CR>' Khác chỉ thực hiện <CR>

Chủ đề trợ giúp liên quan:


EDIT Lưu ý rằng sẽ rất thú vị khi tạo một ánh xạ hoạt động với cả tìm kiếm tiến và lùi tức là khi getcmdtype()quay lại /hoặc ?. Đây là ánh xạ để làm điều đó:

cnoremap <expr> <CR> (getcmdtype() == '?' \|\| getcmdtype() == '/') ? '<CR>zz' : '<CR>'

Lưu ý việc thoát các |ký tự: nếu chúng không thoát, vim sẽ hiểu cnoremap <expr> <CR> (getcmdtype() == '?'là lệnh đầu tiên được thực thi theo sau getcmdtype() == '/') ? '<CR>zz' : '<CR>'mà không có nghĩa và tạo ra lỗi.


EDIT 2 @Antony đã đề xuất một giải pháp dễ đọc hơn, nhờ anh ấy:

cnoremap <expr> <CR> getcmdtype() =~ '[/?]' ? '<CR>zz' : '<CR>'

3
Có lẽ getcmdtype() =~ '[?/]'sẽ dễ dàng hơn một chút.
Antony

@Antony Quả thực là tốt hơn nhiều, tôi đã chỉnh sửa câu trả lời của mình. Cảm ơn bạn!
statox

2
Tuyệt vời! Chỉ cần những gì tôi cần, cảm ơn bạn! Và cảm ơn vì đã giải thích chi tiết, chúng rất hữu ích cho việc học vimscript.
Jan Warchoł

Gần đây có một vấn đề với việc sử dụng /như một chuyển động: ví dụ: c/searchsẽ thay đổi từ vị trí hiện tại của tôi sang vị trí phù hợp tiếp theo search, nhưng vì cnoremap, chèn văn bản zz. Suy nghĩ về một cách giải quyết, hoặc tôi nên loại bỏ ánh xạ?
D. Ben Knoble

1
@DavidBenKnoble thực sự là một vấn đề tôi không nghĩ tới. Tôi sẽ cố gắng tìm một cách giải quyết và chỉnh sửa câu trả lời của tôi nếu tôi tìm thấy.
statox

5

Câu trả lời của Statox chắc chắn là tốt nhất cho đến nay, nhưng như một cách thay thế, tôi mới tìm hiểu về Vim-slash , một plugin nhằm mục đích "nâng cao trải nghiệm tìm kiếm trong bộ đệm."

Và từ đó là readme:

Tùy biến

zz sau khi tìm kiếm

Đặt trận đấu hiện tại ở trung tâm của cửa sổ.

noremap <plug>(slash-after) zz

Chỉ cần thử nó và nó hoạt động trơn tru theo cả hai hướng ( /?).

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.