একটি: কমান্ডের পুরো স্ট্রিংটি কীভাবে পালানো যায়?


13

দেখা যাক. আমার একটি gvimদৌড়াচ্ছে এবং আমি ফাইলগুলি খুলতে চাই, যাautocmd ( যা বিধি নিষেধ করে--remote-tab ) respect

এখন আমি জানি যে আমি করতে পারি (মূলত কিছুটা টুইট)

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

যা কাজ করে। তবে যদি কোনও ফাইলের মধ্যে ফাঁকা স্থান বা অদ্ভুত অক্ষর থাকে তবে আমাকে নিম্নলিখিতগুলি করতে হবে:

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

(দ্বিগুণ \\কারণ এগুলির মধ্যে একটি শেল দ্বারা খাওয়া হয়; এটি ম্যানুয়ালি টাইপের সমতুল্য

`:tabe my\ file` 

ইন vimএবং এটি কাজ করে)। এখন, আমি শেল বা যে কোনও কিছুতে সেই স্ট্রিংটি তৈরি করার একটি উপায় খুঁজে পেতে পারি, তবে আমি আশাবাদী যে আমি ": ট্যাবে" কমান্ডের স্ট্রিংকে "বিশ্বব্যাপী উদ্ধৃতি" দিতে পারব,

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

অথবা

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

--- এটি সরাসরি ভিএম কমান্ড লাইনে লেখার সমতুল্য :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:লাইনে টাইপ করে বিশ্বব্যাপী একটি ফাইল নাম উদ্ধৃত করার জন্য একটি করে "অদ্ভুত" অক্ষরকে উদ্ধৃত না করে?


1
অত্যন্ত শেল নির্ভর বলে মনে হচ্ছে। gvim --remote-send ':tabe foo\ bar.txt<CR>'আমার জন্য বাশ এবং zsh কাজ করে। এবং উদ্ধৃতিগুলিও গুরুত্বপূর্ণ মনে হচ্ছে। যদি আমি ব্যবহার "অভ্যন্তরীণভাবে, এটা কাজ করে নি, কিন্তু ': করেনিgvim --remote-send ":tabe 'foo bar.txt'<CR>"
muru

হুমম ... gvim --remote-send ":tabe 'f s.txt'<CR>"আমার পক্ষে কাজ করেনি, বা :tabe 'f s.txt'ভিমে লেখেনি, পেয়েছি E77: Too many files names
রোমান

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

সাধারণ তথ্যের জন্য, এবং সমস্ত মন্তব্যের জন্য ধন্যবাদ, এই স্ক্রিপ্টটি আমি "এই ডেস্কটপে জিভিআইমের একটি ট্যাবে খোলা" ব্যবহার করতে ব্যবহার করি:

#!/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 সন্নিবেশ করানো হয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.