ভিএম ইনডেন্ট এক্সএমএল ফাইল


103

আমি ভিম শিখছি তবে আমি ভেবেছিলাম এটি একটি সাধারণ কাজ তবে আমি এটি কাজে লাগাতে পারি না। আমার ব্রাউজার এসও আছে তবে সমাধানগুলি আমার পক্ষে কাজ করছে না।

আমি কোনও ফাইল (এক্সএমএল) সঠিকভাবে ইনডেন্ট করার চেষ্টা করছি। আমি যে আদেশটি ব্যবহার করি তা হ'ল:

gg=G 

বা জিজিভিজি = (এটি তৈরি করে আমি সম্ভবত কিছু আলাদা করে;))

আমার .vimrc হ'ল:

syntax on 
filetype plugin indent on 
set nu 

আসল, ফলাফল এবং প্রত্যাশিত আউটপুটটি কী?
ইনগো কারকাত

:set ft? indentexpr?এটা কি আউটপুট পড়বে filetype=xml indentexpr=XmlIndentGet(v:lnum,1)?!
ইনগো কারকাত

ফাইল টাইপ = এক্সএমএল ইনডেনটেক্সপ্র = এক্সএমএল ইন্ডেন্টগেট (v: lnum, 1)। হ্যাঁ
হাগেন্তি


4
আমি এই মানচিত্রে কিছুটা যুক্ত করতে এবং এটি তৈরি করতে চাই m'ggVG='', যা আপনার লাইনে কেবল সংরক্ষণ করে এবং ফাইলটি পুনরায় পাঠানোর পরে এটিতে ফিরে যায়।
হোভিস বিডল

উত্তর:


199

আমি বেরির উত্তর পছন্দ করি। যাইহোক, আমি মনে করি যে নিম্নলিখিতটি কিছুটা নমনীয় যাতে আপনার vimrcফাইলটি পরিবর্তন করতে হবে না । এছাড়াও এক্সএমএল ফাইলের কিছু অংশ নির্বাচন করা ফর্ম্যাট করা সহজ (আমার অনেক কিছু ঘটতে পারে)।

প্রথমে আপনি যে XML ফর্ম্যাট করতে চান তা হাইলাইট করুন।

তারপরে, সাধারণ মোডে টাইপ করুন ! xmllint --format -

নীচে আপনার কমান্ড-লাইনটি দেখতে দেখতে এমন হবে:

:'<,'>!xmllint --format -

তারপরে এন্টার চাপুন।

প্রযুক্তিগত ব্যাখ্যা

নির্বাচিত পাঠ্যটি xmllintকমান্ডে প্রেরণ করা হবে , তারপরে --format'এডি' এবং এর ফলাফলগুলি xmllintআপনার নির্বাচিত পাঠ্যটির উপরে ভিমে রাখা হবে। -যা, এই ক্ষেত্রে, নির্বাচিত পাঠ তেজ পাঠায় যে হয় - কমান্ডের শেষে স্ট্যান্ডার্ড ইনপুট গ্রহণ করা হয় xmllint


6
এটি অবশ্যই তখন কাজ করে যদি আপনার কাছে বাহ্যিক সরঞ্জাম এক্সমিলিন্ট ইনস্টল থাকে এবং আপনার পথে যুক্ত হয়।
পলিমারফিক্স

71
কমান্ডটি সহজ করতে :%!xmllint --format -, এর %অর্থ এই এক্সএমএল ফাইলের পুরো সুযোগ।
হাকুনামী

4
সবাই কেন এক্সমিলিন্ট সরঞ্জাম আশা করে? উবুন্টু 15.04 এ নেই এবং অ্যাপট-গেটও খুঁজে পায় না।
এরিকবওয়ার্ক

8
@ erikb85 প্যাকেজ এবং প্যাকেজ সামগ্রীগুলির সন্ধান করার সময় apt-cache search, না apt-get, ব্যবহার করুন । libxml2-utilsনিখোঁজ সরঞ্জাম রয়েছে।
পারানোয়াপ্পি

@ হাকুনামি আমি আশা করি যে প্রক্রিয়াটি সহজ করার জন্য আমি আপনাকে 1000 বার
উন্নত করতে পারি

69

আপনার xmlফাইলগুলি ইনডেন্ট করতে একটি বাহ্যিক প্রোগ্রাম ব্যবহার করুন । এই ক্ষেত্রে আমি চয়ন করেছি xmllint, সুতরাং equalprgবিকল্পটি কমান্ডটি সেট করুন :

:set equalprg=xmllint\ --format\ -

এখন আপনি মৃত্যুদণ্ড কার্যকর করতে পারেন

gg=G

xmllintআপনার xmlফাইল ফর্ম্যাট করতে দিন ।

প্রতিবার ব্যবহার করার পরে এটি পেতে autocommandএটি সেট করতে একটি ব্যবহার করুন ।

autocommand নীচে একটি মন্তব্য থেকে

au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null

কেন এটি প্রাথমিকভাবে কাজ করে তা নিশ্চিত নয় তবে আমি এটির বিষয়টি বের করব;) আপনাকে ধন্যবাদ
এখনই

8
এক্সএমএল ফাইলগুলি সম্পাদনা করার সময় আপনি এটি সক্ষম করতে আপনার .vimrc এ নিম্নলিখিতটি ব্যবহার করতে পারেন - au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null। সূত্র - ku1ik.com/2011/09/08/…
স্টুডিজ

4
ধন্যবাদ! বড় আকারের এক্সএমএল ফাইল এবং ভিআইএম নিয়ে খুব হতাশ, সাব্লাইমে তারা খুব তাড়াতাড়ি (5000-10000 লাইন এবং বেস 64 ডেটা) রিন্ডেন্ট করে, তবে ভিমে তারা বেশ কয়েক মিনিট সময় বেঁধে দেয়। এই সমাধানটি বড় এক্সএমএল ফাইলগুলির সাথে সমস্যার সমাধান করে। আবার আমি ভিমের সাথে খুশি।
সোনিক

আপনি যদি উবুন্টুতে থাকেন তবে আপনাকে libxml2-utils
xmllint

33

একটি সহজ সমাধান যা আমি পছন্দ করি যার জন্য কোনও তৃতীয় পক্ষের সরঞ্জাম প্রয়োজন হয় না হ'ল প্রতিটি খোলার ট্যাগ '<...>' এর আগে একটি নতুন লাইন .োকানো। তারপরে আপনি স্ট্যান্ডার্ড ভিএম অটো-ইন্ডেন্টেশন ব্যবহার করতে পারেন। সংক্ষেপে:

  1. %s/</\r</g
  2. gg=G স্বয়ংক্রিয় ইন্ডেন্ট

আমি এটি একটি বড় এক্সএমএল ফাইল দিয়ে চেষ্টা করেছি এবং এটি প্রক্রিয়াটির জন্য দীর্ঘস্থায়ী long
লুক এম

ধন্যবাদ. এটি যথেষ্ট সহজ এবং বাহ্যিক সরঞ্জামগুলির প্রয়োজন ছাড়াই কাজটি করে।
এয়ারট্রাইক

6
আমি পছন্দ করি %s/></>\r</g, যাতে প্রতিটি পাঠ্য উপাদান একই লাইনে থাকে।
নিকোলা মুসাত্তি

4
@ নিকোলা মুসাত্তি বা ট্যাগগুলির মধ্যে মাঝে মাঝে ফাঁক থাকলে%s/> *</>\r</g
আর্থার ট্যাকা

12

সংক্ষিপ্ত উত্তর: ম্যাচিট.ভিম চালু করুন । আপনি আপনার যুক্ত packadd matchitকরতে পারেন .vimrc, বা ভিএম-বোধগম্য ব্যবহার করতে পারেন , এটি এটি ডিফল্টরূপে সক্ষম করে।

দীর্ঘ উত্তর: আমি ভিম উইকিতে আলোচিত এক্সম্লিন্ট পদ্ধতির সাথে ভিমের এক্সএমএলকে অটো-ইনডেন্ট করার জন্য অনেক কৌশল চেষ্টা করেছি । সমস্যাটি xmllint(এবং অন্যান্য বাহ্যিক সিএলআই সরঞ্জামগুলির সাথে একই পদ্ধতির যেমন xmlformatএবং tidyখুব) হ'ল তারা সকলেই ফাঁকা নিউলাইনগুলি চেপে ধরার জন্য জোর দেয়। খালি লাইন, মন্তব্য এবং / অথবা অন্যান্য ইচ্ছাকৃত বিন্যাস অপসারণ না করে আপনি যদি চান তবে আপনার এক্সএমএলটি প্রবেশ করাতে পারেন, তবে xmllintসেরা পছন্দ নয়।

দেখা যাচ্ছে যে ভিমের সমান (=) কমান্ডটি ইতিমধ্যে XML সমর্থন করে, যতক্ষণ না ম্যাচিট.ভিম স্ক্রিপ্ট সক্ষম থাকে। এটি সক্ষম করার একটি দুর্দান্ত সহজ উপায় হ'ল টিপপের ভিম - বোধগম্যতা অবলম্বন করা । আরেকটি হল আপনার যুক্ত packadd matchitকরা .vimrc। তারপরে, এক্সএমএল ফর্ম্যাটিংটি বাক্সের বাইরে "কেবলমাত্র কাজ করবে"।


4
আরও সুনির্দিষ্ট করে বললে মনে matchit.vimহয় এটি আসল সমাধান। আপনি vimrcএই লাইনটি যুক্ত করে এটি এতে সক্ষম করতে পারেন :packadd matchit
খ্রিস্টান রোনডাউ

4
ধন্যবাদ খ্রিস্টান; আমি ম্যাচিটাইট.ভিমই সমস্যাটি সমাধান করে, তা পরিষ্কার করার জন্য উত্তরটি আপডেট করেছি।
ctrueden

উত্সাহিত কারণ এটি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে। তবে আমি খ্রিস্টানের পরামর্শটি (প্যাকডড ম্যাচিট) সংক্ষিপ্ত উত্তরে যুক্ত করার পরামর্শ দেব কারণ এটি খুব সহজ এবং কাজটি করে (কমপক্ষে আমার জন্য)
চিহ্নিত করুন

4
@tohuwawohu =কমান্ডটি ব্যবহার করুন আপনি যদি ফাইলটির শীর্ষে থাকেন তবে আপনি টাইপ করতে পারেন =G। পর্যায়ক্রমে, আপনি ফাইলের শীর্ষে যেতে পারেন, সাথে 1Gভিজ্যুয়াল লাইন নির্বাচন করুন মোডে প্রবেশ করুন V, তারপরে Gফাইলের নীচে যেতে টাইপ করুন, সমস্ত কিছু নির্বাচন করে। এবং তারপরে =পুরো ফাইলটি ইনডেন্ট করতে টিপুন । একইভাবে, আপনি যদি কেবল কোনও ফাইলের কিছু অংশ যুক্ত করতে চান তবে কেবলমাত্র সেই অংশটি নির্বাচন করুন এবং টিপুন =
ctrueden

4
@ টুয়াওয়াহুহু আমি ঠিক বুঝতে পেরেছি আপনি বলেছেন "কোনও লাইন বিরতি ছাড়াই"। =কমান্ড (অথবা সরাতে) লাইন ব্রেক ইতিমধ্যে উপস্থিত না সন্নিবেশ করা হবে না। এটি কেবল অগ্রণী ইন্ডেন্টেশনকেই প্রভাবিত করে। সুতরাং matchit.vimপ্রিটি-প্রিন্টিং এক্সএমএল যে সব এক লাইন সম্মুখের squished এর জন্য একটি সমাধান নয়। তার জন্য ব্যবহার করুন xmllintবা অনুরূপ।
সিট্রুডেন

11

একবার ~ / .vimrc সঠিকভাবে সেটআপ হয়ে গেলে এটি অর্জন করা সহজ।

Options / .vimrc এ নিম্নলিখিত বিকল্পগুলি সেট করুন:

filetype indent on
set smartindent

এটি আপনাকে কার্সারটি ফাইলের শীর্ষে স্থানান্তর করতে এবং শেষ দিকে ইনডেন্ট করতে দেয়: gg = G

আপনি ভিজ্যুয়াল মোডের সাথে পছন্দসই পাঠ্যটি নির্বাচন করতে পারেন এবং এটিতে প্রবেশ করতে = টিপুন।


4
আমি মনে করি এটি .vimrcপরিবর্তে হবে .bashrc
বিরেই

4
ওফফফ। হুবহু স্থির। ধন্যবাদ.
জারেদরাজ

প্রতিটি ট্যাগ যখন একটি লাইনে থাকে তখন এটি কাজ করবে। যদি এক্সএমএলটির ফাঁকা স্থান বা শেষের লাইন না থাকে তবে এটি কিছু করতে পারে না।
হোসে রামেন

যতক্ষণ মার্কআপটি বৈধ, এটি আমার পক্ষে সর্বদা কাজ করেছে।
jareeraj

যদি আপনার মার্কআপটি স্বতন্ত্র লাইনে না থাকে (দৃ cons়ভাবে?) আপনি এটিকে আস্তে করে পরিবর্তন করতে পারেন:% s / </ \ r </ g এবং তারপরে:% s / \ n \ n / \ r /
jareeraj

4

ভিআইএম-এ, আমি নিম্নলিখিত কমান্ডটি ব্যবহার করে পুরো ফাইলটি (হার্ড ট্যাবগুলি ব্যবহার করে) স্বয়ংক্রিয়ভাবে প্রবেশ করি:

:%!XMLLINT_INDENT="^I" xmllint --format -

এটি ^Iহ'ল একটি একক অক্ষর যা আপনি মাধ্যমে তৈরি করেন: CTRL+ v, CTRL+i


1

আমারও একই সমস্যা ছিল। দেখা গেল, সেই লাইন

set viewdir=~\.vim\views\

আমার .vimrcসমস্যার কারণ। শুধু নিশ্চিত করুন, আপনার এটি নেই।


1

জেসি হোগানের উত্তর ভাল, তবে আমি এর চেয়ে আরও সহজ উত্তর দেব:

আপনি যখন ভিমে আছেন এবং আপনার এক্সএমএল ফাইলটি খোলার সময়, স্বাভাবিক মোডে এটি লিখুন:

:%!xmllint --format %

তারপরে এন্টার টিপুন। আপনার সমস্ত এক্সএমএল ফাইল ফর্ম্যাট হবে।

মনে রাখবেন আপনার আগে xmllint ইনস্টল করা উচিত ছিল।


0

সেই এক যা ব্যবহার করছে জন্য coc.nvimপ্লাগ-ইন, আপনি ইনস্টল করতে পারেন coc-xmlদ্বারা :CocInstall coc-xml , তারপর আপনার কনফিগ ফাইলে ফরম্যাট কী ম্যাপিং: nmap <silent> fm <Plug>(coc-format)। এখন থেকে, আপনি কেবল এক্সএমএল ফাইল নয় অন্য ফাইল খুব সহজেই ফর্ম্যাট করতে পারবেন

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