A: कमांड में पूरे स्ट्रिंग से कैसे बचें?


13

चलो देखते हैं। मेरे पास एक gvimरनिंग है और मैं एक फाइल खोलना चाहता हूं, जो कि autocmdएस ( जो नियम से बाहर हो--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>"

लेकिन यह सिर्फ रिक्त स्थान के लिए काम करता है, न कि अन्य विशेष वर्ण जैसे टैब और "(न ही नईलाइन्स, लेकिन यदि आपके पास आपके नाम के नाम में न्यूलाइन हैं!)।

सवाल :

स्वतंत्र रूप से विशेष रूप से खोल, जिसके साथ मैं :-) के बाद सौदा होगा पर, वहाँ एक रास्ता है जब सीधे टाइप vim में tabe:विश्व स्तर पर करने के लिए लाइन "अजीब" वर्ण एक के बाद एक उद्धृत करने के लिए जा रहा बिना एक फ़ाइल नाम बोली?


1
अत्यधिक खोल निर्भर करता है। gvim --remote-send ':tabe foo\ bar.txt<CR>'मेरे लिए बैश और ज़श पर काम किया। और उद्धरण भी मायने रखते हैं। अगर मैं "आंतरिक रूप से उपयोग करता हूं , तो यह काम नहीं किया, लेकिन 'किया:gvim --remote-send ":tabe 'foo bar.txt'<CR>"
मूर

हम्म् ... gvim --remote-send ":tabe 'f s.txt'<CR>"मेरे लिए काम नहीं कर रहा था, न ही लेखन :tabe 'f s.txt'में, मुझे मिला E77: Too many files names
12

1
gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"सरल नहीं होगा ?
मूरू

1
क्या shellescapeसमारोह सहायक होगा?
एवरग्रीनट्री

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

क्या मैं विम को भेजने में कामयाब रहा हूं: '<C-\\><C-N>:1wincmd<C-q>x20w<CR>' जहां स्पेस को x20 के रूप में परिभाषित किया गया है जिसका मतलब है कि हेक्स $ 20 डालें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.