Làm thế nào để tham gia mỗi dòng thứ hai trong Vim?


28

Tôi muốn tham gia nhiều (~ 1000) dòng, nhưng chỉ mỗi số lẻ với dòng tiếp theo. Tôi có thể làm bằng tay

Jj

500 lần và đã làm nó. Tuy nhiên, làm thế nào tôi có thể thực hiện hai câu lệnh này 500 lần trong một lệnh? Đánh máy

500Jj

sẽ tham gia 500 dòng tiếp theo và sau đó di chuyển xuống một dòng.

Thí dụ:

Tôi có:

a
b
c
d
e
f
g
h

Tôi muốn:

a b
c d
e f
g h

Chỉnh sửa: Tôi đã thử ánh xạ:

:map X Jj
500X

nhưng rõ ràng tôi nên đọc lại các tài liệu ánh xạ. Không hoạt động.

Câu trả lời:


30

tôi sẽ làm điều này:

  1. bắt đầu ghi một macro 'q': qqJjq

  2. phát lại macro 'q' 500 lần: 500@q

(trên thực tế nó không phải là một macro được gọi là 'q', đó là một thanh ghi tên gọi là 'q'. thay vì tương tác điền đăng ký mà như trong 1., bạn cũng có thể làm :let @q = "Jj"và sau đó làm 2.)


Thật tuyệt, cảm ơn vì đã nhớ các macro cho tôi!
Boldewyn

:% J bình thường rất nhanh chóng và dễ dàng (xem giải pháp hàng đầu thứ 2 bên dưới) ... so với giải pháp vĩ mô này chạy trên 50.000 dòng
ihightower

@ihightower đó là lý do tại sao tôi nêu lên câu trả lời đó. 6 năm trước :)
akira

@akira macro của bạn vừa tiết kiệm trong ngày của tôi vì tôi chỉ cần giải pháp macro này cho mục đích khác.
ihightower

24

Để làm điều này trên mỗi dòng của tệp:

:%normal J

hoặc, ngắn hơn:

:%norm J

Để thực hiện việc này chỉ trên một phần của tệp, hãy chọn các dòng có Vhoặc lấy một phạm vi theo một cách khác:

:'<,'>global/^/normal J

hoặc, ngắn hơn:

:'<,'>g/^/norm J

Kevin anh ấy đang tìm cách để chạy hai lệnh trên mỗi tệp, không chỉ một.
JNK

1
việc sử dụng :gcâu trả lời OP cần.
Luc Hermitte

2
Điều này thực sự sẽ tham gia mỗi dòng thứ hai. Thử nó!
Kevin Panko

Cảm ơn vì globalmánh khóe. Tuy nhiên, trong trường hợp của tôi, việc ghi lại macro dễ dàng hơn và nhanh hơn.
Boldewyn

2
Chỉ cần đoán - nó thực thi lệnh trên mỗi dòng theo thứ tự và sau khi thực hiện dòng đầu tiên, dòng thứ hai đã biến mất (đã được nối với dòng đầu tiên), vì vậy nó buộc phải chuyển sang dòng thứ ba.
Kevin Panko

9

Cái này thì sao:

:g/$/j  

hoặc là

:g/$/j!  

và nhóm ba dòng

:g/$/j3 

1
Đây là một giải pháp RẤT đẹp Miro. Thậm chí còn tốt hơn khi bạn có thể sử dụng điều này trong vi tiêu chuẩn, mặc dù thật kỳ lạ, khi bạn sử dụng số kéo dài trong SVR4.0 vi (như trên Solaris) thay vì j3 tạo 3 cột thì nó tạo ra 4. (vì vậy bạn cần sử dụng j2 ở đó để nhóm mỗi 3 dòng)
JohnGH


-1

Tôi không phải là người dùng của Vim, nhưng kiểm tra các tài liệu trực tuyến có vẻ như

500(Jj) 

có thể hoạt động vì nó phân tích mọi thứ bên trong dấu ngoặc đơn dưới dạng một đơn vị.


Hừm, cảm ơn vì đã thử, nhưng trong phiên bản của tôi, Vim chỉ bỏ qua dấu ngoặc đơn. Bạn có thể cho tôi biết liên kết nơi bạn tìm thấy cú pháp này?
Boldewyn

1
vimdoc.sourceforge.net/htmldoc/syntax.html - Xin lỗi vì nó không giúp được gì!
JNK

Trên thực tế, hãy kiểm tra liên kết này: vim.org/scripts/script.php?script_id=2136 xem điều đó có làm những gì bạn đang theo đuổi không.
JNK
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.