আমি কি কমা (বা অন্য কোনও চরিত্র) দিয়ে লাইনে যোগ দিতে পারি?


19

আমি জানি আমি ভিমে লাইনগুলিতে Jএবং এর বিভিন্ন রূপগুলি ( gJইত্যাদি) এ যোগ দিতে পারি; Jহবে "ইন্ডেন্ট সরান এবং দুই শূণ্যস্থান পর্যন্ত সন্নিবেশ"

তবে দুটি জায়গার পরিবর্তে অন্য চরিত্রটি সন্নিবেশ করার জন্য কি সরল কোনও উপায় আছে? উদাহরণস্বরূপ একটি কমা ( ,) বা কমা এবং স্পেস ( ,)?

প্রদত্ত:

8
9
10
32

আমি এখানে দিয়ে শেষ করতে চাই:

8, 9, 10, 32

বা:

8,9,10,32

আপনি github.com/sk1418/ জয়েন পছন্দ করতে পারেন (পরীক্ষিত নয়)।
ভ্যানল্যাসার

উত্তর:


5

আমি একটি যোগদান প্লাগইন লিখেছি, আপনি যা করতে পারেন তা করতে পারেন এবং আরও অনেক কিছু।

বিল্ট-ইন দ্বারা প্রদত্ত সমস্ত বৈশিষ্ট্য ব্যতীত: কমান্ড কমান্ড, জয়েন ক্যান:

  • বিভাজক (স্ট্রিং) সহ লাইনে যোগ দিন
  • নেতৃস্থানীয় / পিছনের সাদা স্থানগুলিকে ছাঁটা ছাড়াই বা ছাড়াই লাইনগুলিতে যোগদান করুন
  • নেতিবাচক গণনা সহ লাইনগুলিতে যোগদান করুন (পিছনের দিকে যোগ দিন)
  • বিপরীতে লাইনে যোগদান করুন
  • লাইনে যোগদান করুন এবং যোগদান করা রেখাগুলি রাখুন (যুক্ত লাইনগুলি বাদ না দিয়ে)
  • উপরের বিকল্পগুলির যেকোন সংমিশ্রণের সাথে লাইনগুলিতে যোগদান করুন

আরও বিশদ এবং স্ক্রিনশট:

https://github.com/sk1418/Join


23

একটি সহজ উপায় হ'ল: কেবল আপনার লাইনগুলি নির্বাচন করুন (শেষটি ব্যতীত সমস্ত) - বা ব্যবহার করুন %- এবং চালান:

:'<,'>s/\n/,/

অথবা

:'<,'>s/\n/, /

(যেখানে, অবশ্যই, '<,'>অংশটি ইতিমধ্যে ভিমের পরে সন্নিবেশ করা :হয়েছিল, নির্বাচনটি লক্ষ্যবস্তু করার জন্য)


(২ য়) আপডেট:

উপরের উপর ভিত্তি করে (এবং সাটো ক্যাটসুরার মন্তব্য), গণনা এবং alচ্ছিক পুনরাবৃত্তি সমর্থন সহ এখানে একটি সম্ভাব্য "ইন্টারেক্টিভ জয়েন" বাস্তবায়ন রয়েছে:

" ================ script ===============================================
" interactive 'J', 'gJ' replacement with optional 'vim-repeat' support
" The last used separator is automatically reused as:
" a. default choice
" b. when repeating (=> non-interactive repeats: same range, same separator)
let g:last_join_separator = " "
function! s:interactiveJoin(use_last_sep,...) range
    if (a:use_last_sep == 0) "interactive, ask for separator to use
        call inputsave()
        echohl Question
        let l:sep = input("Separator:", g:last_join_separator)
        echohl None
        call inputrestore()
        redraw!
        let g:last_join_separator = l:sep "update last separator value
    else "non-interactive (when repeating with '.')
        let l:sep = g:last_join_separator
    endif
    if (a:0 == 0) "with no argument, remove indentation *and trailing spaces*
        let l:subst = 's/\s*\n\+\s*/\=' . "'" . l:sep . "'/"
    else " don't remove indentation or trailing spaces (act like 'gJ')
        let l:subst = 's/\n\+/\=' . "'" . l:sep . "'/"
    endif
    if a:firstline < a:lastline "join given range
        execute a:firstline . ',' . (a:lastline - 1) . l:subst
        let l:count = a:lastline - a:firstline + 1 "default count for repeat
    else "or join only with next line
        execute l:subst
        let l:count = 1 "default count for repeat
    endif
    "make command repeatable
    "(with the tpope/vim-repeat plugin: optional, recommended)
    if (a:0 == 0)
        silent! call repeat#set("\<Plug>(repeatJoin)", l:count)
    else
        silent! call repeat#set("\<Plug>(repeatGJoin)", l:count)
    endif
endfunction

noremap <silent> <Plug>(interactiveJoin)  :call <SID>interactiveJoin(0)<CR>
noremap <silent> <Plug>(interactiveGJoin) :call <SID>interactiveJoin(0,'g')<CR>
noremap <silent> <Plug>(repeatJoin)       :call <SID>interactiveJoin(1)<CR>
noremap <silent> <Plug>(repeatGJoin)      :call <SID>interactiveJoin(1,'g')<CR>

এবং একটি প্রকৃত ম্যাপিং:

"================= vimrc ================================================
nmap J <Plug>(interactiveJoin)
xmap J <Plug>(interactiveJoin)
nmap gJ <Plug>(interactiveGJoin)
xmap gJ <Plug>(interactiveGJoin)

এটি কিন্ডা (*) এর মতো Jতবে ইন্টারেক্টিভ - এটি বিভাজক স্ট্রিংয়ের জন্য অনুরোধ জানাবে। ডিফল্ট স্ট্রিংটি একটি স্থান - সুতরাং, উদাহরণস্বরূপ, কোনও বিভাজক ছাড়া লাইনগুলিতে যোগ দেওয়া, Backspaceযখন অনুরোধ করা হবে তখন হিট করুন , ডিফল্ট স্থানের অক্ষর সরিয়ে ফেলতে এবং Enter(এখন) খালি বিভাজককে স্বীকার করতে। গণনা, যেমন 3J, এছাড়াও কাজ করে। তাহলে tpope/vim-repeatপ্লাগইনটি ইনস্টল হয়ে, সঙ্গে পুনরায় '।' শেষ বিভাজক এবং (পরিবর্তিত না হলে - উদাহরণস্বরূপ 10.) শেষ গণনা বা ভিজ্যুয়াল লাইনের পরিসীমা পুনরায় ব্যবহার করেও কাজ করবে ।


(*) এটি ঠিক মত নয় J, যদিও এটি ইন্ডেন্টেশনটি সরিয়ে ফেলবে, এটির .!?পরিবর্তে এটি দুটি (দুটি বাক্য) সন্নিবেশ করানোর জন্য অনুসন্ধান করবে না বা এটি অনুপস্থিত থাকলে একটি স্থান সন্নিবেশ করানো হবে (এর মতো কিছু করা শক্ত) এটি, যেহেতু বিভাজক স্ট্রিং এখন কিছু হতে পারে)। এটি পিছনের স্থানগুলিও সরিয়ে ফেলবে (আরও অর্থবোধ করে)।

আমি মনে করি সীমিত অপারেটরদের চিঠি-স্পেসকে ওভারলোড করার এটি একটি দুর্দান্ত উপায় হতে পারে :)

ঠিক আছে, প্রযুক্তিগতভাবে Jকোনও অপারেটর নয়, তবে একটির কাছাকাছি - উদাহরণস্বরূপ, Jaw"একটি শব্দ" -এ যোগ দিতে আপনি পারবেন না ।

(পরামর্শ স্বাগত জানাই)

এখানে চিত্র বর্ণনা লিখুন


2
আরও ভাল: :'<,'>-1s/\n/, /চিহ্নিত লাইনগুলির :1,$-1s/\n/, /জন্য বা পুরো ফাইলের জন্য।
সাতো ক্যাটসুর

প্রকৃতপক্ষে, এটি আরও ভাল :)
ভ্যানলাসার

@ স্যাটোক্যাটসুর আপনি কি ব্যাখ্যা করতে পারবেন -1?
alxndr

1
@alxndr - এটি পরিসীমা / ফাইলের শেষ লাইনটি এড়াতে ব্যবহৃত হয়: উদাহরণস্বরূপ ওপি উদাহরণে, আপনি 32 এর পরে কমা চান না, এবং এটি উপস্থিত থাকলে পরবর্তী লাইনের সাথে আপনি এতে যোগ দিতে চান না । আপনি এমনকি ব্যবহার করতে পারেন '<,'>-s/\n/, /বা 1,$-s/\n/, /হিসাবে -একই -1
ভ্যানল্যাসার

1
যদি l:sepএটি হয় &তবে আপনার প্রতিস্থাপনটি ভুলভাবে কাজ করবে, যেহেতু &প্রতিস্থাপনে যাদু রয়েছে। \=আক্ষরিক স্ট্রিংটি ব্যবহার করতে আরও ভাল হতে পারে - let l:subst = 's/\n\+/\=' . "'" . l:sep . "'/"- পালানোর হাতছাড়া করার চেষ্টা করার পরিবর্তে।
জামেসান

3

বাহ্যিক কমান্ড ব্যবহার করে উদাহরণ দেওয়া হল:

:%!paste -sd,

যেখানে %!বর্তমান বাফার (ফাইলের বিষয়বস্তু) কমান্ডের সাথে প্রতিস্থাপন করে: paste -sd,(পরামিতিগুলি -sএকাধিক লাইনে যোগদানের জন্য ব্যবহৃত হয় এবং -dএতে ডিলিমিটার চরিত্র সেট করে ,)।


3

কেউ যদি রেগেক্স টাইপ করতে এবং আরও প্লাগইন প্রাক্তন কমান্ডগুলি মুখস্থ করতে পছন্দ করেন না:

ভিজ্যুয়াল-ব্লক সংযোজন

ভিজ্যুয়াল-ব্লক সংযোজন ভিজ্যুয়াল ব্লক মোডে উপলব্ধ ( <C-v>) এবং এটি একটি ব্লক পেপেন্ড করতে পারে (এবং প্রিপেন্ডের জন্য ব্লক আই এনসার্ট) can (সুত্র: :help v_b_A, :help v_b_I)

এবং যদি ব্লক ভিজ্যুয়াল মোডের শেষ গতিটি হয় $, সমস্ত সংযোজন শেষে সংযোজন করা হবে; অন্যথায় আপনার সংযুক্ত পাঠ্যের আগে ফাঁকা স্থান সন্নিবেশ করা হবে ( )কোডের মধ্যে বেশ কয়েকটি পদ্ধতি কলের শেষে প্রান্তিককরণ বন্ধের কল্পনা করুন )।

নীচে নমুনা পাঠ্য এবং কার্সার সহ 8:

8
9
10
12

<C-v>}$A,<C-c>। স্বাভাবিক মোডে ফিরে যাওয়ার পরে, আমরা দেখতে পাব ,যে সমস্ত নির্বাচিত লাইনে যুক্ত হয়। (ছাড়া চেষ্টা করুন $)

তারপরে gvঅঞ্চলটি পুনরায় নির্বাচন করতে এবং Jবা gJ। আমাদের একটি চলার পথ রয়েছে ,: 8,9,10,12,এবং $xআমরা শেষ করেছি।

কোনও পিছনে পিছনের জন্য সন্নিবেশ ব্যবহার করুন ,

আসুন আমাদের পাঠ্যটি পূর্বাবস্থায় ফেলা যাক (সে হোক uu..uবা অভিনব হোক :ea 1d<cr>:lat 1), এবং ভিজ্যুয়াল সন্নিবেশ করার চেষ্টা করুন:

j<C-v>}I, <C-c>এবং তারপরে আমরা gJফাঁকা ছাড়াই লাইনে যোগ দিতে পারি ।

অপেক্ষা করুন অপেক্ষা করুন, কিছু অনুপস্থিত। পুরো "অ্যারে" কীভাবে পুনরায় নির্বাচন করবেন? এবার আমরা প্রথম লাইনটি নির্বাচন করি নি ... সুতরাং gvসাহায্য করবে না।

- বা এটি সাহায্য করতে পারে, gvok( gv), oপপোসাইট কোণের এবং পুনরায় নির্বাচন করুন k

পিএস আমার গোলাপী টাইপ করার /\জন্য যথেষ্ট দ্রুত এবং নির্ভুল নয় /\n, তাই রেগেক্স ব্যবহার এড়াতে আমি ভিম অন্তর্নির্মিত ক্রিয়াকলাপ এবং আন্দোলনের সংমিশ্রণ করতে পছন্দ করি। তবে আমি যদি ম্যাপিং ব্যবহার করে এই ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘুরি।।।।।।।।।।।।।।।।


1

প্লাগইন বা বাহ্যিক কমান্ড ছাড়াই আপনার Jজায়গা থেকে যে চরিত্রটি পছন্দ হয় সেই স্থান থেকে পুনরায় পুনরায় সংযুক্ত হওয়ার জন্য খুব সহজ উপায় । উদাহরণস্বরূপ, কমা এবং একটি স্থানের সাথে যোগ দিতে:

:nmap J :s/\n/, /^M

শেষে বিশেষ অক্ষরের নিউলাইনের জন্য ( ^M) টিপুন Ctrl-Vএবং তারপরে রিটার্ন / এন্টার টিপুন। একই যায় আপনি একটি ট্যাব সঙ্গে প্রতিস্থাপন করতে চান ( ^I), টাইপ Ctrl-Iতারপর Tab

:nmap J :s/\n/^I/^M

এটি যা করছে তা হ'ল বর্তমান লাইনের একটি ট্যাব দিয়ে একটি নতুন লাইন প্রতিস্থাপন করা এবং সেই আচরণটিকে জে চরিত্রটিতে পুনরায় স্থাপন করা।

এটি 4Jপরবর্তী 4 টি লাইনে যোগ দেওয়ার মতো সংযোজনগুলির সাথেও কাজ করে।


0

কমা দিয়ে লাইনে যোগ দিতে আপনি একটি ম্যাক্রো রেকর্ড করতে পারেন। এটি কার্যকর যদি এটি একটি বিরল বা এক-অফ কাজ, এবং আপনি কীভাবে বিকল্প সম্পাদনা এবং নিয়মিত প্রকাশটি টাস্কটি সম্পাদন করতে চান তা মনে করতে পারেন না, তবে আপনি কীভাবে ম্যাক্রো রেকর্ড করবেন এবং চালাবেন তা আপনার মনে নেই।

কমা দিয়ে লাইনগুলিতে যোগদান করতে, qjgJi,Escqরেজিস্টারটিতে ম্যাক্রো রেকর্ড করতে টাইপ করুন j। তারপরে আপনি ম্যাক্রোটি দিয়ে চালাতে পারেন @j। আপনি এর সাথে ম্যাক্রোটি আবার চালাতে পারেন @@, যা একাধিকবার এটি একাধিকবার চালানোর সময় টাইপিংয়ের উপর সাশ্রয় করে — আপনি @যে লাইনের সাথে যুক্ত হতে চান তার শেষ না হওয়া পর্যন্ত আপনি কেবল ধরে রাখতে পারেন। আপনি একটি সংখ্যার উপসর্গটি ব্যবহার করতে পারেন @jবা @@এটির একটি সেট সংখ্যা বারবার পুনরাবৃত্তি করতে পারেন। এটি লিডিং এবং পেছনের স্থানটি অক্ষত রাখে, তাই আপনার আসল পাঠ্যটিতে শূন্যস্থান থাকলে কমা বা তার আগে স্পেস থাকবে।

কমা এবং একটি স্থানের সাথে যোগ দিতে ম্যাক্রো রেকর্ড করার সময় এবং এর Spaceমধ্যে সন্নিবেশ করান ।,Esc

আপনি ম্যাক্রো রেকর্ডিংয়ের Jপরিবর্তে ব্যবহার করতে পারেন gJযা সাধারণত কমা এবং একটি স্থানের সাথে লাইনে যোগ দেয়। যাইহোক, যদি বর্তমান লাইনে শ্বেত স্পেস অনুসরণ করে থাকে তবে কমাটি কোনও স্থান অনুসরণ না করে সাদা স্থানের পরে উপস্থিত হবে। এছাড়া, এটিও স্থান যদি পরের লাইনে দিয়ে শুরু হয় অন্তর্ভুক্ত নয় ), এবং এটি কমা পর দুই শূণ্যস্থান রাখে যদি joinspacesবর্তমান লাইন প্রান্ত সেট করা হয় এবং ., !বা, ?। এই সতর্কতা নীচে বর্ণিত হয় :help J

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