소스 검색

chore: initial nvim config

tiago.cipriano 1 일 전
커밋
f58b1ee6f3
3개의 변경된 파일503개의 추가작업 그리고 0개의 파일을 삭제
  1. 151 0
      nvim/init.lua
  2. 289 0
      nvim/lua/mapping.lua
  3. 63 0
      nvim/lua/mini_nvim.lua

+ 151 - 0
nvim/init.lua

@@ -0,0 +1,151 @@
+-- arquivo de configuração do neovim, para isso basta criar o arquivo `~/.config/nvim/init.lua` e adicionar as seguintes linhas:
+
+-- https://github.com/neovim/neovim/tree/master
+
+local vim = vim
+
+-- ====================================================================================
+-- ⭐ ESSENCIAL - Configurações obrigatórias para funcionamento correto
+-- ====================================================================================
+
+-- Desativa compatibilidade com Vi antigo, permitindo usar recursos modernos do Vim/Neovim
+vim.o.compatible = false
+
+
+-- Detecta o tipo de arquivo e carrega automaticamente plugins e indentação apropriados
+-- (Sem equivalente nativo em Lua - essa linha DEVE usar VimScript)
+vim.cmd("filetype plugin indent on")
+
+
+-- Ativa a sintaxe de highlight para deixar o código colorido
+-- (Forma nativa: vim.treesitter.start() é mais moderno)
+vim.cmd("syntax enable")
+
+-- Carrega configurações de arquivos .vim, .lua, .nvimrc e .exrc na pasta de projeto
+vim.o.exrc = true
+-- Ativa modo seguro para bloquear comandos preiudosos ao carregar arquivos de terceiros
+vim.o.secure = true
+
+-- Define a tecla de espaço como "Leader Key" (tecla modificadora para atalhos customizados)
+vim.g.mapleader = " "
+
+-- ====================================================================================
+-- 🔧 RECOMENDADO - Melhor usabilidade e comportamento esperado
+-- ====================================================================================
+
+-- Exibe os números das linhas no lado esquerdo do editor
+vim.opt.number = true
+
+-- Mostra números relativos (distância da linha do cursor), útil para navegação rápida
+vim.o.relativenumber = true
+
+vim.o.scrolloff = 4
+
+
+
+-- Herda a indentação da linha anterior automaticamente ao criar nova linha
+vim.o.autoindent = true
+
+-- Converte caracteres Tab em espaços (importante para compatibilidade entre editores)
+vim.o.expandtab = true
+
+-- Define quantos espaços ocupam UMA tabulação visual no arquivo
+vim.o.tabstop = 4
+
+-- Define quantos espaços o Neovim coloca ao pressionar Tab (mesmo convertendo em espaços)
+-- Por exemplo: ao pressionar Tab, o cursor pula 4 espaços. Ao pressionar Backspace, apaga 4 espaços
+-- Diferente de tabstop que é só visual - softtabstop define o "tamanho tático" do Tab
+vim.o.softtabstop = 4
+
+-- Controla a quantidade de espaços usados para indentação automática
+-- Afeta operações como << (diminuir indentação) e >> (aumentar indentação),
+-- bem como indentação automática feita por plugins. Neste caso, cada nível de indentação
+vim.o.shiftwidth = 4
+
+-- Ativa suporte a clipboard do sistema (copia/cola com "+y" ou "*y funciona com sistema)
+vim.o.clipboard = "unnamedplus"
+
+-- Ativa mouse para clicar, arrastar e selecionar texto no editor em todos os modos
+-- "a" = all modes (normal, insert, command-line, visual)
+vim.o.mouse = ""
+
+-- ====================================================================================
+-- 👀 BUSCA E INTERFACE - Melhor visualização durante edição
+-- ====================================================================================
+
+-- Destaca a linha inteira onde o cursor está (linha horizontal)
+vim.o.cursorline = true
+
+-- dá para brincar com exibindo só o destaque no numero da liilha, ou então da linhas, ambos
+vim.o.cursorlineopt = "line,number"
+
+-- Destaca todos os resultados de uma busca anterior até fazer uma nova busca
+vim.o.hlsearch = true
+
+-- Busca incremental: mostra resultados enquanto você digita a busca
+vim.o.incsearch = true
+
+-- Mostra uma coluna de referência em 120 e 160 caracteres para manter linhas legíveis
+vim.o.colorcolumn = "80,120,140"
+
+-- Destaca automaticamente parênteses/colchetes/chaves correspondentes
+vim.o.showmatch = true
+
+-- Mostra qual modo você está (INSERT, VISUAL, COMMAND, etc) na barra inferior
+vim.o.showmode = true
+
+
+-- quando testei essa config, lá na barra de titulo do emulador
+-- de terminal aparece o arquivo em questão como titulo
+vim.o.title = true
+
+-- quando divide a janela verticalmente, mantem o buffer atual a direita
+vim.o.splitright = true
+
+-- quando divide a tela na horizontal
+-- mantem o buffer atual em cima
+vim.o.splitbelow = true
+
+
+-- ====================================================================================
+-- 📝 DESCOMENTADO - Configurações adicionais disponíveis
+-- ====================================================================================
+
+
+-- ainda não encontrei aonde faça a diferença, dado que o terminal já usa
+vim.o.fileencodings = 'uft-8'
+
+-- ainda não encontrei aonde faça a diferença, dado que o terminal já usa
+vim.o.encoding = 'utf-8'
+
+-- oferece a opção de salvar quando fecha o buffer
+vim.o.confirm = true
+
+vim.o.smartcase = true
+vim.o.ignorecase = true
+vim.o.signcolumn = 'yes'
+vim.o.wrap = true
+
+-- retrobox, habamax, fruit
+vim.cmd.colorscheme('habamax')
+require('mapping')
+require('mini_nvim')
+vim.o.wildmode = "longest:list"
+
+vim.o.backspace=indent,eol,start
+
+vim.o.listchars="tab:>-,trail:-,nbsp:+"
+vim.o.fillchars="eob:~,lastline:@"
+
+
+vim.o.hidden = true
+
+
+-- require('plugs')        -- descomente para carregar arquivo de plugins
+
+
+-- vim.g.NERDTreeShowHidden=1  -- descomente para mostrar arquivos ocultos no NERDTree
+
+-- Telescópio
+-- https://github.com/nvim-telescope/telescope.nvim
+

+ 289 - 0
nvim/lua/mapping.lua

@@ -0,0 +1,289 @@
+-- ============================================================================
+-- Configuração de Mapeamentos do Neovim em Lua
+-- Referência: https://tuckerchapman.com/
+-- ============================================================================
+
+-- Realiza a inicialização da API do Neovim
+local vim = vim
+
+-- Tabela centralizada que armazena todos os mapeamentos organizados por modo
+-- Cada modo contém mapeamentos com suas respectivas ações e opções
+local Mapping = {
+    -- ========================================================================
+    -- MODO INSERT
+    -- Mapeamentos utilizados quando se está inserindo texto no editor
+    -- ========================================================================
+    i = {
+        -- Navegação de linhas: movimentos para início da linha
+        -- Facilita o retorno ao início da linha sem sair do modo insert
+        ["<C-a>"] = {
+            "<ESC>^i",
+            "Begin of line"
+        },
+        ["<C-b>"] = { "<ESC>^i", "Begin of line" },
+
+        -- Inserir bloco de código de markdown
+        -- Facilita a inserção de blocos de código com as backticks de markdown
+        ["<F6>"] = { "```\n```\n", "Insert markdown code block" },
+
+        -- Desabilitar teclas de seta para fortalecer o aprendizado de
+        -- movimentos Vim
+        --
+        -- As teclas de seta (hjkl) são o padrão no Vim e investir em sua
+        -- memorização
+        --
+        -- melhora significativamente a velocidade de edição a longo prazo
+        ["<down>"] = {
+            "<NOP>", "É uma abreviação de 'No Operation'.", { noremap = true }
+        },
+        ["<left>"] = {
+            "<NOP>", "É uma abreviação de 'No Operation'.", { noremap = true }
+        },
+        ["<right>"] = {
+            "<NOP>", "É uma abreviação de 'No Operation'.", { noremap = true }
+        },
+        ["<up>"] = {"<NOP>", "É uma abreviação de 'No Operation'.",
+            { noremap = true }
+        },
+    },
+
+    -- ========================================================================
+    -- MODO NORMAL
+    -- Mapeamentos utilizados no modo padrão de navegação e edição
+    -- Agrupa mapeamentos para navegação entre splits, configuração e edição
+    -- ========================================================================
+    n = {
+        -- Configurações de clipboard: comportamento de copiar, recortar e colar
+        -- Acho que essas configurações servem para alterar o comportamento do
+        -- copiar, recortar e colar
+        -- ["gy"] = { "\"+ y", "Copy to clipboard" },
+        -- ["gp"] = { "\"+ p", "Paste from clipboard" },
+        -- ["x"] = { '"_ x', "Delete without copy" },
+        -- ["X"] = { '"_ d', "Delete line without copy" },
+        -- Deixei comentado pois estava modificando o comportamento padrão do
+        -- vim e estava me atrapalhando.
+        -- Essas configurações fazem com que x e X no modo normal e visual não
+        -- copiem o texto para o registro padrão
+        -- (usam o registro "black hole" "_). Pesquise depois com detalhes
+        -- sobre registros no vim para entender melhor.
+
+        -- Navegação entre janelas (splits)
+        -- Facilita a movimentação entre múltiplas janelas abertas simultaneamente.
+        -- Substitui as combinações padrão <C-w> + direção por atalhos mais diretos.
+        ["<C-h>"] = { "<C-w>h", "Shortcuts for split navigation left" },
+        ["<C-j>"] = { "<C-w>j", "Shortcuts for split navigation down" },
+        ["<C-k>"] = { "<C-w>k", "Shortcuts for split navigation up" },
+        ["<C-l>"] = { "<C-w>l", "Shortcuts for split navigation right" },
+
+        -- Limpeza de highlights de busca
+        -- Remove o destaque das buscas anteriores quando ESC é pressionado,
+        -- mantendo a tela limpa e facilitando a concentração no código
+        ["<ESC>"] = { "<cmd> noh <CR>", "Clear highlights" },
+
+        -- Navegação de caracteres customizada: utiliza 'ç' para entrar em modo comando
+        -- Permite usar o caractere específico do teclado português para acessar
+        -- o modo de comando sem necessidade de combinações de teclas
+        ["ç"] = { ":", "entra no modo de comando" },
+
+        -- Alternância de números de linha e números relativos
+        -- Alterna simultaneamente entre número absoluto e relativo (relativenumber),
+        -- permitindo uma rápida alternância entre modos de navegação sem buscar uma linha específica
+        ["<leader>n"] = { ":set number! relativenumber! <CR>", "toggle number" },
+
+        -- Execução de arquivo de configuração atual
+        -- Carrega novamente o arquivo aberto no editor, útil para testar
+        -- mudanças em arquivos de configuração sem reiniciar o editor
+        ["<leader>s"] = { "<cmd> source % <CR>", "source current file" },
+
+        -- Salvamento rápido do buffer atual
+        -- Salva o arquivo em edição com um atalho único, evitando múltiplas combinações
+        ["<leader>w"] = { ":w<CR>", "Clear write current buffer - same up" },
+
+        -- Recarga de todo o arquivo de configuração do Vim/Neovim
+        -- Reaplica as definições de configuração sem necessidade de reiniciar,
+        -- permitindo testes rápidos de mudanças na configuração principal
+        ["<leader><leader>"] = { ":source $MYVIMRC<CR>", "reload vim/neovim config" },
+
+        -- Selecionar todo o conteúdo do arquivo
+        -- Mantém os jumps intactos ao selecionar tudo usando keepjumps
+        ["<leader>a"] = { ":keepjumps normal! ggVG<CR>", "Select all" },
+
+        -- Editar arquivo de configuração
+        -- Abre o arquivo de configuração principal do Vim/Neovim para edição
+        ["<leader>e"] = { "<cmd>edit $MYVIMRC<CR>", "Edit config file" },
+
+        -- Sair de todos os buffers e fechar Neovim
+        -- Fecha todas as janelas e sai do editor sem confirmação
+        ["<leader>q"] = { "<cmd>quitall<CR>", "Exit vim" },
+
+        -- Abrir terminal integrado
+        -- Abre um terminal embutido dentro do Neovim para executar comandos
+        ["<leader>t"] = { "<cmd>term<CR>", "Open terminal" },
+
+        -- Buscar entre buffers abertos
+        -- Lista os arquivos abertos permitindo navegação rápida entre eles
+        ["<leader><space>"] = { "<cmd>files<CR>:buffer ", "Search open files" },
+
+        -- Alternância da árvore de arquivos (NERDTree)
+        -- Abre ou fecha a visão lateral contendo a estrutura de pastas e arquivos,
+        -- permitindo navegação rápida entre diferentes partes do projeto
+        -- ["<C-a>"] = { ":NERDTreeToggle<CR>", "open/close nerdtree" },
+        -- ["<leader>t"] = { ":NERDTreeToggle<CR>", "open/close nerdtree" },
+
+        -- Desabilitar teclas de seta com feedback ao usuário
+        -- Quando uma tecla de seta é pressionada, exibe uma mensagem de erro encorajando
+        -- o uso dos movimentos Vim (hjkl), reforçando a aquisição do hábito
+        ['<down>'] = {
+            function() vim.api.nvim_err_writeln("Umm, use j instead") end,
+            { noremap = true }
+        },
+        ['<left>'] = {
+            function() vim.api.nvim_err_writeln("Umm, use h instead") end,
+            { noremap = true }
+        },
+        ['<right>'] = {
+            function() vim.api.nvim_err_writeln("Umm, use l instead") end,
+            { noremap = true }
+        },
+        ['<up>'] = {
+            function() vim.api.nvim_err_writeln("Umm, use k instead") end,
+            { noremap = true }
+        },
+    },
+
+    -- ========================================================================
+    -- MODO TERMINAL
+    -- Mapeamentos utilizados quando se está em um terminal integrado no Neovim
+    -- ========================================================================
+    t = {
+        -- Saída do modo terminal para modo normal
+        -- Permite retornar ao modo normal de Vim/Neovim mesmo quando um shell
+        -- está aberto, facilitando a navegação e edição sem fechar o terminal
+        ["<C-x>"] = {
+            vim.api.nvim_replace_termcodes("<C-\\><C-N>", true, true, true),
+            "Escape terminal mode"
+        },
+
+        -- Sair do modo terminal com ESC
+        -- Permite retornar ao modo normal de edição usando a tecla ESC
+        ["<Esc>"] = {
+            vim.api.nvim_replace_termcodes("<C-\\><C-N>", true, true, true),
+            "Exit terminal mode"
+        },
+    },
+
+    -- ========================================================================
+    -- MODO VISUAL
+    -- Mapeamentos utilizados quando texto está selecionado em modo visual
+    -- ========================================================================
+    v = {
+        -- Movimentação vertical suave em seleções com quebra de linha
+        -- Respeita quebras de linha visual (word wrap), movendo-se por linhas lógicas
+        -- em vez de linhas físicas, útil quando o texto está dividido em múltiplas linhas visuais
+        ["<Up>"] = {
+            'v:count || mode(1)[0:1] == "no" ? "k" : "gk"', "Move up",
+            opts = { expr = true }
+        },
+        ["<Down>"] = {
+            'v:count || mode(1)[0:1] == "no" ? "j" : "gj"', "Move down",
+            opts = { expr = true }
+        },
+
+        -- Indentação de blocos selecionados
+        -- Mantém a seleção visual ativa após indentar, permitindo múltiplas
+        -- indentações consecutivas sem necessidade de reselecionar o texto
+        ["<"] = { "<gv", "Indent line" },
+        [">"] = { ">gv", "Indent line" },
+    },
+
+    -- ========================================================================
+    -- MODO VISUAL-BLOCK (seleção em bloco)
+    -- Mapeamentos utilizados em seleções de bloco (Ctrl-V)
+    -- ========================================================================
+    x = {
+        -- Movimentação vertical suave em blocos de seleção
+        -- Respeita quebras de linha visuais, movendo-se naturalmente através
+        -- de linhas envolvidas em word wrap
+        ["j"] = {
+            'v:count || mode(1)[0:1] == "no" ? "j" : "gj"', "Move down",
+            opts = { expr = true }
+        },
+        ["k"] = {
+            'v:count || mode(1)[0:1] == "no" ? "k" : "gk"', "Move up",
+            opts = { expr = true }
+        },
+
+        -- Colamento sem consumir o conteúdo da seleção original
+        -- Mantém o conteúdo anteriormente copiado intacto após colar sobre uma seleção,
+        -- evitando a perda de dados quando se quer colar múltiplas vezes o mesmo conteúdo.
+        -- Referência: https://vim.fandom.com/wiki/Replace_a_word_with_yanked_text#Alternative_mapping_for_paste
+        ["p"] = {
+            'p:let @+=@0<CR>:let @"=@0<CR>', "Dont copy replaced text",
+            opts = { silent = true }
+        },
+    },
+}
+-- ============================================================================
+-- APLICAÇÃO DOS MAPEAMENTOS
+-- Percorre a tabela Mapping e registra todos os mapeamentos no Neovim
+-- ============================================================================
+-- Itera sobre cada modo (i, n, t, v, x) e seus respectivos mapeamentos
+for modo, mapeamentos in pairs(Mapping) do
+    -- Itera sobre cada tecla-ação dentro do modo atual
+    for tecla, acao in pairs(mapeamentos) do
+        local comando = acao[1]
+        local descricao = acao[2]
+        local opt_customizado = acao.opts ~= nil
+
+        -- Registra o mapeamento com as opções customizadas ou padrão (noremap)
+        -- noremap = true previne mapeamentos recursivos, evitando
+        -- comportamentos inesperados
+        if (opt_customizado)
+        then
+            vim.keymap.set(modo, tecla, comando, acao.opts)
+        else
+            vim.keymap.set(modo, tecla, comando, { noremap = true })
+        end
+    end
+end
+
+-- ============================================================================
+-- DEFINIÇÃO DO MÓDULO
+-- Exporta funções customizadas para serem utilizadas em mapeamentos e comandos
+-- ============================================================================
+local M = {}
+
+-- Função utilitária para exibir "Hello World" no console
+-- Utilizada para testes e demonstrações de integração entre mapeamentos e Lua
+function M.PrintHelloWorld()
+    print("Hello World")
+end
+
+-- ============================================================================
+-- VARIÁVEIS GLOBAIS E COMMANDOS CUSTOMIZADOS
+-- Define variáveis globais e comandos do Neovim para facilitar acesso
+-- às funções
+-- ============================================================================
+
+-- Marca globalmente que o módulo de mapeamento foi carregado com sucesso
+-- Permite que outros scripts verifiquem se este arquivo foi executado
+_G.my_mapping_loaded = true
+
+-- Cria um atalho <leader>ph para executar a função PrintHelloWorld
+-- Permite invocar a função com um atalho de teclado no modo normal
+vim.api.nvim_set_keymap(
+    'n', '<leader>ph', ':lua require("mapping").PrintHelloWorld()<CR>',
+    { noremap = true, silent = true }
+)
+
+-- Define um comando customizado 'PrtHello' que executa a função PrintHelloWorld
+-- Permite executar a função digitando ':PrtHello' no modo de comando do Neovim
+vim.api.nvim_create_user_command('PrtHello', M.PrintHelloWorld, {})
+
+-- ============================================================================
+-- EXPORTAÇÃO DO MÓDULO
+-- Retorna o módulo para que ele possa ser utilizado em outros
+-- arquivos de configuração
+-- ============================================================================
+return M
+

+ 63 - 0
nvim/lua/mini_nvim.lua

@@ -0,0 +1,63 @@
+-- Put this at the top of 'init.lua'
+local path_package = vim.fn.stdpath('data') .. '/site'
+local mini_path = path_package .. '/pack/deps/start/mini.nvim'
+if not vim.loop.fs_stat(mini_path) then
+  vim.cmd('echo "Installing `mini.nvim`" | redraw')
+  local clone_cmd = {
+    'git', 'clone', '--filter=blob:none',
+    -- Uncomment next line to use 'stable' branch
+    -- '--branch', 'stable',
+    'https://github.com/nvim-mini/mini.nvim', mini_path
+  }
+  vim.fn.system(clone_cmd)
+  vim.cmd('packadd mini.nvim | helptags ALL')
+  vim.cmd('echo "Installed `mini.nvim`" | redraw')
+end
+
+local ok, MiniDeps = pcall(require, 'mini.deps')
+if not ok then
+  vim.notify('[WARN] mini.deps module not found', vim.log.levels.WARN)
+  return
+end
+
+
+--  https://nvim-mini.org/mini.nvim/
+MiniDeps.setup({})
+MiniDeps.add('neovim/nvim-lspconfig')
+MiniDeps.add('nvim-treesitter/nvim-treesitter')
+MiniDeps.add('nvim-telescope/telescope.nvim')
+MiniDeps.add('nvim-lua/plenary.nvim')
+MiniDeps.add('nvim-telescope/telescope-fzf-native.nvim')
+MiniDeps.add('junegunn/fzf')
+MiniDeps.add('junegunn/fzf.vim')
+MiniDeps.add({
+  source = 'nvim-neo-tree/neo-tree.nvim',
+  checkout = 'v3.x',
+  depends = {
+    "nvim-lua/plenary.nvim",
+    "MunifTanjim/nui.nvim",
+    "nvim-tree/nvim-web-devicons", -- optional, but recommended
+  }
+})
+require('mini.files').setup({})
+vim.keymap.set(
+    'n', '<leader>f',
+    '<cmd>lua MiniFiles.open()<cr>', {desc = 'File explorer'}
+)
+require('mini.icons').setup({style='glyph'})
+require('mini.statusline').setup({use_icons=true})
+
+-- Como é usado o Telescópip
+local builtin = require('telescope.builtin')
+vim.keymap.set(
+    'n', '<leader>ff', builtin.find_files, { desc = 'Telescope find files' }
+)
+vim.keymap.set(
+    'n', '<leader>fg', builtin.live_grep, { desc = 'Telescope live grep' }
+)
+vim.keymap.set(
+    'n', '<leader>fb', builtin.buffers, { desc = 'Telescope buffers' }
+)
+vim.keymap.set(
+    'n', '<leader>fh', builtin.help_tags, { desc = 'Telescope help tags' }
+)