Làm thế nào tôi có thể dễ dàng di chuyển một dòng?


47

Lệnh (hoặc phím tắt) để di chuyển một dòng lên hoặc xuống trong vim là gì? Quy trình công việc hiện tại của tôi là kéo (sao chép) dòng và xóa dòng đó và hơn là đặt (dán) dòng đó.


8
Vì việc xóa thực sự cắt giảm, bạn có thể bỏ qua yank : ddkP, di chuyển xuống dễ dàng hơn : ddp.
muru

Câu trả lời:


52

Đầu tiên, bạn không cần phải kéo xóa; cái sau cũng sẽ đưa nội dung bị xóa vào thanh ghi (mặc định hoặc được chỉ định). Do đó, ddp/ ddkPlà các lệnh phổ biến để di chuyển một dòng xuống / lên.

Ngoài ra, bạn có thể sử dụng :movelệnh, tức là :move +1/ :move -2; điều này không làm tắc nghẽn thanh ghi và bạn cũng có thể di chuyển toàn bộ phạm vi. Bạn có thể dễ dàng xác định ánh xạ chính để rút ngắn điều này.

Nếu bạn không bận tâm đến các plugin (và sự thoải mái bổ sung thường đi kèm với chúng), cả plugin không có kinh nghiệm của Tim Pope và plugin LineJuggler của tôi đều cung cấp ]e/ [eánh xạ để di chuyển các dòng (và nhiều hơn nữa; dòng (s)).


36

Đơn giản nhất là: :m+hoặc :m-2viết tắt cho :movenhư Ingo đề xuất.

Hoặc sử dụng chế độ trực quan ( V) bằng cách cắt dòng ( d/ x) sau đó dán nó ( p- bên dưới con trỏ, Pbên trên con trỏ) sau khi bạn di chuyển con trỏ đến đúng vị trí trước khi dán (tóm lại là Vxp/ Vdp).

Khi di chuyển nhiều dòng trong chế độ trực quan, sau đó bạn sẽ sử dụng :m '>+1(để di chuyển một dòng xuống) hoặc :m '<-2(để di chuyển một dòng lên).


Dưới đây là mẫu ánh xạ hữu ích ( Shift+ ↑/ Shift+↓):

nnoremap <S-Up> :m-2<CR>
nnoremap <S-Down> :m+<CR>
inoremap <S-Up> <Esc>:m-2<CR>
inoremap <S-Down> <Esc>:m+<CR>

tương tự như văn bản cao siêu ( Win / OSX ).

Dưới đây là một số gợi ý tại vim wikia :

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

Ở chế độ bình thường hoặc ở chế độ chèn, nhấn Alt-j để di chuyển dòng hiện tại xuống hoặc nhấn Alt-k để di chuyển dòng hiện tại lên.

Sau khi trực quan chọn một khối các dòng (ví dụ: bằng cách nhấn V sau đó di chuyển con trỏ xuống), nhấn Alt-j để di chuyển toàn bộ khối xuống hoặc nhấn Alt-k để di chuyển khối lên.

Xem thêm:


2
+1 cho liên kết Vim wikia. Đã học được một vài điều ở đó.
Gonçalo Ribeiro

Không biết tại sao, nhưng chúng hoạt động rất tốt trong Gvim, nhưng không hoạt động như mong đợi trong terminal vim. (Có vẻ như đó là vấn đề của tmux)
CodyChan

11

Nếu tôi muốn hoán đổi một dòng với dòng trên, tôi thường làm như sau

ddkP

Giải trình

  • dd sẽ xóa dòng và thêm nó vào thanh ghi mặc định.
  • k sẽ di chuyển lên một dòng (j sẽ di chuyển xuống một dòng)
  • P sẽ dán phía trên dòng hiện tại

3
Để di chuyển dòng hiện tại xuống, hãy sử dụngddp
Qinjie

4

FWIW, đây là những gì tôi đã sử dụng trong nhiều năm. Nó di chuyển dòng hiện tại lên và xuống trong chế độ bình thường hoặc lựa chọn ở chế độ trực quan, trong khi điều chỉnh thụt lề tự động.

nnoremap ,<Up>   :<C-u>silent! move-2<CR>==
nnoremap ,<Down> :<C-u>silent! move+<CR>==
xnoremap ,<Up>   :<C-u>silent! '<,'>move-2<CR>gv=gv
xnoremap ,<Down> :<C-u>silent! '<,'>move'>+<CR>gv=gv
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.