-- ============================================================================ -- 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 [""] = { "^i", "Begin of line" }, [""] = { "^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 [""] = { "```\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 [""] = { "", "É uma abreviação de 'No Operation'.", { noremap = true } }, [""] = { "", "É uma abreviação de 'No Operation'.", { noremap = true } }, [""] = { "", "É uma abreviação de 'No Operation'.", { noremap = true } }, [""] = {"", "É 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 + direção por atalhos mais diretos. [""] = { "h", "Shortcuts for split navigation left" }, [""] = { "j", "Shortcuts for split navigation down" }, [""] = { "k", "Shortcuts for split navigation up" }, [""] = { "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 [""] = { " noh ", "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 ["n"] = { ":set number! relativenumber! ", "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 ["s"] = { " source % ", "source current file" }, -- Salvamento rápido do buffer atual -- Salva o arquivo em edição com um atalho único, evitando múltiplas combinações ["w"] = { ":w", "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 [""] = { ":source $MYVIMRC", "reload vim/neovim config" }, -- Selecionar todo o conteúdo do arquivo -- Mantém os jumps intactos ao selecionar tudo usando keepjumps ["a"] = { ":keepjumps normal! ggVG", "Select all" }, -- Editar arquivo de configuração -- Abre o arquivo de configuração principal do Vim/Neovim para edição ["e"] = { "edit $MYVIMRC", "Edit config file" }, -- Sair de todos os buffers e fechar Neovim -- Fecha todas as janelas e sai do editor sem confirmação ["q"] = { "quitall", "Exit vim" }, -- Abrir terminal integrado -- Abre um terminal embutido dentro do Neovim para executar comandos ["t"] = { "term", "Open terminal" }, -- Buscar entre buffers abertos -- Lista os arquivos abertos permitindo navegação rápida entre eles [""] = { "files: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 -- [""] = { ":NERDTreeToggle", "open/close nerdtree" }, -- ["t"] = { ":NERDTreeToggle", "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 [''] = { function() vim.api.nvim_err_writeln("Umm, use j instead") end, { noremap = true } }, [''] = { function() vim.api.nvim_err_writeln("Umm, use h instead") end, { noremap = true } }, [''] = { function() vim.api.nvim_err_writeln("Umm, use l instead") end, { noremap = true } }, [''] = { 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 [""] = { vim.api.nvim_replace_termcodes("", true, true, true), "Escape terminal mode" }, -- Sair do modo terminal com ESC -- Permite retornar ao modo normal de edição usando a tecla ESC [""] = { vim.api.nvim_replace_termcodes("", 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 [""] = { 'v:count || mode(1)[0:1] == "no" ? "k" : "gk"', "Move up", opts = { expr = true } }, [""] = { '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" }, }, -- ======================================================================== -- 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:let @"=@0', "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 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', 'ph', ':lua require("mapping").PrintHelloWorld()', { 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