Являются ли "normal gg" и "call setpos ('.', [0,1,1,0])" одинаковыми в vimscript? - PullRequest
0 голосов
/ 05 ноября 2018

Vimscript (vim 8.1.511):

normal gg
if search('^<p>[^A-Z“<]', 'Wc') > 0
    echon "\n:: Line " . line('.') . ' ' . getline('.')
endif

normal gg
" call setpos('.', [0,1,1,0])
if search('[a-z,;]</p>$', 'Wc') > 0
    echon "\n:: Line " . line('.') . ' ' . getline('.')
endif

Бег на этом:

<p>Abc for</p>
<p>abc for.</p>

и вывод всегда второй echon, ничего до этого никогда не показывается.

Комментируя 2-й normal gg и раскомментируя call setpos('.', [0,1,1,0]), скрипт работает как положено.

Насколько я понимаю, normal gg переходит к первому непустому символу в 1-й строке, в данном случае так же, как call setpos('.', [0,1,1,0]).

Еще более запутанным является то, что раскомментирование обеих строк также не сработает.

Мое понимание неверно? Я в полном замешательстве.

1 Ответ

0 голосов
/ 05 ноября 2018

Что происходит с :normal gg, зависит от многих вещей:

  • Вы должны использовать :noremap; это делает команду невосприимчивой к переназначению и рекурсии. Если у кого-то есть :nmap gg :quitall!<CR>, он вполне может выйти из Vim.
  • Столбец курсора определяется параметром :help 'startofline'.

Альтернативы

  • Команда :help :[range] (для первой строки, :1 или просто 1 в Vimscript) также учитывает 'startofline', но она не влияет на jumplist .
  • call setpos('.', ...) - это общая версия :call cursor(...). Обе функции являются низкоуровневыми, не зависят от параметров и не влияют на jumplist .

Если все, что вам нужно, это позиционировать курсор для search(), это, вероятно, самый читаемый и надежный:

call cursor(1, 1)   " Move to start of buffer.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...