Created
December 22, 2025 07:20
-
-
Save dontdieych/f6e3998a683f8ee2e3428230fba867b8 to your computer and use it in GitHub Desktop.
MYVIMRC
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 characters
| -- 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') | |
| -- }}} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment