Come sfuggire a un'intera stringa in un comando:?


13

Vediamo. Ho una gvimcorsa e voglio aprire un file, rispettando la autocmds ( che esclude--remote-tab ).

Ora so di poterlo fare (in sostanza, con qualche modifica):

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

che funziona. Ma se un file contiene spazi o caratteri strani, devo fare quanto segue:

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

(il doppio \\è perché uno di essi viene mangiato dalla shell; questo equivale a digitare manualmente

`:tabe my\ file` 

in vime funziona). Ora, posso trovare un modo per creare quella stringa nella shell o altro, ma speravo di poter "citare a livello globale" la stringa nel comando ": tabe", come

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

o

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

--- questo equivale a scrivere direttamente nella riga di comando di vim :tabe "my file"; sembra che non funzioni. Posso citare esplicitamente tutto lo spazio nella stringa con la shell, facendo qualcosa di simile

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

ma funziona solo per gli spazi e non per altri caratteri speciali come le schede e "(né le nuove righe, ma se hai nuove righe nei nomi dei tuoi file te lo meriti!).

La domanda :

Indipendentemente dalla particolare shell, con la quale tratterò dopo :-), c'è un modo quando si digita direttamente la tabe:riga vim per citare globalmente un nome file senza andare a citare gli "strani" caratteri uno per uno?


1
Sembra altamente dipendente dalla shell. gvim --remote-send ':tabe foo\ bar.txt<CR>'ha lavorato per me su bash e zsh. E anche le citazioni sembrano avere importanza. Se uso "internamente, non ha funzionato, ma 'ha funzionato:gvim --remote-send ":tabe 'foo bar.txt'<CR>"
Muru,

Hmmm ... gvim --remote-send ":tabe 'f s.txt'<CR>"non ha funzionato per me, né scrivere :tabe 'f s.txt'in vim, ho capito E77: Too many files names.
Rmano,

1
Non gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"sarebbe più semplice?
Muru,

1
La shellescapefunzione sarebbe utile?
EvergreenTree,

1
Tieni presente che :edit(e le sue varianti) non accetta un nome file tra virgolette. Tutti i personaggi speciali devono essere sfuggiti individualmente. Quindi, :edit "foo bar.txt"non funzionerà; hai bisogno :edit foo\ bar.txt. Detto questo, qualcosa del genere :execute 'tabedit' escape('$file', ' ')potrebbe essere sulla strada giusta.
Tommaso,

Risposte:


2

Per informazioni generali, e grazie a tutti i commenti, questo è lo script che uso per avere uno script "apri in una scheda su gvim su questo desktop":

#!/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

Quello che sono riuscito a inviare a Vim è: '<C-\\><C-N>:1wincmd<C-q>x20w<CR>' dove lo spazio è definito come x20 che significa inserire hex $ 20.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.