From 2cbdb13009c5c4e735bdc930c82d4406060d4b5d Mon Sep 17 00:00:00 2001
From: bridge4 <s.abdulalhash@gmail.com>
Date: Mon, 31 Mar 2025 02:31:41 +0300
Subject: [PATCH] housekeeping merge

---
 init.lua                        | 190 ++++++++------------------------
 lua/core/globals.lua            |  15 +++
 lua/core/keymaps.lua            | 172 +++++++++++++++++++++++++++++
 lua/core/options.lua            |  68 ++++++++++++
 lua/core/plugins.lua            |   7 ++
 lua/plugin-options/gitsigns.lua |   9 ++
 6 files changed, 318 insertions(+), 143 deletions(-)
 create mode 100644 lua/core/globals.lua
 create mode 100644 lua/core/keymaps.lua
 create mode 100644 lua/core/options.lua
 create mode 100644 lua/core/plugins.lua
 create mode 100644 lua/plugin-options/gitsigns.lua

diff --git a/init.lua b/init.lua
index ebe5c707..6ffa9909 100644
--- a/init.lua
+++ b/init.lua
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 -- Set <space> as the leader key
 -- See `:help mapleader`
 --  NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used)
@@ -124,6 +125,9 @@ vim.keymap.set('n', '<C-k>', '<C-w><C-k>', { desc = 'Move focus to the upper win
 
 -- [[ Basic Autocommands ]]
 --  See `:help lua-guide-autocommands`
+=======
+require 'core.globals'
+>>>>>>> b6fc317 (housekeeping)
 
 -- Highlight when yanking (copying) text
 --  Try it with `yap` in normal mode
@@ -161,49 +165,7 @@ vim.opt.rtp:prepend(lazypath)
 -- NOTE: Here is where you install your plugins.
 
 require('lazy').setup({
-  -- NOTE: Plugins can be added with a link (or for a github repo: 'owner/repo' link).
-  'tpope/vim-sleuth', -- Detect tabstop and shiftwidth automatically
-
-  -- NOTE: Plugins can also be added by using a table,
-  -- with the first argument being the link and the following
-  -- keys can be used to configure plugin behavior/loading/etc.
-  --
-  -- Use `opts = {}` to force a plugin to be loaded.
-  --
-
-  -- Here is a more advanced example where we pass configuration
-  -- options to `gitsigns.nvim`. This is equivalent to the following Lua:
-  --    require('gitsigns').setup({ ... })
-  --
-  -- See `:help gitsigns` to understand what the configuration keys do
-  { -- Adds git related signs to the gutter, as well as utilities for managing changes
-    'lewis6991/gitsigns.nvim',
-    opts = {
-      signs = {
-        add = { text = '+' },
-        change = { text = '~' },
-        delete = { text = '_' },
-        topdelete = { text = 'โ€พ' },
-        changedelete = { text = '~' },
-      },
-    },
-  },
-
-  -- NOTE: Plugins can also be configured to run Lua code when they are loaded.
-  --
-  -- This is often very useful to both group configuration, as well as handle
-  -- lazy loading plugins that don't need to be loaded immediately at startup.
-  --
-  -- For example, in the following configuration, we use:
-  --  event = 'VimEnter'
-  --
-  -- which loads which-key before all the UI elements are loaded. Events can be
-  -- normal autocommands events (`:help autocmd-events`).
-  --
-  -- Then, because we use the `opts` key (recommended), the configuration runs
-  -- after the plugin has been loaded as `require(MODULE).setup(opts)`.
-
-  { -- Useful plugin to show you pending keybinds.
+  {
     'folke/which-key.nvim',
     event = 'VimEnter', -- Sets the loading event to 'VimEnter'
     opts = {
@@ -256,14 +218,6 @@ require('lazy').setup({
       },
     },
   },
-
-  -- NOTE: Plugins can specify dependencies.
-  --
-  -- The dependencies are proper plugin specifications as well - anything
-  -- you do for a plugin at the top level, you can do for a dependency.
-  --
-  -- Use the `dependencies` key to specify the dependencies of a particular plugin
-
   { -- Fuzzy Finder (files, lsp, etc)
     'nvim-telescope/telescope.nvim',
     event = 'VimEnter',
@@ -332,43 +286,26 @@ require('lazy').setup({
       pcall(require('telescope').load_extension, 'ui-select')
 
       -- See `:help telescope.builtin`
-      local builtin = require 'telescope.builtin'
-      vim.keymap.set('n', '<leader>sh', builtin.help_tags, { desc = '[S]earch [H]elp' })
-      vim.keymap.set('n', '<leader>sk', builtin.keymaps, { desc = '[S]earch [K]eymaps' })
-      vim.keymap.set('n', '<leader>sf', builtin.find_files, { desc = '[S]earch [F]iles' })
-      vim.keymap.set('n', '<leader>ss', builtin.builtin, { desc = '[S]earch [S]elect Telescope' })
-      vim.keymap.set('n', '<leader>sw', builtin.grep_string, { desc = '[S]earch current [W]ord' })
-      vim.keymap.set('n', '<leader>sg', builtin.live_grep, { desc = '[S]earch by [G]rep' })
-      vim.keymap.set('n', '<leader>sd', builtin.diagnostics, { desc = '[S]earch [D]iagnostics' })
-      vim.keymap.set('n', '<leader>sr', builtin.resume, { desc = '[S]earch [R]esume' })
-      vim.keymap.set('n', '<leader>s.', builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' })
-      vim.keymap.set('n', '<leader><leader>', builtin.buffers, { desc = '[ ] Find existing buffers' })
-
-      -- Slightly advanced example of overriding default behavior and theme
-      vim.keymap.set('n', '<leader>/', function()
-        -- You can pass additional configuration to Telescope to change the theme, layout, etc.
-        builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown {
-          winblend = 10,
-          previewer = false,
-        })
-      end, { desc = '[/] Fuzzily search in current buffer' })
-
-      -- It's also possible to pass additional configuration options.
-      --  See `:help telescope.builtin.live_grep()` for information about particular keys
-      vim.keymap.set('n', '<leader>s/', function()
-        builtin.live_grep {
-          grep_open_files = true,
-          prompt_title = 'Live Grep in Open Files',
-        }
-      end, { desc = '[S]earch [/] in Open Files' })
-
-      -- Shortcut for searching your Neovim configuration files
-      vim.keymap.set('n', '<leader>sn', function()
-        builtin.find_files { cwd = vim.fn.stdpath 'config' }
-      end, { desc = '[S]earch [N]eovim files' })
     end,
   },
+  {
+    'epwalsh/obsidian.nvim',
+    version = '*', -- recommended, use latest release instead of latest commit
+    lazy = true,
+    ft = 'markdown',
+    -- Replace the above line with this if you only want to load obsidian.nvim for markdown files in your vault:
+    -- event = {
+    --   -- If you want to use the home shortcut '~' here you need to call 'vim.fn.expand'.
+    --   -- E.g. "BufReadPre " .. vim.fn.expand "~" .. "/my-vault/*.md"
+    --   -- refer to `:h file-pattern` for more examples
+    --   "BufReadPre path/to/my-vault/*.md",
+    --   "BufNewFile path/to/my-vault/*.md",
+    -- },
+    dependencies = {
+      -- Required.
+      'nvim-lua/plenary.nvim',
 
+<<<<<<< HEAD
   {
     'epwalsh/obsidian.nvim',
     version = '*', -- recommended, use latest release instead of latest commit
@@ -386,13 +323,19 @@ require('lazy').setup({
       -- Required.
       'nvim-lua/plenary.nvim',
 
+=======
+>>>>>>> b6fc317 (housekeeping)
       -- see below for full list of optional dependencies ๐Ÿ‘‡
     },
     opts = {
       workspaces = {
         {
           name = 'personal',
+<<<<<<< HEAD
           path = 'E:/Stories',
+=======
+          path = 'C:/Users/Squirrel/Documents/Worldbuilding',
+>>>>>>> b6fc317 (housekeeping)
         },
       },
       -- A list of workspace names, paths, and configuration overrides.
@@ -436,6 +379,7 @@ require('lazy').setup({
 
       -- Optional, configure key mappings. These are the defaults. If you don't want to set any keymappings this
       -- way then set 'mappings = {}'.
+<<<<<<< HEAD
       mappings = {
         -- Overrides the 'gf' mapping to work on markdown/wiki links within your vault.
         ['gd'] = {
@@ -459,6 +403,8 @@ require('lazy').setup({
           opts = { buffer = true, expr = true },
         },
       },
+=======
+>>>>>>> b6fc317 (housekeeping)
 
       -- Where to put new notes. Valid options are
       --  * "current_dir" - put new notes in same directory as the current buffer.
@@ -711,7 +657,10 @@ require('lazy').setup({
     },
     -- see below for full list of options ๐Ÿ‘‡
   },
+<<<<<<< HEAD
 
+=======
+>>>>>>> b6fc317 (housekeeping)
   -- LSP Plugins
   {
     -- `lazydev` configures Lua LSP for your Neovim config, runtime and plugins
@@ -949,7 +898,6 @@ require('lazy').setup({
       }
     end,
   },
-
   { -- Autoformat
     'stevearc/conform.nvim',
     event = { 'BufWritePre' },
@@ -992,7 +940,6 @@ require('lazy').setup({
       },
     },
   },
-
   { -- Autocompletion
     'hrsh7th/nvim-cmp',
     event = 'InsertEnter',
@@ -1047,54 +994,6 @@ require('lazy').setup({
         -- chosen, you will need to read `:help ins-completion`
         --
         -- No, but seriously. Please read `:help ins-completion`, it is really good!
-        mapping = cmp.mapping.preset.insert {
-          -- Select the [n]ext item
-          ['<C-n>'] = cmp.mapping.select_next_item(),
-          -- Select the [p]revious item
-          ['<C-p>'] = cmp.mapping.select_prev_item(),
-
-          -- Scroll the documentation window [b]ack / [f]orward
-          ['<C-b>'] = cmp.mapping.scroll_docs(-4),
-          ['<C-f>'] = cmp.mapping.scroll_docs(4),
-
-          -- Accept ([y]es) the completion.
-          --  This will auto-import if your LSP supports it.
-          --  This will expand snippets if the LSP sent a snippet.
-          ['<C-y>'] = cmp.mapping.confirm { select = true },
-
-          -- If you prefer more traditional completion keymaps,
-          -- you can uncomment the following lines
-          --['<CR>'] = cmp.mapping.confirm { select = true },
-          --['<Tab>'] = cmp.mapping.select_next_item(),
-          --['<S-Tab>'] = cmp.mapping.select_prev_item(),
-
-          -- Manually trigger a completion from nvim-cmp.
-          --  Generally you don't need this, because nvim-cmp will display
-          --  completions whenever it has completion options available.
-          ['<C-Space>'] = cmp.mapping.complete {},
-
-          -- Think of <c-l> as moving to the right of your snippet expansion.
-          --  So if you have a snippet that's like:
-          --  function $name($args)
-          --    $body
-          --  end
-          --
-          -- <c-l> will move you to the right of each of the expansion locations.
-          -- <c-h> is similar, except moving you backwards.
-          ['<C-l>'] = cmp.mapping(function()
-            if luasnip.expand_or_locally_jumpable() then
-              luasnip.expand_or_jump()
-            end
-          end, { 'i', 's' }),
-          ['<C-h>'] = cmp.mapping(function()
-            if luasnip.locally_jumpable(-1) then
-              luasnip.jump(-1)
-            end
-          end, { 'i', 's' }),
-
-          -- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see:
-          --    https://github.com/L3MON4D3/LuaSnip?tab=readme-ov-file#keymaps
-        },
         sources = {
           {
             name = 'lazydev',
@@ -1215,7 +1114,7 @@ require('lazy').setup({
   --    This is the easiest way to modularize your config.
   --
   --  Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going.
-  -- { import = 'custom.plugins' },
+  { import = 'core.plugins' },
   {
     'mfussenegger/nvim-dap',
     recommended = true,
@@ -1235,7 +1134,6 @@ require('lazy').setup({
     keys = {
       { "<leader>dB", function() require("dap").set_breakpoint(vim.fn.input('Breakpoint condition: ')) end, desc = "Breakpoint Condition" },
       { "<F9>", function() require("dap").toggle_breakpoint() end, desc = "Toggle Breakpoint" },
-      { "<C-F9>", function() require("dap").clear_breakpoints() end, desc = "Clear All Breakpoints" },
       { "<F5>", function() require("dap").continue() end, desc = "Run/Continue" },
       { "<leader>da", function() require("dap").continue({ before = get_args }) end, desc = "Run with Args" },
       { "<leader>dC", function() require("dap").run_to_cursor() end, desc = "Run to Cursor" },
@@ -1246,7 +1144,6 @@ require('lazy').setup({
       { "<leader>dl", function() require("dap").run_last() end, desc = "Run Last" },
       { "<S-F11>", function() require("dap").step_out() end, desc = "Step Out" },
       { "<F10>", function() require("dap").step_over() end, desc = "Step Over" },
-      { "<leader>dP", function() require("dap").pause() end, desc = "Pause" },
       { "<leader>dr", function() require("dap").repl.toggle() end, desc = "Toggle REPL" },
       { "<leader>ds", function() require("dap").session() end, desc = "Session" },
       { "<S-F5>", function() require("dap").terminate() end, desc = "Terminate" },
@@ -1315,6 +1212,7 @@ require('lazy').setup({
       }
     end,
   },
+<<<<<<< HEAD
   {
     'stevearc/oil.nvim',
     ---@module 'oil'
@@ -1343,6 +1241,8 @@ require('lazy').setup({
     vim.keymap.set('n', '<leader>o', '<CMD>Oil<CR>', { desc = 'Open parent directory' }),
     -- dependencies = { "nvim-tree/nvim-web-devicons" }, -- use if prefer nvim-web-devicons
   }, --
+=======
+>>>>>>> b6fc317 (housekeeping)
   -- For additional information with loading, sourcing and examples see `:help lazy.nvim-๐Ÿ”Œ-plugin-spec`
   -- Or use telescope!
   -- In normal mode type `<space>sh` then write `lazy.nvim-plugin`
@@ -1369,11 +1269,6 @@ require('lazy').setup({
   },
 })
 require('nvim-treesitter.install').compilers = { 'clang' }
-local builtin = require 'telescope.builtin'
-vim.keymap.set('n', '<leader>ff', builtin.find_files, { desc = 'Telescope find files' })
-vim.keymap.set('n', '<leader>fg', builtin.live_grep, { desc = 'Telescope live grep' })
-vim.keymap.set('n', '<leader>fb', builtin.buffers, { desc = 'Telescope buffers' })
-vim.keymap.set('n', '<leader>fh', builtin.help_tags, { desc = 'Telescope help tags' })
 require('telescope').setup {
   defaults = {
     file_ignore_patterns = {
@@ -1387,8 +1282,17 @@ require('telescope').setup {
   },
 }
 vim.fn.sign_define('DapBreakpoint', { text = '๐Ÿ›‘', texthl = '', linehl = '', numhl = '' })
+<<<<<<< HEAD
 vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, {})
 
 -- The line beneath this is called `modeline`. See `:help modeline`
 -- vim: ts=2 sts=2 sw=2 et
 require 'oil'
+=======
+-- vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, {})
+
+-- The line beneath this is called `modeline`. See `:help modeline`
+-- vim: ts=2 sts=2 sw=2 et
+require 'core.options'
+require 'core.keymaps'
+>>>>>>> b6fc317 (housekeeping)
diff --git a/lua/core/globals.lua b/lua/core/globals.lua
new file mode 100644
index 00000000..98572b80
--- /dev/null
+++ b/lua/core/globals.lua
@@ -0,0 +1,15 @@
+vim.g.mapleader = ' '
+vim.g.maplocalleader = ' '
+
+if vim.fn.exists 'g:os' == 0 then
+  local is_windows = vim.fn.has 'win64' == 1 or vim.fn.has 'win32' == 1 or vim.fn.has 'win16' == 1
+  if is_windows then
+    vim.g.os = 'Windows'
+  else
+    local uname_output = vim.fn.system 'uname'
+    vim.g.os = string.gsub(uname_output, '\n', '')
+  end
+end
+
+-- Set to true if you have a Nerd Font installed and selected in the terminal
+vim.g.have_nerd_font = true
diff --git a/lua/core/keymaps.lua b/lua/core/keymaps.lua
new file mode 100644
index 00000000..7575a4dc
--- /dev/null
+++ b/lua/core/keymaps.lua
@@ -0,0 +1,172 @@
+-- ################ ################ ################ ################
+-- ################ ################ ################ ################
+-- BASIC KEYBINDS
+-- ################ ################ ################ ################
+-- ################ ################ ################ ################
+vim.keymap.set('n', '<Esc>', '<cmd>nohlsearch<CR>')
+vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist, { desc = 'Open diagnostic [Q]uickfix list' })
+-- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping
+-- or just use <C-\><C-n> to exit terminal mode
+vim.keymap.set('t', '<Esc><Esc>', '<C-\\><C-n>', { desc = 'Exit terminal mode' })
+vim.keymap.set('n', '<C-h>', '<C-w><C-h>', { desc = 'Move focus to the left window' })
+vim.keymap.set('n', '<C-l>', '<C-w><C-l>', { desc = 'Move focus to the right window' })
+vim.keymap.set('n', '<C-j>', '<C-w><C-j>', { desc = 'Move focus to the lower window' })
+vim.keymap.set('n', '<C-k>', '<C-w><C-k>', { desc = 'Move focus to the upper window' })
+
+-- ################ ################ ################ ################
+-- ################ ################ ################ ################
+-- OIL-KEYMAPS
+-- ################ ################ ################ ################
+-- ################ ################ ################ ################
+require('oil').setup {
+  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' },
+  },
+  vim.keymap.set('n', '<leader>o', '<CMD>Oil<CR>', { desc = 'Open parent directory' }),
+  -- Set to false to disable all of the above keymaps
+  use_default_keymaps = true,
+}
+
+-- ################ ################ ################ ################
+-- ################ ################ ################ ################
+-- TELESCOPE-KEYMAPS
+-- ################ ################ ################ ################
+-- ################ ################ ################ ################
+local builtin = require 'telescope.builtin'
+vim.keymap.set('n', '<leader>sh', builtin.help_tags, { desc = '[S]earch [H]elp' })
+vim.keymap.set('n', '<leader>sk', builtin.keymaps, { desc = '[S]earch [K]eymaps' })
+vim.keymap.set('n', '<leader>sf', builtin.find_files, { desc = '[S]earch [F]iles' })
+vim.keymap.set('n', '<leader>ss', builtin.builtin, { desc = '[S]earch [S]elect Telescope' })
+vim.keymap.set('n', '<leader>sw', builtin.grep_string, { desc = '[S]earch current [W]ord' })
+vim.keymap.set('n', '<leader>sg', builtin.live_grep, { desc = '[S]earch by [G]rep' })
+vim.keymap.set('n', '<leader>sd', builtin.diagnostics, { desc = '[S]earch [D]iagnostics' })
+vim.keymap.set('n', '<leader>sr', builtin.resume, { desc = '[S]earch [R]esume' })
+vim.keymap.set('n', '<leader>s.', builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' })
+vim.keymap.set('n', '<leader><leader>', builtin.buffers, { desc = '[ ] Find existing buffers' })
+vim.keymap.set('n', '<leader>ff', builtin.find_files, { desc = 'Telescope find files' })
+vim.keymap.set('n', '<leader>fg', builtin.live_grep, { desc = 'Telescope live grep' })
+vim.keymap.set('n', '<leader>fb', builtin.buffers, { desc = 'Telescope buffers' })
+vim.keymap.set('n', '<leader>fh', builtin.help_tags, { desc = 'Telescope help tags' })
+-- Slightly advanced example of overriding default behavior and theme
+vim.keymap.set('n', '<leader>/', function()
+  -- You can pass additional configuration to Telescope to change the theme, layout, etc.
+  builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown {
+    winblend = 10,
+    previewer = false,
+  })
+end, { desc = '[/] Fuzzily search in current buffer' })
+
+-- It's also possible to pass additional configuration options.
+--  See `:help telescope.builtin.live_grep()` for information about particular keys
+vim.keymap.set('n', '<leader>s/', function()
+  builtin.live_grep {
+    grep_open_files = true,
+    prompt_title = 'Live Grep in Open Files',
+  }
+end, { desc = '[S]earch [/] in Open Files' })
+
+-- Shortcut for searching your Neovim configuration files
+vim.keymap.set('n', '<leader>sn', function()
+  builtin.find_files { cwd = vim.fn.stdpath 'config' }
+end, { desc = '[S]earch [N]eovim files' })
+
+-- ################ ################ ################ ################
+-- ################ ################ ################ ################
+-- OBSIDIAN-KEYMAPS
+-- ################ ################ ################ ################
+-- ################ ################ ################ ################
+vim.keymap.set('n', 'gf', function()
+  if require('obsidian').util.cursor_on_markdown_link() then
+    return '<cmd>ObsidianFollowLink<CR>'
+  else
+    return 'gf'
+  end
+end, { noremap = false, expr = true })
+
+vim.keymap.set('n', 'gd', function()
+  require('obsidian').util.gf_passthrough()
+end, { noremap = false, expr = true, buffer = true })
+
+vim.keymap.set('n', '<leader>ch', function()
+  return require('obsidian').util.toggle_checkbox()
+end, { buffer = true })
+
+vim.keymap.set('n', 'cr', function()
+  return require('obsidian').util.smart_action()
+end, { buffer = true, expr = true })
+
+-- ################ ################ ################ ################
+-- ################ ################ ################ ################
+-- CMP-KEYMAPS
+-- ################ ################ ################ ################
+-- ################ ################ ################ ################
+local cmp = require 'cmp'
+local luasnip = require 'luasnip'
+luasnip.config.setup {}
+
+cmp.setup {
+  -- For an understanding of why these mappings were
+  -- chosen, you will need to read `:help ins-completion`
+  --
+  -- No, but seriously. Please read `:help ins-completion`, it is really good!
+  mapping = cmp.mapping.preset.insert {
+    -- Select the [n]ext item
+    ['<C-n>'] = cmp.mapping.select_next_item(),
+    -- Select the [p]revious item
+    ['<C-p>'] = cmp.mapping.select_prev_item(),
+
+    -- Scroll the documentation window [b]ack / [f]orward
+    ['<C-b>'] = cmp.mapping.scroll_docs(-4),
+    ['<C-f>'] = cmp.mapping.scroll_docs(4),
+
+    -- Accept ([y]es) the completion.
+    --  This will auto-import if your LSP supports it.
+    --  This will expand snippets if the LSP sent a snippet.
+    ['<C-y>'] = cmp.mapping.confirm { select = true },
+
+    -- If you prefer more traditional completion keymaps,
+    -- you can uncomment the following lines
+    --['<CR>'] = cmp.mapping.confirm { select = true },
+    --['<Tab>'] = cmp.mapping.select_next_item(),
+    --['<S-Tab>'] = cmp.mapping.select_prev_item(),
+
+    -- Manually trigger a completion from nvim-cmp.
+    --  Generally you don't need this, because nvim-cmp will display
+    --  completions whenever it has completion options available.
+    ['<C-Space>'] = cmp.mapping.complete {},
+
+    -- Think of <c-l> as moving to the right of your snippet expansion.
+    --  So if you have a snippet that's like:
+    --  function $name($args)
+    --    $body
+    --  end
+    --
+    -- <c-l> will move you to the right of each of the expansion locations.
+    -- <c-h> is similar, except moving you backwards.
+    ['<C-l>'] = cmp.mapping(function()
+      if luasnip.expand_or_locally_jumpable() then
+        luasnip.expand_or_jump()
+      end
+    end, { 'i', 's' }),
+    ['<C-h>'] = cmp.mapping(function()
+      if luasnip.locally_jumpable(-1) then
+        luasnip.jump(-1)
+      end
+    end, { 'i', 's' }),
+  },
+}
diff --git a/lua/core/options.lua b/lua/core/options.lua
new file mode 100644
index 00000000..337f1f9e
--- /dev/null
+++ b/lua/core/options.lua
@@ -0,0 +1,68 @@
+-- [[ Setting options ]]
+-- See `:help vim.opt`
+-- NOTE: You can change these options as you wish!
+--  For more options, you can see `:help option-list`
+
+-- Make line numbers default
+vim.opt.number = true
+vim.opt.relativenumber = true
+-- You can also add relative line numbers, to help with jumping.
+--  Experiment for yourself to see if you like it!
+-- vim.opt.relativenumber = true
+
+-- Enable mouse mode, can be useful for resizing splits for example!
+vim.opt.mouse = 'a'
+
+-- Don't show the mode, since it's already in the status line
+vim.opt.showmode = false
+
+-- 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.schedule(function()
+  vim.opt.clipboard = 'unnamedplus'
+end)
+
+-- Enable break indent
+vim.opt.breakindent = true
+
+-- Save undo history
+vim.opt.undofile = true
+
+-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term
+vim.opt.ignorecase = true
+vim.opt.smartcase = true
+
+-- Keep signcolumn on by default
+vim.opt.signcolumn = 'yes'
+
+-- Decrease update time
+vim.opt.updatetime = 250
+
+-- Decrease mapped sequence wait time
+-- Displays which-key popup sooner
+vim.opt.timeoutlen = 300
+
+-- Configure how new splits should be opened
+vim.opt.splitright = true
+vim.opt.splitbelow = true
+
+-- Sets how neovim will display certain whitespace characters in the editor.
+--  See `:help 'list'`
+--  and `:help 'listchars'`
+vim.opt.list = true
+vim.opt.listchars = { tab = 'ยป ', trail = 'ยท', nbsp = 'โฃ' }
+
+vim.opt.tabstop = 4 -- A TAB character looks like 4 spaces
+vim.opt.expandtab = true -- Pressing the TAB key will insert spaces instead of a TAB character
+vim.opt.softtabstop = 4 -- Number of spaces inserted instead of a TAB character
+vim.opt.shiftwidth = 4 -- Number of spaces inserted when indenting
+-- Preview substitutions live, as you type!
+vim.opt.inccommand = 'split'
+
+-- Show which line your cursor is on
+vim.opt.cursorline = true
+
+-- Minimal number of screen lines to keep above and below the cursor.
+vim.opt.scrolloff = 10
diff --git a/lua/core/plugins.lua b/lua/core/plugins.lua
new file mode 100644
index 00000000..39f54e7e
--- /dev/null
+++ b/lua/core/plugins.lua
@@ -0,0 +1,7 @@
+return {
+  'stevearc/oil.nvim',
+  -- Optional dependencies
+  dependencies = { { 'echasnovski/mini.icons', opts = {} } },
+  'tpope/vim-sleuth', -- Detect tabstop and shiftwidth automatically
+  { 'lewis6991/gitsigns.nvim', opts = 'plugin-options.gitsigns' },
+} --
diff --git a/lua/plugin-options/gitsigns.lua b/lua/plugin-options/gitsigns.lua
new file mode 100644
index 00000000..37b858e6
--- /dev/null
+++ b/lua/plugin-options/gitsigns.lua
@@ -0,0 +1,9 @@
+return {
+  signs = {
+    add = { text = '+' },
+    change = { text = '~' },
+    delete = { text = '_' },
+    topdelete = { text = 'โ€พ' },
+    changedelete = { text = '~' },
+  },
+}