Як я можу змусити "n" йти вперед, навіть якщо я почав пошук з "?" або "#"?


19

Vim має (принаймні) два набори команд, які шукають у протилежних напрямках. Введіть, /а потім шаблон буде шукати вперед через документ; введіть ?і тоді шаблон буде шукати назад. Такий же взаємозв'язок існує між командами *та #.

Що мені не подобається, що ці команди також задають напрямок пошуку для команд nта Nкоманд. Після використання /, nйде вперед по документу і Nйде в зворотному напрямку; після використання ?, nйде назад і Nйде вперед. (Іншими словами, nзавжди йде в тому ж напрямку, що і вихідний пошук, і Nзавжди йде в іншому напрямку.)

Як я можу змуситись nрухатися вперед через документ і Nрухатися назад, незалежно від того, в якому напрямку я почав шукати?

Відповіді:


29

Ви можете змінити поведінку nта Nшукати послідовно вниз / вгору, використовуючи наступне:

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

Оновлення: як це працює?

Для цього використовуються вирази-карти, які відображають lhs карти на вираз, який буде оцінено, щоразу, коли виникає lhs. Дивіться :h map-expressionу довідці.

Що відбувається, що змінна v: searchforward (яка визначає внутрішній стан, в якому напрямку був останній пошук, див. :h v:searchforward) Використовується як індекс для рядка перед нею. Так що у випадку першої карти, якщо останній напрямок пошуку був вперед, n буде відображено у 'n' (індекс 1, що означає повернути другий символ), а якщо він був зворотним, 'n' буде відображено у 'N' (оскільки змінна v: searchforward дорівнює 0, і тому 'N' буде повернуто.

Альтернативним способом написання цих карт буде (що може бути зрозумілішим):

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

Також є деякі плагіни, які роблять це (тобто плагін SearchRepeat і, можливо, інші).


Дякуємо, що згадали про мій плагін; Я як раз збирався рекомендувати це як альтернативу :-)
Інго Каркат

2
Розумне використання підписки!
wchargin

6
Не могли б ви додати пояснення? Я раніше не бачив цього синтаксису, і хотілося б знати, як він працює.
EvergreenTree

1
@EvergreenTree: Додано ще одне пояснення
Крістіан Брабандт

2
@ChristianBrabandt Це дуже розумно. Я ніколи не думав про те, щоб ти використовував v:searchforwardяк індекс.
EvergreenTree

1

На основі рішення Крістіана Брабандта я придумав

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

Ці відображення також підкоряються foldopenналаштуванню


0

Я використовую плагін SearchIndex . Щоб використовувати відповідь Крістіана Брабандта, але зберігати функціональність плагіна для відображення номера відповідності кожного разу, коли я ввожу nабо N, я вкладаю це у свій vimrc:

nnoremap <silent><expr> n (v:searchforward ? 'n' : 'N') . ":SearchIndex<CR>"
nnoremap <silent><expr> N (v:searchforward ? 'N' : 'n') . ":SearchIndex<CR>"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.