Как избежать целой строки в команде:?

13

Посмотрим. У меня gvimработает, и я хочу открыть файл, уважая autocmds ( что исключает--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 глобально заключать в кавычки имя файла, не собираясь заключать в кавычки "странные" символы один за другим?

Rmano
источник
1
Кажется, сильно зависит от оболочки. gvim --remote-send ':tabe foo\ bar.txt<CR>'у меня работал на bash и zsh. И цитаты, похоже, тоже имеют значение. Если я использую "внутри, это не сработало, но 'сделало:gvim --remote-send ":tabe 'foo bar.txt'<CR>"
Муру
Хммм ... gvim --remote-send ":tabe 'f s.txt'<CR>"не работал для меня, ни писать :tabe 'f s.txt'в VIM, я получил E77: Too many files names.
Rmano
1
Не gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"будет проще?
Муру
1
Будет ли shellescapeфункция полезной?
EvergreenTree
1
Имейте в виду, что :edit(и его варианты) не принимает цитируемое имя файла. Все специальные символы должны быть индивидуально экранированы. Так :edit "foo bar.txt"что не сработает; вам нужно :edit foo\ bar.txt. Тем не менее, что-то вроде :execute 'tabedit' escape('$file', ' ')может быть на правильном пути.
Tommcdo

Ответы:

2

Для общей информации, и благодаря всем комментариям, я использую этот скрипт для сценария «открыть вкладку в gvim на этом рабочем столе»:

#!/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
источник
0

Что мне удалось отправить в Vim: '<C-\\><C-N>:1wincmd<C-q>x20w<CR>' где пробел определяется как x20, что означает вставку hex $ 20.

Матия
источник