[英]How to disambiguate vim commands from shell commands
實際上,這有點像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命令。 我該如何消除歧義? 我嘗試了許多組合,包括用子外殼包圍過濾器,並放置!
在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
我無語了。
瑞安(Ryan)有幫助地指出,我並沒有嘗試過逃脫管道。 我完全不知道的一件事:
:nmap L :r !ls \| awk '{printf "\"\%s\"\n", $0}'<CR>
^
有效。
現在,如果我們能解決那個Y問題 ,我將是一個快樂的露營者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.