Bir: komutunda bütün bir dizeden nasıl çıkılır?


13

Bakalım. Ben bir gvimçalışma var ve autocmds ( hangi kurallar--remote-tab ) saygı, bir dosya açmak istiyorum .

Şimdi yapabileceğimi biliyorum (temel olarak, bazı tweak ile):

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

hangi çalışır. Ancak bir dosyanın içinde boşluklar veya garip karakterler varsa, aşağıdakileri yapmam gerekir:

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

(ikincisi \\, bunlardan biri kabuk tarafından yenilmesidir;

`:tabe my\ file` 

içinde vim) ve çalışıyor. Şimdi, bu dizeyi kabukta veya başka bir şekilde oluşturmanın bir yolunu bulabilirim, ancak ": tabe" komutundaki dizeyi "global olarak alıntılayabileceğim"

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

veya

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

--- bu doğrudan vim komut satırında yazmaya eşdeğerdir :tabe "my file"; çalışmıyor gibi görünüyor. Açıkça kabuk ile dize tüm alanı teklif edebilir, gibi bir şey yapıyor

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

ancak sekmeler ve "(veya yeni satırlar gibi diğer özel karakterlerde değil, yalnızca boşluklar için çalışır , ancak dosya adlarınızda yeni satırlarınız varsa bunu hak ediyorsunuz!).

Soru :

Bağımsız olarak :-) sonra ele alacağım kabuk üzerinde, doğrudantabe: "garip" karakterleri tek tek teklif etmeden bir dosya adı küresel teklif etmek için vim satırında yazarken bir yolu var mı?


1
Kabuğa bağımlı görünüyor. gvim --remote-send ':tabe foo\ bar.txt<CR>'benim için bash ve zsh üzerinde çalıştı. Ve alıntılar da önemli gibi görünüyor. "Dahili olarak kullanırsam işe yaramadı, ancak 'yaptı:gvim --remote-send ":tabe 'foo bar.txt'<CR>"
muru

Hmmm ... gvim --remote-send ":tabe 'f s.txt'<CR>"benim için çalışmadı, :tabe 'f s.txt'vim yazmadım E77: Too many files names.
Rmano

1
Daha gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"kolay olmaz mıydı ?
muru

1
Misiniz shellescapeişlevi yararlı olabilir?
EvergreenTree

1
Unutmayın :edit(ve varyantları) alıntılanmış bir dosya adını kabul etmez. Tüm özel karakterler ayrı ayrı kullanılmalıdır. Yani, :edit "foo bar.txt"çalışmaz; ihtiyacınız var :edit foo\ bar.txt. Bununla birlikte, böyle bir şey :execute 'tabedit' escape('$file', ' ')doğru yolda olabilir.
tommcdo

Yanıtlar:


2

Genel bilgi ve tüm yorumlar sayesinde, bu "bu masaüstünde gvim bir sekmede aç" komut dosyası için kullandığınız komut dosyasıdır:

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

Ne Vim göndermek başardı: '<C-\\><C-N>:1wincmd<C-q>x20w<CR>' Nerede boşluk x20 olarak tanımlanır, yani hex $ 20 eklemek anlamına gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.