Посмотрим. У меня gvim
работает, и я хочу открыть файл, уважая autocmd
s ( что исключает--remote-tab
).
Теперь я знаю, что могу сделать (в основном, с некоторыми изменениями):
gvim --remote-send ":tabe my_file<CR>"
который работает. Но если в файле есть пробелы или странные символы, я должен сделать следующее:
gvim --remote-send ":tabe my\\ file<CR>"
(двойник \\
объясняется тем, что один из них съедается оболочкой; это эквивалентно вводу вручную
`: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>"
но это работает только для пробелов, а не для других специальных символов, таких как табуляция и "
(и не новые строки, но если у вас есть новые строки в именах файлов, вы это заслужили!).
Вопрос :
Независимо от конкретной оболочки, с которой я буду иметь дело после :-), есть ли способ при прямом наборе в tabe:
строке vim глобально заключать в кавычки имя файла, не собираясь заключать в кавычки "странные" символы один за другим?
gvim --remote-send ":tabe 'f s.txt'<CR>"
не работал для меня, ни писать :tabe 'f s.txt'
в VIM, я получил E77: Too many files names
.
gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"
будет проще?
shellescape
функция полезной?
:edit
(и его варианты) не принимает цитируемое имя файла. Все специальные символы должны быть индивидуально экранированы. Так :edit "foo bar.txt"
что не сработает; вам нужно :edit foo\ bar.txt
. Тем не менее, что-то вроде :execute 'tabedit' escape('$file', ' ')
может быть на правильном пути.
gvim --remote-send ':tabe foo\ bar.txt<CR>'
у меня работал на bash и zsh. И цитаты, похоже, тоже имеют значение. Если я использую"
внутри, это не сработало, но'
сделало:gvim --remote-send ":tabe 'foo bar.txt'<CR>"