mapping.lua 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. -- ============================================================================
  2. -- Configuração de Mapeamentos do Neovim em Lua
  3. -- Referência: https://tuckerchapman.com/
  4. -- ============================================================================
  5. -- Realiza a inicialização da API do Neovim
  6. local vim = vim
  7. -- Tabela centralizada que armazena todos os mapeamentos organizados por modo
  8. -- Cada modo contém mapeamentos com suas respectivas ações e opções
  9. local Mapping = {
  10. -- ========================================================================
  11. -- MODO INSERT
  12. -- Mapeamentos utilizados quando se está inserindo texto no editor
  13. -- ========================================================================
  14. i = {
  15. -- Navegação de linhas: movimentos para início da linha
  16. -- Facilita o retorno ao início da linha sem sair do modo insert
  17. ["<C-a>"] = {
  18. "<ESC>^i",
  19. "Begin of line"
  20. },
  21. ["<C-b>"] = { "<ESC>^i", "Begin of line" },
  22. -- Inserir bloco de código de markdown
  23. -- Facilita a inserção de blocos de código com as backticks de markdown
  24. ["<F6>"] = { "```\n```\n", "Insert markdown code block" },
  25. -- Desabilitar teclas de seta para fortalecer o aprendizado de
  26. -- movimentos Vim
  27. --
  28. -- As teclas de seta (hjkl) são o padrão no Vim e investir em sua
  29. -- memorização
  30. --
  31. -- melhora significativamente a velocidade de edição a longo prazo
  32. ["<down>"] = {
  33. "<NOP>", "É uma abreviação de 'No Operation'.", { noremap = true }
  34. },
  35. ["<left>"] = {
  36. "<NOP>", "É uma abreviação de 'No Operation'.", { noremap = true }
  37. },
  38. ["<right>"] = {
  39. "<NOP>", "É uma abreviação de 'No Operation'.", { noremap = true }
  40. },
  41. ["<up>"] = {"<NOP>", "É uma abreviação de 'No Operation'.",
  42. { noremap = true }
  43. },
  44. },
  45. -- ========================================================================
  46. -- MODO NORMAL
  47. -- Mapeamentos utilizados no modo padrão de navegação e edição
  48. -- Agrupa mapeamentos para navegação entre splits, configuração e edição
  49. -- ========================================================================
  50. n = {
  51. -- Configurações de clipboard: comportamento de copiar, recortar e colar
  52. -- Acho que essas configurações servem para alterar o comportamento do
  53. -- copiar, recortar e colar
  54. -- ["gy"] = { "\"+ y", "Copy to clipboard" },
  55. -- ["gp"] = { "\"+ p", "Paste from clipboard" },
  56. -- ["x"] = { '"_ x', "Delete without copy" },
  57. -- ["X"] = { '"_ d', "Delete line without copy" },
  58. -- Deixei comentado pois estava modificando o comportamento padrão do
  59. -- vim e estava me atrapalhando.
  60. -- Essas configurações fazem com que x e X no modo normal e visual não
  61. -- copiem o texto para o registro padrão
  62. -- (usam o registro "black hole" "_). Pesquise depois com detalhes
  63. -- sobre registros no vim para entender melhor.
  64. -- Navegação entre janelas (splits)
  65. -- Facilita a movimentação entre múltiplas janelas abertas simultaneamente.
  66. -- Substitui as combinações padrão <C-w> + direção por atalhos mais diretos.
  67. ["<C-h>"] = { "<C-w>h", "Shortcuts for split navigation left" },
  68. ["<C-j>"] = { "<C-w>j", "Shortcuts for split navigation down" },
  69. ["<C-k>"] = { "<C-w>k", "Shortcuts for split navigation up" },
  70. ["<C-l>"] = { "<C-w>l", "Shortcuts for split navigation right" },
  71. -- Limpeza de highlights de busca
  72. -- Remove o destaque das buscas anteriores quando ESC é pressionado,
  73. -- mantendo a tela limpa e facilitando a concentração no código
  74. ["<ESC>"] = { "<cmd> noh <CR>", "Clear highlights" },
  75. -- Navegação de caracteres customizada: utiliza 'ç' para entrar em modo comando
  76. -- Permite usar o caractere específico do teclado português para acessar
  77. -- o modo de comando sem necessidade de combinações de teclas
  78. ["ç"] = { ":", "entra no modo de comando" },
  79. -- Alternância de números de linha e números relativos
  80. -- Alterna simultaneamente entre número absoluto e relativo (relativenumber),
  81. -- permitindo uma rápida alternância entre modos de navegação sem buscar uma linha específica
  82. ["<leader>n"] = { ":set number! relativenumber! <CR>", "toggle number" },
  83. -- Execução de arquivo de configuração atual
  84. -- Carrega novamente o arquivo aberto no editor, útil para testar
  85. -- mudanças em arquivos de configuração sem reiniciar o editor
  86. ["<leader>s"] = { "<cmd> source % <CR>", "source current file" },
  87. -- Salvamento rápido do buffer atual
  88. -- Salva o arquivo em edição com um atalho único, evitando múltiplas combinações
  89. ["<leader>w"] = { ":w<CR>", "Clear write current buffer - same up" },
  90. -- Recarga de todo o arquivo de configuração do Vim/Neovim
  91. -- Reaplica as definições de configuração sem necessidade de reiniciar,
  92. -- permitindo testes rápidos de mudanças na configuração principal
  93. ["<leader><leader>"] = { ":source $MYVIMRC<CR>", "reload vim/neovim config" },
  94. -- Selecionar todo o conteúdo do arquivo
  95. -- Mantém os jumps intactos ao selecionar tudo usando keepjumps
  96. ["<leader>a"] = { ":keepjumps normal! ggVG<CR>", "Select all" },
  97. -- Editar arquivo de configuração
  98. -- Abre o arquivo de configuração principal do Vim/Neovim para edição
  99. ["<leader>e"] = { "<cmd>edit $MYVIMRC<CR>", "Edit config file" },
  100. -- Sair de todos os buffers e fechar Neovim
  101. -- Fecha todas as janelas e sai do editor sem confirmação
  102. ["<leader>q"] = { "<cmd>quitall<CR>", "Exit vim" },
  103. -- Abrir terminal integrado
  104. -- Abre um terminal embutido dentro do Neovim para executar comandos
  105. ["<leader>t"] = { "<cmd>term<CR>", "Open terminal" },
  106. -- Buscar entre buffers abertos
  107. -- Lista os arquivos abertos permitindo navegação rápida entre eles
  108. ["<leader><space>"] = { "<cmd>files<CR>:buffer ", "Search open files" },
  109. -- Alternância da árvore de arquivos (NERDTree)
  110. -- Abre ou fecha a visão lateral contendo a estrutura de pastas e arquivos,
  111. -- permitindo navegação rápida entre diferentes partes do projeto
  112. -- ["<C-a>"] = { ":NERDTreeToggle<CR>", "open/close nerdtree" },
  113. -- ["<leader>t"] = { ":NERDTreeToggle<CR>", "open/close nerdtree" },
  114. -- Desabilitar teclas de seta com feedback ao usuário
  115. -- Quando uma tecla de seta é pressionada, exibe uma mensagem de erro encorajando
  116. -- o uso dos movimentos Vim (hjkl), reforçando a aquisição do hábito
  117. ['<down>'] = {
  118. function() vim.api.nvim_err_writeln("Umm, use j instead") end,
  119. { noremap = true }
  120. },
  121. ['<left>'] = {
  122. function() vim.api.nvim_err_writeln("Umm, use h instead") end,
  123. { noremap = true }
  124. },
  125. ['<right>'] = {
  126. function() vim.api.nvim_err_writeln("Umm, use l instead") end,
  127. { noremap = true }
  128. },
  129. ['<up>'] = {
  130. function() vim.api.nvim_err_writeln("Umm, use k instead") end,
  131. { noremap = true }
  132. },
  133. },
  134. -- ========================================================================
  135. -- MODO TERMINAL
  136. -- Mapeamentos utilizados quando se está em um terminal integrado no Neovim
  137. -- ========================================================================
  138. t = {
  139. -- Saída do modo terminal para modo normal
  140. -- Permite retornar ao modo normal de Vim/Neovim mesmo quando um shell
  141. -- está aberto, facilitando a navegação e edição sem fechar o terminal
  142. ["<C-x>"] = {
  143. vim.api.nvim_replace_termcodes("<C-\\><C-N>", true, true, true),
  144. "Escape terminal mode"
  145. },
  146. -- Sair do modo terminal com ESC
  147. -- Permite retornar ao modo normal de edição usando a tecla ESC
  148. ["<Esc>"] = {
  149. vim.api.nvim_replace_termcodes("<C-\\><C-N>", true, true, true),
  150. "Exit terminal mode"
  151. },
  152. },
  153. -- ========================================================================
  154. -- MODO VISUAL
  155. -- Mapeamentos utilizados quando texto está selecionado em modo visual
  156. -- ========================================================================
  157. v = {
  158. -- Movimentação vertical suave em seleções com quebra de linha
  159. -- Respeita quebras de linha visual (word wrap), movendo-se por linhas lógicas
  160. -- em vez de linhas físicas, útil quando o texto está dividido em múltiplas linhas visuais
  161. ["<Up>"] = {
  162. 'v:count || mode(1)[0:1] == "no" ? "k" : "gk"', "Move up",
  163. opts = { expr = true }
  164. },
  165. ["<Down>"] = {
  166. 'v:count || mode(1)[0:1] == "no" ? "j" : "gj"', "Move down",
  167. opts = { expr = true }
  168. },
  169. -- Indentação de blocos selecionados
  170. -- Mantém a seleção visual ativa após indentar, permitindo múltiplas
  171. -- indentações consecutivas sem necessidade de reselecionar o texto
  172. ["<"] = { "<gv", "Indent line" },
  173. [">"] = { ">gv", "Indent line" },
  174. },
  175. -- ========================================================================
  176. -- MODO VISUAL-BLOCK (seleção em bloco)
  177. -- Mapeamentos utilizados em seleções de bloco (Ctrl-V)
  178. -- ========================================================================
  179. x = {
  180. -- Movimentação vertical suave em blocos de seleção
  181. -- Respeita quebras de linha visuais, movendo-se naturalmente através
  182. -- de linhas envolvidas em word wrap
  183. ["j"] = {
  184. 'v:count || mode(1)[0:1] == "no" ? "j" : "gj"', "Move down",
  185. opts = { expr = true }
  186. },
  187. ["k"] = {
  188. 'v:count || mode(1)[0:1] == "no" ? "k" : "gk"', "Move up",
  189. opts = { expr = true }
  190. },
  191. -- Colamento sem consumir o conteúdo da seleção original
  192. -- Mantém o conteúdo anteriormente copiado intacto após colar sobre uma seleção,
  193. -- evitando a perda de dados quando se quer colar múltiplas vezes o mesmo conteúdo.
  194. -- Referência: https://vim.fandom.com/wiki/Replace_a_word_with_yanked_text#Alternative_mapping_for_paste
  195. ["p"] = {
  196. 'p:let @+=@0<CR>:let @"=@0<CR>', "Dont copy replaced text",
  197. opts = { silent = true }
  198. },
  199. },
  200. }
  201. -- ============================================================================
  202. -- APLICAÇÃO DOS MAPEAMENTOS
  203. -- Percorre a tabela Mapping e registra todos os mapeamentos no Neovim
  204. -- ============================================================================
  205. -- Itera sobre cada modo (i, n, t, v, x) e seus respectivos mapeamentos
  206. for modo, mapeamentos in pairs(Mapping) do
  207. -- Itera sobre cada tecla-ação dentro do modo atual
  208. for tecla, acao in pairs(mapeamentos) do
  209. local comando = acao[1]
  210. local descricao = acao[2]
  211. local opt_customizado = acao.opts ~= nil
  212. -- Registra o mapeamento com as opções customizadas ou padrão (noremap)
  213. -- noremap = true previne mapeamentos recursivos, evitando
  214. -- comportamentos inesperados
  215. if (opt_customizado)
  216. then
  217. vim.keymap.set(modo, tecla, comando, acao.opts)
  218. else
  219. vim.keymap.set(modo, tecla, comando, { noremap = true })
  220. end
  221. end
  222. end
  223. -- ============================================================================
  224. -- DEFINIÇÃO DO MÓDULO
  225. -- Exporta funções customizadas para serem utilizadas em mapeamentos e comandos
  226. -- ============================================================================
  227. local M = {}
  228. -- Função utilitária para exibir "Hello World" no console
  229. -- Utilizada para testes e demonstrações de integração entre mapeamentos e Lua
  230. function M.PrintHelloWorld()
  231. print("Hello World")
  232. end
  233. -- ============================================================================
  234. -- VARIÁVEIS GLOBAIS E COMMANDOS CUSTOMIZADOS
  235. -- Define variáveis globais e comandos do Neovim para facilitar acesso
  236. -- às funções
  237. -- ============================================================================
  238. -- Marca globalmente que o módulo de mapeamento foi carregado com sucesso
  239. -- Permite que outros scripts verifiquem se este arquivo foi executado
  240. _G.my_mapping_loaded = true
  241. -- Cria um atalho <leader>ph para executar a função PrintHelloWorld
  242. -- Permite invocar a função com um atalho de teclado no modo normal
  243. vim.api.nvim_set_keymap(
  244. 'n', '<leader>ph', ':lua require("mapping").PrintHelloWorld()<CR>',
  245. { noremap = true, silent = true }
  246. )
  247. -- Define um comando customizado 'PrtHello' que executa a função PrintHelloWorld
  248. -- Permite executar a função digitando ':PrtHello' no modo de comando do Neovim
  249. vim.api.nvim_create_user_command('PrtHello', M.PrintHelloWorld, {})
  250. -- ============================================================================
  251. -- EXPORTAÇÃO DO MÓDULO
  252. -- Retorna o módulo para que ele possa ser utilizado em outros
  253. -- arquivos de configuração
  254. -- ============================================================================
  255. return M