Làm cách nào để thêm văn bản vào dòng hiện tại?


8

Tôi hiện đang cố gắng tìm ra vimscript và tôi tình cờ thấy append()chức năng này. Tài liệu nói rằng bạn có thể chỉ định dòng mà một biểu thức sẽ được thêm vào, vì vậy tôi đã thử:

:call append(line('.'), Foo())

Foo() trả về một chuỗi.

Điều kỳ lạ là chuỗi được nối vào dòng tiếp theo sau chuỗi hiện tại của tôi. Vì vậy, tôi đã cố gắng line('.') - 1, chỉ để thấy rằng nó nối vào dòng trên hiện tại.

Tôi ngạc nhiên, bối rối và không nói nên lời vào lúc này.

Hy vọng ai đó có thể làm sáng tỏ về điều này.


tài liệu nêu rõ rằng biểu thức, Foo () trong trường hợp này, nên được thêm vào dưới dạng một dòng bên dưới dòng được chỉ định. Không nên nhầm lẫn với lệnh chế độ thông thường Amà thực sự nối thêm văn bản vào dòng hiện tại.
Naumann

1
Hãy xem :help function-listđể biết những chức năng tích hợp nào có sẵn.
Antony

Câu trả lời:


8

append()chèn một vài dòng văn bản bên dưới dòng được chỉ định làm đối số đầu tiên. Điều này phù hợp với appendlệnh ex. Ví dụ, bạn có thể nhập :append(và vào chế độ ex) sau đó viết một vài dòng văn bản và thoát chế độ ex (bằng cách nhấn <c-c>chẳng hạn), các dòng sẽ xuất hiện sau khi dòng con trỏ của bạn được bật. Nói cách khác, appendlệnh có nghĩa là: nối các dòng văn bản tôi sẽ viết bên dưới dòng hiện tại.

Hàm VimScript append()cho phép các bộ xác định dòng, làm cho nó hữu ích hơn lệnh ex. Những điều hữu ích thường đến là cách tiêm các đoạn văn bản ở đầu và cuối tệp. ví dụ: đối với LaTeX, điều này có thể hữu ích:

call append(line('^'), [ '\documentclass[12pt]{article}'
\                      , '\begin{document}'])
call append(line('$'), '\end{document}')

Đâu line('$')là dòng cuối cùng trong tệp và line('^')luôn trả về 0(và tôi có thể đã viết nó thay vào đó mà không gặp vấn đề gì).

Để có được hành vi của Vim A, hoặc bất kỳ lệnh chế độ thông thường Vim nào khác, bạn có thể sử dụng normal. Để có được đầu ra Foo()xuất hiện ở cuối dòng có thể phức tạp hơn một chút, một cách là sử dụng execute:

execute ':normal! A' . Foo()

Hoặc bạn có thể sử dụng chắp thêm và sau đó thực hiện J:

call append(line('.'), Foo())
normal! Jx

(Lưu ý rằng xcần thiết để loại bỏ không gian được tạo bởi J, nhưng điều này có thể không hoạt động như mong đợi nếu chuỗi được tạo bởi Foo()bắt đầu bằng khoảng trắng).


5
setline()+ getline()là một lựa chọn khác.
Antony

2
gJkhông tham gia mà không có không gian
SergioAraujo

10

Các append()chức năng nên có lẽ đã được đặt tên là appendline(): nó chỉ gắn thêm dòng vào bộ đệm. Bạn không thể thay đổi các dòng hiện có với nó.

Nó giống như sử dụng acờ để fopen()hoặc sử dụng >>trong vỏ.


Nếu bạn muốn đặt giá trị của các dòng hiện có, thì cách dễ nhất để làm điều đó từ VimScript là sử dụng setline(). Ví dụ: để đặt dòng hiện tại thành Coconuts:

:call setline('.', 'Coconuts')

Bạn có thể sử dụng getline()để lấy giá trị của dòng hiện tại, vì vậy để nối Coconutsvào dòng sử dụng một cái gì đó như:

:call setline('.', getline('.') . 'Coconuts')

Bạn cũng có thể đặt nhiều dòng bằng cách sử dụng danh sách (giống như với append()):

:call setline('.', ['Coconuts', 'Bananas'])

Để nối văn bản vào nhiều dòng, bạn sẽ phải sử dụng một forvòng lặp.


Lưu ý rằng ở trên không phải là cách duy nhất. Các cách khác sẽ là sử dụng :substitute(ví dụ :s/$/\=Foo()/) hoặc câu trả lời của grochmal . Cách "tốt nhất" phụ thuộc vào bối cảnh bạn đang sử dụng cũng như sở thích cá nhân.

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.