Làm cách nào để hoán đổi hai dòng trong vim?


94

Tôi có cái này:

pick 887b66f add 222 Dziewiecsil to flowers new title
pick dc331cb new name of beginning commit

Và tôi muốn nhận được điều này:

pick dc331cb new name of beginning commit
pick 887b66f add 222 Dziewiecsil to flowers new title

Có cách nào để thực hiện việc này một cách nhanh chóng bằng phím tắt không?


Bạn có thể cân nhắc sử dụng một trình soạn thảo khác nếu bạn không quen với vim. Bạn có thể định cấu hình trình chỉnh sửa cho git chỉ bằng cách sử dụng git config --global core.editor <whatever>hoặc cho nhiều thứ cùng một lúc (bao gồm cả git) bằng cách đưa export EDITOR=<whatever>vào của bạn .bashrc.
Sven Marnach,

Câu trả lời:


159

Để hoán đổi dòng hiện tại với dòng tiếp theo, hãy nhập ddpkhi đang ở chế độ lệnh.

  • dd - xóa dòng (thực sự được gọi là cắt trong các trình soạn thảo khác) và lưu nó vào sổ đăng ký
  • p - dán dòng từ thanh ghi

3
Di chuyển con trỏ trên dòng đầu tiên, sau đó nhập ddp. Nếu bạn chưa ở chế độ lệnh, hãy nhấn Escđể vào chế độ lệnh.
Sven Marnach

32
ddxóa dòng hiện tại sau khi sao chép nó vào một "sổ đăng ký". psao chép ("đặt") nội dung của thanh ghi vào bộ đệm của bạn sau dòng hiện tại. Tương tự, bạn có thể hoán đổi hai ký tự với xphoặc hai từ với dwwP.
Keith Thompson

@KeithThompson thật không may, không dễ dàng như vậy để hoán đổi hai từ.
CS

@CS Bạn đang đề cập đến thực tế dwwPkhông hoạt động theo cùng một cách nếu hai từ nằm ở cuối dòng? (Và hoán đổi từ cuối cùng trên một dòng với từ đầu tiên trên dòng sau thậm chí còn phức tạp hơn.)
Keith Thompson

1
@KeithThompson vâng, mặc dù tôi cảm thấy hơi tệ sau khi đưa ra nhận xét của mình vì đó là một trường hợp cạnh nghĩa;)
CS

52

ddxóa dòng hiện tại, sau đó bạn có thể dán dòng đã xóa bằng cách sử dụng p. Có một cách khác mặc dù sử dụng m. Với mbạn có thể di chuyển các dòng xung quanh tức là

:m 1 sẽ di chuyển dòng hiện tại sau dòng 1

:m 0 sẽ di chuyển dòng hiện tại lên đầu

:m $ sẽ chuyển dòng hiện tại xuống dưới cùng

Trong ví dụ của bạn, hãy đặt con trỏ vào dòng đầu tiên và nhập :m $

Thông tin thêm: http://vim.wikia.com/wiki/Moving_lines_up_or_down


1
Cảm ơn vì lời giải thích cho "người bản xứ" không vim :-)
Bruno Bieri

1
Đây là câu trả lời mà tôi cũng đang tìm kiếm để mở rộng kiến ​​thức về vim.
Phemelo Khetho

Cảm ơn! Đây là câu trả lời mà tôi đang tìm kiếm. Điều này có thể trở nên thuận tiện hơn khi vuốt nhiều dòng cùng một lúc bằng chế độ trực quan.
Kareem Jeiroudi

8

Mặc dù thực tế rằng vấn đề là khá cũ và được đánh dấu là đã trả lời, tôi muốn mở rộng câu trả lời bằng cách nói rằng bạn có thể sử dụng các lệnh chế độ bình thường, được cung cấp bởi Sven Marnach với nnoremapnhư vậy:

:nnoremap <C-Up> <Up>ddp<Up>
:nnoremap <C-Down> ddp

Điều này sẽ cho phép bạn di chuyển các dòng có Ctrl+ UpCtrl+ Downtrong tệp của bạn. Tuy nhiên, điều này sẽ ghi đè lên @"thanh ghi , nơi lưu trữ chuỗi / từ / chữ cái / vv được sao chép cuối cùng của bạn. Vì vậy, bằng cách thêm "(reg) vào trước ddpcác lệnh, chúng ta có thể sửa lỗi này:

:nnoremap <C-Up> <Up>"add"ap<Up>
:nnoremap <C-Down> "add"ap

Ở đây chúng tôi thêm "atrước khi xóa và dán các lệnh để lưu trữ dòng của chúng tôi trong @athanh ghi, vì vậy thanh ghi sao chép mặc định của bạn sẽ không bị ghi đè. Tuy nhiên, nó có thể ghi đè lên nội dung của @athanh ghi (ai biết được, nhưng bạn có thể sử dụng nó cho một việc quan trọng trong trường hợp sử dụng của mình, nhưng bước này hơi hoang tưởng, bạn có thể bỏ qua nếu muốn), hãy khắc phục điều đó:

:nnoremap <silent><C-Up> :let save_a=@a<Cr><Up>"add"ap<Up>:let @a=save_a<Cr>
:nnoremap <silent><C-Down> :let save_a=@a<Cr>"add"ap:let @a=save_a<Cr>

( <silent>cần thiết để ngăn lặp lại các lệnh của chúng tôi tới dòng thông báo ở dưới cùng.)

Bây giờ chúng ta có hai ánh xạ cho phép chúng ta di chuyển các dòng trong tệp bằng các phím tắt. Bạn có thể xác định lại các nút, tôi sử dụng Alt+ j/ k, sẽ là <A-j><A-k>cho các lệnh đó. Tuy nhiên, không phải tất cả các trình giả lập đầu cuối đều hỗ trợ ánh xạ phím Alt AFAIK.



0

Các ánh xạ được đề xuất trong trang Vim wikia thực sự là cách tốt nhất để ánh xạ các tổ hợp phím mô phỏng cách Sublime và các trình soạn thảo khác triển khai tính năng này.

Điều này bao gồm hành động thụt lề sau khi di chuyển, điều này cũng rất tuyệt vời (đó là ==dấu bằng kép , trong trường hợp bạn không muốn điều đó).

Nó cũng hỗ trợ các chế độ trực quanchèn , để bạn có thể di chuyển các dòng trong khi chỉnh sửa hoặc với fulblocks.

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

Cá nhân tôi đã ánh xạ chúng tới <D-J><D-K>trên máy Mac của mình, thay vì <A-ánh xạ tới Altkhóa. Bằng cách đó, tôi sử dụng Cmd+ Shift+ j/ k, cảm giác tự nhiên hơn với đầu ngón tay của tôi.

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.