Làm thế nào để chèn văn bản lặp đi lặp lại với sự khác biệt nhỏ trong vim?


11

Tôi muốn chèn văn bản như thế này:

similar text wordA similar text ...
similar text wordB similar text ...
similar text wordC similar text ...

Tôi biết tôi có thể dán văn bản nhiều lần sau đó sử dụng thay thế để thay đổi từ đơn cho mỗi dòng, tuy nhiên tôi vẫn thấy phương pháp này rất bất tiện.

Có cách nào để lưu một từ hoặc danh sách từ vào một "biến" sau đó sử dụng biến này để tạo văn bản tương tự không?


EDIT Tôi đã làm một cái gì đó không rõ ràng trong câu hỏi ban đầu, trên thực tế tôi đang cố gắng đưa ra một số định nghĩa hàm rất giống nhau, vì vậy wordA wordB... có thể xuất hiện nhiều lần trong mỗi bản sao văn bản và văn bản có thể chứa nhiều dòng. mô hình chính xác như thế này:

similar_text1 wordA similar_text2 wordA similar_text3 ...
similar_text1 wordB similar_text2 wordB similar_text3 ...
similar_text1 wordC similar_text2 wordC similar_text3 ...

(văn bản có thể chứa các dòng mới và wordA, wordB ... có thể tồn tại nhiều lần)


EDIT thứ 2 Các phần "tương tự" có thể khác nhau mỗi khi tôi làm công việc đó, vì vậy giải pháp cho công việc này là tốt hơn để có thể tái sử dụng. Bởi vì tôi đang cố gắng tạo ra các định nghĩa hàm rất giống nhau hoặc một chuỗi ánh xạ hàm.

Sau khi đọc câu trả lời và một số thực hành, tôi thấy rằng sẽ thuận tiện hơn khi nghĩ công việc này là một loại thay thế, bởi vì "part1", "part2" ... "partN" có thể chứa dòng mới là khó viết, vì vậy hãy viết một mẫu đầu tiên:

similar_text1 $WORD similar_text2 $WORD similar_text3 ...
(text may contain <ENTER>, make sure $WORD not exist in "similar_text" parts )

Sau đó cố gắng đặt bản sao của văn bản nhưng thay thế $ WORD bằng một danh sách các từ là suy nghĩ thẳng hơn.

Vì vậy, có vẻ như vấn đề của tôi đã thay đổi thành "làm thế nào để sao chép một khối văn bản nhiều lần, nhưng mỗi lần bằng cách thay thế một từ khóa trong đó bằng một từ trong danh sách?"


Đó là lý do tại sao các thanh ghi được sử dụng cho. Bạn có thể kéo (sao chép) văn bản vào một thanh ghi và sau đó sử dụng thanh ghi đó. Macro có thể được sử dụng để thực hiện các nhiệm vụ tương tự cũng như lặp đi lặp lại.
SibiCoder

Câu trả lời:


7

Bạn có thể sử dụng chức năng sau:

function! GenerateLines()
    let firstpart="similar text part 1"
    let secondpart="similar text part 2"

    let words=["wordA","wordB","wordC","wordD","wordE"]

    for word in words
        let line = firstpart . word . secondpart
        call append(line('.')+1, line)
        normal j
    endfor
endfunction

Trong các biến firstpartsecondpartđặt văn bản để lặp lại trước và sau các từ và trong danh sách, wordshãy đặt các từ cần thay đổi.

Sau đó, vòng lặp sẽ tạo ra nội dung của dòng cho mỗi từ của danh sách, chèn dòng vào bộ đệm và đi đến dòng mới này.

Sau đó, bạn có thể chỉ cần gọi hàm : call GenerateLines().


Chỉnh sửa Để dễ thao tác hơn, bạn cũng có thể chuyển các phần khác nhau làm đối số, hàm sẽ giống như sau:

function! GenerateLines(firstpart, secondpart, words)
    for word in a:words
        call append(line('.')+1, a:firstpart . word . a:secondpart)
        normal j
    endfor
endfunction

Và bạn có thể gọi nó như thế này:

call GenerateLines("first part", "second part", ["wordA","wordB","wordC","wordD","wordE"])

Bạn có thể tránh vòng lặp với call map(a:words, 'a:firstpart . v:val . a:secondpart')call append(line('.'), a:words).
Antony

Vì tôi thường thực hiện loại chỉnh sửa như vậy với "phần thứ nhất" và "phần thứ hai" rất dài, thậm chí là "phần thứ ba" và các phần này có thể chứa các dòng mới, nên dường như quá dài để nhập nhiều như vậy trong chế độ lệnh, vì vậy có lẽ nó thuận tiện hơn để kéo văn bản vào các thanh ghi, sau đó sử dụng các hàm để tạo văn bản từ các thanh ghi?
mạng xã hội

Tôi đã chỉnh sửa câu hỏi, nó thay đổi rất nhiều, xin lỗi vì sự bất tiện này.
social_loser

5

Chiến lược của tôi trong những trường hợp như vậy sẽ khác nhau, nhưng nó thường tuân theo các bước sau:

  1. Viết (các) từ duy nhất, vd

    wordA
    wordB
    ...
    wordK
    
  2. Hoặc

    a) thực hiện tìm kiếm và thay thế, ví dụ

    :%s/\w\+/similar text \0 similar text .../
    

    b) hoặc sử dụng chế độ khối trực quan, xem :h blockwise-visual. Cụ thể, tôi woul chọn các từ và sử dụng Iđể chèn văn bản tương tự ở phía trước hoặc Ađể thêm văn bản tương tự sau.

Tôi sẽ lập luận rằng chiến lược này có ý nghĩa khi bạn thực hiện loại nhiệm vụ chỉnh sửa này tương đối hiếm khi. Tuy nhiên, nếu bạn thấy bạn cần phải làm điều này thường xuyên, thì bạn nên làm theo đề xuất của @ statox với chức năng mở rộng danh sách các từ.


Tôi nghĩ rằng giải pháp phụ thuộc vào nơi danh sách từ đến từ đâu. Nếu đó là từ một tập tin, thì :readtiếp theo là sự thay thế của bạn rất có ý nghĩa.
Antony

giải pháp của bạn rất dễ thực hiện và giải quyết vấn đề tôi đã hỏi trong câu hỏi ban đầu một cách dễ dàng. Tuy nhiên, có một số lỗi trong bài viết gốc của tôi, tôi đã thực hiện 2 lần chỉnh sửa và nó thay đổi rất nhiều, cảm ơn bạn đã trả lời, xin lỗi vì sự thay đổi và tiếng Anh không tốt của tôi :)
social_loser

@social_loser bạn có thể điều chỉnh giải pháp này bằng cách sử dụng "\ r" để thay thế một dòng mới trong phần thay thế của sự thay thế
frangio

2

Tôi sẽ lập luận rằng đây là một công việc cho khối hình ảnh ( Ctrl+ v). Đầu tiên tôi sẽ viết tất cả các từ riêng biệt:

wordA
wordB
wordC
wordD
wordE

Bắt đầu với con trỏ trên đầu tiên wtôi sẽ thực hiện:

<c-v>5j$yA <esc>pA <esc>p

Tôi có thể kiểm soát số lượng cột mình cần bằng cách nhấn A <esc>pbao nhiêu lần tôi muốn. Giả sử rằng tôi cần ba cột giống như lệnh trên cho thấy. Bây giờ chúng ta có điều này:

wordA wordA wordA
wordB wordB wordB
wordC wordC wordC
wordD wordD wordD
wordE wordE wordE

Và con trỏ ở đầu thứ 3 wordA trong dòng đầu tiên. Tiếp theo tôi sẽ chặn chọn cột khoảng trắng giữa các cột đi lùi và thêm văn bản ở giữa. Từ vị trí con trỏ hiện tại:

h<c-v>5jI similar text 3<esc>

Điều này dẫn đến (% đánh dấu vị trí con trỏ):

wordA wordA%similar text 3 wordA
wordB wordB similar text 3 wordB
wordC wordC similar text 3 wordC
wordD wordD similar text 3 wordD
wordE wordE similar text 3 wordE

Lặp lại cho cột tiếp theo:

bh<c-v>5jI similar text 2<esc>

Và cột cuối cùng / đầu tiên (cột bên trái):

b<c-v>5jIsimilar text 1 <esc>

Cuối cùng dẫn đến:

similar text 1 wordA similar text 2 wordA similar text 3 wordA
similar text 1 wordB similar text 2 wordB similar text 3 wordB
similar text 1 wordC similar text 2 wordC similar text 3 wordC
similar text 1 wordD similar text 2 wordD similar text 3 wordD
similar text 1 wordE similar text 2 wordE similar text 3 wordE

Cập nhật: đã thêm một screencast

nhập mô tả hình ảnh ở đây


Điều này dường như là rất nhiều gõ nhưng nó thực sự rất dễ dàng để làm quen. Nó cung cấp cho bạn sự tự do để thay đổi số lượng từ, số lượng cột và thậm chí khoảng cách giữa các cột.

Hạn chế là bạn cần biết số lượng từ riêng biệt bạn đang sử dụng. tôi có một5 mã hóa cứng trong tất cả các lệnh ở trên vì đó là số lượng hàng mà các lệnh đang hoạt động.

Ghi chú gỡ lỗi: tất cả các lệnh bắt đầu và kết thúc ở chế độ bình thường, nếu bạn thấy mình ở chế độ trực quan hoặc chèn ở cuối lệnh bạn đang làm gì đó sai.

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.