来自How to easily escape a command-line filter:
实际上,这有点像XY问题。不过,我必须在不同的问题上发布原始问题,因为Y问题非常有趣,我想知道。我将在评论中发布指向X问题的链接。
这是" X"问题
我曾经想过,通过弄清楚如何逃避%
,我会解决问题,但事实证明Vim的行为比我想象的更深。显然,Vim在其自己的脚本语言中对|
有一些特殊的含义,这使事情变得复杂:
:nmap L :r !ls | awk '{printf "\"\%s\"\n", $0}'<CR>
预期结果:
按L
使用ls
的输出填充缓冲区,每行引用。
实际结果:
E492: Not an editor command: awk '{printf "\"\%s\"\n", $0}')<CR>
Vim似乎是在考虑awk
,我的意思是vim命令,而不是shell命令。我该如何消除歧义?我尝试了很多组合,包括用子shell包围过滤器,并在awk前放置一个!
,但是......
子外壳
:nmap L :r !(ls | awk '{printf "\"\%s\"\n", $0}')<CR>
E492: Not an editor command: awk '{printf "\"\%s\"\n", $0}')<CR>
Subshell + !awk
:
:nmap L :r !(ls | !awk '{printf "\"\%s\"\n", $0}')<CR>
[No write since last change]
/bin/bash: -c: line 0: syntax error near unexpected token `)'
/bin/bash: -c: line 0: `awk '{printf "\"%s\"\n", $0}')<CR>'
shell returned 1
Press ENTER or type command to continue
L
:r !(ls
!awk
没有子shell:
:nmap L :r !ls | !awk '{printf "\"\%s\"\n", $0}'<CR>
[No write since last change]
/bin/bash: -c: line 0: syntax error near unexpected token `newline'
/bin/bash: -c: line 0: `awk '{printf "\"%s\"\n", $0}'<CR>'
shell returned 1
Press ENTER or type command to continue
L
:r !ls
我无言以对。