Bagaimana cara men-debug file vimrc saya?

80

Saya punya masalah di Vim, dan saya pikir itu mungkin ada di vimrcfile saya (atau sudah diberitahu itu bisa jadi vimrcfile saya ).

Bagaimana saya memverifikasi ini? Jika ini saya vimrcberkas, bagaimana saya tahu mana persis masalahnya terletak?

Martin Tournoij
sumber

Jawaban:

79

Hal pertama yang ingin Anda lakukan adalah memulai Vim dengan pengaturan default:

vim -u NONE -U NONE -N

The -u NONEmencegah Vim dari loading vimrc Anda, -U NONEmencegah Vim dari loading gvimrc Anda, dan -Nmemberitahu Vim untuk menggunakan no-kompatibel modus (ini tidak diperlukan, namun sebagian besar pengguna Vim tidak digunakan untuk "kompatibel" mode). Perhatikan bahwa NONEyang diperlukan untuk berada di semua-caps.

Di Windows Anda dapat menambahkan flag-flag ini dengan membuat pintasan baru 1 .

  • Jika masalah tetap, maka Anda tahu itu bukan sesuatu di vimrc Anda.

  • Jika masalah hilang, Anda sekarang disebabkan oleh sesuatu di file vimrc Anda.

Itu bukan vimrc saya!

Hore! Pergi dan tanyakan pertanyaan Anda. Pastikan untuk menyebutkan bahwa Anda mencoba memulai Vim tanpa file vimrc!

Jadi ini vimrc saya, sekarang bagaimana?

Jika Anda belum melakukannya, Anda mungkin ingin menyimpan salinan cadangan file vimrc Anda terlebih dahulu.

Periksa plugins

Hal berikutnya yang mungkin ingin Anda lakukan adalah menonaktifkan semua plugin terlebih dahulu; plugin dapat mengubah sedikit di Vim. Jika ini memperbaiki masalah, cobalah mencari tahu plugin mana yang mengaktifkannya satu per satu. Setelah Anda mengetahui plugin mana yang menyebabkan masalah, Anda dapat mencoba & memperbaikinya dengan membaca dokumentasi plugin ini, dan / atau dengan mengajukan pertanyaan yang ditandai plugin-<name>.

Jika itu tidak plugin, dan Anda tidak memiliki apa pun tahu apa yang menyebabkan masalah Anda, maka itu prosedur trial-and-error. Komentari satu atau lebih baris di vimrc Anda, mulai Vim, periksa apakah masalah terjadi, dan ulangi prosedur ini sampai masalah berhenti terjadi. Cara tercepat untuk melakukan ini adalah:

  1. Beri komentar (atau hapus) sekitar setengah file vimrc Anda.
  2. Mulai ulang Vim, atau buka Vim baru (memuat ulang vimrc tidak cukup baik, karena pengaturan tidak disetel).
  3. Apakah masalahnya sudah hilang? Pasang kembali bagian yang Anda hapus (menjaga Vim terbuka dan menggunakan undo berguna di sini) dan ulangi langkah 1 pada bagian yang Anda tambahkan kembali.
  4. Apakah masalah masih terjadi? Lanjutkan ke langkah 1.

Pada akhirnya Anda harus memiliki satu opsi atau kombinasi beberapa opsi yang menyebabkan masalah Anda. Anda dapat mengetahui lebih lanjut tentang opsi apa pun di Vim dengan menggunakan:

:help 'option_name'

Kutipan itu penting di sini, biasanya berfungsi tanpa mereka, tetapi kadang-kadang Anda berakhir di halaman yang salah jika Anda menghilangkannya.

Jika Anda masih bingung setelah membaca halaman bantuan, Anda tahu harus bertanya di mana ;-)

Melakukan debugging satu plugin

Jika Anda ingin mengisolasi satu plugin, mungkin untuk mengajukan pertanyaan tentangnya, Anda ingin memuat sesedikit mungkin tetapi masih memuat plugin; Anda dapat dengan mudah melakukan ini dengan fitur paket Vim. Ini membutuhkan Vim 8 atau versi Neovim yang cukup baru.

  1. Buat direktori kosong baru; kami akan menggunakan ~/pluginjalur dalam contoh ini. Sekarang letakkan plugin di pack/plugins/start/$namedirektori biasa . Sebagai contoh:

    git clone https://github.com/fatih/vim-go.git ~/plugin/pack/plugins/start/vim-go
    
  2. Buat test-vimrcfile dengan konten berikut; ini akan memastikan bahwa Vim akan memuat plugin dari ~/plugindirektori dan tidak yang ~/.vim direktori:

    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. Mulai Vim dengan:

    vim -U NONE -u ~/test-vimrc
    

    Anda sekarang memiliki vimrc minimal dengan hanya satu plugin ini.


Catatan kaki

1 Sebagai contoh: di 64 bit Windows, shortcut akan terlihat seperti ini: "C:\Program Files (x86)\Vim\vim74\vim.exe" -u NONE -U NONE -N. Untuk membuatnya, klik kanan di File Explorer tempat Anda ingin pintasan, lalu pilih Baru -> Pintasan dan tempel teks pintasan. Anda mungkin perlu mengubah jalur Vim jika Vim Anda dipasang di lokasi lain.

Martin Tournoij
sumber
7
Teknik ini disebut Lokalisasi Kesalahan Pencarian Biner .
tommcdo
2
Setelah Anda mengetahui bug Anda, ini akan menjadi waktu yang tepat untuk mulai menjaga .vimrc Anda di bawah kontrol versi :) Ini hampir selalu akan menjadi salah satu perubahan terakhir yang Anda lakukan yang membuat hal-hal berperilaku aneh.
escrafford
1
Anda tidak perlu -U NONEjika sudah -u NONE.
Antony
@ MartinTournoij Saya menyarankan suntingan untuk memudahkan pembaca pertama kali memahami. Saya harap Anda menyukainya. Terima kasih!
jpaugh
1
Terima kasih @ jpaugh; Saya pikir keteraturan itu lebih masuk akal.
Martin Tournoij
31

Ada -Dparameter Vim khusus untuk debugging yang akan masuk ke mode debugging setelah menjalankan perintah pertama dari skrip.

Misalnya untuk menjalankan Vim dalam mode debug tanpa plugin, jalankan sebagai:

vim --noplugin -D

Ketik n/ nextuntuk menguraikan baris berikutnya dan terus menekan Enter.

Dan contatau quntuk kembali ke vimantarmuka.

Jika Anda menggunakan versi GUI, masukkan guiperintah di vimrc Anda untuk memulai proses debug tepat setelah perintah itu.

Tekan Ctrl+ duntuk daftar perintah yang tersedia

Baca lebih lajut:

kenorb
sumber
1
Ini sangat membantu dalam menemukan kesalahan sederhana dalam file .vimrc yang menyebabkan pesan kesalahan. Pantas untuk dicoba dulu karena ini cepat dilakukan.
RichVel
1
@kenorb perintah ini sangat luar biasa, menyelamatkan saya dari pergi ke editor lain.
TheLazyChap
11

Seperti yang telah disebutkan, cobalah terlebih dahulu vim -u NONE -U NONE -Nuntuk memastikan vim vanilla Anda berfungsi dengan baik.

Kemudian mulai vim secara normal dan periksa

:messages

dari dalam vim setelah masalah, yang akan menampilkan semua peringatan dan kesalahan.

Akhirnya mulailah vim dengan perintah berikut

vim -V9logfile.log

yang akan membuat file log dipanggil logfile.log, -V9adalah tingkat logging dan mencoba mereproduksi masalah Anda.

RSabet
sumber
11

Satu lagi tip: seperti manusia gua kelihatannya, saya suka menambahkan: echom "message" ke .vimrc saya untuk melihat apa yang dieksekusi dan apa yang tidak.

Sebagai contoh

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

  ...
endif

Ini membantu saya dengan cepat melihat apakah blok jika sedang dieksekusi, dll. Pesan akan dicetak pada konsol saat Anda memulai vim.

Edy Bourne
sumber
6
Dan jika Anda menggunakan echomperintah lain yang menarik adalah :messagesuntuk mendapatkan log lengkap dari pesan yang digaungkan. Kadang-kadang bisa berguna untuk melihatnya setelah startup.
statox
Ini hampir apa yang saya butuhkan, saya ingin melihat apa nilai cpoptions pada suatu titik di vimrc saya, bagaimana cara mengulang output ": set cpoptions?" ?
Mike Lippert
10

Satu hal yang saya temukan membantu adalah menjaga koleksi variabel yang mengubah bagian Anda .vimrcsehingga Anda dapat menonaktifkan atau mengaktifkan bagiannya tanpa harus berkomentar. Ini juga memiliki efek samping yang menyenangkan memaksa Anda untuk berpikir tentang organisasi Anda .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

Berikut adalah contoh bagian yang dijaga oleh if:

if g:vimrc_feat_core_minimal
    set nocompatible
    filetype plugin indent on
    syntax on
endif
Gregory Nisbet
sumber
1

Waktu pemuatan vimrc saya sangat lambat, sekitar 400 ms, dan saya menguranginya menjadi 20 ms hanya dengan menghapus baris ini:

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

Pastikan Anda tidak memiliki panggilan ke perintah eksternal seperti itu.

Kristijan
sumber
1
Selamat datang di situs ini! Ini adalah berita gembira yang bermanfaat, tetapi sedikit lebih spesifik daripada pertanyaan umum yang diajukan. Mungkin lebih baik ditambahkan sebagai jawaban untuk contoh pertanyaan ini , atau, jika Anda hanya ingin berbagi pengetahuan, Anda mungkin bisa bertanya dan menjawab pertanyaan Anda sendiri?
Kaya
0

Ini adalah prosedur sederhana untuk memulai.

  1. komentar isi seluruh file .vimrc Anda
  2. muat ulang .vimrc Anda dengan menjalankan :source %atau:so $MYVIMRC
  3. batalkan komentar pada bagian tersembunyi dari file (umumnya dimulai dari atas)
  4. Ulangi langkah 2 dan 3 sampai Anda menemukan kesalahan.
  5. perbaiki kesalahan.
Mike Wilding
sumber
1
Jawaban ini bisa menjadi jauh lebih baik jika Anda menggunakan huruf besar dengan benar dan memberi tanda baca.
Sangat merekomendasikan melakukan ini dengan pencarian biner.
D. Ben Knoble