วิธีแทรกข้อความซ้ำ ๆ ที่มีความแตกต่างเล็กน้อยในกลุ่ม?


11

ฉันต้องการแทรกข้อความแบบนี้:

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

ฉันรู้ว่าฉันสามารถวางข้อความได้หลายครั้งจากนั้นใช้การแทนที่เพื่อเปลี่ยนคำเดียวสำหรับแต่ละบรรทัด แต่ฉันก็ยังพบว่าวิธีนี้ไม่สะดวกมาก

มีวิธีการบันทึกคำหรือรายการคำใน "ตัวแปร" แล้วใช้ตัวแปรนี้เพื่อสร้างข้อความที่คล้ายกัน?


แก้ไขฉันทำสิ่งที่ไม่ชัดเจนในคำถามต้นฉบับจริง ๆ แล้วฉันพยายามทำให้ฟังก์ชั่นคำนิยามที่เหมือนกันดังนั้นwordA wordB... อาจปรากฏหลายครั้งในแต่ละโคลนของข้อความและข้อความอาจมีหลายบรรทัด รูปแบบเป็นเช่นนี้:

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

(ข้อความอาจมีบรรทัดใหม่และ wordA, wordB ... อาจมีอยู่หลายครั้ง)


2nd EDIT ส่วน "Similar_text" อาจแตกต่างกันในแต่ละครั้งที่ฉันทำงานดังนั้นวิธีแก้ปัญหาสำหรับงานนี้จะดีกว่าที่จะนำมาใช้ซ้ำได้ เพราะฉันกำลังพยายามสร้างนิยามฟังก์ชันที่เหมือนกันมากหรือตารางสตริงกับฟังก์ชันการแมป

หลังจากอ่านคำตอบและการฝึกฝนฉันพบว่าการคิดว่างานนี้เป็นการทดแทนบางประเภทสะดวกกว่าเพราะแยก "part1", "part2" ... "partN" ซึ่งอาจมีการขึ้นบรรทัดใหม่เขียนยากดังนั้นเขียน เทมเพลตก่อน:

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

จากนั้นพยายามใส่โคลนของข้อความ แต่แทนที่คำว่า $ WORD ด้วยรายการคำจะเป็นการคิดที่ตรงกว่า

ดังนั้นดูเหมือนว่าปัญหาของฉันเปลี่ยนเป็น "วิธีโคลนบล็อกข้อความหลายครั้ง แต่ทุกครั้งโดยแทนที่คำหลักในคำนั้นด้วยคำจากรายการ"


นั่นคือเหตุผลที่ใช้สำหรับการลงทะเบียน คุณสามารถดึง (คัดลอก) ข้อความไปยังการลงทะเบียนแล้วใช้การลงทะเบียนนั้น แมโครสามารถใช้ในการทำงานที่คล้ายกันเช่นเดียวกับงานซ้ำ ๆ
SibiCoder

คำตอบ:


7

คุณสามารถใช้ฟังก์ชั่นต่อไปนี้:

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

ในตัวแปรfirstpartและsecondpartใส่ข้อความเพื่อยกเลิกก่อนและหลังคำและในรายการwordsให้ใส่คำที่ควรเปลี่ยน

จากนั้นลูปจะสร้างเนื้อหาของบรรทัดสำหรับแต่ละคำของรายการแทรกบรรทัดในบัฟเฟอร์และไปที่บรรทัดใหม่นี้

call GenerateLines()จากนั้นคุณสามารถเพียงแค่เรียกใช้ฟังก์ชัน:


แก้ไขเพื่อให้ง่ายต่อการจัดการคุณสามารถส่งผ่านส่วนต่าง ๆ เป็นอาร์กิวเมนต์ฟังก์ชันควรมีลักษณะดังนี้:

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

และคุณสามารถเรียกมันว่า:

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

คุณสามารถหลีกเลี่ยงวงด้วยและcall map(a:words, 'a:firstpart . v:val . a:secondpart') call append(line('.'), a:words)
แอนโทนี

เนื่องจากฉันมักจะทำการแก้ไขแบบนี้ด้วย "firstpart" ที่ยาวมากและ "secondpart" แม้แต่ "thirdpart" และส่วนเหล่านี้อาจมีการขึ้นบรรทัดใหม่ดูเหมือนว่าจะยาวเกินไปที่จะพิมพ์ในโหมดคำสั่งมากเกินไป การดึงข้อความเข้าสู่รีจิสเตอร์จากนั้นใช้ฟังก์ชั่นเพื่อสร้างข้อความจากรีจิสเตอร์?
social_loser

ฉันแก้ไขคำถามมันเปลี่ยนไปมากขออภัยในความไม่สะดวก
social_loser

5

กลยุทธ์ของฉันในกรณีเช่นนี้จะแตกต่างกันไป แต่มักจะทำตามขั้นตอนต่อไปนี้:

  1. เขียนคำที่ไม่ซ้ำเช่น

    wordA
    wordB
    ...
    wordK
    
  2. ทั้ง

    a) ทำการค้นหาและแทนที่เช่น

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

    ข) :h blockwise-visualหรือใช้โหมดบล็อกภาพดู โดยเฉพาะอย่างยิ่งฉันจะเลือกคำและใช้Iเพื่อแทรกข้อความที่คล้ายกันข้างหน้าหรือAเพื่อเพิ่มข้อความที่คล้ายกันหลังจากนั้น

ฉันจะยืนยันว่ากลยุทธ์นี้เหมาะสมเมื่อคุณทำงานแก้ไขประเภทนี้ค่อนข้างไม่ค่อย อย่างไรก็ตามหากคุณพบว่าคุณต้องทำสิ่งนี้บ่อยครั้งคุณควรทำตามคำแนะนำของ @ statox ด้วยฟังก์ชันที่ขยายรายการคำ


ฉันคิดว่าวิธีแก้ปัญหาขึ้นอยู่กับว่ารายการคำนั้นมาจากไหน ถ้ามันมาจากไฟล์แล้ว:readตามด้วยการทดแทนของคุณทำให้รู้สึกมาก
แอนโทนี

วิธีการแก้ปัญหาของคุณนั้นง่ายและแก้ไขปัญหาที่ฉันถามในคำถามเดิมได้อย่างง่ายดาย อย่างไรก็ตามมีข้อผิดพลาดบางอย่างในโพสต์ต้นฉบับของฉันฉันได้ทำการแก้ไข 2 ครั้งและเปลี่ยนแปลงไปมากขอขอบคุณสำหรับคำตอบขอโทษสำหรับการเปลี่ยนแปลงและไม่ดีภาษาอังกฤษของฉัน :)
social_loser

@social_loser คุณสามารถปรับแก้ปัญหานี้ได้โดยใช้ "\ r" เพื่อแทนบรรทัดใหม่ในส่วนทดแทนของการทดแทน
frangio

2

ฉันจะยืนยันว่านี่เป็นงานสำหรับบล็อกที่มองเห็น ( Ctrl+ v) ก่อนอื่นฉันจะเขียนคำที่ต่างกันทั้งหมด:

wordA
wordB
wordC
wordD
wordE

เริ่มต้นด้วยเคอร์เซอร์ในครั้งแรกที่wฉันจะทำ:

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

ฉันสามารถควบคุมจำนวนคอลัมน์ที่ฉันต้องการได้โดยการกดA <esc>pหลายครั้งที่ฉันต้องการ สมมติว่าฉันต้องการสามคอลัมน์เหมือนคำสั่งด้านบนแสดง ตอนนี้เรามีสิ่งนี้:

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

และเคอร์เซอร์อยู่ที่จุดเริ่มต้นของ 3 wordAในบรรทัดแรก ต่อไปฉันจะบล็อกเลือกคอลัมน์ของช่องว่างระหว่างคอลัมน์ที่ย้อนหลังและเพิ่มข้อความระหว่างนั้น จากตำแหน่งเคอร์เซอร์ปัจจุบัน:

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

ผลลัพธ์นี้ใน (% ทำเครื่องหมายตำแหน่งเคอร์เซอร์):

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

ทำซ้ำสำหรับคอลัมน์ถัดไป:

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

และคอลัมน์สุดท้าย / แรก (คอลัมน์ทางซ้าย):

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

ผลสุดท้ายใน:

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

อัปเดต: เพิ่มหน้าจอ screencast

ป้อนคำอธิบายรูปภาพที่นี่


สิ่งนี้ดูเหมือนจะเป็นการพิมพ์จำนวนมาก แต่จริงๆแล้วมันเป็นเรื่องง่ายที่จะทำความคุ้นเคย มันช่วยให้คุณมีอิสระในการเปลี่ยนจำนวนคำจำนวนคอลัมน์และระยะห่างระหว่างคอลัมน์

ข้อเสียเปรียบคือคุณต้องรู้จำนวนคำศัพท์ที่คุณใช้ ฉันมี5ฮาร์ดโค้ดในคำสั่งทั้งหมดข้างต้นเพราะเป็นจำนวนแถวที่คำสั่งใช้งาน

การดีบักหมายเหตุ: คำสั่งทั้งหมดเริ่มต้นและสิ้นสุดในโหมดปกติหากคุณพบว่าตัวเองอยู่ในโหมดมองเห็นหรือแทรกในตอนท้ายของคำสั่งที่คุณกำลังทำอะไรผิด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.