Як уникнути цілого рядка в команді:


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, глобально цитувати ім’я файлу, не збираючись цитувати "дивні" символи по черзі?


1
Здається, дуже залежно від оболонок. gvim --remote-send ':tabe foo\ bar.txt<CR>'працював на мене на bash і zsh. І цитати, здається, теж мають значення. Якщо я використовую "внутрішньо, це не спрацювало, але 'зробило:gvim --remote-send ":tabe 'foo bar.txt'<CR>"
muru

Гммм ... gvim --remote-send ":tabe 'f s.txt'<CR>"не працювало для мене, ні писати :tabe 'f s.txt'vim, я зрозумів E77: Too many files names.
Рмано

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

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.