让我们来看看。我正在运行一个gvim,我想打开一个文件,尊重autocmd s(排除--remote-tab)。

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

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


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

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


(双\是因为其中一个被外壳吞噬了;等效于在vim中手动键入

`:tabe my\ file` 


,它可以工作)。现在,我可以找到一种在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>"


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

问题:

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

评论

似乎与外壳高度相关。 gvim --remote-send':tabe foo \ bar.txt '在bash和zsh上为我工作。而且报价似乎也很重要。如果我在内部使用“,那是行不通的,但是'是:gvim --remote-send”:tabe'foo bar.txt'

嗯... gvim --remote-send“:tabe'f s.txt'”对我不起作用,也没有在vim中写:tabe'f s.txt',我得到E77:文件太多名称。

gvim --servername $ desktop --remote-send“ :tabe $ {file // / \\} ”会更简单吗?

shellescape函数对您有帮助吗?

请记住,:edit(及其变体)不接受带引号的文件名。所有特殊字符都需要单独转义。因此,:edit“ foo bar.txt”不起作用;您需要:edit foo \ bar.txt。就是说,像:execute'tabedit'escape('$ file','')之类的东西可能在正确的轨道上。

#1 楼

有关常规信息,并感谢所有注释,这是我用来在“此桌面上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+)//')

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


#2 楼

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