কোনও শ্বেতস্থান চরিত্র না পৌঁছানো পর্যন্ত আমি কিভাবে উল্লম্বভাবে সরব?


27

(সঠিকভাবে) ইনডেন্ট কোড সহ একটি দীর্ঘ ফাইলটিতে, কার্সারের উপরে বা নীচে পাঠ্যের একটি লাইনে সরাসরি স্থানান্তর করা সহায়ক হতে পারে যা ইনডেন্টিংটি সীমিত করে।

(এটি করার একটি উপায় ইনডেন্ট ফোল্ডমেডথের মাধ্যমে, বর্তমান ইনডেন্ট স্তরটি ভাঁজ করে, যা ইনডেন্ট স্তরটি কার্সার থেকে কেবল এক jবা kদূরে সীমাবদ্ধ করে ভেঙে দেয় However আমি আগ্রহী ইন্ডেন্টে কাজ করতে সক্ষম হয়েছি))

এখানে একটি উদাহরণ, কার্সার আন্ডারস্কোর দ্বারা চিহ্নিত সঙ্গে _(সংজ্ঞা দ্বিতীয় চরিত্র কলাম এ class Bazzএবং class Qux), কিন্তু কল্পনা মধ্যে অনুচ্ছেদ বা লাইনের সংখ্যা moduleগুলি অজানা বা পরিবর্তনশীল:

module Foo
  # lots of code...
end

module Bar
  class Baz
    # ...
  end

  class Bazz
    # lots of code...
  end
 _
  class Qux
    # ...
  end

  class Quux
    # lots of code...
  end
end

... আমি দ্রুত নেভিগেট করতে পারে oএর module Barকার্সার উপরে, অথবা nএর endকার্সার নীচে শেষ লাইনে? দ্রষ্টব্য যে উল্লম্ব কলামে সাদা স্থান রয়েছে তবে classসংজ্ঞাগুলির মধ্যে দ্বিতীয় কলামে কোনও অক্ষর নেই ।


2
সম্পর্কিত: ভিম টিপস উইকি vim.wikia.com/wiki/Move_to_next/…
alxndr

জি এবং তারপরে দিকনির্দেশ কী টিপলে ট্যাবগুলি এড়ানো এবং লাইনগুলিতে সরে যেতে পারে
সিবিকোডার

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

উত্তর:


9

কিভাবে এই ফাংশন সম্পর্কে?

function FloatUp()
    while line(".") > 1
                \ && (strlen(getline(".")) < col(".")
                \ || getline(".")[col(".") - 1] =~ '\s')
        norm k
    endwhile
endfunction

আপনি nnoremap gU :call FloatUp()<CR>( gU"উপরে" যেতে পারেন) করতে পারেন, এবং তারপরে অনুরোধ করতে পারেন gU

এখানে একটি ব্যাখ্যা:

  • কোডটি বার বার শর্তটি ধরে রাখার সাথে সাথে কার্সারটিকে (সাথে norm k) সরিয়ে দেয় while
  • whileযদি এই প্রথম লাইন (নয় শর্ত ঝুলিতে line(".") > 1) এবং পারেন
    • এই লাইনটি খুব ছোট (সম্ভবত খালি); অথবা
    • getline(".")বর্তমান কলামে ( [col(".") - 1]) এর বর্তমান লাইন ( ) এর চরিত্রটি শ্বেত স্পেস ( =~ '\s'; অর্থাত্, হোয়াইটস্পেস প্যাটার্নের সাথে মেলে)।

1
এটি পুরোপুরি (এবং দ্রুত) কাজ করে বলে মনে হয় এবং সহজেই কোনও FloatDownকার্যক্রমে রূপান্তরিত হয় । আমার .vimrc এর ভিতরে এটি যায়, ধন্যবাদ! github.com/alxndr/dotfiles/commit/0e25a302
alxndr

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

13

আমি এই জিনিসগুলির জন্য অনুসন্ধান ব্যবহার করতে পছন্দ করি, কারণ এই ক্ষেত্রে, ভার্চাম রিমেক্সগুলিতে নির্দিষ্ট ভার্চুয়াল কলাম সংখ্যার মতো আপনি অনুসন্ধান করতে পারেন এমন একটি উন্মাদ পরিমাণ রয়েছে:

nnoremap cd /\%<C-R>=virtcol(".")<CR>v\S<CR>

nnoremap cu ?\%<C-R>=virtcol(".")<CR>v\S<CR>

cdনীচে যেতে এবং উপরে যেতে ব্যবহার করুন cu। আমি এখানে "কলাম আপ" এবং "কলাম ডাউন" ভাবছি। আমি প্রায় 100% আত্মবিশ্বাসী যে এগুলি ডিফল্টরূপে কোনও পছন্দ নয়। অথবা আপনার নিজের ম্যাপিং চয়ন করুন।

আপনি ট্যাব বা স্পেস বা উভয় ব্যবহার করছেন কিনা তা এটি ব্যবহার করা উচিত।


1
আমার এই আদেশগুলি পার্স করতে সমস্যা হচ্ছে। আপনি তাদের কিছুটা প্রসারিত করতে আপত্তি করবেন?
ডেভিড্লোরিডুদা

1
/ বা? নীচে বা উপরে অনুসন্ধান করতে, \% xv ভার্চুয়াল কলাম নম্বর 'x' অনুসন্ধান করতে সীমাবদ্ধ, এই ক্ষেত্রে 'x' হ'ল <cCR> = virtcol ("।") <CR> 'যা ভার্চল কমান্ড চালায় এবং সন্নিবেশ করে ভার্চুয়াল কলাম নম্বরটি কার্সারটি অভিব্যক্তিতে রয়েছে \ S এর অর্থ কোনও অ-সাদা অংশের অক্ষর।
চাদ

1
চাদকে ব্যাখ্যা করার জন্য ধন্যবাদ আমি কেবল <সিআরটি> সন্নিবেশ মোডে বা কমান্ড-লাইন মোডে একটি রেজিস্টারের বিষয়বস্তু ধরে ফেলব। =রেজিস্টার অভিব্যক্তি রেজিস্টার যা জায়গায় একটি অভিব্যক্তি মূল্যায়ণ করা হয়। এটি খুব সহজ, যদি না কিছুটা অদ্ভুত লাগছে।
সুপারজার

1
এই পদ্ধতির একটি অসুবিধা হ'ল যদি আপনার অনুসন্ধানটি হাইলাইট করা থাকে তবে আপনি দেখতে পাবেন যে কার্সারের উল্লম্ব কলামের সমস্ত অক্ষর এখন "কলাম আপ" আইএনএন বা "কলাম ডাউন" আইংয়ের পরে হাইলাইট হয়েছে।
alxndr

3
আপনি যদি আপনার বিদ্যমান অনুসন্ধানটি সুরক্ষা দিতে চান তবে আপনি পুনরায় :let searchbak=@/<CR>সংযোজন এবং সংযোজন করতে পারেন :let @/=searchbak<CR>। তবে এই মুহুর্তে এটি একধরনের দীর্ঘ এবং অগ্রহণযোগ্য এবং সম্ভবত একটি ফাংশন হওয়া উচিত।
সুপারজার

7

আপনি জাম্পটোভার্টিকালঅ্যাকচারেন্স প্লাগইন ব্যবহার করতে পারেন (এতে ডিফল্ট ম্যাপ করা হয়েছে ]|এবং [|)। এমন আরও কয়েক জন রয়েছে ]V{char}যা কাজ করে fতবে উল্লম্বভাবে। আপনি অবশ্যই তাদের প্রয়োজন হিসাবে পুনরায় তৈরি করতে পারেন।


আপনি প্লাগিন ব্যবহার করতে না চান, আপনি ব্যবহার করতে চেষ্টা করতে পারেন :searchসঙ্গে virtcol(.), যেমন:

:call search('\%' . virtcol('.') . 'v\S', 'bW')

কোথায়:

  • virtcol('.') আপনাকে বর্তমান কলাম দেয়,
  • \S নন-হোয়াইটস্পেসের অর্থ
  • bW পিছনে অনুসন্ধানের জন্য

:help searchআরও জানতে চেক করুন ।

এটি ব্যবহার করা সহজ করার জন্য, আপনি এটি মানচিত্র করতে পারেন, উদাহরণস্বরূপ:

:map <C-k> :call search('\%' . virtcol('.') . 'v\S', 'bW')<CR>
:map <C-j> :call search('\%' . virtcol('.') . 'v\S', 'W')<CR>

অন্যথা, যদি আপনার কোড বন্ধনী রয়েছে, ব্যবহার %তাদের মিলে (যেমন মধ্যে ঘুরে ফিরে দেখতে {, }, [, ], ইত্যাদি) অথবা পুরো অনুচ্ছেদ জাম্প (ব্যবহার {, }সঙ্গে Shiftপ্রয়োজনীয় থাকেন)।


লিংক / উত্স:


থেকে :h search(): wঅর্থ wrap around the end of the fileএবং Wঅর্থ don't wrap around the end of the file। তবে কেন আপনি তাদের দ্বিতীয়টিতে রেখেছিলেন :map?
জায়ের লোপেজ

@ জাইরলপেজ সঠিক, wসেখানে থাকা উচিত নয়, তাই আমি এটি সরিয়েছি, ধন্যবাদ। সম্ভবত আমি মোশন কীগুলি দ্বারা বিভ্রান্ত হয়ে পড়েছিলাম।
কেনারব

3

এই আচরণটি সরবরাহ করতে আমি ভিএম-ইনডেন্ট-অবজেক্ট প্লাগইনের একটি পরিবর্তিত সংস্করণ ব্যবহার করি । আমার পরিবর্তনগুলি এখানে দেখা যায় ।

এটি আমাকে [iবর্তমান ইনডেন্ট স্তরের শুরুতে এবং শেষের দিকে যেতে মানচিত্র করতে দেয় ]i


2

এটা তোলে ঠিক করা হয়েছে কারণ এটি উল্লম্ব আন্দোলন নয়, বরং কিছু অনুরূপ যে দ্রুত কি জিজ্ঞাসা, এবং ভাল যথেষ্ট হতে পারে আপনি অনগ্রসর 2 অনুচ্ছেদ চলন্ত হয় না: {{। এটি আপনাকে ঠিক আগে লাইনে নিয়ে যাবে module Bar


2
কল্পনা করুন যে কার্সার এবং এর শীর্ষ-স্তরের moduleলাইনের মধ্যে অজানা সংখ্যক লাইন এবং / অথবা অনুচ্ছেদ রয়েছে । (বিশেষত, যখন আমি সম্প্রতি তৃতীয় পক্ষের কোডটি কয়েক হাজার লাইন দীর্ঘ নেভিগেট করছিলাম তখন সঠিক ইন্ডেন্টেশন তবে খালি লাইন ছিল না, এবং মডিউলের সংজ্ঞাটির বাহ্যিক প্রসঙ্গটি সন্ধান করার চেষ্টা করা হয়েছিল)
অ্যালেক্সান্ডার

অনুচ্ছেদে লাফিয়ে ফেলা আমার পছন্দের উপায়টি ঘোরাফেরা করার উপায়, তবে এটি কোনও বিকল্প ছিল না: পুরো ফাইলটি একটি "অনুচ্ছেদ" ছিল।
alxndr


1

আমি তার জন্য আমার নিজস্ব প্লাগইন মুভ_আন্টিল_চর_চেন্জস.ভিম ব্যবহার করি।

আমি এটি মানচিত্র gKএবং gJ

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

ডিফল্টরূপে এটি "অনুসন্ধান" অক্ষরটি বাছাইয়ের আগে প্রথমে একটি লাইন স্থানান্তরিত করে।

এটি ভিজুয়াল মোডে কাজ করে তবে আপনি এটি দু'বার ব্যবহারের চেষ্টা না করে এবং আপনি লাইনওয়াইজ বা ব্লকওয়াইজ ভিজুয়াল মোডে থাকেন না ... (সংশোধন স্বাগত!)


1

যেহেতু আমি এটিকে এখানে উত্তর হিসাবে দেখছি না ( সম্পাদনা কেবল লক্ষ্য করেছেন যে সুপারজার খুব অনুরূপ কিছু উল্লেখ করেছে)। আপনি কেবল / বা পারেন? অনুসন্ধান করুন।

উদাহরণস্বরূপ, আপনি দ্বিতীয় কলামের মতো কোনও সাদা বর্ণমালা অক্ষরের জন্য নীচের দিকে অনুসন্ধান করতে পারেন:

/\%2v\S

ভাঙ্গনটি হ'ল:

/    "search downward (use ? for upward movement)
\%2v "for the following char in the 2nd virtual column
\S   "any non white space character

তারপরে আপনি অনুসন্ধানটির পুনরাবৃত্তি করতে সাধারণ অপারেটরগুলি ব্যবহার করতে পারেন।

বিষয়ে আরও তথ্যের জন্য দেখুন :help \%cএবং :help \%v

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