[英]How can I escape the % and # characters in a Vim command?
我正在使用Ack( https://github.com/mileszs/ack.vim )和--literal
標志來搜索Vim中的項目。 我注意到每當我搜索帶有%
或#
字符的字符串時,搜索都不符合我期望的內容。 我做了一些研究,發現這是因為Vim會在命令中擴展這些字符( %
是當前文件, #
是其他東西,不知道是什么)。
考慮到這些符號經常在代碼中出現,這在執行搜索時非常煩人。 有沒有辦法逃脫它們,最好是自動逃脫,以便搜索按預期工作? 我當前的映射是: nnoremap <leader>al :Ack --literal<space>
。
例
假設我在某個CSS文件中有一個選擇器#body
,我想找到它。 這些是我嘗試過的(沒有用過):
:Ack --literal #body
:Ack --literal \#body
:Ack --literal "#body"
:Ack --literal "\#body"
任何逃避的想法都不會像往常那樣起作用,或者甚至是搜索什么? 我沒有這些例子匹配任何東西 。
解
我已經通過雙重逃避角色來實現它。 例如, :Ack --literal "\\\\#body"
將在結果窗口的狀態行中顯示:ack -H --nocolor --nogroup --column --literal "#body"
並顯示預期結果。 引號似乎也是必需的。
你只需要用反斜杠作為前綴
:!echo %
輸出當前緩沖區的文件名
:!echo \%
打印一個單獨的'%'字符
顯然你必須像ack.vim問題中提到的那樣多次逃脫:
:Ack \\\#foo
這是ack.vim中的一個錯誤,當你這么做時,甚至不會調用ack程序:Ack --literal \\#body
但是,我用過
`strace -f -o-e trace=process gvim | tee /tmp/log`
它似乎在做:Ack --literal '\\#body'
(介意額外的引號) 確實按預期工作:
[pid 3833] execve("/usr/bin/ack", ["ack", "-H", "--nocolor", "--nogroup", "--literal", "#body"], [/* 25 vars */] <unfinished ...>
我還沒有真正測試過它......
我對@ sehe的答案有一個補充:當你這樣做時!...
或者system('...')
vim本身不處理...
但是調用shell,就像這樣: {shell} {shellcmdflag} {shellxquote}...{shellxquote}
。 對於ack調用,這將類似於["/bin/bash", "-c", "ack -H --nocolor --nogroup --literal #body"]
,因此bash將忽略--literal
之后的所有內容,因為#
是評論字符。 對於'#body'
它不會這樣做,因為在引用的字符串中沒有可能的注釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.