ตั้งเครื่องหมายเป็นค่าก่อนหน้า


9

บางครั้งผมก็ใช้เครื่องหมายนำทางได้อย่างง่ายดายผ่านไฟล์ที่แตกต่างกันโดยใช้mA, mB... และ'A, 'B...

และบางครั้ง (บ่อยกว่าที่ฉันต้องการยอมรับ) เนื่องจากความไม่ตั้งใจหรือเหตุผลอะไรก็ตามฉันใช้m[LETTER]กับเครื่องหมายที่มีอยู่แล้วซึ่งจะลบค่าก่อนหน้านี้เมื่อฉันไม่ต้องการ เวลาส่วนใหญ่ของฉันเมื่อฉันทำอย่างนั้นฉันไม่ได้เปิดไฟล์ที่ชี้โดยเครื่องหมายเดิม

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

ฉันไม่พบคำสั่งเช่นนั้นในเอกสารดังนั้นหากไม่มีอยู่จะมีวิธีแก้ปัญหาที่ฉลาดซึ่งคุณบางคนใช้ในสถานการณ์นี้


1
นอกจากนี้คุณสามารถดูโพสต์นี้สำหรับข้อมูลเพิ่มเติม: superuser.com/questions/687441/ …
nobe4

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

ใช้คำสั่งกระโดด ( ctrl-o, ctrl-iและ:jumps) กับหน่วยความจำส่วนตัวของคุณเอง :)
VanLaser

คำตอบ:


5

นี่คือ VimScript พื้นฐานซึ่งทำในสิ่งที่คุณต้องการโดยประมาณ

เราแทนที่การแมปmaผ่านmzเพื่อเก็บค่าปัจจุบันg:previous_marksก่อนเรียกต้นฉบับmเพื่อตั้งค่าเครื่องหมายจริง นอกจากนี้เรายังกำหนด<Leader>maผ่าน<Leader>mzเพื่อแสดงประวัติสำหรับเครื่องหมายกล่าวว่า

คุณอาจต้องการจัดเก็บข้อมูลในg:previous_marksลักษณะที่เป็นระเบียบมากขึ้นและเพิ่มความสามารถในการเรียกคืนเครื่องหมายอย่างรวดเร็ว (แทนที่จะแค่เห็นที่ตั้ง) แต่ตัวอย่างนี้แสดงให้เห็นว่าสามารถทำได้อย่างไร เพื่อผู้อ่าน ;-)

let g:previous_marks = {}
fun! MyMark(mark)
    let l:marks = ''
    redir => l:marks
        try
            silent! execute 'marks ' . a:mark
        catch
        endtry
    redir END

    if l:marks != ''
        if !has_key(g:previous_marks, a:mark)
            let g:previous_marks[a:mark] = []
        endif
        call add(g:previous_marks[a:mark], split(l:marks, "\n")[1])
    endif

    execute 'normal! m' . a:mark
endfun

fun! ShowHistory(mark)
    if !has_key(g:previous_marks, a:mark)
        echoerr 'No history for ' . a:mark
        return
    endif

    for l:line in g:previous_marks[a:mark]
        echo l:line
    endfor
endfun

fun! MakeMappings()
    for l:char in range(97, 122)
        let l:char = nr2char(l:char)

        execute 'nnoremap <silent> m' . l:char . ' :call MyMark("' . l:char . '")<CR>'
        execute 'nnoremap <silent> <Leader>m' . l:char . ' :call ShowHistory("' . l:char . '")<CR>'
    endfor
endfun

call MakeMappings()

ว้าวเป็นคำตอบที่น่าอัศจรรย์! ฉันจะลองใช้เวลาสุดสัปดาห์นี้เพื่อใช้แบบฝึกหัดสำหรับผู้อ่าน;)
statox

2

ไม่ใช่สิ่งที่คุณต้องการ แต่อาจมีประโยชน์มากกว่า: ปลั๊กอินลายเซ็น มันแสดงให้เห็นว่าเครื่องหมายปัจจุบันเป็นสัญญาณในระยะห่างของท่อและมีทางลัดง่าย ๆ สำหรับการแก้ไข นอกจากนี้ยังสามารถใส่รายการเครื่องหมายในรายการตำแหน่งเพื่อการเข้าถึงที่รวดเร็ว


ฉันไม่ได้เป็นแฟนตัวยงของเครื่องหมายที่มองเห็นได้บนขอบ แต่ดูเหมือนว่าจะมีคุณสมบัติที่น่าสนใจบางอย่างฉันจะดูมัน
statox

@statox ในหลอดเลือดดำเดียวกันนอกจากนี้ยังมีshowmarks มันแสดงให้เห็นว่าเครื่องหมายทั้งหมด (ปลั๊กอินข้างต้นเกี่ยวข้องเฉพาะกับตัวอักษร) และสามารถสลับกับคีย์ ฉันคิดว่ามันมีประโยชน์เป็นครั้งคราว
Sato Katsura

ใช่ฉันเคยใช้ showmarks สองสามครั้ง (ไม่เหมือนลายเซ็น) นั่นคือเหตุผลที่ฉันบอกว่าฉันไม่ใช่แฟนของเครื่องหมายในระยะขอบ แต่ฉันพยายามลายเซ็นตอนนี้เพื่อดูว่าฉันชอบ :-)
statox

2

เนื่องจากปัญหาที่เกิดขึ้นจริงเป็นการนำทางระหว่างหลายไฟล์ / ตำแหน่งฉันขอแนะนำวิธีแก้ปัญหาง่ายๆนี้ซึ่งใช้ปลั๊กอินUnite :

:Unite jump -auto-preview

คำสั่งนี้ (ซึ่งสามารถแมปกับบางอย่าง<leader>jเช่น) จะแสดงรายการข้ามพร้อมแสดงตัวอย่าง: ทุกครั้งที่คุณนำทางรายการด้วยj/ k, หลายบรรทัดรอบตำแหน่งเคอร์เซอร์ในไฟล์นั้นจะปรากฏขึ้น

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


ทางเลือก:

เครื่องหมายเริ่มต้นนั้นง่ายต่อการเขียนทับ: บางทีชื่อบุ๊กมาร์กอาจเหมาะกับกรณีการใช้ของคุณเช่นกับปลั๊กอินsimple_bookmarks


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

แม้ว่าพวกเขาจะสามารถบันทึกระหว่างเซสชันเป็นกลุ่มมันง่ายเกินไปที่จะเขียนทับเครื่องหมาย ฉันได้เพิ่มทางเลือกอื่น
VanLaser

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