2008-10-31 57 views

Trả lời

102

Với

:%s/^/\=line('.')/ 

EDIT: để tổng hợp các nhận xét.

Lệnh này có thể được tinh chỉnh bao nhiêu tùy thích.


Hãy nói rằng bạn muốn thêm số điện thoại ở phía trước dòng từ một lựa chọn trực quan (V + di chuyển), và bạn muốn đánh số bắt đầu từ 42.

:'<,'>s/^/\=(line('.')-line("'<")+42)/ 

Nếu bạn muốn thêm một chuỗi giữa số và văn bản cũ từ dòng, chỉ cần ghép (với . trong VimL) vào biểu thức số:

:'<,'>s/^/\=(line('.')-line("'<")+42).' --> '/ 

Nếu bạn cần điều này để sắp xếp dưới dạng văn bản, bạn có thể muốn zero pad kết quả, có thể được thực hiện bằng printf cho 0001, 0002 ... thay vì 1, 2 ... ví dụ:

:%s/^/\=printf('%04d', line('.'))/ 

Dù sao, nếu bạn muốn biết thêm thông tin, chỉ cần mở vim giúp đỡ: :h :s và làm theo các liên kết (|subreplace-special| ..., |submatch()|)

+0

Cố gắng thực hiện điều này trên một lựa chọn trực quan (trong đó 1 sẽ là dòng đầu tiên trong lựa chọn) tuy nhiên nó bắt đầu số ở dòng số đó trong tệp. Bất kỳ cách nào để sửa đổi số bắt đầu? Cảm ơn! – Jason

+2

Tất nhiên. Thay đổi "line ('.')" Thành "(offset + line ('.'))". –

+2

@Jason 'offset' có thể là' 1-line ("'<") '. Tự hỏi, tại sao câu hỏi cũ như vậy xuất hiện trong RSS của tôi. – ZyX

32

cat -n thêm số dòng vào đầu vào của nó. Bạn có thể đặt đường ống tệp hiện tại thành cat -n và thay thế bộ đệm hiện tại bằng những gì nó in ra để xuất chuẩn. May mắn thay giải pháp phức tạp này là ít hơn 10 ký tự trong vim:

:%!cat -n 

Hoặc, nếu bạn chỉ muốn một subselection, trực quan chọn khu vực, và gõ này:

:!cat -n 

Điều đó sẽ tự động đưa các hình ảnh đánh dấu chọn vào, và sẽ giống như thế này sau khi bạn đã gõ nó:

:'<,'>!cat -n 

để xóa số dòng, tôi khuyên bạn nên sử dụng control-v, mà sẽ cho phép bạn chọn trực quan một hình chữ nhật, sau đó bạn có thể xóa hình chữ nhật đó với x.

+0

Nếu u muốn số dòng bắt đầu bằng 0 thay vì 1 thì sao? – Nils

+0

Xóa dòng đầu tiên, đánh số còn lại. Readd dòng đầu tiên sau đó với một '0' hàng đầu. ;) – sjas

+0

Đó là câu trả lời! – user3751385

5

Với môi trường giống Unix, bạn có thể sử dụng con mèo hoặc awk để tạo một số dòng dễ dàng, vì vim có giao diện thân thiện với vỏ, vì vậy mọi thứ hoạt động trong vim cũng như trong shell.
Từ Vim Tip28:

:%!cat -n 

hoặc

:%!awk '{print NR,$0}' 

Nhưng, nếu bạn sử dụng vim trong MS-DOS, trong Win9x, Win2000, bạn mất những công cụ này. đây là một cách rất đơn giản để lưu trữ này chỉ bằng vim:

fu! LineIt() 
    exe ":s/^/".line(".")."/" 
endf 

Hoặc, một chuỗi sáng tác với bảng chữ cái là dễ dàng như trên:

exe "s/^/".nr2char(line("."))."/" 

Bạn cũng có thể sử dụng một subst:

:g/^/exe ":s/^/".line(".")."^I/" 

Bạn cũng có thể chỉ muốn in các dòng mà không cần thêm chúng vào tệp:

"Đôi khi nó có thể hữu ích đặc biệt là chỉnh sửa tệp nguồn lớn để in số dòng trên giấy.
Để làm như vậy, bạn có thể sử dụng tùy chọn :set printoptions=number:y để kích hoạt và :set printoptions=number:n để tắt tính năng này.
Nếu số dòng sẽ được in luôn, đặt dòng set printoptions=number:y trong vimrc "

+0

Ý của bạn là 'mèo' thay vì 'gọi' trong ví dụ đầu tiên? –

+0

@Lance: hai năm sau, tôi không thực sự chắc chắn: bản sửa đổi 3 của bài đăng này cho thấy tôi hoàn nguyên sửa đổi từ 'cat' thành' call' ... (nguồn có thể là Vim tip28 như trong http: //neuron.tuke .sk/~ hudecm/VimTips-OFFLINE-nov02.txt) – VonC

+0

OK, dòng awk là những gì tôi cần anyway. Bạn có biết làm thế nào tôi sẽ thực hiện điều đó để nó cho tôi 3 hoặc 4 chữ số, như bắt đầu với 100 hay 1000? –

19

Trên một hệ thống GNU:. Với bên ngoài nl nhị phân:

:%!nl 
+2

cool nl -v cho phép bạn chỉ định nơi đánh số sẽ bắt đầu, vì vậy nếu bạn muốn dòng đầu tiên là dòng 0 thay vì 1 sử dụng nl -v 0 – Nils

3

các "VisIncr" plugin là tốt cho chèn cột của số incrementing nói chung (hoặc chữ cái, ngày tháng, chữ số La Mã, vv). Bạn có thể kiểm soát định dạng số, phần đệm, v.v. Vì vậy, chèn một "1" ở phía trước của mỗi dòng (thông qua :s hoặc :g hoặc chèn khối hình ảnh), đánh dấu cột đó trong chế độ chặn hình ảnh và chạy một trong các lệnh từ plugin.

4

Trước tiên, bạn có thể loại bỏ các số dòng hiện tại nếu bạn cần phải:

:%s/^[0-9]*// 

Sau đó, bạn có thể thêm số điện thoại đường. NR là số dòng hiện tại bắt đầu từ một số, vì vậy bạn có thể thực hiện một số phép toán trên số đó để lấy số bạn muốn. Lệnh sau cung cấp cho bạn bốn số dòng:

:%!awk '{print 1000+NR*10,$0}' 
Các vấn đề liên quan