Skip to content

Instantly share code, notes, and snippets.

@dontdieych
Created December 22, 2025 07:20
Show Gist options
  • Select an option

  • Save dontdieych/f6e3998a683f8ee2e3428230fba867b8 to your computer and use it in GitHub Desktop.

Select an option

Save dontdieych/f6e3998a683f8ee2e3428230fba867b8 to your computer and use it in GitHub Desktop.

Revisions

  1. dontdieych created this gist Dec 22, 2025.
    443 changes: 443 additions & 0 deletions init.lua
    Original 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')
    -- }}}