:コマンドで文字列全体をエスケープする方法は?


13

どれどれ。私はgvim走っているので、ファイルを開いて、autocmdsを尊重します(これは除外されます--remote-tab)。

今、私はできることを知っています(基本的に、いくつかの微調整を行います):

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

動作します。しかし、ファイルにスペースや奇妙な文字が含まれている場合は、次のことを行う必要があります。

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

(ダブル\\は、そのうちの1つがシェルに食べられるためです。これは、手動で入力するのと同じです。

`:tabe my\ file` 

vim動作します)。これで、シェルなどでその文字列を作成する方法を見つけることができますが、次のように、「:tabe」コマンドで文字列を「グローバルに引用」できるといいのですが

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

または

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

---これは、vimコマンドラインに直接書き込むのと同じ:tabe "my file"です。動作していないようです。文字列内のすべてのスペースをシェルで明示的に引用して、次のようなことを行うことができます

# <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>"

しかし、それはスペースに対してのみ機能し、タブやその他の特殊文字には使用できません"(改行も使用できませんが、ファイル名に改行がある場合は、それに値します!)。

質問

:-)の後に対処する特定のシェルとは独立して、「奇妙な」文字を1つずつ引用せずに、vim 行に直接入力してtabe:ファイル名をグローバルに引用する方法はありますか?


1
シェル依存性が高いようです。gvim --remote-send ':tabe foo\ bar.txt<CR>'bashとzshで私のために働いた。そして、引用符も重要なようです。"内部で使用した場合、機能しませんでしたが、機能'しました:gvim --remote-send ":tabe 'foo bar.txt'<CR>"
-muru

うーん... gvim --remote-send ":tabe 'f s.txt'<CR>"私にとってはうまくいかず:tabe 'f s.txt'、vimで書くこともできませんでしたE77: Too many files names
Rmano

1
gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"もっとシンプルになりませんか?
ムル

1
このshellescape機能は役に立ちますか?
エバーグリーン

1
ことを覚えておいてください:edit(およびその変種)が引用されたファイル名を受け付けません。すべての特殊文字は個別にエスケープする必要があります。したがって、:edit "foo bar.txt"動作しません。あなたが必要:edit foo\ bar.txtです。そうは言っても、そのようなもの:execute 'tabedit' escape('$file', ' ')は正しい軌道に乗っているかもしれません。
tommcdo

回答:


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を挿入することを意味します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.