Wie kann man eine ganze Zeichenkette in einem: -Befehl maskieren?

13

Mal sehen. Ich habe ein gvimRennen und ich möchte eine Datei öffnen, unter Beachtung der autocmds ( was ausschließt--remote-tab ).

Jetzt weiß ich, dass ich Folgendes tun kann (im Grunde genommen mit einigem Aufwand):

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

welches funktioniert. Aber wenn eine Datei Leerzeichen oder seltsame Zeichen enthält, muss ich Folgendes tun:

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

(Das Doppelte \\liegt daran, dass einer von ihnen von der Shell gefressen wird. Dies entspricht der manuellen Eingabe

`:tabe my\ file` 

in vimund es funktioniert). Jetzt kann ich einen Weg finden, diese Zeichenkette in der Shell oder was auch immer zu erstellen, aber ich hoffte, ich könnte die Zeichenkette im Befehl ": tabe" wie "global zitieren"

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

oder

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

--- Dies entspricht dem Schreiben direkt in die vim-Befehlszeile :tabe "my file". es scheint, dass es nicht funktioniert. Ich kann mit der Shell explizit alle Leerzeichen in der Zeichenkette zitieren und so etwas tun

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

Aber es funktioniert nur für Leerzeichen und nicht für andere Sonderzeichen wie Tabulatoren und "(auch nicht für Zeilenumbrüche, aber wenn Sie Zeilenumbrüche in Ihren Dateinamen haben, haben Sie es verdient!).

Die frage :

Gibt es eine Möglichkeit, unabhängig von der jeweiligen Shell, mit der ich mich später befasse :-), beim direkten Eingeben der vim- tabe:Zeile einen Dateinamen global zu zitieren, ohne die "seltsamen" Zeichen einzeln zu zitieren?

Rmano
quelle
1
Scheint stark schalenabhängig. gvim --remote-send ':tabe foo\ bar.txt<CR>'arbeitete für mich an bash und zsh. Und die Zitate scheinen auch eine Rolle zu spielen. Wenn ich es "intern benutze , hat es nicht funktioniert, aber es hat 'funktioniert:gvim --remote-send ":tabe 'foo bar.txt'<CR>"
muru
Hmmm ... gvim --remote-send ":tabe 'f s.txt'<CR>"hat bei mir nicht funktioniert :tabe 'f s.txt'und ich habe auch nicht geschrieben E77: Too many files names.
Rmano
1
Wäre es nicht gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"einfacher?
muru
1
Wäre die shellescapeFunktion hilfreich?
EvergreenTree
1
Denken Sie daran, dass :edit(und seine Varianten) keine Dateinamen in Anführungszeichen akzeptieren. Alle Sonderzeichen müssen einzeln maskiert werden. Also :edit "foo bar.txt"wird nicht funktionieren; du brauchst :edit foo\ bar.txt. Das heißt, so etwas :execute 'tabedit' escape('$file', ' ')könnte auf dem richtigen Weg sein.
tommcdo

Antworten:

2

Für allgemeine Informationen und dank aller Kommentare ist dies das Skript, das ich verwende, um ein Skript "Öffnen in einer Registerkarte in der GVIM auf diesem Desktop" zu haben:

#!/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
Rmano
quelle
0

Was ich geschafft habe, an Vim zu senden, ist: '<C-\\><C-N>:1wincmd<C-q>x20w<CR>' Wo Raum als x20 definiert ist, was bedeutet, Hex $ 20 einzufügen.

Matija
quelle