首页 > 解决方案 > 是什么导致 vim exec 所需的 `\` 数量不对称?

问题描述

考虑以下文件,该文件是从Learn Vimscript the Hard Way 中无耻窃取的。

Topic One
=========

This is some text about topic one.

It has multiple paragraphs.

Topic Three
--------

Hello World
Topic Two
=========

This is some text about topic two.  It has only one paragraph.

假设我试图在两种类型的标题上方查找文本,并编写以下表达式。

:onoremap <buffer> ih :<c-u>execute "normal! ?^\\(==\\+\\|--\\+\\)$\r:nohlsearch\rkvg_"<cr>

此映射不起作用,似乎是因为表达式\\|转换为|. 另一方面,以下映射确实有效。

:onoremap <buffer> ih :<c-u>execute "normal! ?^\\(==\\+\\\\|--\\+\\)$\r:nohlsearch\rkvg_"<cr>

这似乎非常违反直觉,因为\(可以\\(在字符串中表示,并且\+可以\\+在字符串中表示。

为什么\|需要\\\\|代表?

我正在尝试为这个原因建立一个心理模型,这样我就可以对未来的这种情况进行推理。

标签: vim

解决方案


双引号内的反斜杠只需要转义一次,这样就可以"\\("'\"。然而|,需要转义两次,一次是双引号,一次是因为否则它将结束:map命令。出于这个原因,我强烈建议使用<Bar>而不是\|映射内部。这记录在 下:help map-bar


推荐阅读