Created
December 22, 2025 07:20
-
-
Save dontdieych/f6e3998a683f8ee2e3428230fba867b8 to your computer and use it in GitHub Desktop.
Revisions
-
dontdieych created this gist
Dec 22, 2025 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,443 @@ -- vim:foldmethod=marker:sw=4:et -- {{{ PLUGINS -- [[ Install plugins ]] -- Nvim functionality can be extended by installing external plugins. -- One way to do it is with a built-in plugin manager. See `:h vim.pack`. vim.pack.add({ 'https://github.com/neovim/nvim-lspconfig' }) vim.pack.add({ 'https://github.com/tpope/vim-rsi' }) vim.pack.add({ 'https://github.com/tiagovla/tokyodark.nvim' }) vim.pack.add({ 'https://github.com/folke/tokyonight.nvim' }) vim.pack.add({ 'https://github.com/nvim-treesitter/nvim-treesitter' }) vim.pack.add({ 'https://github.com/mason-org/mason.nvim' }) vim.pack.add({ 'https://github.com/stevearc/oil.nvim' }) vim.pack.add({ 'https://github.com/fei6409/log-highlight.nvim' }) vim.pack.add({ 'https://github.com/keaising/im-select.nvim' }) vim.pack.add({ 'https://github.com/noirbizarre/ensure.nvim' }) -- }}} -- {{{ PLUGIN SETUP require'ensure'.setup {} require'im_select'.setup {} require'nvim-treesitter.configs'.setup { -- Modules and its options go here highlight = { enable = true }, incremental_selection = { enable = true }, textobjects = { enable = true }, } require'mason'.setup({ ui = { icons = { package_installed = "✓", package_pending = "➜", package_uninstalled = "✗" } }, PATH = "append", }) -- {{{ Oil SETUP require("oil").setup({ -- Oil will take over directory buffers (e.g. `vim .` or `:e src/`) -- Set to false if you want some other plugin (e.g. netrw) to open when you edit directories. default_file_explorer = true, -- Id is automatically added at the beginning, and name at the end -- See :help oil-columns columns = { "icon", -- "permissions", -- "size", -- "mtime", }, -- Buffer-local options to use for oil buffers buf_options = { buflisted = false, bufhidden = "hide", }, -- Window-local options to use for oil buffers win_options = { wrap = false, signcolumn = "no", cursorcolumn = false, foldcolumn = "0", spell = false, list = false, conceallevel = 3, concealcursor = "nvic", }, -- Send deleted files to the trash instead of permanently deleting them (:help oil-trash) delete_to_trash = true, -- Skip the confirmation popup for simple operations (:help oil.skip_confirm_for_simple_edits) skip_confirm_for_simple_edits = false, -- Selecting a new/moved/renamed file or directory will prompt you to save changes first -- (:help prompt_save_on_select_new_entry) prompt_save_on_select_new_entry = true, -- Oil will automatically delete hidden buffers after this delay -- You can set the delay to false to disable cleanup entirely -- Note that the cleanup process only starts when none of the oil buffers are currently displayed cleanup_delay_ms = 2000, lsp_file_methods = { -- Enable or disable LSP file operations enabled = true, -- Time to wait for LSP file operations to complete before skipping timeout_ms = 1000, -- Set to true to autosave buffers that are updated with LSP willRenameFiles -- Set to "unmodified" to only save unmodified buffers autosave_changes = false, }, -- Constrain the cursor to the editable parts of the oil buffer -- Set to `false` to disable, or "name" to keep it on the file names constrain_cursor = "editable", -- Set to true to watch the filesystem for changes and reload oil watch_for_changes = false, -- Keymaps in oil buffer. Can be any value that `vim.keymap.set` accepts OR a table of keymap -- options with a `callback` (e.g. { callback = function() ... end, desc = "", mode = "n" }) -- Additionally, if it is a string that matches "actions.<name>", -- it will use the mapping at require("oil.actions").<name> -- Set to `false` to remove a keymap -- See :help oil-actions for a list of all available actions keymaps = { ["g?"] = { "actions.show_help", mode = "n" }, ["<CR>"] = "actions.select", ["<C-s>"] = { "actions.select", opts = { vertical = true } }, ["<C-h>"] = { "actions.select", opts = { horizontal = true } }, ["<C-t>"] = { "actions.select", opts = { tab = true } }, ["<C-p>"] = "actions.preview", ["<C-c>"] = { "actions.close", mode = "n" }, ["<C-l>"] = "actions.refresh", ["-"] = { "actions.parent", mode = "n" }, ["_"] = { "actions.open_cwd", mode = "n" }, ["`"] = { "actions.cd", mode = "n" }, ["~"] = { "actions.cd", opts = { scope = "tab" }, mode = "n" }, ["gs"] = { "actions.change_sort", mode = "n" }, ["gx"] = "actions.open_external", ["g."] = { "actions.toggle_hidden", mode = "n" }, ["g\\"] = { "actions.toggle_trash", mode = "n" }, }, -- Set to false to disable all of the above keymaps use_default_keymaps = true, view_options = { -- Show files and directories that start with "." show_hidden = false, -- This function defines what is considered a "hidden" file is_hidden_file = function(name, bufnr) local m = name:match("^%.") return m ~= nil end, -- This function defines what will never be shown, even when `show_hidden` is set is_always_hidden = function(name, bufnr) return false end, -- Sort file names with numbers in a more intuitive order for humans. -- Can be "fast", true, or false. "fast" will turn it off for large directories. natural_order = "fast", -- Sort file and directory names case insensitive case_insensitive = false, sort = { -- sort order can be "asc" or "desc" -- see :help oil-columns to see which columns are sortable { "mtime", "desc" }, { "type", "asc" }, { "name", "asc" }, }, -- Customize the highlight group for the file name highlight_filename = function(entry, is_hidden, is_link_target, is_link_orphan) return nil end, }, -- Extra arguments to pass to SCP when moving/copying files over SSH extra_scp_args = {}, -- EXPERIMENTAL support for performing file operations with git git = { -- Return true to automatically git add/mv/rm files add = function(path) return false end, mv = function(src_path, dest_path) return false end, rm = function(path) return false end, }, -- Configuration for the floating window in oil.open_float float = { -- Padding around the floating window padding = 2, -- max_width and max_height can be integers or a float between 0 and 1 (e.g. 0.4 for 40%) max_width = 0, max_height = 0, border = "rounded", win_options = { winblend = 0, }, -- optionally override the oil buffers window title with custom function: fun(winid: integer): string get_win_title = nil, -- preview_split: Split direction: "auto", "left", "right", "above", "below". preview_split = "auto", -- This is the config that will be passed to nvim_open_win. -- Change values here to customize the layout override = function(conf) return conf end, }, -- Configuration for the file preview window preview_win = { -- Whether the preview window is automatically updated when the cursor is moved update_on_cursor_moved = true, -- How to open the preview window "load"|"scratch"|"fast_scratch" preview_method = "fast_scratch", -- A function that returns true to disable preview on a file e.g. to avoid lag disable_preview = function(filename) return false end, -- Window-local options to use for preview window buffers win_options = {}, }, -- Configuration for the floating action confirmation window confirmation = { -- Width dimensions can be integers or a float between 0 and 1 (e.g. 0.4 for 40%) -- min_width and max_width can be a single value or a list of mixed integer/float types. -- max_width = {100, 0.8} means "the lesser of 100 columns or 80% of total" max_width = 0.9, -- min_width = {40, 0.4} means "the greater of 40 columns or 40% of total" min_width = { 40, 0.4 }, -- optionally define an integer/float for the exact width of the preview window width = nil, -- Height dimensions can be integers or a float between 0 and 1 (e.g. 0.4 for 40%) -- min_height and max_height can be a single value or a list of mixed integer/float types. -- max_height = {80, 0.9} means "the lesser of 80 columns or 90% of total" max_height = 0.9, -- min_height = {5, 0.1} means "the greater of 5 columns or 10% of total" min_height = { 5, 0.1 }, -- optionally define an integer/float for the exact height of the preview window height = nil, border = "rounded", win_options = { winblend = 0, }, }, -- Configuration for the floating progress window progress = { max_width = 0.9, min_width = { 40, 0.4 }, width = nil, max_height = { 10, 0.9 }, min_height = { 5, 0.1 }, height = nil, border = "rounded", minimized_border = "none", win_options = { winblend = 0, }, }, -- Configuration for the floating SSH window ssh = { border = "rounded", }, -- Configuration for the floating keymaps help window keymaps_help = { border = "rounded", }, }) -- }}} -- }}} -- {{{ LSP SETUP -- vim.lsp.config('hls', { -- cmd = { 'haskell-language-server-wrapper', '--lsp' }, -- filetypes = { 'haskell', 'lhaskell' }, -- root_dir = function(bufnr, on_dir) -- local fname = vim.api.nvim_buf_get_name(bufnr) -- on_dir(util.root_pattern('hie.yaml', 'stack.yaml', 'cabal.project', '*.cabal', 'package.yaml')(fname)) -- end, -- settings = { -- haskell = { -- formattingProvider = 'fourmolu', -- cabalFormattingProvider = 'cabal-gild', -- }, -- }, -- }) -- }}} -- {{{ OPTION vim.cmd.color('tokyodark') vim.o.expandtab = true vim.o.shiftwidth = 4 vim.o.softtabstop = -1 vim.o.autoindent = true vim.o.smartindent = true vim.o.cindent = true vim.o.number = false vim.o.relativenumber = false vim.o.wildmode = 'full:lastused' vim.g.clipboard = 'osc52' -- }}} -- {{{ KEYMAP vim.g.mapleader = ',' vim.keymap.set('n', '<leader>c', ':e $MYVIMRC<cr>') vim.keymap.set({ 'n', 'v' }, ';', ':') -- tpope/vim-rsi <c-k> support -- https://github.com/tpope/vim-rsi/issues/59 vim.keymap.set('i', '<c-k>', '<c-o>D') vim.keymap.set('c', '<c-k>', '<c-\\>e{-> slice(getcmdline(), 0, getcmdpos() - 1)}()<cr>') vim.keymap.set("n", "-", "<CMD>Oil<CR>", { desc = "Open parent directory" }) -- }}} -- {{{ KEYMAP FILETYPE -- Create an augroup to keep the autocommands organized and prevent duplicates local help_augroup = vim.api.nvim_create_augroup("HelpAutocmds", { clear = true }) -- Autocmd for when entering a help filetype buffer vim.api.nvim_create_autocmd("FileType", { group = help_augroup, pattern = "help", callback = function() local opts = { noremap = true, silent = true, buffer = true } -- 'q' to close help window (quick exit) vim.keymap.set("n", "q", ":q<CR>", opts) -- Optional: map space to scroll down incrementally vim.keymap.set("n", "<Space>", "<C-f>", opts) -- Optional: map 'b' to go back to previous help tag vim.keymap.set("n", "b", "<c-b>", opts) -- maximize window height vertically -- vim.cmd('wincmd _') -- Set up buffer-local autocmd for BufEnter on this help buffer vim.api.nvim_create_autocmd("BufEnter", { group = help_augroup, buffer = 0, -- current buffer only callback = function() vim.cmd('wincmd _') -- minimize window height vertically end, }) -- Set up buffer-local autocmd for BufLeave on this help buffer vim.api.nvim_create_autocmd("BufLeave", { group = help_augroup, buffer = 0, -- current buffer only callback = function() vim.cmd('resize 1') -- minimize window height vertically end, }) end, }) -- }}} -- {{{ NEOVIDE ZOOM IN/OUT KEYMAP if vim.g.neovide then vim.g.neovide_scale_factor = 1.0 local change_scale_factor = function(delta) vim.g.neovide_scale_factor = vim.g.neovide_scale_factor * delta end vim.keymap.set("n", "<C-=>", function() change_scale_factor(1.05) end) vim.keymap.set("n", "<C-->", function() change_scale_factor(1/1.05) end) vim.keymap.set("n", "<C-0>", function() vim.g.neovide_scale_factor = 1.0 end) end -- }}} -- {{{ DEFAULT SETTINGS - REFERENCE -- Set <space> as the leader key -- See `:help mapleader` -- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used) -- vim.g.mapleader = ',' -- [[ Setting options ]] See `:h vim.o` -- NOTE: You can change these options as you wish! -- For more options, you can see `:help option-list` -- To see documentation for an option, you can use `:h 'optionname'`, for example `:h 'number'` -- (Note the single quotes) -- Print the line number in front of each line -- vim.o.number = true -- Use relative line numbers, so that it is easier to jump with j, k. This will affect the 'number' -- option above, see `:h number_relativenumber` -- vim.o.relativenumber = true -- Sync clipboard between OS and Neovim. Schedule the setting after `UiEnter` because it can -- increase startup-time. Remove this option if you want your OS clipboard to remain independent. -- See `:help 'clipboard'` -- vim.api.nvim_create_autocmd('UIEnter', { -- callback = function() -- vim.o.clipboard = 'unnamedplus' -- end, -- }) -- Case-insensitive searching UNLESS \C or one or more capital letters in the search term vim.o.ignorecase = true vim.o.smartcase = true -- Highlight the line where the cursor is on vim.o.cursorline = true -- Minimal number of screen lines to keep above and below the cursor. -- vim.o.scrolloff = 0 -- Show <tab> and trailing spaces vim.o.list = true -- if performing an operation that would fail due to unsaved changes in the buffer (like `:q`), -- instead raise a dialog asking if you wish to save the current file(s) See `:help 'confirm'` vim.o.confirm = true -- [[ Set up keymaps ]] See `:h vim.keymap.set()`, `:h mapping`, `:h keycodes` -- Use <Esc> to exit terminal mode vim.keymap.set('t', '<Esc>', '<C-\\><C-n>') -- Map <A-j>, <A-k>, <A-h>, <A-l> to navigate between windows in any modes vim.keymap.set({ 't', 'i' }, '<A-h>', '<C-\\><C-n><C-w>h') vim.keymap.set({ 't', 'i' }, '<A-j>', '<C-\\><C-n><C-w>j') vim.keymap.set({ 't', 'i' }, '<A-k>', '<C-\\><C-n><C-w>k') vim.keymap.set({ 't', 'i' }, '<A-l>', '<C-\\><C-n><C-w>l') vim.keymap.set({ 'n' }, '<A-h>', '<C-w>h') vim.keymap.set({ 'n' }, '<A-j>', '<C-w>j') vim.keymap.set({ 'n' }, '<A-k>', '<C-w>k') vim.keymap.set({ 'n' }, '<A-l>', '<C-w>l') -- [[ Basic Autocommands ]]. -- See `:h lua-guide-autocommands`, `:h autocmd`, `:h nvim_create_autocmd()` -- Highlight when yanking (copying) text. -- Try it with `yap` in normal mode. See `:h vim.hl.on_yank()` vim.api.nvim_create_autocmd('TextYankPost', { desc = 'Highlight when yanking (copying) text', callback = function() vim.hl.on_yank() end, }) -- [[ Create user commands ]] -- See `:h nvim_create_user_command()` and `:h user-commands` -- Create a command `:GitBlameLine` that print the git blame for the current line vim.api.nvim_create_user_command('GitBlameLine', function() local line_number = vim.fn.line('.') -- Get the current line number. See `:h line()` local filename = vim.api.nvim_buf_get_name(0) print(vim.system({ 'git', 'blame', '-L', line_number .. ',+1', filename }):wait().stdout) end, { desc = 'Print the git blame for the current line' }) -- [[ Add optional packages ]] -- Nvim comes bundled with a set of packages that are not enabled by -- default. You can enable any of them by using the `:packadd` command. -- For example, to add the "nohlsearch" package to automatically turn off search highlighting after -- 'updatetime' and when going to insert mode vim.cmd('packadd! nohlsearch') -- }}}