সাধারণ ক্যাভেটস
কেবলমাত্র পঠনযোগ্য ফাইল সমস্যার আশেপাশের সবচেয়ে সাধারণ পদ্ধতি হ'ল একটি বাস্তবায়ন ব্যবহার করে সুপার-ব্যবহারকারী হিসাবে বর্তমান ফাইলটিতে একটি পাইপ খোলার sudo tee
। তবে, আমি ইন্টারনেটে যে সর্বাধিক জনপ্রিয় সমাধান খুঁজে পেয়েছি তার মধ্যে বেশ কয়েকটি সম্ভাব্য ক্যাভেটের সংমিশ্রণ রয়েছে:
- পুরো ফাইলটি টার্মিনালে এবং সেই সাথে ফাইলটিতে লেখা হয়। বড় ফাইলগুলির জন্য এটি ধীর হতে পারে, বিশেষত ধীর নেটওয়ার্ক সংযোগের চেয়ে বেশি।
- ফাইলটি এর মোড এবং অনুরূপ বৈশিষ্ট্যগুলি হারিয়ে ফেলে।
- অস্বাভাবিক অক্ষর বা স্পেস সহ ফাইলের পথগুলি সঠিকভাবে পরিচালনা করা যায় না।
সলিউশন
এই সমস্ত সমস্যা সম্পর্কে জানতে, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:
" On POSIX (Linux/Mac/BSD):
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'
এগুলি সংক্ষিপ্তভাবে সংক্ষিপ্ত করা যেতে পারে:
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'
ব্যাখ্যা
:
আদেশ শুরু; কমান্ড প্রবেশ করাতে আপনাকে এই অক্ষরটি স্বাভাবিক মোডে টাইপ করতে হবে। এটি স্ক্রিপ্টগুলিতে বাদ দেওয়া উচিত।
sil[ent]
কমান্ড থেকে আউটপুট দমন করে। এই ক্ষেত্রে, আমরা কমান্ডটি Press any key to continue
চালানোর পরে প্রদর্শিত-অনুরূপ প্রম্পটটি বন্ধ করতে চাই :!
।
exec[ute]
কমান্ড হিসাবে একটি স্ট্রিং কার্যকর করে। আমরা কেবল চালাতে পারি না :write
কারণ এটি প্রয়োজনীয় ফাংশন কলটি প্রক্রিয়া করে না।
!
:!
কমান্ডটি উপস্থাপন করে : একমাত্র আদেশ যা :write
গ্রহণ করে। সাধারণত, :write
কোন ফাইল পাথ লিখতে হয় তা গ্রহণ করে। :!
নিজের শেলটিতে একটি কমান্ড চালায় (উদাহরণস্বরূপ, ব্যবহার করে bash -c
)। এর সাহায্যে :write
এটি শেলের কমান্ডটি চালাবে এবং তারপরে সম্পূর্ণ ফাইলটি লিখবে stdin
।
sudo
আপনি এখানে আছেন যেহেতু সুস্পষ্ট হওয়া উচিত। কমান্ডটি সুপার-ইউজার হিসাবে চালান। নেট কীভাবে এটি কাজ করে সে সম্পর্কে প্রচুর তথ্য রয়েছে।
tee
stdin
প্রদত্ত ফাইলে পাইপ । :write
এতে লিখবে stdin
, তারপরে সুপার-ব্যবহারকারী tee
ফাইল সামগ্রীগুলি গ্রহণ করবে এবং ফাইলটি লিখবে। এটি কোনও নতুন ফাইল তৈরি করবে না - কেবল সামগ্রীগুলি ওভাররাইট করে - সুতরাং ফাইলের মোড এবং বৈশিষ্ট্যগুলি সংরক্ষণ করা হবে।
shellescape()
বর্তমান শেলের জন্য উপযুক্ত হিসাবে প্রদত্ত ফাইল পাথের বিশেষ অক্ষরগুলি অতিক্রম করে। একটি মাত্র প্যারামিটার দিয়ে, এটি সাধারণত প্রয়োজনীয় হিসাবে উদ্ধৃতিগুলিতে পথটি আবদ্ধ করে রাখে। যেহেতু আমরা একটি পূর্ণ শেল কমান্ড লাইনে প্রেরণ করছি, আমরা অন্য বিশেষ অক্ষরগুলির ব্যাকস্ল্যাশ-পলায়ন সক্ষম করতে দ্বিতীয় আর্গুমেন্ট হিসাবে একটি শূন্য-অমূল্যটি পাস করতে চাই যা অন্যথায় শেলটি ট্রিপ করতে পারে।
@%
%
নিবন্ধের বিষয়বস্তু পড়ে , যা বর্তমান বাফারের ফাইলের নাম ধারণ করে। এটি অগত্যা একটি নিখুঁত পাথ নয়, সুতরাং আপনি বর্তমান ডিরেক্টরিটি পরিবর্তন করেন নি তা নিশ্চিত করুন। কিছু সমাধানে, আপনি বাণিজ্যিক-এ-প্রতীক বাদ দেওয়া দেখতে পাবেন। অবস্থানের উপর নির্ভর করে, %
একটি বৈধ এক্সপ্রেশন এবং এটি %
রেজিস্টার পড়ার মতোই প্রভাব ফেলে । অন্য অভিব্যক্তির ভিতরে নেস্টেড শর্টকাটটি সাধারণত অনুমোদিত নয়, যেমন: এই ক্ষেত্রে।
>NUL
এবং প্ল্যাটফর্মের নাল ডিভাইসে >/dev/null
পুনর্নির্দেশ করুন stdout
। যদিও আমরা কমান্ডটি নিঃশব্দ করে রেখেছি, আমরা stdin
পাইপিংয়ের সাথে যুক্ত সমস্ত ওভারহেডকে উইম-এর কাছে ফিরিয়ে আনতে চাই না - সর্বোত্তম এটি যত তাড়াতাড়ি সম্ভব ডাম্প করা। NUL
ডস, এমএস-ডস এবং উইন্ডোজের নাল ডিভাইস, কোনও বৈধ ফাইল নয়। উইন্ডোজ 8 অনুসারে NUL- এ পুনঃনির্দেশের ফলস্বরূপ NUL নামের একটি ফাইল লিখিত হবে না। ফাইল এক্সটেনশন সহ বা ছাড়াই আপনার ডেস্কটপে NUL নামে একটি ফাইল তৈরি করার চেষ্টা করুন: আপনি এটি করতে অক্ষম হবেন। (উইন্ডোতে আরও বেশ কয়েকটি ডিভাইসের নাম রয়েছে যা জানার জন্য উপযুক্ত হতে পারে))
~ / .Vimrc
প্ল্যাটফর্ম-এর উপর নির্ভরশীল
অবশ্যই, আপনি এখনও সেগুলি মুখস্ত করতে এবং প্রতিবার এগুলি টাইপ করতে চান না। একটি সহজ ব্যবহারকারী কমান্ডে উপযুক্ত কমান্ডটি মানচিত্র করা অনেক সহজ। পসিক্সে এটি করতে আপনি নিজের ~/.vimrc
ফাইলটিতে নিম্নলিখিত লাইনটি যুক্ত করতে পারেন, এটি ইতিমধ্যে উপস্থিত না থাকলে এটি তৈরি করে:
command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
এটি আপনাকে সুপার-ব্যবহারকারীর অনুমতি সহ বর্তমান ফাইলটি লিখতে ডাব্লু (কেস-সংবেদনশীল) কমান্ডটি টাইপ করতে দেয় - আরও সহজ।
স্বাধীন প্ল্যাটফর্ম
আমি একটি প্ল্যাটফর্ম-স্বতন্ত্র ~/.vimrc
ফাইল ব্যবহার করি যা কম্পিউটার জুড়ে সিঙ্ক্রোনাইজ হয়, তাই আমি আমার সাথে বহু-প্ল্যাটফর্মের কার্যকারিতা যুক্ত করেছি। এখানে ~/.vimrc
কেবলমাত্র প্রাসঙ্গিক সেটিংস সহ একটি রয়েছে:
#!vim
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
" ts: Actual tab character stops.
" sw: Indentation commands shift by this much.
" sr: Round existing indentation when using shift commands.
" sts: Virtual tab stops while using tab key.
" fdm: Folds are manually defined in file syntax.
" ff: Line endings should always be <NL> (line feed #09).
" fenc: Should always be UTF-8; #! must be first bytes, so no BOM.
" General Commands: User Ex commands. {{{1
command W call WriteAsSuperUser(@%) " Write file as super-user.
" Helper Functions: Used by user Ex commands. {{{1
function GetNullDevice() " Gets the path to the null device. {{{2
if filewritable('/dev/null')
return '/dev/null'
else
return 'NUL'
endif
endfunction
function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
endfunction
" }}}1
" EOF