Bagaimana cara melepaskan seluruh string dalam perintah:?

13

Ayo lihat. Saya telah gvimmenjalankan dan saya ingin membuka file, menghormati autocmds ( yang mengesampingkan--remote-tab ).

Sekarang saya tahu saya bisa melakukannya (pada dasarnya, dengan beberapa penyesuaian):

gvim --remote-send ":tabe my_file<CR>" 

yang bekerja Tetapi jika file memiliki spasi atau karakter aneh di dalamnya, saya harus melakukan hal berikut:

gvim --remote-send ":tabe my\\ file<CR>"

(ganda \\adalah karena salah satu dari mereka dimakan oleh shell; ini setara dengan mengetik secara manual

`:tabe my\ file` 

di vimdan itu bekerja). Sekarang, saya dapat menemukan cara untuk membuat string di shell atau apa pun, tetapi saya berharap saya bisa "secara global mengutip" string dalam perintah ": tabe", seperti

 gvim --remote-send ":tabe 'my file'<CR>"

atau

 gvim --remote-send ":tabe \"my file\"<CR>"

--- ini sama dengan menulis langsung di baris perintah vim :tabe "my file"; sepertinya itu tidak berfungsi. Saya dapat secara eksplisit mengutip semua ruang dalam string dengan shell, melakukan sesuatu seperti

# <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>"

tetapi hanya berfungsi untuk spasi dan bukan karakter khusus lainnya seperti tab dan "(atau baris baru, tetapi jika Anda memiliki baris baru dalam nama file Anda, Anda pantas mendapatkannya!).

Pertanyaan :

Secara independen pada shell tertentu, yang akan saya tangani setelah :-), apakah ada cara ketika langsung mengetikkantabe: baris vim untuk secara global mengutip nama file tanpa akan mengutip karakter "aneh" satu per satu?

Rmano
sumber
1
Tampaknya sangat tergantung shell. gvim --remote-send ':tabe foo\ bar.txt<CR>'bekerja untuk saya di bash dan zsh. Dan kutipan itu tampaknya juga penting. Jika saya menggunakan "internal, itu tidak berhasil, tetapi 'tidak:gvim --remote-send ":tabe 'foo bar.txt'<CR>"
muru
Hmmm ... gvim --remote-send ":tabe 'f s.txt'<CR>"tidak bekerja untuk saya, atau menulis :tabe 'f s.txt'dalam vim, saya mengerti E77: Too many files names.
Rmano
1
Bukankah gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"lebih sederhana?
muru
1
Apakah shellescapefungsinya akan membantu?
EvergreenTree
1
Ingatlah bahwa :edit(dan variannya) tidak menerima nama file yang dikutip. Semua karakter khusus harus lolos secara individual. Jadi, :edit "foo bar.txt"tidak akan berhasil; kamu membutuhkan :edit foo\ bar.txt. Yang mengatakan, sesuatu seperti :execute 'tabedit' escape('$file', ' ')mungkin berada di jalur yang benar.
tommcdo

Jawaban:

2

Untuk info umum, dan terima kasih untuk semua komentar, ini skrip yang saya gunakan untuk memiliki skrip "buka di tab pada gvim di desktop ini":

#!/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
sumber
0

Apa yang berhasil saya kirim ke Vim adalah: '<C-\\><C-N>:1wincmd<C-q>x20w<CR>' Di mana ruang didefinisikan sebagai x20 yang berarti memasukkan hex $ 20.

Matija
sumber