vim - 是什么导致 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>
这似乎非常违反直觉,因为\(
可以\\(
在字符串中表示,并且\+
可以\\+
在字符串中表示。
为什么\|
需要\\\\|
代表?
我正在尝试为这个原因建立一个心理模型,这样我就可以对未来的这种情况进行推理。
解决方案
双引号内的反斜杠只需要转义一次,这样就可以"\\("
了'\"
。然而|
,需要转义两次,一次是双引号,一次是因为否则它将结束:map
命令。出于这个原因,我强烈建议使用<Bar>
而不是\|
映射内部。这记录在 下:help map-bar
。
推荐阅读
- ajax - 在 laravel 中使用 ajax 调用并获取 document.execCommand("copy") 但它不起作用
- laravel - 如何将数据从部分页面传递到主要的 laravel 母版页?
- mysql - 从满足的状态和数据库查询中的 id 获取间隔 1 天的日期
- mysql - 为什么查询中没有提到任何命名列时会出现新列错误?
- java - 如何检查类型化类的类型
- mysql - 需要在不同的域中部署相同的 Codeigniter 代码,但使用不同的数据库
- javascript - 在加载时设置 datetimepicker 的值
- c# - 我是否必须在远程主机上安装 Docker 才能在线访问我的应用程序?
- go - 如何将结构转换为具有更少字段的不同结构
- python-3.x - 如何将所有 int 值转换为浮点数?