2008-10-27 24 views

Trả lời

74
:r! sed -n 147,227p /path/to/foo/foo.c 
+0

bất kỳ cơ hội nào bạn biết cách tạo macro sao chép/dán cho nhiều vim trong tmux, cho phép dán từ tệp này sang tệp khác? – serup

+0

Tôi đã thử ở trên, tuy nhiên khi cố gắng đọc 217 dòng, sau đó 18 dòng cuối cùng hoán đổi quanh phía trước điểm chèn trong vim - bạn có biết tại sao điều này có thể xảy ra không? Có bao bọc xung quanh khi 200 dòng đã đạt được không? – serup

17

{range} đề cập đến đích trong tệp hiện tại, không phải là phạm vi của các dòng trong tệp nguồn.

Sau một số thử nghiệm, có vẻ như

:147,227r /path/to/foo/foo.c 

nghĩa chèn nội dung của /path/to/foo/foo.c sau dòng 227 trong tập tin này. ví dụ: nó bỏ qua 147.

2

Bạn sẽ cần phải:

:r /path/to/foo/foo.c 
:d 228,$ 
:d 1,146 

Ba bước, nhưng nó sẽ làm cho nó thực hiện ...

+4

đây là rất nhiều đánh máy, xin lỗi :) –

+3

Không phải là một giải pháp tốt - không được so sánh với các giải pháp sed. –

2

Một loạt cho phép một lệnh được áp dụng cho một nhóm các dòng trong bộ đệm hiện tại.

Vì vậy, phạm vi lệnh đọc có nghĩa là nơi chèn nội dung vào tệp hiện tại, nhưng không phải là phạm vi tệp mà bạn muốn đọc.

1

tôi chỉ phải làm điều này trong một dự án mã của tôi và đã làm nó theo cách này:

Trong đệm với /path/to/foo/foo.c mở:

:147,227w export.txt 

Trong đệm Tôi đang làm việc với:

:r export.txt 

Dễ dàng hơn nhiều trong sách của tôi ... Nó yêu cầu phải có cả hai tệp đang mở, nhưng nếu tôi đang nhập một tập hợp các dòng, tôi thường có cả hai đều mở. Phương pháp này tổng quát hơn và dễ nhớ hơn đối với tôi, đặc biệt nếu tôi đang cố gắng xuất/nhập một tập hợp các dòng phức tạp hơn bằng cách sử dụng g/<search_criteria/:.w >> export.txt hoặc một số cách chọn phức tạp hơn khác.

+0

Điều này đặt ra câu hỏi - nếu bạn có tập tin mở và bạn sẽ nhập phạm vi, tại sao không chỉ yank phạm vi đó và đặt nó vào bộ đệm mục tiêu? –

19

Bạn có thể làm điều đó trong tinh khiết Vimscript, mà không cần phải sử dụng một công cụ bên ngoài như sed:

:put =readfile('/path/to/foo/foo.c')[146:226] 

Lưu ý rằng chúng ta phải giảm giá trị một từ số dòng vì mảng bắt đầu từ 0, trong khi số dòng bắt đầu từ 1.

Nhược điểm: Giải pháp này dài hơn 7 ký tự được chấp nhận và sẽ tạm thời tiêu thụ bộ nhớ tương ứng với kích thước của tệp khác.

+0

Không có cách nào để biến đổi nó thành lệnh vim thoải mái, với cú pháp tương tự như cú pháp do OP đề xuất? ví dụ. : '147,227ri /path/to/foo/foo.c '(thông báo' ri 'để đọc) –

+0

Có bạn chắc chắn có thể làm điều đó. Tuy nhiên, các lệnh do người dùng tạo phải bắt đầu bằng một chữ cái viết hoa, do đó, 'ri' của bạn sẽ cần phải là' Ri' hoặc 'RI'. – joeytwiddle

+0

Điều này dường như không hoạt động khi sử dụng dấu ngã '~ /' cho thư mục $ HOME, ví dụ: 'readfile (" ~/Documents/something.txt ")' kết quả trong 'E484: Không thể mở tệp' ~/Tài liệu/something.txt'. – f1lt3r

1

Các giải pháp khác được đăng là tuyệt vời cho các số dòng cụ thể. Nó thường là trường hợp mà bạn muốn đọc từ đầu hoặc cuối của một tập tin khác. Trong trường hợp đó, đọc đầu ra của đầu hoặc đuôi rất nhanh.Ví dụ -

:r !head -20 xyz.xml 

Sẽ đọc 20 dòng đầu tiên từ xyz.xml vào đệm hiện tại nơi con trỏ là

:r !tail -10 xyz.xml 

Sẽ đọc 10 dòng cuối cùng từ xyz.xml vào đệm hiện tại nơi con trỏ là

Lệnh đầu và đuôi cực kỳ nhanh, do đó thậm chí kết hợp chúng có thể nhanh hơn nhiều so với các cách tiếp cận khác cho các tệp rất lớn.

:r !head -700030 xyz.xml| tail -30 

Sẽ đọc số dòng 700,000-700.030 từ file xyz.xml vào đệm hiện

Thao tác này sẽ hoàn thành ngay lập tức ngay cả đối với các file khá lớn.

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