2010-11-19 36 views
20

Thông thường, có vẻ như tôi có một danh sách các mục và tôi cần phải thêm số vào trước mặt. Ví dụ:Macro để tạo danh sách được đánh số trong vim?

Item one 
Item two 
Item three 

nào nên là:

1. Item one 
2. Item two 
3. Item three 

Trong vim, tôi có thể nhấn I trong chế độ chỉnh sửa, chèn "1.", nhấn thoát. Sau đó, tôi chuyển sang dòng tiếp theo, nhấn . và sau đó ^A để tăng số. Điều này có vẻ cực kỳ kém hiệu quả ... làm thế nào tôi có thể tạo ra một macro để tôi có thể đi đến dòng tiếp theo, và chèn một số ở đầu mà là một lớn hơn so với dòng trước?

Trả lời

18

Bạn có thể dễ dàng ghi macro để thực hiện.

Chèn đầu tiên 1. ở đầu dòng đầu tiên (có một vài khoảng trắng sau 1. nhưng bạn không thể nhìn thấy chúng).

Chuyển đến đầu dòng thứ hai và chuyển sang chế độ quay với qa.

Nhấn dãy phím sau:

i       # insert mode 
<ctrl-Y><ctrl-Y><ctrl-Y> # copy the first few characters from the line above 
<ESC>      # back to normal mode 
|       # go back to the start of the line 
<ctrl-A>     # increment the number 
j       # down to the next line 
q       # stop recording 

Bây giờ bạn có thể phát lại bản ghi với @a (lần đầu tiên, vì lần tiếp theo, bạn có thể làm @@ để lặp lại các vĩ mô cuối cùng thực hiện) và nó sẽ thêm một số gia tăng mới vào đầu mỗi dòng.

+7

Sử dụng '3 @ a' để thực hiện macro 3 lần –

+8

Thay vào đó, tôi muốn thay thế' k^yWjP^ j'. Văn bản có thể không ở đầu dòng và quan trọng hơn là macro của bạn sẽ không hoạt động sau dòng thứ mười. –

+0

Phát hiện, @Luc - chính xác như thế nào tôi đã có nó bản thân mình ngoại trừ tôi tacked trên^để kết thúc để nó vị trí con trỏ ở đầu dòng khi thực hiện. Không có sự khác biệt chức năng do^lúc đầu, chỉ cảm thấy một chút neater. –

10

Chọn dòng của bạn trong chế độ trực quan với: V, sau đó gõ:

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

Đó là dễ dàng để đưa vào một lệnh:

command! -nargs=0 -range=% Number <line1>,<line2>s/^\s*\zs/\=(line('.') - <line1>+1).'. ' 
+0

Tôi thích tính lặp lại của điều này. Đối với các dòng đơn, nó rất tuyệt. Thật không may, với mục đích * my *, khi chèn số tôi có xu hướng làm trong reStructuredText, và do đó cần chức năng '}' - nhưng do cách nó đang đếm dòng, chỉ thay thế '^' bằng '\ n \ n' sẽ không cắt nó. Đáng tiếc, nếu không nó sẽ nhập vào '.vimrc' của tôi. Tốt code, dù sao, tôi đã không nhận thức được '\ =()' - và tôi không thể tìm thấy nó trong sự giúp đỡ vim! –

+0

Bạn có thể sử dụng bất kỳ chức năng nào bạn muốn, ví dụ như một hàm giữ số đếm cho chính nó. Trong trường hợp đó, bạn có thể phải chơi bằng lệnh đóng gói "vòng lặp", ví dụ: http://stackoverflow.com/questions/1809571/how-do-i-substitute-from-a-list-of-strings-in-vim/1809780#1809780. Nếu không, hãy xem ': h sub-replace - \ =' –

+0

trick line() đẹp - tôi vẫn chưa tìm thấy điều đó! – egbutter

2

Bạn có thể sử dụng tính năng 'kỷ lục'. Đây là cách dễ dàng để ghi lại macro trong Vim.

Xem: giúp đỡ kỷ lục

Trong chế độ chụp thường 'qa' để bắt đầu ghi lại những gì bạn gõ vào 'a' đăng ký Loại lệnh cần thiết để chèn một số vào đầu dòng, sao chép nó vào dòng tiếp theo và sử dụng CTRL-A để tăng giá trị của nó. 'q' để kết thúc ghi âm rồi '@a' để phát lại macro được lưu trữ trong sổ đăng ký 'a' ('@@' lặp lại macro cuối cùng).

Và bạn có thể làm những việc như '20 @a 'để thực hiện điều đó hai mươi lần liên tiếp.

Khá tiện lợi để lặp lại sửa đổi văn bản.

Tùy thuộc vào các trường hợp, việc sử dụng dễ dàng hơn hoặc khó sử dụng hơn là regexp.

6

Ngoài ra còn có một số plugin để làm loại công việc này nếu bạn cần phải làm điều đó trong dịp:

http://vim.sourceforge.net/scripts/script.php?script_id=670

+0

Không thể đồng ý nhiều hơn, một plugin dành riêng cho tác vụ đó tốt hơn nhiều so với macro được tạo tại nhà và điều này bởi vì việc tạo chuỗi là một tác vụ mà bạn sẽ có nhiều lần. – Benoit

2

Có lẽ nó không phải là một giải pháp vĩ mô, nhưng ít nhất nó dễ dàng.

thêm số điện thoại cho tất cả các dòng

Có thể sử dụng :%!nl -ba hoặc :%!cat -n lệnh mà sẽ thêm số hàng tới tất cả các dòng.

Trên Windows, bạn đã cài đặt Cygwin/MSYS/SUA.

thêm số điện thoại đường dây chọn

Để thêm số điện thoại chỉ dành cho dòng được chọn, hãy chọn chúng trong chế độ trực quan (v và con trỏ), sau đó khi hoàn tất - thực hiện lệnh: :%!nl (bỏ qua các dòng trống) hoặc :%!cat -n (bao gồm các dòng trống).

định dạng

Để loại bỏ thêm dấu cách, chọn chúng trong khối thị giác (Ctrl +v) và loại bỏ chúng (x).

Để thêm một số ký tự (., :, )) sau khi các con số, chọn chúng trong khối thị giác (Ctrl + v), sau đó nối các ký tự (Một, gõ ký tự, sau đó kết thúc với Esc).

+0

Để thêm một số ký tự ('.'), bạn có thể sử dụng': '<,'> a.' bình thường trên các dòng đã chọn. Khi lựa chọn được thực hiện trước đó, hãy lặp lại nó với 'gv'. – wryrych

0

Chèn số ở đầu khối văn bản, ví dụ:

1. Item One

Nhập lệnh chế độ bình thường vim như sau:

qb^yW+P^<Ctrl-A>q 

Điều này có nghĩa:

qb  # start recording macro 'b' 
^  # move to start of text on the line 
yW  # 'yank' or copy a word including the ending whitespace. 
+  # move one line down to the start of the next line 
P  # place text ahead of the cursor 
^  # move to start of text 
<Ctrl-A> # increment text 
q  # Finish recording macro 

Điều này cho phép bạn làm là replay vĩ mô trên dòng cuối cùng của danh sách được đánh số nhiều lần nếu cần.

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