Executando verificação de segurança...
9

Meu plugin de git preferido para o NeoVim

CI Versão Licença: MIT Gitter

Visualização

Hunk actionsLine blame

Instalação

packer.nvim:

  use 'lewis6991/gitsigns.nvim'

vim-plug:

Plug 'lewis6991/gitsigns.nvim'

Configuração

Essa é a configuração que eu costumo usar em meu NeoVim. Ela mostra uma barra vertical do lado esquerdo, com uma cor diferente dependendo da alteração, de maneira parecida como o VSCode faz.

require('gitsigns').setup {
  signs = {
    add          = {hl = 'GitSignsAdd'   , text = '│', numhl='GitSignsAddNr'   , linehl='GitSignsAddLn'},
    change       = {hl = 'GitSignsChange', text = '│', numhl='GitSignsChangeNr', linehl='GitSignsChangeLn'},
    delete       = {hl = 'GitSignsDelete', text = '│', numhl='GitSignsDeleteNr', linehl='GitSignsDeleteLn'},
    topdelete    = {hl = 'GitSignsDelete', text = '│', numhl='GitSignsDeleteNr', linehl='GitSignsDeleteLn'},
    changedelete = {hl = 'GitSignsChange', text = '│', numhl='GitSignsChangeNr', linehl='GitSignsChangeLn'},
  },
  signcolumn = true,  -- Toggle with `:Gitsigns toggle_signs`
  numhl      = false, -- Toggle with `:Gitsigns toggle_numhl`
  linehl     = false, -- Toggle with `:Gitsigns toggle_linehl`
  word_diff  = false, -- Toggle with `:Gitsigns toggle_word_diff`
  watch_gitdir = {
    interval = 1000,
    follow_files = true
  },
  attach_to_untracked = true,
  current_line_blame = true, -- Toggle with `:Gitsigns toggle_current_line_blame`
  current_line_blame_opts = {
    virt_text = true,
    virt_text_pos = 'eol', -- 'eol' | 'overlay' | 'right_align'
    delay = 1000,
    ignore_whitespace = false,
  },
  current_line_blame_formatter = '<author>, <author_time:%Y-%m-%d> - <summary>',
  sign_priority = 6,
  update_debounce = 100,
  status_formatter = nil, -- Use default
  max_file_length = 40000,
  preview_config = {
    -- Options passed to nvim_open_win
    border = 'single',
    style = 'minimal',
    relative = 'cursor',
    row = 0,
    col = 1
  },
  yadm = {
    enable = false
  },
  on_attach = function(bufnr)
    local gs = package.loaded.gitsigns

    local function map(mode, l, r, opts)
      opts = opts or {}
      opts.buffer = bufnr
      vim.keymap.set(mode, l, r, opts)
    end

    -- Navigation
    map('n', ']c', function()
      if vim.wo.diff then return ']c' end
      vim.schedule(function() gs.next_hunk() end)
      return '<Ignore>'
    end, {expr=true})

    map('n', '[c', function()
      if vim.wo.diff then return '[c' end
      vim.schedule(function() gs.prev_hunk() end)
      return '<Ignore>'
    end, {expr=true})

    -- Actions
    map({'n', 'v'}, '<leader>ss', ':Gitsigns stage_hunk<CR>')
    map({'n', 'v'}, '<leader>uu', ':Gitsigns reset_hunk<CR>')
    map('n', '<leader>SS', gs.stage_buffer)
    map('n', '<leader>us', gs.undo_stage_hunk)
    map('n', '<leader>UU', gs.reset_buffer)
    -- map('n', '<leader>hp', gs.preview_hunk)
    -- map('n', '<leader>hb', function() gs.blame_line{full=true} end)
    -- map('n', '<leader>tb', gs.toggle_current_line_blame)
    map('n', 'gs', gs.diffthis)
    -- map('n', '<leader>hD', function() gs.diffthis('~') end)
    -- map('n', '<leader>td', gs.toggle_deleted)

    -- Text object
    map({'o', 'x'}, 'ih', ':<C-U>Gitsigns select_hunk<CR>')
  end
}

Os remaps que eu utilizo com mais frequência são esses:

  • <Leader>ss - Colocar o hunk no stage do git;
  • <Leader>uu - Remover o hunk do stage do git;
  • <Leader>SS - Colocar o arquivo em stage;
  • <Leader>UU - Remover o arquivo do stage;
  • <Leader>gs - Ver o diff do arquivo;
  • ]c - Ir para o próximo hunk;
  • [c - Ir para o hunk anterior.

Exemplo de diff

exemplo-de-diff

3

Muito bom Nathan! Tenho uma máquina meio fraca que já não aguenta tão bem meus projetos pessoais e estou querendo começar a usar Neo/LunarVim por serem mais leves que o vscode, mas acho meio complicado pois são muitos comandos pra lembrar, tem alguma recomendação de por onde começar?

2

Realmente leva um tempo para se acostumar, vá com calma que aos poucos você internaliza os comandos. Eu tenho feio algumas postagens aqui no TabNews sobre o NeoVim. Você pode conferir todas as postagens que eu já fiz clicando aqui. A maioria dessas postagens são dicas minhas envolvendo plugins que eu uso, mas eu não fiz nenhuma com um passo a passo de uso ainda. Há três posts meus que eu imagino que você vai curtir:

Outra coisa que deve te ajudar é essa página do devhints.io. Esse é um site que tem dicas de diversas linguagens, frameworks e tecnologias, inclusive o vim.

O caminho que eu trilhei

Quando comecei a usar o NeoVim com mais frequência, assisti esse vídeo. Ele ensina a configurar o NeoVim do zero usando a linguagem Vimscript. Um tempo depois eu fiz novamente uma configuração do zero, e já consegui montá-la sozinho pegando informações de diversas fontes conforme eu queria. Nessa segunda vez eu foquei em usar linguagem lua ao invés de Vimscript, pois ela ajuda na performance se você tiver muitos plugins, além de ter uma api mais amigável. Essas foram algumas fontes qu eu tive.

Conteúdos em inglês

Não sei o seu nível de inglês, mas ná nossa área é muito bom que você saiba se virar com ele. Não sou fluente, mas assisti vários vídeos em inglês sobre o vim. Como ele não é um editor tão famoso, é natural que haja menos conteúdos falando sobre ele, principalmente em português. Mas persista, essa barreira de dificultade pode afastar algumas pessoas, mas foi o que me atraiu. Usar o vim me fez ser persistente em achar as respostas, me incentivou a ver vídeos em outra lingua e tudo isso me fez ser um programador mais confiante.

Espero que tenha te ajudado! 😄

1