如何消除shell命令中的vim命令的歧义

时间:2018-04-02 22:02:04

标签: vim filter escaping

来自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>

Subshel​​l + !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

我无言以对。

1 个答案:

答案 0 :(得分:0)

Ryan有帮助地指出我没有尝试逃避管道。一些完全让我不知所措的事情:

:nmap L :r !ls \| awk '{printf "\"\%s\"\n", $0}'<CR>
               ^

有效。

现在,如果我们能够解决Y problem,我将是一个快乐的露营者。