如何在:命令中转义整个字符串?


13

让我们来看看。我gvim正在跑步,我想打开一个文件,遵守autocmd s(排除--remote-tab)。

现在我知道我可以做(基本上是通过一些调整):

gvim --remote-send ":tabe my_file<CR>" 

哪个有效。但是,如果文件中包含空格或奇怪的字符,则必须执行以下操作:

gvim --remote-send ":tabe my\\ file<CR>"

(双重\\是因为其中一个被外壳吃掉了;这等效于手动键入

`:tabe my\ file` 

vim它的作品)。现在,我可以找到一种在shell或其他东西中创建该字符串的方法,但是我希望可以在“:tabe”命令中对该字符串进行“全局引用”,例如

 gvim --remote-send ":tabe 'my file'<CR>"

要么

 gvim --remote-send ":tabe \"my file\"<CR>"

---等同于直接在vim命令行中编写:tabe "my file";似乎没有用。我可以用Shell显式引用字符串中的所有空格,例如

# <ESC> because the gvim instance can be in a mode different from normal
# the double CR: do not ask. 
# the argument MUST be a full path
file="$(readlink -f "$@")"
fileq="$(echo "$file" |  awk '{gsub(/ /,"\\\ ")}1')" # quote spaces FIXME add other chars
exec gvim 2>/dev/null --servername $desktop --remote-send "<ESC>:tabe $fileq <CR><CR>"

但它仅适用于空格,不适用于制表符和的其他特殊字符"(也不包含换行符,但如果文件名中包含换行符,则应使用!)。

问题

独立于特定的shell(我将在:-)之后进行处理)时,是否可以直接在vim tabe:行中键入全局引用文件名而不用一个一个地引用“奇怪”字符?


1
似乎与外壳高度相关。gvim --remote-send ':tabe foo\ bar.txt<CR>'在bash和zsh上为我工作。而且报价似乎也很重要。如果我在"内部使用,它不会起作用,但会起作用'gvim --remote-send ":tabe 'foo bar.txt'<CR>"
muru 2015年

嗯... gvim --remote-send ":tabe 'f s.txt'<CR>"对我没有用,也没有:tabe 'f s.txt'用vim 编写,我明白了E77: Too many files names
Rmano 2015年

1
会不会gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"更简单?
muru

1
shellescape功能有用吗?
EvergreenTree

1
请记住,:edit(及其变体)不接受带引号的文件名。所有特殊字符都需要单独转义。所以,:edit "foo bar.txt"行不通;你需要:edit foo\ bar.txt。就是说,类似的事情:execute 'tabedit' escape('$file', ' ')可能在正确的轨道上。
tommcdo

Answers:


2

有关常规信息,并感谢所有注释,这是我用来创建“在此桌面上gvim的选项卡中打开”脚本的脚本:

#!/bin/bash -x
#
# this is convoluted because it has to finish in an exec to keep the DM happy
# remember to set StartupNotify=false in the .desktop file
#
desktop=desktop_$(xprop -root -notype  _NET_CURRENT_DESKTOP | perl -pe 's/.*?= (\d+)/$1/')

if ! vim --serverlist | grep -iq $desktop; then #we need to start the server
    if [ $# != 0 ]; then 
        exec gvim 2>/dev/null --servername $desktop "$@"
    else
        exec gvim 2>/dev/null --servername $desktop  #no files 
    fi
fi
# the only case here is if we need to open a tab in an existing server
if [ $# != 0 ]; then  
        # Do not use --remote-tab, see http://vi.stackexchange.com/questions/2066/different-autocmd-behavior-when-using-remote-tab-silent
        # <ESC> because the gvim instance can be in a mode different from normal
        # the double CR: do not ask. 
        # the argument MUST be a full path
        file="$(readlink -f "$@")"
        #fileq="$(echo "$file" |  awk '{gsub(/ /,"\\\ ")}1')" # quote spaces FIXME add other chars
        fileq=${file// /\\ } # quote spaces FIXME add other chars
        exec gvim 2>/dev/null --servername $desktop --remote-send "<ESC>:tabe $fileq <CR><CR>"
fi

0

我设法发送给Vim的是: '<C-\\><C-N>:1wincmd<C-q>x20w<CR>' 其中空间定义为x20,这意味着插入hex $ 20。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.