2012-01-24 27 views
38

Tôi đang chạy vim 7.3 trên máy Mac 10.7.2 và tôi đang gặp một số sự cố khi cắt và dán một vài dòng.Cắt và dán nhiều dòng trong vim

Trên thiết lập Linux cũ của tôi (đã bị đánh cắp vì vậy tôi không biết phiên bản), tôi có thể nhập "dd" nhiều lần và sau đó "p" sẽ giật tất cả chúng trở lại. Ví dụ: loại: "dd dd" và hai dòng sẽ bị xóa. Bây giờ, hãy nhập "p" và cả hai dòng được dán lại vào bộ đệm.

Tôi biết tôi có thể thực hiện những gì tôi muốn bằng cách nhập "2dd" và sau đó "p" - nhưng tôi muốn có thể "dd" -out dòng mà không tính số dòng trước.

Bất kỳ ý tưởng nào?

+2

Không để đếm dòng trước sử dụng "relativenumbers" để hiển thị số dòng tương ứng với con trỏ. Và bắt đầu với 7.4, thiết lập cả hai "số" và "relativenumbers" làm cho số dòng nơi con trỏ của bạn là tuyệt đối và những người khác tương đối, nhận được tốt nhất của cả hai thế giới. Sau đó, nó dễ dàng hơn để làm như @Giovanni đề nghị d2d (cho hai dòng). –

+1

Điều này thật tuyệt vời, nhưng đối với bất cứ ai cố gắng nó thực sự là "số" và "relativenumber", không phải "số" và "relativenumbers" :) – user3640967

Trả lời

75

Bạn đã cân nhắc sử dụng visual mode?

Bạn chỉ có thể đi:

  • Nhấn V
  • Chọn tất cả mọi thứ bạn muốn cắt mà không cần đếm
  • Nhấn d
  • Đến nơi bạn muốn dán
  • Nhấn p

Điều này sẽ mang lại khoảng một nửa số lần nhấn phím như phương thức dd vì bạn nhấn một phím trên mỗi dòng thay vì hai. Điểm thưởng nếu bạn sử dụng 5j (hoặc tương tự) để chọn nhiều dòng cùng một lúc.

+9

Đối với dòng đầy đủ, nó dễ dàng hơn để sử dụng 'V' (Shift + V). –

+0

Tốt nhất @GregHewgill, đã chỉnh sửa với đề xuất của bạn. –

+1

Tôi sẽ nói rằng tôi không muốn làm điều này bởi vì tôi "thích" luồng công việc cũ của tôi. Nhưng, tôi đã thử nó và nó tốt hơn. Cảm ơn! – spinlock

5

Không chắc chắn nếu điều này là đủ gần với những gì bạn đang cố gắng, nhưng một điều bạn có thể làm là sử dụng một đăng ký cụ thể, và viết hoa tên đăng ký của bạn. Mà nói vim để phụ thêm vào đăng ký chứ không phải thay thế nó, vì vậy nếu bạn có các dòng:

one 
two 
three 

bạn có thể nhập

"qdd 
"Qdd 
"Qdd 

và rồi sau đó nếu bạn nhập

"qp 

nó sẽ dán lại các dòng gốc

+0

Từ câu hỏi, có vẻ như nó đã được ánh xạ tới 'd'. – romainl

1

Tôi đồng ý với @Ben S. rằng đây là cách ưu tiên để acco mplish này nhưng nếu bạn đang tìm cách để nhân rộng hành vi cũ của bạn, bạn có thể remap dd để thêm vào một đăng ký được chỉ định, và sau đó bản đồ p để dán từ đăng ký đó và xóa nó.
Điều này sẽ có bất lợi khi gây ra p để chỉ làm việc với những thứ bị xóa bằng cách sử dụng dd (sử dụng d} để xóa đến cuối đoạn văn bản sẽ không đặt văn bản trong sổ đăng ký chính xác được dán sau).

Thêm dòng sau vào vimrc

noremap dd "Ddd    "Appends the contents of the current line into register d 
noremap p "dp:let @d=""<CR> "Pastes from register d and then clears it out 

của bạn nếu bạn không muốn dán để xóa các nội dung của thanh ghi

noremap p "dp    "Paste from register d 

nhưng điều này sẽ gây ra điều đó đăng ký để phát triển mà không bao giờ thanh toán bù trừ nó ra

2

Để cắt và dán theo số dòng (làm :set number để xem số dòng), cho các dòng x đến y làm:

:x,yd 

hoặc nếu con trỏ của bạn là đã có trên dòng x, làm

:,yd 

Sau đó đi đến nơi mà bạn muốn dán và nhấn p

13

Bạn có thể gõ:

d<n>d 

trong đó <n> là số dòng mà bạn muốn cắt, và sau đó bạn có thể dán chúng với:

p 

Ví dụ, để cắt và dán 3 dòng:

d3d 
p 
+0

câu trả lời tuyệt vời cảm ơn bạn – kapil

Các vấn đề liên quan