ฉันจะดีบักไฟล์ vimrc ของฉันได้อย่างไร


80

ฉันมีปัญหาในกลุ่มและผมคิดว่ามันอาจจะอยู่ในของฉันvimrcไฟล์ (หรือได้รับการบอกว่ามันอาจจะเป็นของฉันvimrcไฟล์)

ฉันจะตรวจสอบสิ่งนี้ได้อย่างไร ถ้าเป็นvimrcไฟล์ของฉันฉันจะรู้ได้อย่างไรว่าปัญหาอยู่ตรงไหน

คำตอบ:


79

สิ่งแรกที่คุณต้องการทำคือเริ่ม Vim ด้วยการตั้งค่าเริ่มต้น:

vim -u NONE -U NONE -N

การ-u NONEป้องกัน Vim จากการโหลด vimrc ของคุณ-U NONEป้องกัน Vim จากการโหลด gvimrc ของคุณและ-Nบอกให้ Vim ใช้โหมดที่ไม่เข้ากันได้ (ไม่จำเป็นต้องใช้สิ่งนี้ แต่ผู้ใช้ Vim ส่วนใหญ่ไม่ได้ใช้ในโหมด "Compatible") โปรดทราบว่าNONEจะต้องอยู่ในตัวพิมพ์ใหญ่ทั้งหมด

ใน Windows คุณสามารถเพิ่มสถานะเหล่านี้โดยการสร้างทางลัดใหม่ 1

  • หากปัญหายังคงอยู่คุณจะรู้ว่าไม่ใช่สิ่งที่อยู่ใน vimrc ของคุณ

  • หากปัญหาหายไปคุณก็เกิดจากบางสิ่งในไฟล์ vimrc ของคุณ

มันไม่ใช่ vimrc ของฉัน!

เย่! ไปและถามคำถามของคุณ อย่าลืมระบุว่าคุณได้ลองใช้ Vim โดยไม่ใช้ไฟล์ vimrc!

ดังนั้นมันคือ vimrc ของฉันตอนนี้เป็นอย่างไร

หากคุณยังไม่ได้ทำคุณอาจต้องการบันทึกสำเนาสำรองของไฟล์ vimrc ของคุณก่อน

ตรวจสอบปลั๊กอิน

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

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

  1. ใส่ความคิดเห็น (หรือลบ) ประมาณครึ่งไฟล์ vimrc ของคุณ
  2. เริ่ม Vim ใหม่หรือเปิด Vim ใหม่ (การโหลด vimrc ใหม่นั้นไม่ดีพอเนื่องจากการตั้งค่าไม่ได้ถูกยกเลิก)
  3. ตอนนี้ปัญหาหายไปหรือไม่ นำส่วนที่คุณนำออกมาคืน (ให้ Vim เปิดอยู่และใช้เลิกทำมีประโยชน์ที่นี่) และทำซ้ำขั้นตอนที่ 1 ในส่วนที่คุณเพิ่มกลับมา
  4. ปัญหายังคงเกิดขึ้นหรือไม่? ไปที่ขั้นตอนที่ 1

ในที่สุดคุณควรมีตัวเลือกเดียวหรือการรวมกันของตัวเลือกที่ทำให้เกิดปัญหาของคุณ คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกใด ๆ ในกลุ่มโดยใช้:

:help 'option_name'

คำพูดมีความสำคัญที่นี่มันมักจะทำงานโดยไม่มีพวกเขา แต่บางครั้งคุณท้ายผิดหน้าถ้าคุณไม่ใส่พวกเขา

หากคุณยังสับสนหลังจากอ่านหน้าความช่วยเหลือคุณจะรู้ว่าจะถามคำถามได้ที่ไหน ;-)

การดีบักปลั๊กอินเดียว

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

  1. สร้างไดเรกทอรีว่างใหม่ เราจะใช้~/pluginเส้นทางในตัวอย่างนี้ ตอนนี้ใส่ปลั๊กอินในpack/plugins/start/$nameไดเรกทอรีปกติ ตัวอย่างเช่น:

    git clone https://github.com/fatih/vim-go.git ~/plugin/pack/plugins/start/vim-go
    
  2. สร้างtest-vimrcไฟล์ที่มีเนื้อหาดังต่อไปนี้ นี้จะให้แน่ใจว่าเป็นกลุ่มจะโหลดปลั๊กอินจาก~/pluginไดเรกทอรีและไม่~/.vim ไดเรกทอรี:

    set nocompatible
    set packpath=~/plugin,/usr/share/vim/vimfiles,/usr/share/vim/vim80,/usr/share/vim/vimfiles/after,~/plugin/after
    packloadall!
    
    syntax on
    filetype plugin indent on
    
  3. เริ่มเป็นกลุ่มด้วย:

    vim -U NONE -u ~/test-vimrc
    

    ตอนนี้คุณมี vimrc น้อยที่สุดด้วยปลั๊กอินตัวเดียวนี้


เชิงอรรถ

1ตัวอย่างเช่น 64 บิตของ Windows "C:\Program Files (x86)\Vim\vim74\vim.exe" -u NONE -U NONE -Nทางลัดจะมีลักษณะบางอย่างเช่นนี้ หากต้องการสร้างคลิกขวาใน File Explorer ที่คุณต้องการทางลัดจากนั้นเลือกใหม่ -> ทางลัดและวางข้อความทางลัด คุณอาจต้องเปลี่ยนเส้นทาง Vim หากติดตั้ง Vim ของคุณในตำแหน่งอื่น


7
เทคนิคนี้เรียกว่าBinary ค้นหาความผิดรองรับหลายภาษา
tommcdo

2
หลังจากที่คุณทราบจุดบกพร่องของคุณแล้วนี่เป็นเวลาที่ดีในการเริ่มเก็บ. vimrc ของคุณภายใต้การควบคุมเวอร์ชัน :) มันเกือบจะเป็นหนึ่งในการเปลี่ยนแปลงล่าสุดที่คุณทำกับมัน
escrafford

1
คุณไม่จำเป็นต้องถ้าคุณมี-U NONE -u NONE
แอนโทนี

@MartinTournoij ฉันแนะนำให้แก้ไขเพื่อให้ง่ายขึ้นสำหรับผู้อ่านครั้งแรกที่จะเข้าใจ ฉันหวังว่าคุณจะชอบมัน. ขอบคุณ!
jpaugh

1
ขอบคุณ @jpaugh; ฉันคิดว่าคำสั่งนั้นสมเหตุสมผลดีกว่า
Martin Tournoij

31

มี-Dพารามิเตอร์ Vim เป็นพิเศษสำหรับการดีบักซึ่งจะไปที่โหมดการดีบักหลังจากดำเนินการคำสั่งแรกจากสคริปต์

ตัวอย่างเช่นการเรียกใช้กลุ่มในโหมดดีบักโดยไม่มีปลั๊กอินให้เรียกใช้เป็น:

vim --noplugin -D

พิมพ์n/ nextเพื่อแยกบรรทัดถัดไปแล้วกดEnterต่อไป

และcontหรือqกลับไปที่vimส่วนต่อประสาน

หากคุณกำลังใช้เวอร์ชัน GUI ให้ใส่guiคำสั่งใน vimrc ของคุณเพื่อเริ่มการดีบักทันทีหลังจากคำสั่งนั้น

กดCtrl+ dเพื่อดูรายการคำสั่งที่มี

อ่านเพิ่มเติม:


1
สิ่งนี้มีประโยชน์มากที่สุดในการค้นหาข้อผิดพลาดแบบง่ายในไฟล์. vimrc ที่ทำให้เกิดข้อความแสดงข้อผิดพลาด ควรลองสิ่งนี้ก่อนเพราะมันรวดเร็วในการทำ
RichVel

1
@kenorb คำสั่งนี้น่ากลัวมากช่วยฉันจากการไปที่เครื่องมือแก้ไขอื่น
TheLazyChap

11

ดังที่ได้กล่าวไปแล้วก่อนอื่นvim -u NONE -U NONE -Nให้ตรวจสอบว่า vanilla vim ของคุณทำงานได้ดี

จากนั้นเริ่มเป็นกลุ่มตามปกติแล้วตรวจสอบ

:messages

จากภายในเป็นกลุ่มหลังจากปัญหาซึ่งจะแสดงคำเตือนและข้อผิดพลาดทั้งหมด

ในที่สุดก็เริ่มเป็นกลุ่มด้วยคำสั่งดังต่อไปนี้

vim -V9logfile.log

ซึ่งจะสร้าง logfile ที่เรียกว่าlogfile.log, -V9เป็นระดับการบันทึกและพยายามที่จะทำให้เกิดปัญหาของคุณ


11

อีกหนึ่งเคล็ดลับ: ในฐานะมนุษย์ถ้ำตามที่อาจดูเหมือนฉันต้องการเพิ่ม: echom "message" ไปยัง. vimrc ของฉันเพื่อดูว่ามีการดำเนินการอะไรและอะไรที่ไม่

ตัวอย่างเช่น

if executable('ag')
  :echom "AG FOUND"

  ...
endif

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


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

นี่คือสิ่งที่ฉันต้องการฉันต้องการดูว่ามูลค่าของ cpoptions อยู่ที่จุดใดใน vimrc ของฉันฉันจะสะท้อนผลลัพธ์ของ ": set cpoptions" ได้อย่างไร ?
Mike Lippert

10

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

" feature toggles in vimrc
let g:vimrc_feat_pathogen               = 1
let g:vimrc_feat_core_minimal           = 1
let g:vimrc_feat_matchit                = 1
let g:vimrc_feat_options                = 1
let g:vimrc_feat_colors_and_highlight   = 1
let g:vimrc_feat_key_rebinding_arpeggio = 1
let g:vimrc_feat_key_rebinding          = 1
let g:vimrc_feat_autocommand_group      = 1
let g:vimrc_feat_custom_definitions     = 1
let g:vimrc_feat_load_opam              = 1

นี่คือตัวอย่างของส่วนที่ได้รับการปกป้องโดยif:

if g:vimrc_feat_core_minimal
    set nocompatible
    filetype plugin indent on
    syntax on
endif

1

เวลาในการโหลด vimrc ของฉันช้ามากประมาณ 400 มิลลิวินาทีและฉันลดลงเหลือ 20 มิลลิวินาทีโดยการลบบรรทัดนี้:

silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1

ตรวจสอบให้แน่ใจว่าคุณไม่มีการโทรไปยังคำสั่งภายนอกเช่นนั้น


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

0

นี่เป็นขั้นตอนง่าย ๆ ที่จะช่วยให้คุณเริ่มต้นได้

  1. แสดงความคิดเห็นเนื้อหาของไฟล์. vimrc ทั้งหมดของคุณ
  2. โหลด. vimrc ของคุณอีกครั้งโดยเรียกใช้:source %หรือ:so $MYVIMRC
  3. uncomment ส่วนที่รอบคอบของไฟล์ (โดยทั่วไปเริ่มจากด้านบน)
  4. ทำซ้ำขั้นตอนที่ 2 และ 3 จนกระทั่งพบข้อผิดพลาด
  5. แก้ไขข้อผิดพลาด

1
คำตอบนี้อาจจะดีกว่ามากถ้าคุณใช้ตัวพิมพ์ใหญ่และเว้นวรรค

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