Zobaczmy. Mam gvim
uruchomiony i chcę otworzyć plik, przestrzegając autocmd
s ( 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 vim
i 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?
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
.
gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"
byłoby prostsze?
shellescape
funkcja byłaby pomocna?
: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.
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>"