Получить номер строки начала / конца текущего абзаца - PullRequest
0 голосов
/ 06 декабря 2018

для сценария, который я сейчас пишу, я пытаюсь как можно быстрее получить номер строки начала / конца текущего абзаца.

Сначала я использовалline("'{") и line("'}"), но на самом деле это не работает в этом случае использования: 1. this is a 2. paragraph 3. 4. 5. this is another paragraph 6. that is below the first one

Действительно, когда курсор находится в строке 4, line("'{") возвращает 1, а line("'}") возвращает6, когда я хотел бы, чтобы это было что-то вроде 1/2 или 5/6

Я неохотно перемещаю курсор, чтобы получить желаемые результаты, так как эти операции будут выполненыкаждый раз, когда пользователь меняет абзац, а перемещение курсора происходит немного медленно.

Если кто-нибудь знает способ последовательного получения номеров строк начала и конца текущего абзаца, я был бы рад это услышать!

Надеюсь, мой вопрос был достаточно ясен!

1 Ответ

0 голосов
/ 06 декабря 2018

Определение абзацев в основном основано на пустых строках, хотя :help paragraph также упоминает некоторые (довольно неясные и унаследованные от vi) nroff макросы, которые могут определять абзацы.

  • Если вас не интересуют непонятные части, и вы просто основываете свое определение на пустых строках, вы можете использовать цикл :while вместе с empty(getline(lnum)), чтобы проверить наличие пустых строк и тем самым самостоятельно обнаружить абзацы.,Эта явная итерация полностью исключает перемещения курсора, но может быть медленной, если есть очень большие абзацы (охватывающие сотни строк).
  • Ваш текущий подход ломается, только если курсор в данный момент находится между абзацами.Вы можете явно проверить это (снова игнорируя неясные части), и только затем выполнить переход, например, через normal! {.
  • Самая простая (и только та, которая полностью корректна и для неясных частей) реализация всегдапрыгает вокругВнутри :function обновления экрана происходят только по требованию (через :redraw).Вам нужно сохранить и восстановить текущий вид, чтобы пользователь не заметил:
let l:save_view = winsaveview()
" Code that jumps around here.
call winrestview(l:save_view)

Если вы добавили префикс к вашим движениям с :noautocmd (или временно установили :help 'eventignore'), вы можете избежать запуска плагинов (которая может быть гораздо более дорогостоящей, чем перемещения внутреннего курсора Vim) (для события CursorMoved).

Сводка

Естьнесколько вариантов;какой из них вам подходит, зависит от ваших типичных данных и вариантов использования.

...