Como depurar meu arquivo vimrc?

80

Estou com um problema no Vim e acho que pode estar no meu vimrcarquivo (ou foi informado que poderia ser o meu vimrcarquivo).

Como verifico isso? Se for o meu vimrcarquivo, como sei exatamente onde está o problema?

Martin Tournoij
fonte

Respostas:

79

A primeira coisa que você quer fazer é iniciar o Vim com as configurações padrão:

vim -u NONE -U NONE -N

Os -u NONEimpede Vim de carregar o seu vimrc, -U NONEimpede Vim de carregar o seu gvimrc, e -Ndiz ao Vim para usar nenhum modo compatível (isto não é necessário, mas a maioria dos usuários Vim não são usados para o modo "compatível"). Observe que NONEé necessário estar em letras maiúsculas.

No Windows, você pode adicionar esses sinalizadores criando um novo atalho 1 .

  • Se o problema persistir, você saberá que não é algo no seu vimrc.

  • Se o problema desaparecer, agora você é causado por algo no seu arquivo vimrc.

Não é o meu vimrc!

Viva! Vá e faça sua pergunta. Certifique-se de mencionar que você tentou iniciar o Vim sem um arquivo vimrc!

Então é o meu vimrc, e agora?

Se você ainda não o fez, provavelmente deseja salvar uma cópia de backup do seu arquivo vimrc primeiro.

Verifique os plugins

A próxima coisa que você provavelmente quer fazer é desativar todos os plugins primeiro; plugins podem alterar bastante no Vim. Se isso resolver o problema, tente descobrir qual plug-in reativando-o um por um. Depois de descobrir qual plugin exatamente causa o problema, você pode tentar corrigi-lo lendo a documentação deste plugin e / ou fazendo uma pergunta marcada com plugin-<name>.

Se é não um plugin, e você não tem qualquer ideia do que está causando o problema, então é um procedimento de tentativa e erro. Comente uma ou mais linhas no seu vimrc, inicie o Vim, verifique se o problema ocorre e repita este procedimento até que o problema pare de ocorrer. A maneira mais rápida de fazer isso é:

  1. Comente (ou remova) cerca da metade do seu arquivo vimrc.
  2. Reinicie o Vim ou abra um novo Vim (recarregar o vimrc não é bom o suficiente, pois as configurações não são definidas).
  3. O problema agora se foi? Recoloque a peça que você removeu (manter o Vim aberto e usar desfazer é útil aqui) e repita a etapa 1 da peça que você adicionou novamente.
  4. O problema ainda ocorre? Vá para o passo 1.

No final, você deve ter uma única opção ou uma combinação de algumas opções que causam o seu problema. Você pode descobrir mais sobre qualquer opção no Vim usando:

:help 'option_name'

As aspas são importantes aqui, geralmente funcionam sem elas, mas às vezes você acaba na página errada se as omitir.

Se você ainda estiver confuso depois de ler a página de ajuda, sabe onde fazer uma pergunta ;-)

Depurando um Único Plug-in

Se você deseja isolar um único plugin, talvez faça uma pergunta sobre ele, você deseja carregar o mínimo possível, mas ainda carrega o plugin; você pode fazer isso facilmente com o recurso de pacotes do Vim. Isso requer o Vim 8 ou uma versão razoavelmente recente do Neovim.

  1. Crie um novo diretório vazio; usaremos o ~/plugincaminho neste exemplo. Agora coloque o plugin no pack/plugins/start/$namediretório regular . Por exemplo:

    git clone https://github.com/fatih/vim-go.git ~/plugin/pack/plugins/start/vim-go
    
  2. Crie um test-vimrcarquivo com o seguinte conteúdo; isso garantirá que o Vim carregue plugins do ~/plugindiretório e não do ~/.vim diretório:

    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. Inicie o Vim com:

    vim -U NONE -u ~/test-vimrc
    

    Agora você tem um vimrc mínimo com apenas este único plugin.


Notas de rodapé

1 Por exemplo: em 64 bits do Windows, o atalho seria algo parecido com isto: "C:\Program Files (x86)\Vim\vim74\vim.exe" -u NONE -U NONE -N. Para criá-lo, clique com o botão direito do mouse em File Explorer onde deseja o atalho, selecione Novo -> Atalho e cole o texto do atalho. Pode ser necessário alterar o caminho do Vim se o seu Vim estiver instalado em outro local.

Martin Tournoij
fonte
7
Essa técnica é chamada localização de falhas de pesquisa binária .
21415 Tommcdo
2
Depois de descobrir o seu bug, esse seria um ótimo momento para começar a manter o seu .vimrc sob controle de versão :) Quase sempre será uma das últimas alterações que você fez para que o material se comporte de maneira estranha.
escrafford
1
Você não precisa -U NONEse tiver -u NONE.
Antony
@MartinTournoij Sugeri uma edição para facilitar a compreensão de um leitor iniciante . Espero que você goste. Obrigado!
jpaugh
1
Obrigado @jpaugh; Eu acho que essa ordem faz mais sentido.
Martin Tournoij 19/09/19
31

Existe o -Dparâmetro Vim especialmente para depuração, que entrará no modo de depuração após executar o primeiro comando a partir de um script.

Por exemplo, para executar o Vim no modo de depuração sem nenhum plug-in, execute como:

vim --noplugin -D

Digite n/ nextpara analisar a próxima linha e continue pressionando Enter.

E contou qpara voltar à viminterface.

Se você estiver usando uma versão da GUI, insira um guicomando no vimrc para iniciar a depuração logo após esse comando.

Pressione Ctrl+ dpara obter a lista de comandos disponíveis

Consulte Mais informação:

kenorb
fonte
1
Isso foi muito útil para encontrar um erro simples no arquivo .vimrc que estava causando uma mensagem de erro. Vale a pena tentar isso primeiro, pois é rápido.
21316 RichVel
1
@kenorb Este comando é incrível, salve-me de ir para outro editor.
TheLazyChap
11

Como já mencionado, primeiro tente vim -u NONE -U NONE -Ngarantir que seu vanilla vim esteja funcionando bem.

Em seguida, inicie o vim normalmente e verifique

:messages

de dentro do vim após o problema, que mostrará todos os avisos e erros.

Por fim, inicie o vim com o seguinte comando

vim -V9logfile.log

que criará um arquivo de log chamado logfile.log, -V9é o nível de log e tenta reproduzir seu problema.

RSabet
fonte
11

Mais uma dica: por mais que pareça um homem das cavernas, gosto de adicionar: echom "message" ao meu .vimrc para ver o que está sendo executado e o que não é.

Por exemplo

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

  ...
endif

Isso me ajuda a ver rapidamente se o bloco if está sendo executado, etc. A mensagem será impressa no console na próxima vez que você iniciar o vim.

Edy Bourne
fonte
6
E se você usar echomoutro comando interessante é :messagesfazer eco do log completo das mensagens. Às vezes, pode ser útil olhar para eles após a inicialização.
statox
Isso é quase o que eu precisava, quero ver qual é o valor de cpoptions em um ponto do meu vimrc, como faço para ecoar a saída de ": set cpoptions?" ?
Mike Lippert
10

Uma coisa que eu encontrei ajuda é manter uma coleção de variáveis ​​que alternam partes do seu, .vimrcpara que você possa desabilitar ou habilitar partes dele sem precisar comentar nada. Ele também tem o agradável efeito colateral de forçá-lo a pensar na organização do seu .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

Aqui está um exemplo de uma seção protegida por um if:

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

Meu tempo de carregamento do vimrc foi muito lento, em torno de 400ms, e eu o reduzi para 20ms apenas removendo esta linha:

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

Verifique se você não tem chamadas para comandos externos como esse.

Kristijan
fonte
1
Bem vindo ao site! Este é um boato útil, mas é um pouco mais específico do que a pergunta muito geral feita. Pode ser melhor adicionado como resposta a, por exemplo, esta pergunta , ou, se você está apenas procurando compartilhar conhecimento, talvez possa perguntar e responder sua própria pergunta?
Rich
0

Aqui está um procedimento muito simples para você começar.

  1. comente o conteúdo de todo o seu arquivo .vimrc
  2. recarregue seu .vimrc executando :source %ou:so $MYVIMRC
  3. descomente uma parte discreta do arquivo (geralmente começando do topo)
  4. Repita as etapas 2 e 3 até encontrar o erro.
  5. corrija o erro.
Mike Wilding
fonte
1
Essa resposta pode ser muito melhor se você a colocar em maiúscula e pontuada corretamente.
É altamente recomendável fazer isso com uma pesquisa binária.
D. Ben Knoble