ভিমে পুরো লাইনটি উপরে এবং নীচে সরান


311

নোটপ্যাডে ++ আমি ব্যবহার করতে পারেন Ctrl+ + Shift+ + Up/ Downবর্তমান লাইন উপরে উঠানো এবং নিম্নমুখী হয়। ভিমে কি এর সাথে অনুরূপ আদেশ রয়েছে? আমি অন্তহীন গাইডদের সন্ধান করেছি, কিন্তু কিছুই পাই নি।

যদি তা না থাকে, তবে কীভাবে আমি কীটির সংমিশ্রণের সাথে ক্রিয়াটি আবদ্ধ করতে পারি?

সম্পাদনা: মিকারার উত্তরটি বাফারের শুরু এবং শেষের দিকগুলি বাদ দিয়ে সমস্ত লাইনের জন্য কাজ করে। প্রথম লাইনটি উপরে বা নীচের লাইনটি নীচে সরানো রেখাটি মুছে দেয় এবং নীচের লাইনটি উপরে সরানোর সময় এটি শুরুতে দুটি শূন্যস্থান লাফিয়ে লাফিয়ে ফেলা হয়! যে কেউ কোনও পরিশোধন করতে পারবেন?


স্ক্রিপ্টিং সমাধান বাস্তবায়ন করা ছাড়া আমার আর কোনও উপায় ছিল না। আমি আশা করি এটি আপনার প্রয়োজনের জন্য পরিষ্কার এবং গ্রহণযোগ্য।
মাইকোলা গোলুয়েভ

31
ভবিষ্যতের ছেলেমেয়েদের জন্য: vim.wikia.com/wiki/ মুভিং_লাইনস_উপ_অর_ডাউন
বন্দুক

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


এছাড়াও ষষ্ঠ দঃপূঃ
cfi

উত্তর:


81

কাজটি করতে আপনার .vimrc এ নিম্নলিখিতটি দিন

noremap <c-s-up> :call feedkeys( line('.')==1 ? '' : 'ddkP' )<CR>
noremap <c-s-down> ddp

লাইনটি অদৃশ্য হওয়া দেখে মনে হচ্ছে ভিম বাগের মতো। আমি এড়াতে একটি হ্যাক লাগিয়েছি। সম্ভবত আরও কিছু সঠিক সমাধান আছে।

হালনাগাদ

কেবলমাত্র ভিএম সংমিশ্রণগুলি ব্যবহার করে অনেক অব্যক্ত সমস্যা রয়েছে। এগুলি লাইন নিখোঁজ এবং অতিরিক্ত লাইন জাম্পিং।

সুতরাং এখানে স্ক্রিপ্টিং সমাধান যা .vimrc বা ~ / .vim / প্লাগইন / swap_lines.vim এর ভিতরে স্থাপন করা যেতে পারে

function! s:swap_lines(n1, n2)
    let line1 = getline(a:n1)
    let line2 = getline(a:n2)
    call setline(a:n1, line2)
    call setline(a:n2, line1)
endfunction

function! s:swap_up()
    let n = line('.')
    if n == 1
        return
    endif

    call s:swap_lines(n, n - 1)
    exec n - 1
endfunction

function! s:swap_down()
    let n = line('.')
    if n == line('$')
        return
    endif

    call s:swap_lines(n, n + 1)
    exec n + 1
endfunction

noremap <silent> <c-s-up> :call <SID>swap_up()<CR>
noremap <silent> <c-s-down> :call <SID>swap_down()<CR>

1
আমার সেটআপটির সাথে কোনও সংঘাতের উপস্থিতি উপস্থিত হওয়ার সাথে সাথে <cj> এবং <ck> এ পরিবর্তন করতে হয়েছিল, তবে দুর্দান্ত উত্তর! অনেক অনেক ধন্যবাদ
ব্যবহারকারী 4812

1
ধন্যবাদ, গিট রিবেসের জন্য দুর্দান্ত - ইন্টারেক্টিভ। <cj> এবং <ck> তে আবদ্ধ থাকতে হয়েছিল। সিএস-আপ / ডাউন কাজ করে না।
লারি হোতারি

2
যদি কেউ আলাদা শর্টকাট চায়: সি নিয়ন্ত্রণের জন্য, এ এলইডি, আমি গ্রহণের ক্ষেত্রে <A-up>ব্যবহৃত মতো ব্যবহার করি ।
জানু

1
অদৃশ্য লাইনটি কোনও ভিম ​​বাগ নয়! বরং ddkPডকুমেন্টের শেষ লাইনে পারফর্ম করার কারণে । এটি নিজের জন্য 3-লাইনের ফাইলটিতে চেষ্টা করে দেখুন। এই জাতীয় সমস্যা এড়াতে, :mভিম উইকিতে প্রদত্ত আরও সহজ ম্যাপিংগুলি ব্যবহার করুন
সার্জ Stroobandt

1
আমি শেষ রেখাগুলি পরিবর্তন করেছি <A-up>এবং <A-down>তবে যখন আমি tmux এ ভিজ্যুয়াল চলতে ভিমে এই কীগুলি চেষ্টা করি নির্বাচনটি অদৃশ্য হয়ে যায় এবং কার্সারটি লাইন উপরে চলে যায়; নির্বাচিত লাইন না সরানো ছাড়া।
Konrad

574

আমি যদি উপরের রেখার সাথে একটি লাইন অদলবদল করতে চাই তবে আমি সাধারণত নিম্নলিখিতটি করি

ddkP

ব্যাখ্যা

  • ডিডি লাইনটি মুছে ফেলবে এবং এটি ডিফল্ট রেজিস্টারে যুক্ত করবে।
  • k একটি লাইন উপরে যাবে (j একটি রেখা নীচে সরবে)
  • পি বর্তমান লাইনের উপরে পেস্ট করবে

5
এবং এটি সর্বদা পাওয়া যায়। :-)
হেনো

71
এবং ddpএকটি লাইন নীচে সরানোর জন্য (লাইনটি মুছুন এবং বর্তমান লাইনের নীচে পেস্ট করুন)
বেকফ্লান

2
গুচ্ছ রেখাগুলি সরাতে 4 বলুন 4 ddএবং তারপরে 2 লাইনটি যান, তারপরে :2আপনি কোথায় পেস্ট করতে চান এবং P
গুরু

2
@ গুরু এর 4ddপরিবর্তে হওয়া উচিত 4 dd?
প্যাট্রিক ম্যাকডোনাল্ড

3
এবং dd<number>jpবর্তমান লাইনটি <নাম্বার> +1 লাইনের নীচে সরানোর জন্য। এবং dd<number>kpবর্তমান লাইনটি <লম্বরের সংখ্যা> উপরে সরাতে।
এজেলেভ

230

ধরে নেওয়া যায় যে কার্সারটি আপনার সরানো পছন্দসই লাইনে রয়েছে।

উপরে এবং নীচে চলন্ত: :mসরানোর জন্য

:m +1 - 1 লাইন নিচে সরানো

:m -2 - 1 লাইন উপরে সরান

(দ্রষ্টব্য আপনি কতগুলি রেখাকে উপরে বা নীচে সরিয়ে নিতে চান তার উপর নির্ভর করে যে কোনও সংখ্যার সাথে আপনি +1 প্রতিস্থাপন করতে পারবেন, যেমন +2 এটি 2 লাইনের নীচে সরিয়ে ফেলবে, -3 এটিকে 2 টি লাইনের উপরে সরিয়ে দেবে)

নির্দিষ্ট লাইনে যেতে

:set number - সংখ্যা লাইনগুলি প্রদর্শন করুন (আপনি এটি কোথায় নিয়ে চলেছেন তা দেখতে আরও সহজ)

:m 3 - তৃতীয় লাইনের পরে লাইনটি সরান (আপনি যে কোনও লাইনে 3 টি প্রতিস্থাপন করুন)

একাধিক লাইন সরানো:

V(অর্থাত্‍ ) Shift- Vএবং ভিআইএম-এ একাধিক লাইন নির্বাচনের জন্য উত্সাহীকে উপরে এবং নীচে নিয়ে যান

একবার নির্বাচিত হিট করুন :এবং উপরের কমান্ডগুলি চালনা করুন, m +1ইত্যাদি


14
আমার জন্য: মি -2 কেবল একটি লাইন উপরে চলে যায়।
হারমান ইনজালডসন

2
আমি এই পদ্ধতিটি আমার ভিআইএমআরসি-তে রেখেছি তবে আমি '' ব্যবহার করে কমান্ডটি পুনরাবৃত্তি করতে পারি না। কেউ কি জানেন যে এটি কেন?
হারমান ইঙ্গজালডসন

খুব সুন্দর! নোটপ্যাড ++ এর সমাধানের মতো আরামদায়ক নয়, তবে এখনও - বাস্তব এবং কর্মক্ষম।
আর্টুরাস এম

হারমান, দুঃখিত, টাইপ / ভুল আমার পক্ষ থেকে, আপনি ঠিক বলেছেন: মি -2 এটিকে এক লাইনে নিয়ে যাবে। আমি এটি পরিবর্তন করেছিলাম. খুব দেরিতে জবাবের জন্য দুঃখিত (.vimrc অংশ সম্পর্কে নিশ্চিত নয়) চিয়ার্স
সার্জ

2
: যেমন নোটপ্যাড থেকে বেশী ++, যেমন ওপি জিজ্ঞেস করলাম, .vimrc নিম্নলিখিত প্রবেশ করতে হবে যেমন কমান্ড কাজ ব্যবহার করার, আপনি বাইন্ডিং এটা ব্যবহার করতে চান তাহলে মুভিংnoremap <c-s-up> :m -2<CR> noremap <c-s-down> :m +1<CR>
Kap

74

একটি লাইন উপরে সরান: ddkP

একটি লাইন নীচে সরান: ddp


1
এটি ভিএমআরসি-তে থাকা '' ব্যবহার করে কমান্ড পুনরাবৃত্তি করতে অস্বীকার করে।
হারমান ইনজালডসন

@ হারমানইংজালডসন, আমি মনে করি আপনি যদি কোনও পুনর্বার ব্যবহার করতে সক্ষম হতে চান তবে আপনি কোনও ফাংশনে কমান্ডটি গুটিয়ে রাখতে পারবেন .
জ্যাকোসিমিয়ন

হ্যাঁ, .. এবং যদি আপনাকে আরও লাইন সরানোর প্রয়োজন হয়, আপনি dd এর পরিবর্তে ভি ব্যবহার করতে পারেন।
সেনসোরিও

15

এটি আমার পক্ষে কাজ করেছে:

http://vim.wikia.com/wiki/Moving_lines_up_or_down_in_a_file

বিটিডাব্লু, আপনি যদি ALT + কিছু_কি ব্যবহার করতে চান এবং আপনার টার্মিনাল (urxvt এটি করে) মেনে চলা অস্বীকার করে, আপনার .vimrc এ এই জাতীয় কিছু প্রবেশ করা উচিত:

" For moving lines (^] is a special character; use <M-k> and <M-j> if it works)
nnoremap ^]k mz:m-2<CR>`z==
inoremap ^]j <Esc>:m+<CR>==gi
inoremap ^]k <Esc>:m-2<CR>==gi
vnoremap ^]j :m'>+<CR>gv=`<my`>mzgv`yo`z
nnoremap ^]j mz:m+<CR>`z==
vnoremap ^]k :m'<-2<CR>gv=`>my`<mzgv`yo`z

যেখানে ^] হ'ল একক অক্ষর যা ALT কী উপস্থাপন করে। এই চরিত্রটি ইনপুট করতে, C+v, Escভিমে ( C+q, Escউইন্ডোজে) ব্যবহার করুন।


1
লিমিটি সরানোর জন্য ভিমের অন্তর্নির্মিত কমান্ডটি ব্যবহার করে এটি ভাল। পূর্বাবস্থা বা ত্রুটির মুখে সুন্দর আচরণ করার সম্ভাবনা বেশি।
জোশ লি

1
কেন আপনি এসকে <kbd> সিভি << কেবিডি /> <কেবিডি> এসসি </ কেবিডি> (লিনাক্স) হিসাবে প্রবেশ করবেন না। উইন্ডোজ <kbd> সিভি <কেবিডি /> দ্বারা <kbd> সিকিউ <কেবিডি /> বোর্ড জুড়ে প্রতিস্থাপন করে তবে সন্নিবেশ / কমান্ড মোডে কোনও বিশেষ কী প্রবেশ করার একই পদ্ধতিতে রয়েছে
সেপ্টেম্বর

@ সেহ: ধন্যবাদ, আমি তখন জানতাম না। আমি উত্তর আপডেট করেছি।
emil.p.stanchev

1
@ রাফায়েলআরিনালদি, [niv]noremapসাধারণ | সন্নিবেশ | ভিজ্যুয়াল মোডের জন্য পুনরায় তৈরি হয়। <CR>is Carriage Return( Enterkey)।
vp_arth

1
@vp_arth কোন নেই
sehe

13

~ / .vimrc ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করুন (নিশ্চিত করুন যে এন, এম এর জন্য আপনার কোনও ম্যাপিং নেই)

nmap n :m +1<CR>
nmap m :m -2<CR>

এখন nকী টিপলে একটি লাইন নীচে mসরবে এবং একটি লাইন উপরে চলে যাবে।


12

কমান্ড মোডে আপনি যে লাইনে কার্সারটি নীচে নামতে চান তার অবস্থান এবং তারপরে

ddp

ব্যাখ্যা: ডিডি বর্তমান লাইনটি সাধারণ বাফারকে মুছে দেয় কার্সার অবস্থানের পরে বা সম্পূর্ণ রেখার ক্ষেত্রে নীচে এক লাইন রেখে দেয়।

অনেক ডক্সে p এবং P কমান্ড সম্পর্কে কিছু বিভ্রান্তি রয়েছে। বাস্তবে পি কর্সার এবং পি এ টি কার্সারের পরে আটকায়।


8

এই কোডটি .vimrc (বা .gvimrc) এ কেবল যুক্ত করুন

nnoremap <A-j> :m+<CR>==
nnoremap <A-k> :m-2<CR>==
inoremap <A-j> <Esc>:m+<CR>==gi
inoremap <A-k> <Esc>:m-2<CR>==gi
vnoremap <A-j> :m'>+<CR>gv=gv
vnoremap <A-k> :m-2<CR>gv=gv

1
অনুযায়ী vim.wikia.com/wiki/... একটি ব্যাপক ব্যাখ্যা জন্য সেখানে দেখতে।
সার্জ স্ট্রোব্যা্যান্ড্ট

কোনও ম্যাক <এ- কিছুতে> কাজ করে না, আমি জানি না। আমি <Cj> <Ck> দিয়ে প্রতিস্থাপন করেছি এবং Ctrl কী ব্যবহার করে ভাল কাজ করেছি well
ক্যাড্রিক নিকোলাস

5

আপনি এই দুর্দান্ত প্লাগইনে ঠিক কীটি সন্ধান করছেন : https://github.com/vim-scriptts/upAndDown


1
এটি একাধিক লাইনকে সমর্থন করে যা দুর্দান্ত।
স্টাডিজিক

<S> কীটি দাঁড়ায়?
উসামামান

@ উসামামান শিফট সংশোধক
মাজুনকি


3

আমি আমার .vimrc ফাইলটির শেষে নিম্নলিখিতটি রেখেছি:

noremap H ddkkp
noremap N ddp

সুতরাং এখন 'এইচ' এবং 'এন' যথাক্রমে বর্তমান লাইনটিকে উপরে এবং নীচে সরান।


এইচ এবং এন আসলে দরকারী কমান্ড (এইচ স্ক্রিনের শীর্ষে এবং
প্রার্টারে

আমি দেখি. আমি তাদের পুনর্গঠন করেছি। স্ক্রিনের শীর্ষে যেতে আমি একটি টিপুন এবং তারপরে উপরে। আমার বইগুলির সর্বদা সর্বদা উপায়। এবং পূর্ববর্তী ফলাফলগুলির সন্ধানের জন্য আমি টিপুন এবং তারপরে বামে। F এরপরে সন্ধানের জন্য দাঁড়ায়। তবে যাদের কাছে এটির মতো নেই তারা হ্যাঁ .. এটি বৈধ।
হারম্যান ইনজালডসন

1

উইকিয়া নিবন্ধের উদাহরণগুলি ( বন্দুকের মন্তব্য থেকে সিএফ। লিংক ) ব্যবহার করে ম্যাকভিমের জন্য এখানে একটি সরলিকৃত সংস্করণ ।

" Move selection up/down (add =gv to reindent after move)
:vmap <D-S-Up> :m-2<CR>gv
:vmap <D-S-Down> :m'>+<CR>gv

আমি কেবলমাত্র ব্লক নির্বাচনের বৈকল্পিকটি ব্যবহার করছি, কারণ বর্তমান লাইনটি নির্বাচন করা শিফট-ভি, এবং আরও কয়েকটি লাইন নির্বাচন করতে optionচ্ছিকভাবে কার্সার আপ / ডাউনটি লাগে।

উপরের শর্টকাট অনুসারে, সিএমডি-শিফট-আপ / ডাউন টিপলে ব্লক নির্বাচনটি উপরে / নীচে স্থানান্তরিত হবে। "ডি" হ'ল ম্যাকভিমে কমান্ড কী, উইন্ডোজের জন্য "সি" (নিয়ন্ত্রণ), বা "এ" (অল্ট) চেষ্টা করুন (যেমন <সিএফএফ> হবে কন্ট্রোল আল্ট চ)।

উইকিয়া নিবন্ধ এগুলিতে "= জিভি" যুক্ত করেছে, যা পার্শ্ববর্তী পাঠ্যের উপর ভিত্তি করে সরানোর পরে ব্লকের ইন্ডেন্টেশন সামঞ্জস্য করতে প্রভাব ফেলে। এটি বিভ্রান্তিকর তাই আমি এটিকে সরিয়ে দিয়েছি এবং পরিবর্তে নির্বাচনের দ্রুত ইনডেন্ট করার জন্য শর্টকাট যুক্ত করেছি।

" Indent selection left/right (Cmd Shift Left/Right is used for Tab switching)
:vmap <D-A-Left> <gv
:vmap <D-A-Right> >gv

মাইন্ড, << এবং >> এর মাধ্যমেও একই কাজ করা যেতে পারে তবে নির্বাচনটি হারিয়ে যাবে, সুতরাং উপরের এই শর্টকাটগুলি একাধিকবার ইনডেন্ট করতে দেয় এবং নির্বাচনটি এখনও বজায় থাকে কারণ নির্বাচনটি বজায় থাকে।

আমার ম্যাকভিম সিএমডি-শিফট-বাম / ডান দিয়ে ট্যাবগুলি স্যুইচ করার জন্য কনফিগার করা হয়েছে যাতে আমি সিএমডি-অল্ট-বাম / রাইট ব্যবহার করি।

এখানে ম্যাকভিমের জন্য ট্যাব স্যুইচিং রয়েছে (উপরের বাকীগুলির সাথে .gvimrc রাখুন):

:macm Window.Select\ Previous\ Tab key=<D-S-Left>
:macm Window.Select\ Next\ Tab key=<D-S-Right>

1

ভিম প্লাগইন আনমপাইার্ড.ভিম [ই এবং] ই


2
এটি ওভারকিলের মতো বলে মনে হচ্ছে, এর জন্য আপনার সত্যিই একটি সম্পূর্ণ প্লাগইন প্রয়োজন বলে আমি মনে করি না। ভিএমআরসি-র 2 টি লাইন ওপি যা চায় ঠিক তা করে
ড্যানিয়েল গ্রেটজার

1

যখন আপনি কমান্ড আঘাত :help moveমধ্যে vim, এখানে ফলাফল:

:[range]m[ove] {address} *:m* *:mo* *:move* *E134* Move the lines given by [range] to below the line given by {address}.

উদাহরণস্বরূপ: বর্তমান রেখাকে এক লাইন নীচে সরান => :m+1

উদাহরণস্বরূপ: 80 => সংখ্যার সাথে রেখার নীচে 100 নম্বর দিয়ে রেখাটি সরান :100 m 80

উদাহরণস্বরূপ: 200 => সংখ্যার সাথে রেখার নীচে 100 নম্বর সহ লাইন সরান :100 m 200

উদাহরণস্বরূপ: 200 => সংখ্যা সহ লাইনের নীচে [100, 120] এর মধ্যে সংখ্যার সাথে রেখাগুলি সরান :100,120 m 200


1

এখানে আমার মেশিনে কাজ করা একটি সমাধান রয়েছে : ম্যাকবুক প্রো চলমান ভিআইএম 8.1

এই আদেশগুলি আপনার বাফারের উপরের বা নীচে আপনার লাইনগুলি মুছবে না।

আমার পরিবেশে সঠিকভাবে ম্যাপিং না করার জন্য তাদের কী-কোডগুলির জন্য আল্ট-জে এবং আল্ট-কে আউটপুট একটি বাস্তব কাজ হিসাবে ব্যবহার করা।

এটি পুরানো .vimrc এ ফেলে দিন এবং দেখুন আপনার পক্ষে কাজ করে কিনা।

" Maps Alt-J and Alt-K to macros for moving lines up and down
" Works for modes: Normal, Insert and Visual
nnoremap ∆ :m .+1<CR>==
nnoremap ˚ :m .-2<CR>==
inoremap ∆ <Esc>:m .+1<CR>==gi
inoremap ˚ <Esc>:m .-2<CR>==gi
vnoremap ∆ :m '>+1<CR>gv=gv
vnoremap ˚ :m '<-2<CR>gv=gv


0

: মি। + 1 বা: মিঃ -2 আপনি যদি একটি একক লাইনটি সরিয়ে থাকেন তবে তা করবে। একাধিক লাইন সরানোর জন্য আমার স্ক্রিপ্ট এখানে। ভিজ্যুয়াল মোডে, আল্ট-আপ / আল্ট-ডাউন এক লাইনের মাধ্যমে ভিজ্যুয়াল নির্বাচন সংবলিত লাইনগুলিকে উপরে / নিচে সরানো হবে। সন্নিবেশ মোড বা স্বাভাবিক মোডে, আল্ট-আপ / আল্ট-ডাউন বর্তমান লাইনটি সরিয়ে ফেলবে যদি কোনও গণনা উপসর্গ দেওয়া না হয়। যদি একটি গণনা উপসর্গ থাকে, আল্ট-আপ / আল্ট-ডাউন বর্তমান লাইন থেকে শুরু করে অনেকগুলি রেখা এক লাইন উপরে / নীচে সরানো হবে।

function! MoveLines(offset) range
    let l:col = virtcol('.')
    let l:offset = str2nr(a:offset)
    exe 'silent! :' . a:firstline . ',' . a:lastline . 'm'
        \ . (l:offset > 0 ? a:lastline + l:offset : a:firstline + l:offset)
    exe 'normal ' . l:col . '|'
endf

imap <silent> <M-up> <C-O>:call MoveLines('-2')<CR>
imap <silent> <M-down> <C-O>:call MoveLines('+1')<CR>
nmap <silent> <M-up> :call MoveLines('-2')<CR>
nmap <silent> <M-down> :call MoveLines('+1')<CR>
vmap <silent> <M-up> :call MoveLines('-2')<CR>gv
vmap <silent> <M-down> :call MoveLines('+1')<CR>gv

0

আপনি যদি সুনির্দিষ্ট অনুসন্ধানের সাথে মেলে এমন একাধিক লাইনে এটি করতে চান তবে:

  • আপ: :g/Your query/ normal ddpবা:g/Your query/ m -1
  • ডাউন :g/Your query/ normal ddpবা:g/Your query/ m +1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.