aboutsummaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
authorjdhao <jdhao@hotmail.com>2023-07-28 22:27:54 +0200
committerjdhao <jdhao@hotmail.com>2023-07-28 22:28:36 +0200
commite53ee104ec251b11b84045dec7782b9b7a03479f (patch)
tree5072e32bdb796384a1233aecbef93aa75aa69408 /lua
parent671c78df9bc005321d77405dec004d1317e43e0a (diff)
feat: move lua conf under lua directory
Diffstat (limited to 'lua')
-rw-r--r--lua/colorschemes.lua153
-rw-r--r--lua/globals.lua75
-rw-r--r--lua/mappings.lua245
3 files changed, 473 insertions, 0 deletions
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 <leader> (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", "<c-u>", "<Esc>viwUea")
+
+-- Turn the current word into title case
+keymap.set("i", "<c-t>", "<Esc>b~lea")
+
+-- Paste non-linewise text above or below current line, see https://stackoverflow.com/a/1346777/6064933
+keymap.set("n", "<leader>p", "m`o<ESC>p``", { desc = "paste below current line" })
+keymap.set("n", "<leader>P", "m`O<ESC>p``", { desc = "paste above current line" })
+
+-- Shortcut for faster save and quit
+keymap.set("n", "<leader>w", "<cmd>update<cr>", { silent = true, desc = "save buffer" })
+
+-- Saves the file if modified and quit
+keymap.set("n", "<leader>q", "<cmd>x<cr>", { silent = true, desc = "quit current window" })
+
+-- Quit all opened buffers
+keymap.set("n", "<leader>Q", "<cmd>qa!<cr>", { silent = true, desc = "quit nvim" })
+
+-- Navigation in the location and quickfix list
+keymap.set("n", "[l", "<cmd>lprevious<cr>zv", { silent = true, desc = "previous location item" })
+keymap.set("n", "]l", "<cmd>lnext<cr>zv", { silent = true, desc = "next location item" })
+
+keymap.set("n", "[L", "<cmd>lfirst<cr>zv", { silent = true, desc = "first location item" })
+keymap.set("n", "]L", "<cmd>llast<cr>zv", { silent = true, desc = "last location item" })
+
+keymap.set("n", "[q", "<cmd>cprevious<cr>zv", { silent = true, desc = "previous qf item" })
+keymap.set("n", "]q", "<cmd>cnext<cr>zv", { silent = true, desc = "next qf item" })
+
+keymap.set("n", "[Q", "<cmd>cfirst<cr>zv", { silent = true, desc = "first qf item" })
+keymap.set("n", "]Q", "<cmd>clast<cr>zv", { 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]], "<cmd>windo lclose <bar> cclose <cr>", {
+ 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]], "<cmd>bprevious <bar> bdelete #<cr>", {
+ 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", "<space>o", "printf('m`%so<ESC>``', v:count1)", {
+ expr = true,
+ desc = "insert line below",
+})
+
+keymap.set("n", "<space>O", "printf('m`%sO<ESC>``', 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")
+keymap.set("x", ">", ">gv")
+
+-- Edit and reload nvim config file quickly
+keymap.set("n", "<leader>ev", "<cmd>tabnew $MYVIMRC <bar> tcd %:h<cr>", {
+ silent = true,
+ desc = "open init.lua",
+})
+
+keymap.set("n", "<leader>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", "<leader>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 / :<C-U>call feedkeys('/\%>'.(line("'<")-1).'l\%<'.(line("'>")+1)."l")<CR>
+
+-- 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", "<leader>cd", "<cmd>lcd %:p:h<cr><cmd>pwd<cr>", { desc = "change cwd" })
+
+-- Use Esc to quit builtin terminal
+keymap.set("t", "<Esc>", [[<c-\><c-n>]])
+
+-- Toggle spell checking
+keymap.set("n", "<F11>", "<cmd>set spell!<cr>", { desc = "toggle spell" })
+keymap.set("i", "<F11>", "<c-o><cmd>set spell!<cr>", { 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", "<leader><space>", "<cmd>StripTrailingWhitespace<cr>", { desc = "remove trailing space" })
+
+-- check the syntax group of current cursor position
+keymap.set("n", "<leader>st", "<cmd>call utils#SynGroup()<cr>", { desc = "check syntax group" })
+
+-- Copy entire buffer.
+keymap.set("n", "<leader>y", "<cmd>%yank<cr>", { desc = "yank entire buffer" })
+
+-- Toggle cursor column
+keymap.set("n", "<leader>cl", "<cmd>call utils#ToggleCursorCol()<cr>", { desc = "toggle cursor column" })
+
+-- Move current line up and down
+keymap.set("n", "<A-k>", '<cmd>call utils#SwitchLine(line("."), "up")<cr>', { desc = "move line up" })
+keymap.set("n", "<A-j>", '<cmd>call utils#SwitchLine(line("."), "down")<cr>', { desc = "move line down" })
+
+-- Move current visual-line selection up and down
+keymap.set("x", "<A-k>", '<cmd>call utils#MoveSelection("up")<cr>', { desc = "move selection up" })
+
+keymap.set("x", "<A-j>", '<cmd>call utils#MoveSelection("down")<cr>', { 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", '"_c<Esc>p')
+
+-- Go to a certain buffer
+keymap.set("n", "gb", '<cmd>call buf_utils#GoToBuffer(v:count, "forward")<cr>', {
+ desc = "go to buffer (forward)",
+})
+keymap.set("n", "gB", '<cmd>call buf_utils#GoToBuffer(v:count, "backward")<cr>', {
+ desc = "go to buffer (backward)",
+})
+
+-- Switch windows
+keymap.set("n", "<left>", "<c-w>h")
+keymap.set("n", "<Right>", "<C-W>l")
+keymap.set("n", "<Up>", "<C-W>k")
+keymap.set("n", "<Down>", "<C-W>j")
+
+-- Text objects for URL
+keymap.set({ "x", "o" }, "iu", "<cmd>call text_obj#URL()<cr>", { desc = "URL text object" })
+
+-- Text objects for entire buffer
+keymap.set({ "x", "o" }, "iB", "<cmd>call text_obj#Buffer()<cr>", { 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 .. "<c-g>u")
+end
+
+-- insert semicolon in the end
+keymap.set("i", "<A-;>", "<Esc>miA;<Esc>`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", "<C-A>", "<HOME>")
+keymap.set("i", "<C-E>", "<END>")
+
+-- Go to beginning of command in command-line mode
+keymap.set("c", "<C-A>", "<HOME>")
+
+-- Delete the character to the right of the cursor
+keymap.set("i", "<C-D>", "<DEL>")
+
+keymap.set("n", "<leader>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)