From e53ee104ec251b11b84045dec7782b9b7a03479f Mon Sep 17 00:00:00 2001 From: jdhao Date: Fri, 28 Jul 2023 22:27:54 +0200 Subject: feat: move lua conf under lua directory --- core/colorschemes.lua | 153 ------------------------------- core/globals.lua | 75 ---------------- core/mappings.lua | 245 -------------------------------------------------- init.lua | 13 ++- lua/colorschemes.lua | 153 +++++++++++++++++++++++++++++++ lua/globals.lua | 75 ++++++++++++++++ lua/mappings.lua | 245 ++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 482 insertions(+), 477 deletions(-) delete mode 100644 core/colorschemes.lua delete mode 100644 core/globals.lua delete mode 100644 core/mappings.lua create mode 100644 lua/colorschemes.lua create mode 100644 lua/globals.lua create mode 100644 lua/mappings.lua diff --git a/core/colorschemes.lua b/core/colorschemes.lua deleted file mode 100644 index 46545b3..0000000 --- a/core/colorschemes.lua +++ /dev/null @@ -1,153 +0,0 @@ ---- This module will load a random colorscheme on nvim startup process. - -local utils = require("utils") - -local M = {} - --- Colorscheme to its directory name mapping, because colorscheme repo name is not necessarily --- the same as the colorscheme name itself. -M.colorscheme2dir = { - onedark = "onedark.nvim", - edge = "edge", - sonokai = "sonokai", - gruvbox_material = "gruvbox-material", - nord = "nord.nvim", - everforest = "everforest", - nightfox = "nightfox.nvim", - kanagawa = "kanagawa.nvim", - catppuccin = "catppuccin", - rose_pine = "rose-pine", - onedarkpro = "onedarkpro.nvim", - monokai = "monokai.nvim", - material = "material.nvim", -} - -M.gruvbox8 = function() - -- Italic options should be put before colorscheme setting, - -- see https://github.com/morhetz/gruvbox/wiki/Terminal-specific#1-italics-is-disabled - vim.g.gruvbox_italics = 1 - vim.g.gruvbox_italicize_strings = 1 - vim.g.gruvbox_filetype_hi_groups = 1 - vim.g.gruvbox_plugin_hi_groups = 1 - - vim.cmd([[colorscheme gruvbox8_hard]]) -end - -M.onedark = function() - vim.cmd([[colorscheme onedark]]) -end - -M.edge = function() - vim.g.edge_enable_italic = 1 - vim.g.edge_better_performance = 1 - - vim.cmd([[colorscheme edge]]) -end - -M.sonokai = function() - vim.g.sonokai_enable_italic = 1 - vim.g.sonokai_better_performance = 1 - - vim.cmd([[colorscheme sonokai]]) -end - -M.gruvbox_material = function() - -- foreground option can be material, mix, or original - vim.g.gruvbox_material_foreground = "material" - --background option can be hard, medium, soft - vim.g.gruvbox_material_background = "soft" - vim.g.gruvbox_material_enable_italic = 1 - vim.g.gruvbox_material_better_performance = 1 - - vim.cmd([[colorscheme gruvbox-material]]) -end - -M.nord = function() - vim.cmd([[colorscheme nord]]) -end - -M.doom_one = function() - vim.cmd([[colorscheme doom-one]]) -end - -M.everforest = function() - vim.g.everforest_enable_italic = 1 - vim.g.everforest_better_performance = 1 - - vim.cmd([[colorscheme everforest]]) -end - -M.nightfox = function() - vim.cmd([[colorscheme nordfox]]) -end - -M.kanagawa = function() - vim.cmd([[colorscheme kanagawa]]) -end - -M.catppuccin = function() - -- available option: latte, frappe, macchiato, mocha - vim.g.catppuccin_flavour = "frappe" - - require("catppuccin").setup() - - vim.cmd([[colorscheme catppuccin]]) -end - -M.rose_pine = function() - require('rose-pine').setup({ - --- @usage 'main' | 'moon' - dark_variant = 'moon', - }) - - -- set colorscheme after options - vim.cmd('colorscheme rose-pine') -end - -M.onedarkpro = function() - -- set colorscheme after options - vim.cmd('colorscheme onedark_vivid') -end - -M.monokai = function() - vim.cmd('colorscheme monokai_pro') -end - -M.material = function () - vim.g.material_style = "oceanic" - vim.cmd('colorscheme material') -end - ---- Use a random colorscheme from the pre-defined list of colorschemes. -M.rand_colorscheme = function() - local colorscheme = utils.rand_element(vim.tbl_keys(M.colorscheme2dir)) - - if not vim.tbl_contains(vim.tbl_keys(M), colorscheme) then - local msg = "Invalid colorscheme: " .. colorscheme - vim.notify(msg, vim.log.levels.ERROR, { title = "nvim-config" }) - - return - end - - -- Load the colorscheme, because all the colorschemes are declared as opt plugins, so the colorscheme isn't loaded yet. - local status = utils.add_pack(M.colorscheme2dir[colorscheme]) - - if not status then - local msg = string.format("Colorscheme %s is not installed. Run PackerSync to install.", colorscheme) - vim.notify(msg, vim.log.levels.ERROR, { title = "nvim-config" }) - - return - end - - -- Load the colorscheme and its settings - M[colorscheme]() - - if vim.g.logging_level == "debug" then - local msg = "Colorscheme: " .. colorscheme - - vim.notify(msg, vim.log.levels.DEBUG, { title = "nvim-config" }) - end -end - --- Load a random colorscheme -M.rand_colorscheme() diff --git a/core/globals.lua b/core/globals.lua deleted file mode 100644 index b0af26e..0000000 --- a/core/globals.lua +++ /dev/null @@ -1,75 +0,0 @@ -local fn = vim.fn -local api = vim.api - -local utils = require('utils') - --- Inspect something -function _G.inspect(item) - vim.print(item) -end - ------------------------------------------------------------------------- --- custom variables -- ------------------------------------------------------------------------- -vim.g.is_win = (utils.has("win32") or utils.has("win64")) and true or false -vim.g.is_linux = (utils.has("unix") and (not utils.has("macunix"))) and true or false -vim.g.is_mac = utils.has("macunix") and true or false - -vim.g.logging_level = "info" - ------------------------------------------------------------------------- --- builtin variables -- ------------------------------------------------------------------------- -vim.g.loaded_perl_provider = 0 -- Disable perl provider -vim.g.loaded_ruby_provider = 0 -- Disable ruby provider -vim.g.loaded_node_provider = 0 -- Disable node provider -vim.g.did_install_default_menus = 1 -- do not load menu - -if utils.executable('python3') then - if vim.g.is_win then - vim.g.python3_host_prog = fn.substitute(fn.exepath("python3"), ".exe$", '', 'g') - else - vim.g.python3_host_prog = fn.exepath("python3") - end -else - api.nvim_err_writeln("Python3 executable not found! You must install Python3 and set its PATH correctly!") - return -end - --- Custom mapping (see `:h mapleader` for more info) -vim.g.mapleader = ',' - --- Enable highlighting for lua HERE doc inside vim script -vim.g.vimsyn_embed = 'l' - --- Use English as main language -vim.cmd [[language en_US.UTF-8]] - --- Disable loading certain plugins - --- Whether to load netrw by default, see https://github.com/bling/dotvim/issues/4 -vim.g.loaded_netrw = 1 -vim.g.loaded_netrwPlugin = 1 -vim.g.netrw_liststyle = 3 -if vim.g.is_win then - vim.g.netrw_http_cmd = "curl --ssl-no-revoke -Lo" -end - --- Do not load tohtml.vim -vim.g.loaded_2html_plugin = 1 - --- Do not load zipPlugin.vim, gzip.vim and tarPlugin.vim (all these plugins are --- related to checking files inside compressed files) -vim.g.loaded_zipPlugin = 1 -vim.g.loaded_gzip = 1 -vim.g.loaded_tarPlugin = 1 - --- Do not load the tutor plugin -vim.g.loaded_tutor_mode_plugin = 1 - --- Do not use builtin matchit.vim and matchparen.vim since we use vim-matchup -vim.g.loaded_matchit = 1 -vim.g.loaded_matchparen = 1 - --- Disable sql omni completion, it is broken. -vim.g.loaded_sql_completion = 1 diff --git a/core/mappings.lua b/core/mappings.lua deleted file mode 100644 index 8a1e2e6..0000000 --- a/core/mappings.lua +++ /dev/null @@ -1,245 +0,0 @@ -local keymap = vim.keymap -local api = vim.api -local uv = vim.loop - --- Save key strokes (now we do not need to press shift to enter command mode). -keymap.set({ "n", "x" }, ";", ":") - --- Turn the word under cursor to upper case -keymap.set("i", "", "viwUea") - --- Turn the current word into title case -keymap.set("i", "", "b~lea") - --- Paste non-linewise text above or below current line, see https://stackoverflow.com/a/1346777/6064933 -keymap.set("n", "p", "m`op``", { desc = "paste below current line" }) -keymap.set("n", "P", "m`Op``", { desc = "paste above current line" }) - --- Shortcut for faster save and quit -keymap.set("n", "w", "update", { silent = true, desc = "save buffer" }) - --- Saves the file if modified and quit -keymap.set("n", "q", "x", { silent = true, desc = "quit current window" }) - --- Quit all opened buffers -keymap.set("n", "Q", "qa!", { silent = true, desc = "quit nvim" }) - --- Navigation in the location and quickfix list -keymap.set("n", "[l", "lpreviouszv", { silent = true, desc = "previous location item" }) -keymap.set("n", "]l", "lnextzv", { silent = true, desc = "next location item" }) - -keymap.set("n", "[L", "lfirstzv", { silent = true, desc = "first location item" }) -keymap.set("n", "]L", "llastzv", { silent = true, desc = "last location item" }) - -keymap.set("n", "[q", "cpreviouszv", { silent = true, desc = "previous qf item" }) -keymap.set("n", "]q", "cnextzv", { silent = true, desc = "next qf item" }) - -keymap.set("n", "[Q", "cfirstzv", { silent = true, desc = "first qf item" }) -keymap.set("n", "]Q", "clastzv", { silent = true, desc = "last qf item" }) - --- Close location list or quickfix list if they are present, see https://superuser.com/q/355325/736190 -keymap.set("n", [[\x]], "windo lclose cclose ", { - silent = true, - desc = "close qf and location list", -}) - --- Delete a buffer, without closing the window, see https://stackoverflow.com/q/4465095/6064933 -keymap.set("n", [[\d]], "bprevious bdelete #", { - silent = true, - desc = "delete buffer", -}) - --- Insert a blank line below or above current line (do not move the cursor), --- see https://stackoverflow.com/a/16136133/6064933 -keymap.set("n", "o", "printf('m`%so``', v:count1)", { - expr = true, - desc = "insert line below", -}) - -keymap.set("n", "O", "printf('m`%sO``', v:count1)", { - expr = true, - desc = "insert line above", -}) - --- Move the cursor based on physical lines, not the actual lines. -keymap.set("n", "j", "v:count == 0 ? 'gj' : 'j'", { expr = true }) -keymap.set("n", "k", "v:count == 0 ? 'gk' : 'k'", { expr = true }) -keymap.set("n", "^", "g^") -keymap.set("n", "0", "g0") - --- Do not include white space characters when using $ in visual mode, --- see https://vi.stackexchange.com/q/12607/15292 -keymap.set("x", "$", "g_") - --- Go to start or end of line easier -keymap.set({ "n", "x" }, "H", "^") -keymap.set({ "n", "x" }, "L", "g_") - --- Continuous visual shifting (does not exit Visual mode), `gv` means --- to reselect previous visual area, see https://superuser.com/q/310417/736190 -keymap.set("x", "<", "", ">gv") - --- Edit and reload nvim config file quickly -keymap.set("n", "ev", "tabnew $MYVIMRC tcd %:h", { - silent = true, - desc = "open init.lua", -}) - -keymap.set("n", "sv", function() - vim.cmd([[ - update $MYVIMRC - source $MYVIMRC - ]]) - vim.notify("Nvim config successfully reloaded!", vim.log.levels.INFO, { title = "nvim-config" }) -end, { - silent = true, - desc = "reload init.lua", -}) - --- Reselect the text that has just been pasted, see also https://stackoverflow.com/a/4317090/6064933. -keymap.set("n", "v", "printf('`[%s`]', getregtype()[0])", { - expr = true, - desc = "reselect last pasted area", -}) - --- Always use very magic mode for searching -keymap.set("n", "/", [[/\v]]) - --- Search in selected region --- xnoremap / :call feedkeys('/\%>'.(line("'<")-1).'l\%<'.(line("'>")+1)."l") - --- Change current working directory locally and print cwd after that, --- see https://vim.fandom.com/wiki/Set_working_directory_to_the_current_file -keymap.set("n", "cd", "lcd %:p:hpwd", { desc = "change cwd" }) - --- Use Esc to quit builtin terminal -keymap.set("t", "", [[]]) - --- Toggle spell checking -keymap.set("n", "", "set spell!", { desc = "toggle spell" }) -keymap.set("i", "", "set spell!", { desc = "toggle spell" }) - --- Change text without putting it into the vim register, --- see https://stackoverflow.com/q/54255/6064933 -keymap.set("n", "c", '"_c') -keymap.set("n", "C", '"_C') -keymap.set("n", "cc", '"_cc') -keymap.set("x", "c", '"_c') - --- Remove trailing whitespace characters -keymap.set("n", "", "StripTrailingWhitespace", { desc = "remove trailing space" }) - --- check the syntax group of current cursor position -keymap.set("n", "st", "call utils#SynGroup()", { desc = "check syntax group" }) - --- Copy entire buffer. -keymap.set("n", "y", "%yank", { desc = "yank entire buffer" }) - --- Toggle cursor column -keymap.set("n", "cl", "call utils#ToggleCursorCol()", { desc = "toggle cursor column" }) - --- Move current line up and down -keymap.set("n", "", 'call utils#SwitchLine(line("."), "up")', { desc = "move line up" }) -keymap.set("n", "", 'call utils#SwitchLine(line("."), "down")', { desc = "move line down" }) - --- Move current visual-line selection up and down -keymap.set("x", "", 'call utils#MoveSelection("up")', { desc = "move selection up" }) - -keymap.set("x", "", 'call utils#MoveSelection("down")', { desc = "move selection down" }) - --- Replace visual selection with text in register, but not contaminate the register, --- see also https://stackoverflow.com/q/10723700/6064933. -keymap.set("x", "p", '"_cp') - --- Go to a certain buffer -keymap.set("n", "gb", 'call buf_utils#GoToBuffer(v:count, "forward")', { - desc = "go to buffer (forward)", -}) -keymap.set("n", "gB", 'call buf_utils#GoToBuffer(v:count, "backward")', { - desc = "go to buffer (backward)", -}) - --- Switch windows -keymap.set("n", "", "h") -keymap.set("n", "", "l") -keymap.set("n", "", "k") -keymap.set("n", "", "j") - --- Text objects for URL -keymap.set({ "x", "o" }, "iu", "call text_obj#URL()", { desc = "URL text object" }) - --- Text objects for entire buffer -keymap.set({ "x", "o" }, "iB", "call text_obj#Buffer()", { desc = "buffer text object" }) - --- Do not move my cursor when joining lines. -keymap.set("n", "J", function() - vim.cmd([[ - normal! mzJ`z - delmarks z - ]]) -end, { - desc = "join line", -}) - -keymap.set("n", "gJ", function() - -- we must use `normal!`, otherwise it will trigger recursive mapping - vim.cmd([[ - normal! zmgJ`z - delmarks z - ]]) -end, { - desc = "join visual lines", -}) - --- Break inserted text into smaller undo units when we insert some punctuation chars. -local undo_ch = { ",", ".", "!", "?", ";", ":" } -for _, ch in ipairs(undo_ch) do - keymap.set("i", ch, ch .. "u") -end - --- insert semicolon in the end -keymap.set("i", "", "miA;`ii") - --- Keep cursor position after yanking -keymap.set("n", "y", "myy") - -api.nvim_create_autocmd("TextYankPost", { - pattern = "*", - group = api.nvim_create_augroup("restore_after_yank", { clear = true }), - callback = function() - vim.cmd([[ - silent! normal! `y - silent! delmarks y - ]]) - end, -}) - --- Go to the beginning and end of current line in insert mode quickly -keymap.set("i", "", "") -keymap.set("i", "", "") - --- Go to beginning of command in command-line mode -keymap.set("c", "", "") - --- Delete the character to the right of the cursor -keymap.set("i", "", "") - -keymap.set("n", "cb", function() - local cnt = 0 - local blink_times = 7 - local timer = uv.new_timer() - - timer:start(0, 100, vim.schedule_wrap(function() - vim.cmd[[ - set cursorcolumn! - set cursorline! - ]] - - if cnt == blink_times then - timer:close() - end - - cnt = cnt + 1 - end)) -end) diff --git a/init.lua b/init.lua index f294ab2..1cd6815 100644 --- a/init.lua +++ b/init.lua @@ -36,8 +36,13 @@ local core_conf_files = { } -- source all the core config files -for _, name in ipairs(core_conf_files) do - local path = string.format("%s/core/%s", vim.fn.stdpath("config"), name) - local source_cmd = "source " .. path - vim.cmd(source_cmd) +for _, file_name in ipairs(core_conf_files) do + if vim.endswith(file_name, 'vim') then + local path = string.format("%s/core/%s", vim.fn.stdpath("config"), file_name) + local source_cmd = "source " .. path + vim.cmd(source_cmd) + else + local module_name, _ = string.gsub(file_name, "%.lua", "") + require(module_name) + end end diff --git a/lua/colorschemes.lua b/lua/colorschemes.lua new file mode 100644 index 0000000..46545b3 --- /dev/null +++ b/lua/colorschemes.lua @@ -0,0 +1,153 @@ +--- This module will load a random colorscheme on nvim startup process. + +local utils = require("utils") + +local M = {} + +-- Colorscheme to its directory name mapping, because colorscheme repo name is not necessarily +-- the same as the colorscheme name itself. +M.colorscheme2dir = { + onedark = "onedark.nvim", + edge = "edge", + sonokai = "sonokai", + gruvbox_material = "gruvbox-material", + nord = "nord.nvim", + everforest = "everforest", + nightfox = "nightfox.nvim", + kanagawa = "kanagawa.nvim", + catppuccin = "catppuccin", + rose_pine = "rose-pine", + onedarkpro = "onedarkpro.nvim", + monokai = "monokai.nvim", + material = "material.nvim", +} + +M.gruvbox8 = function() + -- Italic options should be put before colorscheme setting, + -- see https://github.com/morhetz/gruvbox/wiki/Terminal-specific#1-italics-is-disabled + vim.g.gruvbox_italics = 1 + vim.g.gruvbox_italicize_strings = 1 + vim.g.gruvbox_filetype_hi_groups = 1 + vim.g.gruvbox_plugin_hi_groups = 1 + + vim.cmd([[colorscheme gruvbox8_hard]]) +end + +M.onedark = function() + vim.cmd([[colorscheme onedark]]) +end + +M.edge = function() + vim.g.edge_enable_italic = 1 + vim.g.edge_better_performance = 1 + + vim.cmd([[colorscheme edge]]) +end + +M.sonokai = function() + vim.g.sonokai_enable_italic = 1 + vim.g.sonokai_better_performance = 1 + + vim.cmd([[colorscheme sonokai]]) +end + +M.gruvbox_material = function() + -- foreground option can be material, mix, or original + vim.g.gruvbox_material_foreground = "material" + --background option can be hard, medium, soft + vim.g.gruvbox_material_background = "soft" + vim.g.gruvbox_material_enable_italic = 1 + vim.g.gruvbox_material_better_performance = 1 + + vim.cmd([[colorscheme gruvbox-material]]) +end + +M.nord = function() + vim.cmd([[colorscheme nord]]) +end + +M.doom_one = function() + vim.cmd([[colorscheme doom-one]]) +end + +M.everforest = function() + vim.g.everforest_enable_italic = 1 + vim.g.everforest_better_performance = 1 + + vim.cmd([[colorscheme everforest]]) +end + +M.nightfox = function() + vim.cmd([[colorscheme nordfox]]) +end + +M.kanagawa = function() + vim.cmd([[colorscheme kanagawa]]) +end + +M.catppuccin = function() + -- available option: latte, frappe, macchiato, mocha + vim.g.catppuccin_flavour = "frappe" + + require("catppuccin").setup() + + vim.cmd([[colorscheme catppuccin]]) +end + +M.rose_pine = function() + require('rose-pine').setup({ + --- @usage 'main' | 'moon' + dark_variant = 'moon', + }) + + -- set colorscheme after options + vim.cmd('colorscheme rose-pine') +end + +M.onedarkpro = function() + -- set colorscheme after options + vim.cmd('colorscheme onedark_vivid') +end + +M.monokai = function() + vim.cmd('colorscheme monokai_pro') +end + +M.material = function () + vim.g.material_style = "oceanic" + vim.cmd('colorscheme material') +end + +--- Use a random colorscheme from the pre-defined list of colorschemes. +M.rand_colorscheme = function() + local colorscheme = utils.rand_element(vim.tbl_keys(M.colorscheme2dir)) + + if not vim.tbl_contains(vim.tbl_keys(M), colorscheme) then + local msg = "Invalid colorscheme: " .. colorscheme + vim.notify(msg, vim.log.levels.ERROR, { title = "nvim-config" }) + + return + end + + -- Load the colorscheme, because all the colorschemes are declared as opt plugins, so the colorscheme isn't loaded yet. + local status = utils.add_pack(M.colorscheme2dir[colorscheme]) + + if not status then + local msg = string.format("Colorscheme %s is not installed. Run PackerSync to install.", colorscheme) + vim.notify(msg, vim.log.levels.ERROR, { title = "nvim-config" }) + + return + end + + -- Load the colorscheme and its settings + M[colorscheme]() + + if vim.g.logging_level == "debug" then + local msg = "Colorscheme: " .. colorscheme + + vim.notify(msg, vim.log.levels.DEBUG, { title = "nvim-config" }) + end +end + +-- Load a random colorscheme +M.rand_colorscheme() diff --git a/lua/globals.lua b/lua/globals.lua new file mode 100644 index 0000000..b0af26e --- /dev/null +++ b/lua/globals.lua @@ -0,0 +1,75 @@ +local fn = vim.fn +local api = vim.api + +local utils = require('utils') + +-- Inspect something +function _G.inspect(item) + vim.print(item) +end + +------------------------------------------------------------------------ +-- custom variables -- +------------------------------------------------------------------------ +vim.g.is_win = (utils.has("win32") or utils.has("win64")) and true or false +vim.g.is_linux = (utils.has("unix") and (not utils.has("macunix"))) and true or false +vim.g.is_mac = utils.has("macunix") and true or false + +vim.g.logging_level = "info" + +------------------------------------------------------------------------ +-- builtin variables -- +------------------------------------------------------------------------ +vim.g.loaded_perl_provider = 0 -- Disable perl provider +vim.g.loaded_ruby_provider = 0 -- Disable ruby provider +vim.g.loaded_node_provider = 0 -- Disable node provider +vim.g.did_install_default_menus = 1 -- do not load menu + +if utils.executable('python3') then + if vim.g.is_win then + vim.g.python3_host_prog = fn.substitute(fn.exepath("python3"), ".exe$", '', 'g') + else + vim.g.python3_host_prog = fn.exepath("python3") + end +else + api.nvim_err_writeln("Python3 executable not found! You must install Python3 and set its PATH correctly!") + return +end + +-- Custom mapping (see `:h mapleader` for more info) +vim.g.mapleader = ',' + +-- Enable highlighting for lua HERE doc inside vim script +vim.g.vimsyn_embed = 'l' + +-- Use English as main language +vim.cmd [[language en_US.UTF-8]] + +-- Disable loading certain plugins + +-- Whether to load netrw by default, see https://github.com/bling/dotvim/issues/4 +vim.g.loaded_netrw = 1 +vim.g.loaded_netrwPlugin = 1 +vim.g.netrw_liststyle = 3 +if vim.g.is_win then + vim.g.netrw_http_cmd = "curl --ssl-no-revoke -Lo" +end + +-- Do not load tohtml.vim +vim.g.loaded_2html_plugin = 1 + +-- Do not load zipPlugin.vim, gzip.vim and tarPlugin.vim (all these plugins are +-- related to checking files inside compressed files) +vim.g.loaded_zipPlugin = 1 +vim.g.loaded_gzip = 1 +vim.g.loaded_tarPlugin = 1 + +-- Do not load the tutor plugin +vim.g.loaded_tutor_mode_plugin = 1 + +-- Do not use builtin matchit.vim and matchparen.vim since we use vim-matchup +vim.g.loaded_matchit = 1 +vim.g.loaded_matchparen = 1 + +-- Disable sql omni completion, it is broken. +vim.g.loaded_sql_completion = 1 diff --git a/lua/mappings.lua b/lua/mappings.lua new file mode 100644 index 0000000..8a1e2e6 --- /dev/null +++ b/lua/mappings.lua @@ -0,0 +1,245 @@ +local keymap = vim.keymap +local api = vim.api +local uv = vim.loop + +-- Save key strokes (now we do not need to press shift to enter command mode). +keymap.set({ "n", "x" }, ";", ":") + +-- Turn the word under cursor to upper case +keymap.set("i", "", "viwUea") + +-- Turn the current word into title case +keymap.set("i", "", "b~lea") + +-- Paste non-linewise text above or below current line, see https://stackoverflow.com/a/1346777/6064933 +keymap.set("n", "p", "m`op``", { desc = "paste below current line" }) +keymap.set("n", "P", "m`Op``", { desc = "paste above current line" }) + +-- Shortcut for faster save and quit +keymap.set("n", "w", "update", { silent = true, desc = "save buffer" }) + +-- Saves the file if modified and quit +keymap.set("n", "q", "x", { silent = true, desc = "quit current window" }) + +-- Quit all opened buffers +keymap.set("n", "Q", "qa!", { silent = true, desc = "quit nvim" }) + +-- Navigation in the location and quickfix list +keymap.set("n", "[l", "lpreviouszv", { silent = true, desc = "previous location item" }) +keymap.set("n", "]l", "lnextzv", { silent = true, desc = "next location item" }) + +keymap.set("n", "[L", "lfirstzv", { silent = true, desc = "first location item" }) +keymap.set("n", "]L", "llastzv", { silent = true, desc = "last location item" }) + +keymap.set("n", "[q", "cpreviouszv", { silent = true, desc = "previous qf item" }) +keymap.set("n", "]q", "cnextzv", { silent = true, desc = "next qf item" }) + +keymap.set("n", "[Q", "cfirstzv", { silent = true, desc = "first qf item" }) +keymap.set("n", "]Q", "clastzv", { silent = true, desc = "last qf item" }) + +-- Close location list or quickfix list if they are present, see https://superuser.com/q/355325/736190 +keymap.set("n", [[\x]], "windo lclose cclose ", { + silent = true, + desc = "close qf and location list", +}) + +-- Delete a buffer, without closing the window, see https://stackoverflow.com/q/4465095/6064933 +keymap.set("n", [[\d]], "bprevious bdelete #", { + silent = true, + desc = "delete buffer", +}) + +-- Insert a blank line below or above current line (do not move the cursor), +-- see https://stackoverflow.com/a/16136133/6064933 +keymap.set("n", "o", "printf('m`%so``', v:count1)", { + expr = true, + desc = "insert line below", +}) + +keymap.set("n", "O", "printf('m`%sO``', v:count1)", { + expr = true, + desc = "insert line above", +}) + +-- Move the cursor based on physical lines, not the actual lines. +keymap.set("n", "j", "v:count == 0 ? 'gj' : 'j'", { expr = true }) +keymap.set("n", "k", "v:count == 0 ? 'gk' : 'k'", { expr = true }) +keymap.set("n", "^", "g^") +keymap.set("n", "0", "g0") + +-- Do not include white space characters when using $ in visual mode, +-- see https://vi.stackexchange.com/q/12607/15292 +keymap.set("x", "$", "g_") + +-- Go to start or end of line easier +keymap.set({ "n", "x" }, "H", "^") +keymap.set({ "n", "x" }, "L", "g_") + +-- Continuous visual shifting (does not exit Visual mode), `gv` means +-- to reselect previous visual area, see https://superuser.com/q/310417/736190 +keymap.set("x", "<", "", ">gv") + +-- Edit and reload nvim config file quickly +keymap.set("n", "ev", "tabnew $MYVIMRC tcd %:h", { + silent = true, + desc = "open init.lua", +}) + +keymap.set("n", "sv", function() + vim.cmd([[ + update $MYVIMRC + source $MYVIMRC + ]]) + vim.notify("Nvim config successfully reloaded!", vim.log.levels.INFO, { title = "nvim-config" }) +end, { + silent = true, + desc = "reload init.lua", +}) + +-- Reselect the text that has just been pasted, see also https://stackoverflow.com/a/4317090/6064933. +keymap.set("n", "v", "printf('`[%s`]', getregtype()[0])", { + expr = true, + desc = "reselect last pasted area", +}) + +-- Always use very magic mode for searching +keymap.set("n", "/", [[/\v]]) + +-- Search in selected region +-- xnoremap / :call feedkeys('/\%>'.(line("'<")-1).'l\%<'.(line("'>")+1)."l") + +-- Change current working directory locally and print cwd after that, +-- see https://vim.fandom.com/wiki/Set_working_directory_to_the_current_file +keymap.set("n", "cd", "lcd %:p:hpwd", { desc = "change cwd" }) + +-- Use Esc to quit builtin terminal +keymap.set("t", "", [[]]) + +-- Toggle spell checking +keymap.set("n", "", "set spell!", { desc = "toggle spell" }) +keymap.set("i", "", "set spell!", { desc = "toggle spell" }) + +-- Change text without putting it into the vim register, +-- see https://stackoverflow.com/q/54255/6064933 +keymap.set("n", "c", '"_c') +keymap.set("n", "C", '"_C') +keymap.set("n", "cc", '"_cc') +keymap.set("x", "c", '"_c') + +-- Remove trailing whitespace characters +keymap.set("n", "", "StripTrailingWhitespace", { desc = "remove trailing space" }) + +-- check the syntax group of current cursor position +keymap.set("n", "st", "call utils#SynGroup()", { desc = "check syntax group" }) + +-- Copy entire buffer. +keymap.set("n", "y", "%yank", { desc = "yank entire buffer" }) + +-- Toggle cursor column +keymap.set("n", "cl", "call utils#ToggleCursorCol()", { desc = "toggle cursor column" }) + +-- Move current line up and down +keymap.set("n", "", 'call utils#SwitchLine(line("."), "up")', { desc = "move line up" }) +keymap.set("n", "", 'call utils#SwitchLine(line("."), "down")', { desc = "move line down" }) + +-- Move current visual-line selection up and down +keymap.set("x", "", 'call utils#MoveSelection("up")', { desc = "move selection up" }) + +keymap.set("x", "", 'call utils#MoveSelection("down")', { desc = "move selection down" }) + +-- Replace visual selection with text in register, but not contaminate the register, +-- see also https://stackoverflow.com/q/10723700/6064933. +keymap.set("x", "p", '"_cp') + +-- Go to a certain buffer +keymap.set("n", "gb", 'call buf_utils#GoToBuffer(v:count, "forward")', { + desc = "go to buffer (forward)", +}) +keymap.set("n", "gB", 'call buf_utils#GoToBuffer(v:count, "backward")', { + desc = "go to buffer (backward)", +}) + +-- Switch windows +keymap.set("n", "", "h") +keymap.set("n", "", "l") +keymap.set("n", "", "k") +keymap.set("n", "", "j") + +-- Text objects for URL +keymap.set({ "x", "o" }, "iu", "call text_obj#URL()", { desc = "URL text object" }) + +-- Text objects for entire buffer +keymap.set({ "x", "o" }, "iB", "call text_obj#Buffer()", { desc = "buffer text object" }) + +-- Do not move my cursor when joining lines. +keymap.set("n", "J", function() + vim.cmd([[ + normal! mzJ`z + delmarks z + ]]) +end, { + desc = "join line", +}) + +keymap.set("n", "gJ", function() + -- we must use `normal!`, otherwise it will trigger recursive mapping + vim.cmd([[ + normal! zmgJ`z + delmarks z + ]]) +end, { + desc = "join visual lines", +}) + +-- Break inserted text into smaller undo units when we insert some punctuation chars. +local undo_ch = { ",", ".", "!", "?", ";", ":" } +for _, ch in ipairs(undo_ch) do + keymap.set("i", ch, ch .. "u") +end + +-- insert semicolon in the end +keymap.set("i", "", "miA;`ii") + +-- Keep cursor position after yanking +keymap.set("n", "y", "myy") + +api.nvim_create_autocmd("TextYankPost", { + pattern = "*", + group = api.nvim_create_augroup("restore_after_yank", { clear = true }), + callback = function() + vim.cmd([[ + silent! normal! `y + silent! delmarks y + ]]) + end, +}) + +-- Go to the beginning and end of current line in insert mode quickly +keymap.set("i", "", "") +keymap.set("i", "", "") + +-- Go to beginning of command in command-line mode +keymap.set("c", "", "") + +-- Delete the character to the right of the cursor +keymap.set("i", "", "") + +keymap.set("n", "cb", function() + local cnt = 0 + local blink_times = 7 + local timer = uv.new_timer() + + timer:start(0, 100, vim.schedule_wrap(function() + vim.cmd[[ + set cursorcolumn! + set cursorline! + ]] + + if cnt == blink_times then + timer:close() + end + + cnt = cnt + 1 + end)) +end) -- cgit v1.2.3