Cách dán khối trực quan bắt đầu bằng một dòng khác


10

Phải mất rất lâu tôi mới nhận ra rằng việc đặt (dán) thứ gì đó với phoặc Pkhối hình ảnh nào được chọn ctrl+vvà kéo theo (sao chép) với y, giữ nguyên cách thức trước đó, để khi văn bản được sao chép ở giữa dòng, nó sau đó sẽ được sao chép giữa các văn bản khác bất cứ khi nào có thể. Ngược lại, dòng chọn Vkhông dán dòng được sao chép giữa các văn bản khác, nhưng bắt đầu trên dòng khác.

Ví dụ, giả sử bây giờ tôi có:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
12/15:
12/16:
12/17:

Khi tôi muốn cắt AvocadoBeanCherry, bằng cách lựa chọn (lựa chọn biểu diễn dưới dạng _)

12/12: ________ Apple.
12/13: ________ Banana.
12/14: ________ Citron.
12/15:
12/16:
12/17:

và nhấn yvà di chuyển con trỏ đến dòng sau (con trỏ được biểu thị là _),

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
_2/15:
12/16:
12/17:

và nhấn P. Kết quả:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.12/15:
Bean.   12/16:
Cherry. 12/17:

Nhưng điều tôi ước là:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.
Bean.   
Cherry. 
12/15:
12/16:
12/17:

Điều này làm tôi bối rối mỗi lần, cho đến khi tôi nhận ra rằng vì chúng được sao chép ở giữa dòng, do đó chúng được dán ở giữa dòng, bắt chước theo cách của chúng.

Có vẻ như cách tốt nhất để dán thứ gì đó bắt đầu trên một dòng khác, là di chuyển con trỏ đến điểm bắt đầu bằng 0và xuống 3 dòng, đến vị trí mới; và vào chế độ chèn với i, và nhấn <return>3 lần, và di chuyển con trỏ trở lại 6 dòng và phải, trở lại vị trí ban đầu; và sao chép, và một lần nữa di chuyển đến nơi mới và dán, như tôi đã làm ở trên.

Tôi có thể lưu một vài nét không? Hay bạn thường làm gì?

(Chỉnh sửa: Những gì đã nói ở trên là cách tôi hiểu nó ngay khi tôi hỏi điều này. Xem những câu trả lời để được giải thích chính xác :)

Câu trả lời:


11

Khi bạn sao chép một số văn bản, nó sẽ đi vào một thanh ghi. Văn bản bên trong một thanh ghi có một loại : characterwise, linewisehoặc blockwise.

Loại này xác định theo cách mà văn bản sẽ được đặt.

Trong ví dụ của bạn, bạn đã sao chép một số văn bản từ chế độ khối trực quan. Vì vậy, văn bản có loại blockwisevà được lưu trữ trong sổ đăng ký không tên ".
Vì loại này, khi bạn sẽ dán lại vào bên trong bộ đệm của mình, nó sẽ được dán dưới dạng một khối.


Nếu bạn muốn dán nó dưới dạng một chuỗi các dòng, thay vì một khối, có 3 cách.

  1. Từ chế độ chèn, bạn có thể chèn nó bằng cách nhấn C-r ".
    Nó nên chèn nội dung của thanh ghi không tên như thể loại của nó là theo chiều dọc.

  1. Từ dòng lệnh, bạn có thể sử dụng :putlệnh.
    :putnên dán văn bản bên trong một thanh ghi như thể loại của nó là dòng, bất kể loại ban đầu của nó. Lưu ý rằng bạn có thể chuyển tên của một thanh ghi làm đối số, cũng như địa chỉ dòng cho specifiy bên dưới dòng nào bạn muốn đăng ký được dán.

Ví dụ:

:42put a

... nên đặt nội dung của thanh ghi a, bên dưới 42dòng thứ.

Nếu không có tên đăng ký, Vim sẽ cho rằng bạn muốn dán thanh ghi không tên (hoặc thanh +ghi nếu bạn điều chỉnh 'clipboard').
Và không có địa chỉ, Vim sẽ cho rằng bạn muốn dán nó bên dưới dòng hiện tại.


  1. Từ dòng lệnh, bạn có thể thay đổi loại thanh ghi không tên với setreg()chức năng:

    :call setreg('"', '', 'al')

Ở đây, setreg()nên nối một chuỗi rỗng vào thanh ghi không tên (nhờ acờ được chuyển dưới dạng đối số thứ ba) và thay đổi kiểu của nó thành dòng theo chiều dọc (nhờ lcờ).

Sau đó, từ chế độ bình thường, bạn sẽ có thể dán thanh ghi, với plệnh bình thường, như thể kiểu của nó là theo đường thẳng.


Nó không liên quan trực tiếp đến vấn đề của bạn, nhưng khi bạn sao chép một số văn bản, nó cũng sẽ được 0đăng ký. Và nếu bạn đặt trước giá trị unnamedpluscho tùy chọn 'clipboard', nó cũng sẽ được +đăng ký.

Bạn có thể kiểm tra loại đăng ký, sử dụng getregtype()chức năng:

:echo getregtype('"')

Nếu nó trả về một chữ thường v, nó có nghĩa là loại đặc trưng.
Nếu nó trả về một chữ hoa V, nó có nghĩa là loại là dòng.
Nếu nó trả về ^V{some number}, nó có nghĩa là loại theo chiều ngang và chiều rộng của khối là {some number}.


3

Tôi cần phải "truyền" nội dung đăng ký vào một chế độ (đặc trưng / đường thẳng / khối) nhất định thường xuyên, tôi đã viết plugin UnconditablePaste cho nó. Nó cung cấp gcp, glpv.v., các lựa chọn thay thế cho các lệnh dán tích hợp buộc một chế độ nhất định (và bây giờ có thêm một số biến thể trong chủ đề này, như dán với dấu phẩy hoặc ký tự được truy vấn).

Với nó, bạn chỉ có thể sử dụng glp/ glPđể dán sau / trước dòng hiện tại (dưới dạng dòng mới), bất kể bạn đã kéo văn bản như thế nào.


Tôi ghen tị với bạn rằng bạn có thời gian để viết những điều như vậy QQ Nhưng tôi hài lòng với :put. (Cũng đánh giá cao bạn)
Viol CHƯƠNGin

@Aminopterin: Tôi đã trả lời rất thường xuyên, tôi thực sự có một đoạn snipMate cho đoạn đầu tiên. Vì vậy, tôi chỉ cần tùy chỉnh một chút. Cảm ơn vì đánh giá cao câu trả lời của tôi, và upvote!
Ingo Karkat

Ồ tôi đã nói rằng tôi ghen tị với việc bạn có thời gian để viết một plugin một cách đơn giản, như thế này, như thể được thực hiện một cách nhẹ nhàng .... chỉ nửa năm sau tôi đã bắt đầu viết một dự án c ++ như một dự án sở thích để ép mình học lập trình, và tôi đã bắt đầu sử dụng vim ~ ~
Viol CHƯƠNGin

2
@Aminopterin À, plugin bắt đầu như một đoạn nhỏ được sao chép từ Vimtips và dần dần phát triển theo thời gian. Vì nó tỏ ra rất hữu ích với tôi, tôi dần dần tăng cường nó rất nhiều. Nhiều bước nhỏ mạnh hơn một nỗ lực lớn!
Ingo Karkat
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.