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:
行中键入全局引用文件名而不用一一引用“奇怪”字符? #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。
评论
似乎与外壳高度相关。 gvim --remote-send':tabe foo \ bar.txt嗯... gvim --remote-send“:tabe'f s.txt'
gvim --servername $ desktop --remote-send“
shellescape函数对您有帮助吗?
请记住,:edit(及其变体)不接受带引号的文件名。所有特殊字符都需要单独转义。因此,:edit“ foo bar.txt”不起作用;您需要:edit foo \ bar.txt。就是说,像:execute'tabedit'escape('$ file','')之类的东西可能在正确的轨道上。