Text Vim搜索而不覆盖";/登记
我想在vimscript期间使用斜杠(Text Vim搜索而不覆盖";/登记,text,vim,latex,Text,Vim,Latex,我想在vimscript期间使用斜杠(/)进行搜索,但我不想覆盖“/寄存器。我该怎么做 在我的特定示例中,我正在处理LaTeX的自定义vim文本对象,a$,以指定上一个美元符号和下一个美元符号之间的区域($字符,用于在LaTeX中限定数学模式)。我正在遵循一个指南,该指南建议使用vnoremap和omap命令,这是一个非常简单的方法。我想写的是: vnoremap a$ :<C-U> execute "normal! ?\\$\rvN"<CR> omap a$ :norm
/
)进行搜索,但我不想覆盖“/
寄存器。我该怎么做
在我的特定示例中,我正在处理LaTeX的自定义vim文本对象,a$
,以指定上一个美元符号和下一个美元符号之间的区域($
字符,用于在LaTeX中限定数学模式)。我正在遵循一个指南,该指南建议使用vnoremap
和omap
命令,这是一个非常简单的方法。我想写的是:
vnoremap a$ :<C-U> execute "normal! ?\\$\rvN"<CR>
omap a$ :normal va$<CR>
vnoremap a$:执行“正常!”\\$\rvN“
omap a$:正常va$
但是,此实现有一个致命缺陷:
“/
寄存器被美元符号字符的搜索覆盖,清除了以前的任何搜索,并在尝试使用n
或n
下一步时造成混乱和效率低下 保存@/
。搜索。还原@/
。您可能无法将所有这些压缩到映射中,因此我建议使用函数:
function! VisualAroundDollar()
let search = @/
execute "normal! ?\\$\rvN"
let @/ = search
endfunction
vnoremap a$ :<C-U>call VisualAroundDollar()<CR>
omap a$ :normal va$<CR>
函数!美元
让搜索=@/
执行“正常!?\\$\rvN”
让@/=搜索
端功能
vnoremap a$:调用VisualRoundDollar()
omap a$:正常va$
<代码> > P>我可以建议考虑命令<代码> KePype < /Calp> < /P>
正如:h keeppatterns
所说的“执行{command},而不向搜索历史添加任何内容”,它可以帮助您构建映射如果$
始终在同一行上,那么通常最好使用f
&t
来创建自定义文本对象
xnoremap a$ :<c-u>normal! F$vf$"<cr>
onoremap a$ :normal va$<cr>
正如@ViVeteran所述,您也可以将:keeppatterns
与/
或?
一起使用,以避免更改搜索寄存器和历史记录
xnoremap :<c-u>execute "keeppatterns normal! ?\\$\<cr>v/\\$"<cr>
onoremap a$ :normal va$<cr>
My提供了这一点的实现。您可以使用普通搜索(/{pattern}
),但通过
而不是
来结束它(在GVIM中)。这将进行搜索,但保留原始搜索模式。它还有与内置的*
和#
搜索相对应的命令。我对vimscript比较陌生,因此,我也欢迎大家对编码风格提出意见和挑剔。将/
与keeppattern
相结合似乎只会将光标移动到包含匹配项的行的开头,而不会跳到匹配项的开头。它似乎还忽略了当前行上的匹配项。因此,:keepattern/
的行为与/
xnoremap :<c-u>execute "keeppatterns normal! ?\\$\<cr>v/\\$"<cr>
onoremap a$ :normal va$<cr>
:h Operator-pending
:h :map-modes
:h c_CTRL-U
:h search()
:h :keeppatterns