Jak uciec cały ciąg w poleceniu:?

13

Zobaczmy. Mam gvimuruchomiony i chcę otworzyć plik, przestrzegając autocmds ( co wyklucza--remote-tab ).

Teraz wiem, że mogę to zrobić (w zasadzie z pewnymi poprawkami):

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

który działa. Ale jeśli plik zawiera spacje lub dziwne znaki, muszę wykonać następujące czynności:

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

(podwójne \\jest, ponieważ jeden z nich jest spożywany przez skorupę; jest to równoważne z ręcznym pisaniem

`:tabe my\ file` 

w vimi to działa). Teraz mogę znaleźć sposób na utworzenie tego ciągu w powłoce lub cokolwiek innego, ale miałem nadzieję, że będę mógł „zacytować” cały ciąg w poleceniu „: tabe”, na przykład

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

lub

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

--- jest to równoważne z pisaniem bezpośrednio w linii poleceń vim :tabe "my file"; wygląda na to, że nie działa. Mogę jawnie zacytować całą przestrzeń w łańcuchu za pomocą powłoki, robiąc coś takiego

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

ale działa tylko na spacje, a nie na inne znaki specjalne, takie jak tabulatory i "(ani znaki nowej linii, ale jeśli masz nazwy linii w nazwach plików, zasługujesz na to!).

Pytanie :

Niezależnie od konkretnej powłoki, z którą poradzę sobie po :-), czy jest sposób, kiedy bezpośrednio wpisująctabe: wiersz vim , aby globalnie zacytować nazwę pliku bez cytowania „dziwnych” znaków po kolei?

Rmano
źródło
1
Wydaje się być wysoce zależny od powłoki. gvim --remote-send ':tabe foo\ bar.txt<CR>'pracował dla mnie na bash i zsh. Cytaty też wydają się mieć znaczenie. Jeśli używam "wewnętrznie, to nie działało, ale 'gvim --remote-send ":tabe 'foo bar.txt'<CR>"
działało
Hmmm ... gvim --remote-send ":tabe 'f s.txt'<CR>"nie działało dla mnie, ani pisania :tabe 'f s.txt'w vimie, rozumiem E77: Too many files names.
Rmano
1
Czy nie gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"byłoby prostsze?
muru
1
Czy shellescapefunkcja byłaby pomocna?
EvergreenTree,
1
Pamiętaj, że :edit(i jego warianty) nie akceptuje cytowanej nazwy pliku. Wszystkie znaki specjalne należy indywidualnie usuwać. Więc :edit "foo bar.txt"nie będzie działać; trzeba :edit foo\ bar.txt. To powiedziawszy, coś takiego :execute 'tabedit' escape('$file', ' ')może być na dobrej drodze.
tommcdo

Odpowiedzi:

2

Aby uzyskać ogólne informacje i dzięki wszystkim komentarzom, jest to skrypt, którego używam, aby mieć skrypt „otwarty w karcie gvim na tym pulpicie”:

#!/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
źródło
0

Co udało mi się wysłać do Vima: '<C-\\><C-N>:1wincmd<C-q>x20w<CR>' gdzie spacja jest zdefiniowana jako x20, co oznacza wstaw szesnastkę $ 20.

Matija
źródło