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
,之前的任何内容都不会显示。
通过注释第二个normal gg
并取消注释call setpos('.', [0,1,1,0])
,脚本可以按预期工作。
我的理解是normal gg
转到第一行的第一个非空白字符,在这种情况下,与call setpos('.', [0,1,1,0])
相同。
更令人困惑的是,取消注释这两行也不会起作用。
我的理解错误吗?我完全感到困惑。
答案 0 :(得分:0)
:normal gg
发生的事情取决于很多事情:
:noremap
;它使命令不受重新映射和递归的影响。如果有人拥有:nmap gg :quitall!<CR>
,则很可能退出Vim。:help 'startofline'
选项确定。:help :[range]
命令(对于第一行,:1
或在Vimscript中仅为1
)也观察到'startofline'
,但不会影响 jumplist < / em>。call setpos('.', ...
)是:call cursor(...)
的通用版本。两者都是低级函数,不受选项的影响,也不影响 jumplist 。如果您只想将光标定位在search()
上,这可能是最易读和最可靠的:
call cursor(1, 1) " Move to start of buffer.