Digamos que eu crie um nome de arquivo com isso:
xb@dnxb:/tmp/test$ touch '"i'"'"'m noob.mp4"'
xb@dnxb:/tmp/test$ ls -1
"i'm noob.mp4"
xb@dnxb:/tmp/test$
Em seguida, vim .
para entrar na lista de diretórios do Netrw.
" ============================================================================
" Netrw Directory Listing (netrw v156)
" /tmp/test
" Sorted by name
" Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$
" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:special
" ==============================================================================
../
./
"i'm noob.mp4"
Em seguida, pressione Enter para visualizar o arquivo. Tipo:
:!ls -l %
Isso mostrará o erro:
xb@dnxb:/tmp/test$ vim .
ls: cannot access '/tmp/test/i'\''m noob.mp4': No such file or directory
shell returned 2
Press ENTER or type command to continue
Eu também tentei:
[1] :!ls -l '%'
:
Press ENTER or type command to continue
/bin/bash: -c: line 0: unexpected EOF while looking for matching '"'
/bin/bash: -c: line 1: syntax error: unexpected end of file
shell returned 1
Press ENTER or type command to continue
[2] :!ls -l "%"
:
Press ENTER or type command to continue
/bin/bash: -c: line 0: unexpected EOF while looking for matching '''
/bin/bash: -c: line 1: syntax error: unexpected end of file
shell returned 1
Press ENTER or type command to continue
[3] :!ls -l expand("%")
:
/bin/bash: -c: line 0: syntax error near unexpected token '('
/bin/bash: -c: line 0: 'ls -l expand(""i'm noob.mp4"")'
shell returned 1
Press ENTER or type command to continue
[4] !ls -l shellescape("%")
:
/bin/bash: -c: line 0: syntax error near unexpected token '('
/bin/bash: -c: line 0: 'ls -l shellescape("/tmp/test/"i'm noob.mp4"")'
shell returned 1
Press ENTER or type command to continue
[5] !ls -l shellescape(expand("%"))
:
/bin/bash: -c: line 0: syntax error near unexpected token '('
/bin/bash: -c: line 0: 'ls -l shellescape(expand("/tmp/test/"i'm noob.mp4""))'
shell returned 1
Press ENTER or type command to continue
Meu objetivo final é executar rsync
em Ctrl + c , por exemplo:
nnoremap <C-c> :!eval 'ssh-agent -s'; ssh-add; rsync -azvb --no-t % [email protected]:/home/xiaobai/storage/
Minha plataforma é o vim.gtk3
, bash do Kali Linux. vim
e gvim
do Fedora também têm o mesmo problema.
Qual é a sintaxe correta para escapar do nome do arquivo contendo aspas simples e duplas no vim?
[UPDATE]
exec '!ls -l' shellescape(expand('%'))
pode funcionar, mas ainda não consigo descobrir como fazer rsync
acima do trabalho. Não tenho idéia de onde devo colocar aspas para este comando mais complexo rsync
.