Text Vim搜索而不覆盖";/登记

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

我想在vimscript期间使用斜杠(
/
)进行搜索,但我不想覆盖
“/
寄存器。我该怎么做

在我的特定示例中,我正在处理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