ฉันจะทดสอบปลั๊กอินได้อย่างไรและรวมเฉพาะเมื่อมีอยู่ใน. vimrc เท่านั้น


14

ในตัวฉัน.vimrcฉันกำลังพยายามใช้ftpluginและเห็นได้ชัดว่าใช้คำสั่งบางอย่างที่เกี่ยวข้องกับสิ่งนั้นภายใต้สมมติฐานที่ว่ามันถูกโหลดสำเร็จ อย่างไรก็ตามตอนนี้ฉันได้พบกับเครื่องจักรเก่า ๆ สองสามตัวที่ไม่มีปลั๊กอินติดตั้งอยู่ ฉันสามารถทำการโหลดปลั๊กอินแบบมีเงื่อนไขและเพิ่มfiletype onและคำสั่งที่คล้ายกันลงในบล็อกเงื่อนไขแบบเดียวกันได้หรือไม่?

ฉันได้เห็นแล้วว่ามีเงื่อนไขสำหรับโทนสีและเวอร์ชัน Vim แต่ฉันไม่เห็นตัวอย่างที่จะตรวจสอบปลั๊กอิน (หรือจำไม่ได้)

NB: อ่อนโยนฉันเป็นผู้เริ่มต้น VimScript


1
โปรดทราบว่าปลั๊กอินจะโหลดหลังจากคุณ~/.vimrcดังนั้นคุณจะไม่สามารถทดสอบผลกระทบของปลั๊กอินภายในของคุณได้~/.vimrcเว้นแต่คุณจะทดสอบการมีอยู่ของไฟล์ปลั๊กอินหรือเลื่อนการทดสอบจนกว่าจะโหลดปลั๊กอินด้วย autocommand เช่น VimEnter
garyjohn

@garyjohn: aha นั่นน่าสนใจ เพราะประเภทนี้ขัดแย้งกับคำตอบที่มีอยู่ คุณช่วยเขียนมันเป็นคำตอบได้ไหม?
0xC0000022L

ฉันได้แก้ไขคำตอบของฉันเพื่อแก้ไขปัญหาดังกล่าวแล้ว
qqx

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

คำตอบ:


19

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

นี่คือสองสามบิตที่ฉันมีในไฟล์ภายใต้ ~ / .vim:

" after/plugin/speeddating.vim
if exists(':SpeedDatingFormat')
    SpeedDatingFormat %-d %B %Y
endif

" ftplugin/ruby.vim
if exists('g:loaded_surround') && !exists('b:surround_'.char2nr(':'))
  let b:surround_{char2nr(':')} = ":\r"
endif

โปรดทราบว่าบิตด้านบนอยู่ในไฟล์ที่ได้รับการประเมินหลังจากปลั๊กอินปกตินี่คือ ftplugin และไฟล์ในafter/pluginไดเรกทอรี

ตัวเลือกอื่นจะใช้บล็อก try / catch แม้ว่าต้องใช้ vim 7.0 เป็นอย่างน้อย:

if v:version >= 700
    try
        runtime bundle/pathogen/autoload/pathogen.vim
        call pathogen#infect()
    catch
    endtry
endif

เมื่อบางสิ่งในtryส่วนของบล็อกนั้นล้มเหลวมันจะข้ามไปยัง catchส่วนนั้น เนื่องจากcatchส่วนนั้นว่างเปล่ามันจะดำเนินต่อไปพร้อมกับส่วนที่เหลือของไฟล์เริ่มต้นหลังจากendtryคำสั่ง

เนื่องจากนี่เป็นการโหลดรหัสด้วยตนเองแทนที่จะอาศัยปลั๊กอินที่ถูกโหลดไปแล้วสิ่งนี้สามารถทำได้ในไฟล์. vimrc เอง


8

วิธีที่ฉันชอบคือการตรวจสอบว่ามีไฟล์ปลั๊กอินอยู่หรือไม่ ฉันพบว่ามันง่ายกว่านี้

if !empty(glob("path/to/plugin.vim"))
   echo "File exists."
endif

ฟังดูสมเหตุสมผล แต่เส้นทางพื้นฐานคืออะไร? บ้านเป็นกลุ่มโดยอัตโนมัติ (เช่นปกติ~/.vim) หรือไม่
0xC0000022L

ขึ้นอยู่กับการกำหนดค่า. vimrc และการตั้งค่าการจัดการแพ็คเกจของคุณ ฉันทำสิ่งนี้:if filereadable($HOME."/.vim/plugins.vim") source ${HOME}/.vim/plugins.vim endif
user3751385

ขอบคุณมาก ฉันกังวลมากขึ้นว่ามีบางเส้นทางพื้นฐานโดยนัยที่คุณให้
0xC0000022L

4

ฉันต้องการบรรลุสิ่งนี้ในขณะที่รักษาการตั้งค่า Vim ของฉันไว้ด้วยกัน.vimrcแทนที่จะเก็บไว้ในafter/ไดเรกทอรีจำนวนมาก นี่คือวิธีแก้ปัญหาที่ฉันได้รับ:

  1. ตรวจสอบการมีอยู่ของปลั๊กอินแต่ละตัวโดยตรวจสอบคำสั่งเดียวที่มีให้exists()และตั้งค่าตัวเลือกหากมีอยู่ (นี่เป็นเหมือนคำตอบที่ยอมรับ)

  2. ใส่ตัวเลือกทั้งหมดที่ตั้งค่าในลักษณะข้างต้นภายในฟังก์ชั่น (เรียกว่าSetPluginOptionsNow()ในรหัสของฉัน)

  3. เรียกใช้ฟังก์ชันนี้ในVimEnterเหตุการณ์ซึ่งจะถูกเรียกใช้ขณะเข้าสู่เซสชัน Vim ใหม่ - แต่มีความสำคัญมากหลังจากโหลดปลั๊กอินทั้งหมดแล้ว ด้วยเหตุนี้การexists()ตรวจสอบของเราจึงสามารถตรวจสอบฟังก์ชั่นปลั๊กอินได้โดยไม่มีปัญหา

.vimrcนี่คือตัวอย่างจากส่วนหนึ่งของฉัน

""" PLUGIN-SPECIFIC OPTIONS
" These are "supposed to be" set in after/plugin directory, but then
" cross-platform synchronization would get even messier. So, au VimEnter it is. 

function! SetPluginOptionsNow()


    " NERDTree Options
    if exists(":NERDTree")
        map <F10> :NERDTreeToggle<CR>
    endif

    " Syntastic Options
    if exists(":SyntasticCheck")
        let g:syntastic_stl_format = '[Syntax: line:%F (%e+%w)]'
        set statusline+=%#warningmsg#
        set statusline+=%{SyntasticStatuslineFlag()}
        set statusline+=%*
        " and so on...

endfunction

au VimEnter * call SetPluginOptionsNow()
""" END OF PLUGIN-SPECIFIC OPTIONS

คำตอบนี้ไม่ได้ดีกับกลุ่มสายการบิน โดยเฉพาะการรอเหตุการณ์ VimEnter เพื่อระบุสิ่งต่าง ๆairline_themeดูเหมือนว่าจะทำให้เกิดข้อผิดพลาดมากมาย ... ฉันไม่แน่ใจจริงๆว่าทำไม
StevieP

3

อีกทางเลือกหนึ่งคือการใช้:silent! {cmd}ซึ่งจะระงับข้อผิดพลาดเมื่อ{cmd}ไม่มีอยู่ ประโยชน์หลักคือมันเป็นคำสั่งสั้น ๆ เดียว สิ่งนี้สามารถใช้งานได้ใน Vim 6 และยอดเยี่ยมสำหรับอุปกรณ์เสริม

ตัวอย่างเช่นมันถูกใช้โดยปลั๊กอินที่ใช้repeat.vimของ Tim Pope เพื่อทำการแมปซ้ำได้


มัน:silent!ไม่ใช่!silentและมันใช้กับคำสั่งทั้งหมดที่มีอยู่ยกเว้นเมื่อ:unsilentมีการใช้ที่ไหนสักแห่งภายใน (แต่หายาก)
Ingo Karkat

2

โพสต์ครั้งแรกในคำถามอื่น: /programming//a/48178537/2843583

คุณสามารถใช้ regexp เพื่อตัดสินใจว่าปลั๊กอินอยู่ในมือของคุณหรือไม่runtimepath:

if &rtp =~ 'plugin-name'
    ...
endif

นี่เป็นข้อได้เปรียบที่ใช้งานได้กับปลั๊กอินที่มีรหัส vimscript ในautoloadไดเรกทอรีซึ่งจะไม่สามารถตรวจพบได้เมื่อ. vimrc ถูกแยกวิเคราะห์ตั้งแต่เริ่มแรกเนื่องจากโหลดตัวอย่างอัตโนมัติที่โหลดในเวลาที่เรียกใช้ฟังก์ชัน

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