কোনও ফাইলের সমস্ত লাইন থেকে শ্বেত স্থান অনুসরণ করার সহজ উপায় কী?


139

প্রোগ্রামিং করার সময় বা পাঠ্য ফাইলগুলি খোলার সময় লাইনটির শেষে পেছনের শ্বেতক্ষেত্রের ফাইলগুলির মুখোমুখি হওয়া খুব সাধারণ। trailবিকল্পটিতে বিকল্পটি সেট করে listcharsএবং তারপরে চালু listকরে ভিএম এর এটির একটি উপায় রয়েছে ।

তবে, পুরো ফাইল জুড়ে (আদর্শভাবে প্লাগইন ব্যতীত) বিশ্বজুড়ে সেই পেছনের সাদা স্থানটি দূর করার সহজ উপায় কী?




আপনি যদি ভিম-ফ্যাক ইনস্টল করেন তবে আপনি সেখানে একটি অফলাইন উত্তর পেতে পারেন: :h vim-faqএবং অনুসন্ধান করুন /trailing। মুখস্থ করা ট্যাগ হার্ড :h faq-12.1
হটসকে

উত্তর:


72

সমস্ত ট্রেলিং হোয়াইটস্পেস ফালা করতে একটি কী-বাইন্ডিং ব্যবহার করুন

যেহেতু আমি সম্পাদনা করি এমন কয়েকটি পৃষ্ঠাগুলির জন্য প্রকৃতপক্ষে শ্বেত স্পেসগুলি (উদাহরণস্বরূপ মার্কডাউন) প্রয়োজন এবং অন্যগুলি না করে, আমি একটি কী-বাইন্ডিং সেটআপ করেছি F5যাতে এটি স্বয়ংক্রিয় না হয়েই তুচ্ছ। এটি করতে, নীচের কোডটি (vim.wikia থেকে) বা এটির কিছু প্রকরণ আপনার যুক্ত করুন .vimrc:

"Remove all trailing whitespace by pressing F5
nnoremap <F5> :let _s=@/<Bar>:%s/\s\+$//e<Bar>:let @/=_s<Bar><CR>
  • nnoremap <F5>F5সাধারন মোডে কীটিতে নন-রিসার্সিভ ম্যাপিং করে
  • :let _s=@/চলকটিতে সর্বশেষ অনুসন্ধান শব্দটি (ম্যাক্রো থেকে @/) সঞ্চয় করে_s
  • <Bar>|পৃথক কমান্ডের পাইপ প্রতীক হিসাবে কাজগুলি , তবে |এই প্রসঙ্গে একটি কমান্ডের সমাপ্তি ঘটবে, সুতরাং <Bar>পরিবর্তে অবশ্যই ব্যবহার করা উচিত।
  • :%s/\s\+$//eশ্বেত স্পেস অনুসরণ করার জন্য অনুসন্ধান করে এবং এটি বাফারের যে কোনও জায়গায় মুছে ফেলা হয় ( এই অভিব্যক্তির বিস্তারিত ভাঙ্গনের জন্য কার্পেটস্মোকারের উত্তর দেখুন )
  • let @/=_sআপনার শেষ অনুসন্ধান শব্দটিকে ম্যাক্রোতে পুনরুদ্ধার করে @/, যাতে আপনি পরবর্তী সময় আঘাত করার সময় এটি উপলব্ধ হবে n
  • <CR> ম্যাপিং শেষ

... বা আরও নির্বাচনী হতে

আপনার যদি এমন কেস থাকে যেখানে আপনি সমস্ত চলমান শ্বেত স্পেসটি সরিয়ে নিতে চান না, আপনি আরও বেছে বেছে বেছে বেছে বেছে বেছে নিতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি দেখায় আমি কীভাবে কেবল সেমিকোলনের পরে আসে (যদি এটি এখানে আবদ্ধ থাকে F8) তবে হোয়াইটস্পেসটি অনুসরণ করতে হবে ।

nnoremap <F8> :let _s=@/<Bar>:%s/;\s\+$/;/e<Bar>:let @/=_s<Bar><CR>

এটি কার্যকর যদি আমার মতো আপনার কাছে মার্কডাউন -জাতীয় বংশধর সহ কিছু ফাইল সেমিকোলন-টার্মিনেটেড প্রোগ্রামিং স্টেটমেন্টগুলির মধ্যে ছেদ করা থাকে


6
:keeppatternsওভাররাইডিং প্রতিরোধ করার চেষ্টা করুন @/। এবং একবার দেখুন :keepjumps
বোহর

@ বোহর আপনি ভিএম এর কোন সংস্করণ ব্যবহার করছেন? আমি চেষ্টা করেও :help keeppatternকিছু পেলাম না।
ক্রিস্টোফার বটমস

@ ক্রিস্টোফারবটমস কমপক্ষে 7.4.155 সংস্করণ ।
বোহর

@Bohr। ধন্যবাদ! আমি এখনও 7.4.0 ব্যবহার করেছিলাম তা সন্ধান করতে আসুন। আমি সর্বশেষতম সংস্করণ ইনস্টল করেছি এবং এটি উপলব্ধ।
ক্রিস্টোফার বটমস

2
আপনি এই আদেশটি কোনও কার্যক্রমে মোড়ানো দ্বারা একই প্রভাব পেতে পারেন, তারপরে থেকে শেষ অনুসন্ধান শব্দটি স্বয়ংক্রিয়ভাবে পুনরুদ্ধার করা হয়েছে :-) এইভাবে আপনাকে কোনওটির সাথে বিদ্রূপ করতে হবে না :nohl, যদি আপনি কিছু হাইলাইট করে থাকেন তবে এটি হাইলাইট করে রাখবে এটি (আমার আপডেট হওয়া উত্তর দেখুন)
মার্টিন টর্নয়েজ

175

"সহজতম" উপায়টি কেবলমাত্র ব্যবহার করা :substitute:

:%s/\s\+$//e
  • :%s:substituteপরিসীমা চালাতে %, যা পুরো বাফার।
  • \s টি সমস্ত সাদা স্থানের অক্ষরের সাথে মেলে।
  • \+ তাদের 1 বা একাধিকবার পুনরাবৃত্তি করতে।
  • $ লাইনের শেষে নোঙ্গর করা।
  • eযদি কোনো মিল (অর্থাত ফাইল সাদা ব্যবধান trailing ছাড়া আগে থেকেই) পতাকা একটি ত্রুটি না দিতে।

তবে এটি সম্ভবত "সেরা" উপায় নয় কারণ এটি দুটি পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে:

  1. এটি কার্সারকে শেষ ম্যাচে নিয়ে যায়;
  2. এটি ইতিহাস এবং অনুসন্ধানের ইতিহাসে কমান্ড যুক্ত করে;
  3. এটি সর্বশেষ অনুসন্ধান শব্দটি পুনরায় সেট করে।

এটিকে একটি কার্যক্রমে রূপান্তর করে আপনি উভয় আইটেম ঠিক করতে পারেন:

fun! TrimWhitespace()
    let l:save = winsaveview()
    keeppatterns %s/\s\+$//e
    call winrestview(l:save)
endfun

এবং তারপরে এটি ব্যবহার করুন:

:call TrimWhitespace()
  1. winsaveview()বর্তমান "দেখুন", যা কার্সার অবস্থানে রয়েছে, ভাঁজ, জাম্প, ইত্যাদি সংরক্ষণ করতে হবে winrestview()শেষ মুহূর্তে সংরক্ষণ পরিবর্তনশীল থেকে এই পুনরুদ্ধার করতে হবে।
  2. :keeppatternsবাধা দেয় \s\+$অনুসন্ধানের ইতিহাস যোগ করা হচ্ছে থেকে প্যাটার্ন।
  3. শেষ-ব্যবহৃত অনুসন্ধান শব্দটি কোনও ফাংশন ছেড়ে যাওয়ার পরে স্বয়ংক্রিয়ভাবে পুনরুদ্ধার হয়, সুতরাং এর জন্য আমাদের আর কিছু করার দরকার নেই।

যেহেতু এটি সর্বদা টাইপ করতে কিছুটা বিরক্তিকর :call, তাই আপনি একটি আদেশ নির্ধারণ করতে পারেন:

command! TrimWhitespace call TrimWhitespace()

যা ব্যবহার না করে ব্যবহার করা যেতে পারে :call:

:TrimWitespace

এবং আপনি অবশ্যই এটি একটি চাবির সাথে আবদ্ধ করতে পারেন:

:noremap <Leader>w :call TrimWhitespace()<CR>

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

autocmd BufWritePre * :call TrimWhitespace()

আমি এটি পছন্দ করি না, কারণ কিছু ফর্ম্যাটের জন্য পূর্ববর্তী সাদা অংশ (যেমন মার্কডাউন) প্রয়োজন হয়, এবং অন্য কয়েকটি অনুষ্ঠানে আপনি এমনকি আপনার কোডে শ্বেত স্পেসটি অনুসরণ করতে চান (যেমন কোনও ইমেলের বিন্যাসকরণ, এবং --<Space>একটি স্বাক্ষরের শুরুতে চিহ্নিতকরণের জন্য চিহ্নিতকারী ব্যবহার করে) )।


লজ্জাবিহীন প্লাগ মোড: কিছুক্ষণ আগে আমি একবারে পুরো প্রকল্পের জন্য হোয়াইটস্পেস পরিষ্কার করার জন্য একটি অল্প পাইথন স্ক্রিপ্ট লিখেছিলাম


1
আপনি যদি পূর্বের অবস্থানে যেতে কোনও ফাংশন তৈরি করতে না চান ​`​তবে প্রতিস্থাপনটি শেষ হওয়ার পরে আপনি কেবল দুবার চাপতে পারেন । এটি এটির মতো অনলাইনার তৈরি করার সম্ভাবনাটি উন্মুক্ত করে:%s/\s\+$//e | exe "normal ``"
Neaţu Ovidiu Gabriel

1
@ NeaţuOvidiuGabriel, অবশ্যই অনলাইনার কার্যকর হওয়ার পরে ডাবল ব্যাকটিক একই রকম কাজ করবে না। ;)
ওয়াইল্ডকার্ড

অনুরূপ: স্ট্যাকওভারফ্লো . com / a / 1618401 । তবে আমি মার্টিনের কোডটি বেশি পছন্দ করি।
জন সিজে

11

সমস্ত ট্রেলিং হোয়াইটস্পেস মুছতে (প্রতিটি লাইনের শেষে), আপনি কমান্ডটি ব্যবহার করতে পারেন:

:%s/ \+$//

ট্যাবগুলি অন্তর্ভুক্ত করতে \s, স্থানের পরিবর্তে ব্যবহার করুন।


কমান্ড-লাইন থেকে:

$ ex +'%s/\s\+$//e' -cwq file.c

বর্তমান ডিরেক্টরিতে থাকা সমস্ত ফাইল (পুনরাবৃত্তভাবে ব্যবহার করুন **/*.*):

$ ex +'bufdo!%s/\s\+$//e' -cxa *.*

পাইথন উপায়:

:py import vim
:pydo vim.current.buffer[linenr - 1] = vim.current.buffer[linenr - 1].strip()

বা:

:py import vim
:py for i, l in enumerate(vim.current.buffer): vim.current.buffer[i] = l.rstrip()

ডান ফালা (অগ্রণী) জন্য বা উভয় প্রান্ত থেকে অপসারণ করতে lstrip()বাম স্ট্রিপ (ট্রেলিং) ব্যবহার করুন ।rstrip()strip()


এখানে দরকারী কার্যকারিতা রয়েছে যা একটি লাইনের শেষে থেকে অতিরিক্ত অতিরিক্ত সাদা স্থান সরিয়ে দেয় যা আপনি এতে যুক্ত করতে পারেন .vimrc:

" Removes superfluous white space from the end of a line
function! RemoveWhiteSpace()
   :%s/\s*$//g
    :'^
    "`.
endfunction

এর জন্য মুছে ফেলা ট্রাইলিংহাইটস্পেস প্লাগইনও রয়েছে


সাদা স্থান হাইলাইট করা

সমস্ত পেছনের জায়গাগুলি চলে গেছে কিনা ডাবল-পরীক্ষা করতে, ব্যবহার করুন:

  1. / $তাদের খুঁজে পেতে টাইপ করুন। যদি কিছু থাকে তবে ভিম আপনার জন্য সেগুলি হাইলাইট করে।

  2. তাদের হাইলাইট করতে রঙগুলি ব্যবহার করুন:

    :highlight ws ctermbg=red guibg=red
    :match ws /\s\+$/
    
  3. দৃশ্যমান অক্ষর ( উত্স ) ব্যবহার করুন :

    :set encoding=utf-8
    :set listchars=trail:·
    :set list
    

আরও দেখুন: অবাঞ্ছিত স্থান হাইলাইট করুন

পূর্বনির্ধারিতভাবে পূর্ববর্তী সাদা স্থানটিকে হাইলাইট করতে আপনি নিম্নলিখিত .vimrcহিসাবে কনফিগার করতে পারেন :

highlight ws ctermbg=red guibg=red
match ws /\s\+$/
autocmd BufWinEnter * match ws / \+$/

ডিফল্টরূপে সাদা স্পেসগুলি সরানো

আপনি যদি নিশ্চিত করতে চান যে কোনও ফাইলের সমস্ত চলমান শ্বেতস্পেস সংরক্ষণের সময় স্বয়ংক্রিয়ভাবে অপসারণ করা হয়, আপনি নিম্নলিখিত কমান্ডটি এতে যুক্ত করতে পারেন .vimrc:

autocmd BufWritePre *.c,*.php :%s/ \+$//ge

যা সুপারিশ করা হয় না, কারণ এটি ব্যবহারকারীর সংরক্ষণ করা প্রতিটি ফাইল থেকে হোয়াইটস্পেসটি অনুসরণ করবে (এমনকি যেখানে হোয়াইটস্পেস পছন্দ করা যেতে পারে)।


আরো দেখুন:


5

উপর Exapnding ক্রিস্টোফার বটমস এর উত্তর একটু : জনাথন Palardy এই একটি ভাল নিবন্ধ লিখেছিলেন । এতে তিনি একটি ফাংশন লিখেছেন Preserve(command), যেটি সম্পাদকের অবস্থা সংরক্ষণ করে (মূলত কার্সারের অবস্থান এবং শেষ সন্ধানের ধরণ) একটি স্বেচ্ছাসেবক কমান্ড চালানোর সময়:

function! Preserve(command)
  " Preparation: save window state
  let l:saved_winview = winsaveview()
  " Run the command:
  execute a:command
  " Clean up: restore previous window position
  call winrestview(l:saved_winview)
endfunction

বহুমুখী হওয়ায় এর সুবিধা রয়েছে, উদাহরণস্বরূপ আপনি এটিকে ম্যাপিংয়ের মাধ্যমে সমস্ত ট্রেলিং হোয়াইটস্পেস (যেমন জোনাথন যেমন করেন) প্রতিস্থাপন করতে এটি ব্যবহার করতে পারেন:

nnoremap <F5> :call Preserve("%s/\\s\\+$//e")<CR>

আপনি কেবলমাত্র চাক্ষুষভাবে নির্বাচিত লাইনের উপরের স্থানগুলি সরাতে ভিজ্যুয়াল মোড ম্যাপিংয়ের জন্য এটি ব্যবহার করতে পারেন:

xnoremap <F5> :call Preserve("'<,'>s/\\s\\+$//e")<CR>

এবং আপনি এটি অন্য কলগুলির জন্য ব্যবহার করতে পারেন, যেমন =নিজের জায়গা ধরে রাখার সময় পুরো ডকুমেন্টটি ফর্ম্যাট করার মতো (এবার কোনও ভিন্ন কী ব্যবহার করুন যাতে দ্বন্দ্ব না ঘটে):

nnoremap <F6> :call Preserve("normal gg=G")<CR>

সব মিলিয়ে, আমি Preserve(command)ফাংশনটি একটি দুর্দান্ত সরঞ্জাম হিসাবে পেয়েছি ।


2
আপনি কোনও ফাংশন ছেড়ে গেলে সর্বশেষ ব্যবহৃত অনুসন্ধান শব্দটি স্বয়ংক্রিয়ভাবে সংরক্ষণ করা উচিত; সুতরাং সাথে শোক করার @/প্রয়োজন হবে না (এই ক্ষেত্রে, যাইহোক)।
মার্টিন টর্নয়েজ

3
winsaveview()এবং winrestview()অনেক উচ্চতর।
ড্যাশ-টম-ব্যাং

একদম ঠিক! আপনার মতামতের ভিত্তিতে আপডেট হয়েছে Updated
অ্যালেক্স

0

স্ট্রিপট্রেইলিংস্পেসেস ফাংশনের আরও একটি সংস্করণ:

if !exists('*StripTrailingWhitespace')
    function! StripTrailingWhitespace() range
        if !&binary && &filetype != 'diff'
            call Preserve(":" . a:firstline . "," . a:lastline . "s/\\s\\+$//e")
        endif
    endfunction
endif

প্রকৃতপক্ষে এই ফাংশনে একটি বাগ রয়েছে (এটি একটি): "সীমা" বিকল্পের কারণে সম্ভাবনাটি মৌমাছি করা হচ্ছে না। এটি মুছে ফেলা হয়েছে এটি খুব ভালভাবে কাজ করে, তবে আমি কিছু সহায়তা পাওয়ার জন্য কোডটি ভাগ করছি।

আপনি দেখতে পাচ্ছেন এটি উপরে প্রদর্শিত সংরক্ষণ ফাংশনটিও ব্যবহার করে তবে কিছুটা ভিন্ন ফ্যাশনে।

এখানে পার্থক্যটি হ'ল আমি লাইনগুলির একটি পরিসর বা একটি অনুচ্ছেদ নির্বাচন করতে পারি vipএবং তারপরে পরিসীমাটি :'<,'>স্বয়ংক্রিয়ভাবে কমান্ড প্রম্পটে উপস্থিত হবে।

বেজ হার্মোসো পোস্ট থেকে ধারণাটি এসেছে ।

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