feat(vatsal): Create new config vatsal
kickstart folder contains the original init.lua file. Current init.lua gets it's config from lua.vatsal.plugins which what I created to modularize the code and enable lazy loading. Init to lua now loads all the plugins from vatsal.plugins
This commit is contained in:
		
							parent
							
								
									7a5a4b0c72
								
							
						
					
					
						commit
						47b7622fe7
					
				
							
								
								
									
										16
									
								
								init.lua
								
								
								
								
							
							
						
						
									
										16
									
								
								init.lua
								
								
								
								
							|  | @ -3,7 +3,6 @@ | ||||||
| vim.g.mapleader = ' ' | vim.g.mapleader = ' ' | ||||||
| vim.g.maplocalleader = ' ' | vim.g.maplocalleader = ' ' | ||||||
| 
 | 
 | ||||||
| -- [[ Install `lazy.nvim` plugin manager ]] |  | ||||||
| --    `:help lazy.nvim.txt` for more info | --    `:help lazy.nvim.txt` for more info | ||||||
| local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim' | local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim' | ||||||
| if not vim.loop.fs_stat(lazypath) then | if not vim.loop.fs_stat(lazypath) then | ||||||
|  | @ -18,17 +17,14 @@ if not vim.loop.fs_stat(lazypath) then | ||||||
| end | end | ||||||
| vim.opt.rtp:prepend(lazypath) | vim.opt.rtp:prepend(lazypath) | ||||||
| 
 | 
 | ||||||
| -- Load settings | -- Load options | ||||||
| require('kickstart.settings') | local options = 'vatsal.options.' | ||||||
| require('kickstart.keymaps') | require(options .. 'settings') | ||||||
| require('kickstart.yank-highlight') | require(options .. 'keymaps') | ||||||
|  | require(options .. 'yank-highlight') | ||||||
| 
 | 
 | ||||||
| -- Load plugins | -- Load plugins | ||||||
| require('lazy').setup({ | require('lazy').setup('vatsal.plugins', {}) | ||||||
| 
 |  | ||||||
|   { import = 'kickstart.plugins' }, |  | ||||||
|   { import = 'custom.plugins' }, |  | ||||||
| }, {}) |  | ||||||
| 
 | 
 | ||||||
| -- The line beneath this is called `modeline`. See `:help modeline` | -- The line beneath this is called `modeline`. See `:help modeline` | ||||||
| -- vim: ts=2 sts=2 sw=2 et | -- vim: ts=2 sts=2 sw=2 et | ||||||
|  |  | ||||||
|  | @ -0,0 +1,74 @@ | ||||||
|  | -- autoformat.lua | ||||||
|  | -- | ||||||
|  | -- Use your language server to automatically format your code on save. | ||||||
|  | -- Adds additional commands as well to manage the behavior | ||||||
|  | 
 | ||||||
|  | return { | ||||||
|  |   'neovim/nvim-lspconfig', | ||||||
|  |   config = function() | ||||||
|  |     -- Switch for controlling whether you want autoformatting. | ||||||
|  |     --  Use :KickstartFormatToggle to toggle autoformatting on or off | ||||||
|  |     local format_is_enabled = true | ||||||
|  |     vim.api.nvim_create_user_command('KickstartFormatToggle', function() | ||||||
|  |       format_is_enabled = not format_is_enabled | ||||||
|  |       print('Setting autoformatting to: ' .. tostring(format_is_enabled)) | ||||||
|  |     end, {}) | ||||||
|  | 
 | ||||||
|  |     -- Create an augroup that is used for managing our formatting autocmds. | ||||||
|  |     --      We need one augroup per client to make sure that multiple clients | ||||||
|  |     --      can attach to the same buffer without interfering with each other. | ||||||
|  |     local _augroups = {} | ||||||
|  |     local get_augroup = function(client) | ||||||
|  |       if not _augroups[client.id] then | ||||||
|  |         local group_name = 'kickstart-lsp-format-' .. client.name | ||||||
|  |         local id = vim.api.nvim_create_augroup(group_name, { clear = true }) | ||||||
|  |         _augroups[client.id] = id | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       return _augroups[client.id] | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     -- Whenever an LSP attaches to a buffer, we will run this function. | ||||||
|  |     -- | ||||||
|  |     -- See `:help LspAttach` for more information about this autocmd event. | ||||||
|  |     vim.api.nvim_create_autocmd('LspAttach', { | ||||||
|  |       group = vim.api.nvim_create_augroup('kickstart-lsp-attach-format', { clear = true }), | ||||||
|  |       -- This is where we attach the autoformatting for reasonable clients | ||||||
|  |       callback = function(args) | ||||||
|  |         local client_id = args.data.client_id | ||||||
|  |         local client = vim.lsp.get_client_by_id(client_id) | ||||||
|  |         local bufnr = args.buf | ||||||
|  | 
 | ||||||
|  |         -- Only attach to clients that support document formatting | ||||||
|  |         if not client.server_capabilities.documentFormattingProvider then | ||||||
|  |           return | ||||||
|  |         end | ||||||
|  | 
 | ||||||
|  |         -- Tsserver usually works poorly. Sorry you work with bad languages | ||||||
|  |         -- You can remove this line if you know what you're doing :) | ||||||
|  |         if client.name == 'tsserver' then | ||||||
|  |           return | ||||||
|  |         end | ||||||
|  | 
 | ||||||
|  |         -- Create an autocmd that will run *before* we save the buffer. | ||||||
|  |         --  Run the formatting command for the LSP that has just attached. | ||||||
|  |         vim.api.nvim_create_autocmd('BufWritePre', { | ||||||
|  |           group = get_augroup(client), | ||||||
|  |           buffer = bufnr, | ||||||
|  |           callback = function() | ||||||
|  |             if not format_is_enabled then | ||||||
|  |               return | ||||||
|  |             end | ||||||
|  | 
 | ||||||
|  |             vim.lsp.buf.format { | ||||||
|  |               async = false, | ||||||
|  |               filter = function(c) | ||||||
|  |                 return c.id == client.id | ||||||
|  |               end, | ||||||
|  |             } | ||||||
|  |           end, | ||||||
|  |         }) | ||||||
|  |       end, | ||||||
|  |     }) | ||||||
|  |   end, | ||||||
|  | } | ||||||
|  | @ -7,7 +7,9 @@ | ||||||
| -- kickstart.nvim and not kitchen-sink.nvim ;) | -- kickstart.nvim and not kitchen-sink.nvim ;) | ||||||
| 
 | 
 | ||||||
| return { | return { | ||||||
|  |   -- NOTE: Yes, you can install new plugins here! | ||||||
|   'mfussenegger/nvim-dap', |   'mfussenegger/nvim-dap', | ||||||
|  |   -- NOTE: And you can specify dependencies as well | ||||||
|   dependencies = { |   dependencies = { | ||||||
|     -- Creates a beautiful debugger UI |     -- Creates a beautiful debugger UI | ||||||
|     'rcarriga/nvim-dap-ui', |     'rcarriga/nvim-dap-ui', | ||||||
|  | @ -19,7 +21,6 @@ return { | ||||||
|     -- Add your own debuggers here |     -- Add your own debuggers here | ||||||
|     'leoluz/nvim-dap-go', |     'leoluz/nvim-dap-go', | ||||||
|   }, |   }, | ||||||
|   event = { 'BufReadPre', 'BufNewFile' }, |  | ||||||
|   config = function() |   config = function() | ||||||
|     local dap = require 'dap' |     local dap = require 'dap' | ||||||
|     local dapui = require 'dapui' |     local dapui = require 'dapui' | ||||||
|  |  | ||||||
|  | @ -0,0 +1,669 @@ | ||||||
|  | --[[ | ||||||
|  | 
 | ||||||
|  | ===================================================================== | ||||||
|  | ==================== READ THIS BEFORE CONTINUING ==================== | ||||||
|  | ===================================================================== | ||||||
|  | 
 | ||||||
|  | Kickstart.nvim is *not* a distribution. | ||||||
|  | 
 | ||||||
|  | Kickstart.nvim is a template for your own configuration. | ||||||
|  |   The goal is that you can read every line of code, top-to-bottom, understand | ||||||
|  |   what your configuration is doing, and modify it to suit your needs. | ||||||
|  | 
 | ||||||
|  |   Once you've done that, you should start exploring, configuring and tinkering to | ||||||
|  |   explore Neovim! | ||||||
|  | 
 | ||||||
|  |   If you don't know anything about Lua, I recommend taking some time to read through | ||||||
|  |   a guide. One possible example: | ||||||
|  |   - https://learnxinyminutes.com/docs/lua/ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   And then you can explore or search through `:help lua-guide` | ||||||
|  |   - https://neovim.io/doc/user/lua-guide.html | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Kickstart Guide: | ||||||
|  | 
 | ||||||
|  | I have left several `:help X` comments throughout the init.lua | ||||||
|  | You should run that command and read that help section for more information. | ||||||
|  | 
 | ||||||
|  | In addition, I have some `NOTE:` items throughout the file. | ||||||
|  | These are for you, the reader to help understand what is happening. Feel free to delete | ||||||
|  | them once you know what you're doing, but they should serve as a guide for when you | ||||||
|  | are first encountering a few different constructs in your nvim config. | ||||||
|  | 
 | ||||||
|  | I hope you enjoy your Neovim journey, | ||||||
|  | - TJ | ||||||
|  | 
 | ||||||
|  | P.S. You can delete this when you're done too. It's your config now :) | ||||||
|  | --]] | ||||||
|  | 
 | ||||||
|  | -- Set <space> as the leader key | ||||||
|  | -- See `:help mapleader` | ||||||
|  | --  NOTE: Must happen before plugins are required (otherwise wrong leader will be used) | ||||||
|  | vim.g.mapleader = ' ' | ||||||
|  | vim.g.maplocalleader = ' ' | ||||||
|  | 
 | ||||||
|  | -- [[ Install `lazy.nvim` plugin manager ]] | ||||||
|  | --    https://github.com/folke/lazy.nvim | ||||||
|  | --    `:help lazy.nvim.txt` for more info | ||||||
|  | local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim' | ||||||
|  | if not vim.loop.fs_stat(lazypath) then | ||||||
|  |   vim.fn.system { | ||||||
|  |     'git', | ||||||
|  |     'clone', | ||||||
|  |     '--filter=blob:none', | ||||||
|  |     'https://github.com/folke/lazy.nvim.git', | ||||||
|  |     '--branch=stable', -- latest stable release | ||||||
|  |     lazypath, | ||||||
|  |   } | ||||||
|  | end | ||||||
|  | vim.opt.rtp:prepend(lazypath) | ||||||
|  | 
 | ||||||
|  | -- [[ Configure plugins ]] | ||||||
|  | -- NOTE: Here is where you install your plugins. | ||||||
|  | --  You can configure plugins using the `config` key. | ||||||
|  | -- | ||||||
|  | --  You can also configure plugins after the setup call, | ||||||
|  | --    as they will be available in your neovim runtime. | ||||||
|  | require('lazy').setup({ | ||||||
|  |   -- NOTE: First, some plugins that don't require any configuration | ||||||
|  | 
 | ||||||
|  |   -- Git related plugins | ||||||
|  |   'tpope/vim-fugitive', | ||||||
|  |   'tpope/vim-rhubarb', | ||||||
|  | 
 | ||||||
|  |   -- Detect tabstop and shiftwidth automatically | ||||||
|  |   'tpope/vim-sleuth', | ||||||
|  | 
 | ||||||
|  |   -- NOTE: This is where your plugins related to LSP can be installed. | ||||||
|  |   --  The configuration is done below. Search for lspconfig to find it below. | ||||||
|  |   { | ||||||
|  |     -- LSP Configuration & Plugins | ||||||
|  |     'neovim/nvim-lspconfig', | ||||||
|  |     dependencies = { | ||||||
|  |       -- Automatically install LSPs to stdpath for neovim | ||||||
|  |       { 'williamboman/mason.nvim', config = true }, | ||||||
|  |       'williamboman/mason-lspconfig.nvim', | ||||||
|  | 
 | ||||||
|  |       -- Useful status updates for LSP | ||||||
|  |       -- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})` | ||||||
|  |       { 'j-hui/fidget.nvim',       opts = {} }, | ||||||
|  | 
 | ||||||
|  |       -- Additional lua configuration, makes nvim stuff amazing! | ||||||
|  |       'folke/neodev.nvim', | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   { | ||||||
|  |     -- Autocompletion | ||||||
|  |     'hrsh7th/nvim-cmp', | ||||||
|  |     dependencies = { | ||||||
|  |       -- Snippet Engine & its associated nvim-cmp source | ||||||
|  |       'L3MON4D3/LuaSnip', | ||||||
|  |       'saadparwaiz1/cmp_luasnip', | ||||||
|  | 
 | ||||||
|  |       -- Adds LSP completion capabilities | ||||||
|  |       'hrsh7th/cmp-nvim-lsp', | ||||||
|  |       'hrsh7th/cmp-path', | ||||||
|  | 
 | ||||||
|  |       -- Adds a number of user-friendly snippets | ||||||
|  |       'rafamadriz/friendly-snippets', | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   -- Useful plugin to show you pending keybinds. | ||||||
|  |   { 'folke/which-key.nvim',  opts = {} }, | ||||||
|  |   { | ||||||
|  |     -- Adds git related signs to the gutter, as well as utilities for managing changes | ||||||
|  |     'lewis6991/gitsigns.nvim', | ||||||
|  |     opts = { | ||||||
|  |       -- See `:help gitsigns.txt` | ||||||
|  |       signs = { | ||||||
|  |         add = { text = '+' }, | ||||||
|  |         change = { text = '~' }, | ||||||
|  |         delete = { text = '_' }, | ||||||
|  |         topdelete = { text = '‾' }, | ||||||
|  |         changedelete = { text = '~' }, | ||||||
|  |       }, | ||||||
|  |       on_attach = function(bufnr) | ||||||
|  |         local gs = package.loaded.gitsigns | ||||||
|  | 
 | ||||||
|  |         local function map(mode, l, r, opts) | ||||||
|  |           opts = opts or {} | ||||||
|  |           opts.buffer = bufnr | ||||||
|  |           vim.keymap.set(mode, l, r, opts) | ||||||
|  |         end | ||||||
|  | 
 | ||||||
|  |         -- Navigation | ||||||
|  |         map({ 'n', 'v' }, ']c', function() | ||||||
|  |           if vim.wo.diff then | ||||||
|  |             return ']c' | ||||||
|  |           end | ||||||
|  |           vim.schedule(function() | ||||||
|  |             gs.next_hunk() | ||||||
|  |           end) | ||||||
|  |           return '<Ignore>' | ||||||
|  |         end, { expr = true, desc = 'Jump to next hunk' }) | ||||||
|  | 
 | ||||||
|  |         map({ 'n', 'v' }, '[c', function() | ||||||
|  |           if vim.wo.diff then | ||||||
|  |             return '[c' | ||||||
|  |           end | ||||||
|  |           vim.schedule(function() | ||||||
|  |             gs.prev_hunk() | ||||||
|  |           end) | ||||||
|  |           return '<Ignore>' | ||||||
|  |         end, { expr = true, desc = 'Jump to previous hunk' }) | ||||||
|  | 
 | ||||||
|  |         -- Actions | ||||||
|  |         -- visual mode | ||||||
|  |         map('v', '<leader>hs', function() | ||||||
|  |           gs.stage_hunk { vim.fn.line '.', vim.fn.line 'v' } | ||||||
|  |         end, { desc = 'stage git hunk' }) | ||||||
|  |         map('v', '<leader>hr', function() | ||||||
|  |           gs.reset_hunk { vim.fn.line '.', vim.fn.line 'v' } | ||||||
|  |         end, { desc = 'reset git hunk' }) | ||||||
|  |         -- normal mode | ||||||
|  |         map('n', '<leader>hs', gs.stage_hunk, { desc = 'git stage hunk' }) | ||||||
|  |         map('n', '<leader>hr', gs.reset_hunk, { desc = 'git reset hunk' }) | ||||||
|  |         map('n', '<leader>hS', gs.stage_buffer, { desc = 'git Stage buffer' }) | ||||||
|  |         map('n', '<leader>hu', gs.undo_stage_hunk, { desc = 'undo stage hunk' }) | ||||||
|  |         map('n', '<leader>hR', gs.reset_buffer, { desc = 'git Reset buffer' }) | ||||||
|  |         map('n', '<leader>hp', gs.preview_hunk, { desc = 'preview git hunk' }) | ||||||
|  |         map('n', '<leader>hb', function() | ||||||
|  |           gs.blame_line { full = false } | ||||||
|  |         end, { desc = 'git blame line' }) | ||||||
|  |         map('n', '<leader>hd', gs.diffthis, { desc = 'git diff against index' }) | ||||||
|  |         map('n', '<leader>hD', function() | ||||||
|  |           gs.diffthis '~' | ||||||
|  |         end, { desc = 'git diff against last commit' }) | ||||||
|  | 
 | ||||||
|  |         -- Toggles | ||||||
|  |         map('n', '<leader>tb', gs.toggle_current_line_blame, { desc = 'toggle git blame line' }) | ||||||
|  |         map('n', '<leader>td', gs.toggle_deleted, { desc = 'toggle git show deleted' }) | ||||||
|  | 
 | ||||||
|  |         -- Text object | ||||||
|  |         map({ 'o', 'x' }, 'ih', ':<C-U>Gitsigns select_hunk<CR>', { desc = 'select git hunk' }) | ||||||
|  |       end, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   { | ||||||
|  |     -- Theme inspired by Atom | ||||||
|  |     'navarasu/onedark.nvim', | ||||||
|  |     priority = 1000, | ||||||
|  |     config = function() | ||||||
|  |       vim.cmd.colorscheme 'onedark' | ||||||
|  |     end, | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   { | ||||||
|  |     -- Set lualine as statusline | ||||||
|  |     'nvim-lualine/lualine.nvim', | ||||||
|  |     -- See `:help lualine.txt` | ||||||
|  |     opts = { | ||||||
|  |       options = { | ||||||
|  |         icons_enabled = true, | ||||||
|  |         -- theme = 'auto', | ||||||
|  |         component_separators = '/', | ||||||
|  |         section_separators = '', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     dependencies = { | ||||||
|  |       'nvim-tree/nvim-web-devicons', opt = true | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   { | ||||||
|  |     -- Add indentation guides even on blank lines | ||||||
|  |     'lukas-reineke/indent-blankline.nvim', | ||||||
|  |     -- Enable `lukas-reineke/indent-blankline.nvim` | ||||||
|  |     -- See `:help ibl` | ||||||
|  |     main = 'ibl', | ||||||
|  |     opts = {}, | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   -- "gc" to comment visual regions/lines | ||||||
|  |   { 'numToStr/Comment.nvim', opts = {} }, | ||||||
|  | 
 | ||||||
|  |   -- Fuzzy Finder (files, lsp, etc) | ||||||
|  |   { | ||||||
|  |     'nvim-telescope/telescope.nvim', | ||||||
|  |     branch = '0.1.x', | ||||||
|  |     dependencies = { | ||||||
|  |       'nvim-lua/plenary.nvim', | ||||||
|  |       -- Fuzzy Finder Algorithm which requires local dependencies to be built. | ||||||
|  |       -- Only load if `make` is available. Make sure you have the system | ||||||
|  |       -- requirements installed. | ||||||
|  |       { | ||||||
|  |         'nvim-telescope/telescope-fzf-native.nvim', | ||||||
|  |         -- NOTE: If you are having trouble with this installation, | ||||||
|  |         --       refer to the README for telescope-fzf-native for more instructions. | ||||||
|  |         build = 'make', | ||||||
|  |         cond = function() | ||||||
|  |           return vim.fn.executable 'make' == 1 | ||||||
|  |         end, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   { | ||||||
|  |     -- Highlight, edit, and navigate code | ||||||
|  |     'nvim-treesitter/nvim-treesitter', | ||||||
|  |     dependencies = { | ||||||
|  |       'nvim-treesitter/nvim-treesitter-textobjects', | ||||||
|  |     }, | ||||||
|  |     build = ':TSUpdate', | ||||||
|  |     config = function() | ||||||
|  |       require 'nvim-treesitter.install'.compilers = { 'zig' } | ||||||
|  |     end | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   -- NOTE: Next Step on Your Neovim Journey: Add/Configure additional "plugins" for kickstart | ||||||
|  |   --       These are some example plugins that I've included in the kickstart repository. | ||||||
|  |   --       Uncomment any of the lines below to enable them. | ||||||
|  |   require 'kickstart.plugins.autoformat', | ||||||
|  |   require 'kickstart.plugins.debug', | ||||||
|  | 
 | ||||||
|  |   -- NOTE: The import below can automatically add your own plugins, configuration, etc from `lua/custom/plugins/*.lua` | ||||||
|  |   --    You can use this folder to prevent any conflicts with this init.lua if you're interested in keeping | ||||||
|  |   --    up-to-date with whatever is in the kickstart repo. | ||||||
|  |   --    Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going. | ||||||
|  |   -- | ||||||
|  |   --    For additional information see: https://github.com/folke/lazy.nvim#-structuring-your-plugins | ||||||
|  |   { import = 'custom.plugins' }, | ||||||
|  | }, {}) | ||||||
|  | 
 | ||||||
|  | -- [[ Setting options ]] | ||||||
|  | -- See `:help vim.o` | ||||||
|  | -- NOTE: You can change these options as you wish! | ||||||
|  | 
 | ||||||
|  | -- Set highlight on search | ||||||
|  | vim.o.hlsearch = false | ||||||
|  | 
 | ||||||
|  | -- Make line numbers default | ||||||
|  | vim.wo.number = true | ||||||
|  | 
 | ||||||
|  | -- Enable mouse mode | ||||||
|  | vim.o.mouse = 'a' | ||||||
|  | 
 | ||||||
|  | -- Sync clipboard between OS and Neovim. | ||||||
|  | --  Remove this option if you want your OS clipboard to remain independent. | ||||||
|  | --  See `:help 'clipboard'` | ||||||
|  | vim.o.clipboard = 'unnamedplus' | ||||||
|  | 
 | ||||||
|  | -- Enable break indent | ||||||
|  | vim.o.breakindent = true | ||||||
|  | 
 | ||||||
|  | -- Save undo history | ||||||
|  | vim.o.undofile = true | ||||||
|  | 
 | ||||||
|  | -- Case-insensitive searching UNLESS \C or capital in search | ||||||
|  | vim.o.ignorecase = true | ||||||
|  | vim.o.smartcase = true | ||||||
|  | 
 | ||||||
|  | -- Keep signcolumn on by default | ||||||
|  | vim.wo.signcolumn = 'yes' | ||||||
|  | 
 | ||||||
|  | -- Decrease update time | ||||||
|  | vim.o.updatetime = 250 | ||||||
|  | vim.o.timeoutlen = 300 | ||||||
|  | 
 | ||||||
|  | -- Set completeopt to have a better completion experience | ||||||
|  | vim.o.completeopt = 'menuone,noselect' | ||||||
|  | 
 | ||||||
|  | -- NOTE: You should make sure your terminal supports this | ||||||
|  | vim.o.termguicolors = true | ||||||
|  | 
 | ||||||
|  | -- [[ Basic Keymaps ]] | ||||||
|  | 
 | ||||||
|  | -- Keymaps for better default experience | ||||||
|  | -- See `:help vim.keymap.set()` | ||||||
|  | vim.keymap.set({ 'n', 'v' }, '<Space>', '<Nop>', { silent = true }) | ||||||
|  | 
 | ||||||
|  | -- Remap for dealing with word wrap | ||||||
|  | vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true }) | ||||||
|  | vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true }) | ||||||
|  | 
 | ||||||
|  | -- Diagnostic keymaps | ||||||
|  | vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Go to previous diagnostic message' }) | ||||||
|  | vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Go to next diagnostic message' }) | ||||||
|  | vim.keymap.set('n', '<leader>e', vim.diagnostic.open_float, { desc = 'Open floating diagnostic message' }) | ||||||
|  | vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist, { desc = 'Open diagnostics list' }) | ||||||
|  | 
 | ||||||
|  | -- [[ Highlight on yank ]] | ||||||
|  | -- See `:help vim.highlight.on_yank()` | ||||||
|  | local highlight_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true }) | ||||||
|  | vim.api.nvim_create_autocmd('TextYankPost', { | ||||||
|  |   callback = function() | ||||||
|  |     vim.highlight.on_yank() | ||||||
|  |   end, | ||||||
|  |   group = highlight_group, | ||||||
|  |   pattern = '*', | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | -- [[ Configure Telescope ]] | ||||||
|  | -- See `:help telescope` and `:help telescope.setup()` | ||||||
|  | require('telescope').setup { | ||||||
|  |   defaults = { | ||||||
|  |     mappings = { | ||||||
|  |       i = { | ||||||
|  |         ['<C-u>'] = false, | ||||||
|  |         ['<C-d>'] = false, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | -- Enable telescope fzf native, if installed | ||||||
|  | pcall(require('telescope').load_extension, 'fzf') | ||||||
|  | 
 | ||||||
|  | -- Telescope live_grep in git root | ||||||
|  | -- Function to find the git root directory based on the current buffer's path | ||||||
|  | local function find_git_root() | ||||||
|  |   -- Use the current buffer's path as the starting point for the git search | ||||||
|  |   local current_file = vim.api.nvim_buf_get_name(0) | ||||||
|  |   local current_dir | ||||||
|  |   local cwd = vim.fn.getcwd() | ||||||
|  |   -- If the buffer is not associated with a file, return nil | ||||||
|  |   if current_file == '' then | ||||||
|  |     current_dir = cwd | ||||||
|  |   else | ||||||
|  |     -- Extract the directory from the current file's path | ||||||
|  |     current_dir = vim.fn.fnamemodify(current_file, ':h') | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   -- Find the Git root directory from the current file's path | ||||||
|  |   local git_root = vim.fn.systemlist('git -C ' .. vim.fn.escape(current_dir, ' ') .. ' rev-parse --show-toplevel') | ||||||
|  |       [1] | ||||||
|  |   if vim.v.shell_error ~= 0 then | ||||||
|  |     print 'Not a git repository. Searching on current working directory' | ||||||
|  |     return cwd | ||||||
|  |   end | ||||||
|  |   return git_root | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | -- Custom live_grep function to search in git root | ||||||
|  | local function live_grep_git_root() | ||||||
|  |   local git_root = find_git_root() | ||||||
|  |   if git_root then | ||||||
|  |     require('telescope.builtin').live_grep { | ||||||
|  |       search_dirs = { git_root }, | ||||||
|  |     } | ||||||
|  |   end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | vim.api.nvim_create_user_command('LiveGrepGitRoot', live_grep_git_root, {}) | ||||||
|  | 
 | ||||||
|  | -- See `:help telescope.builtin` | ||||||
|  | vim.keymap.set('n', '<leader>?', require('telescope.builtin').oldfiles, { desc = '[?] Find recently opened files' }) | ||||||
|  | vim.keymap.set('n', '<leader><space>', require('telescope.builtin').buffers, { desc = '[ ] Find existing buffers' }) | ||||||
|  | vim.keymap.set('n', '<leader>/', function() | ||||||
|  |   -- You can pass additional configuration to telescope to change theme, layout, etc. | ||||||
|  |   require('telescope.builtin').current_buffer_fuzzy_find(require('telescope.themes').get_dropdown { | ||||||
|  |     winblend = 10, | ||||||
|  |     previewer = false, | ||||||
|  |   }) | ||||||
|  | end, { desc = '[/] Fuzzily search in current buffer' }) | ||||||
|  | 
 | ||||||
|  | local function telescope_live_grep_open_files() | ||||||
|  |   require('telescope.builtin').live_grep { | ||||||
|  |     grep_open_files = true, | ||||||
|  |     prompt_title = 'Live Grep in Open Files', | ||||||
|  |   } | ||||||
|  | end | ||||||
|  | vim.keymap.set('n', '<leader>s/', telescope_live_grep_open_files, { desc = '[S]earch [/] in Open Files' }) | ||||||
|  | vim.keymap.set('n', '<leader>ss', require('telescope.builtin').builtin, { desc = '[S]earch [S]elect Telescope' }) | ||||||
|  | vim.keymap.set('n', '<leader>gf', require('telescope.builtin').git_files, { desc = 'Search [G]it [F]iles' }) | ||||||
|  | vim.keymap.set('n', '<leader>sf', require('telescope.builtin').find_files, { desc = '[S]earch [F]iles' }) | ||||||
|  | vim.keymap.set('n', '<leader>sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' }) | ||||||
|  | vim.keymap.set('n', '<leader>sw', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' }) | ||||||
|  | vim.keymap.set('n', '<leader>sg', require('telescope.builtin').live_grep, { desc = '[S]earch by [G]rep' }) | ||||||
|  | vim.keymap.set('n', '<leader>sG', ':LiveGrepGitRoot<cr>', { desc = '[S]earch by [G]rep on Git Root' }) | ||||||
|  | vim.keymap.set('n', '<leader>sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' }) | ||||||
|  | vim.keymap.set('n', '<leader>sr', require('telescope.builtin').resume, { desc = '[S]earch [R]esume' }) | ||||||
|  | 
 | ||||||
|  | -- [[ Configure Treesitter ]] | ||||||
|  | -- See `:help nvim-treesitter` | ||||||
|  | -- Defer Treesitter setup after first render to improve startup time of 'nvim {filename}' | ||||||
|  | vim.defer_fn(function() | ||||||
|  |   require('nvim-treesitter.configs').setup { | ||||||
|  |     -- Add languages to be installed here that you want installed for treesitter | ||||||
|  |     ensure_installed = { 'c', 'cpp', 'go', 'lua', 'python', 'rust', 'tsx', 'javascript', 'typescript', 'vimdoc', 'vim', 'bash', 'markdown', 'html', 'css' }, | ||||||
|  | 
 | ||||||
|  |     -- Autoinstall languages that are not installed. Defaults to false (but you can change for yourself!) | ||||||
|  |     auto_install = true, | ||||||
|  | 
 | ||||||
|  |     highlight = { enable = true }, | ||||||
|  |     indent = { enable = true }, | ||||||
|  |     incremental_selection = { | ||||||
|  |       enable = true, | ||||||
|  |       keymaps = { | ||||||
|  |         init_selection = '<c-space>', | ||||||
|  |         node_incremental = '<c-space>', | ||||||
|  |         scope_incremental = '<c-s>', | ||||||
|  |         node_decremental = '<M-space>', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     textobjects = { | ||||||
|  |       select = { | ||||||
|  |         enable = true, | ||||||
|  |         lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim | ||||||
|  |         keymaps = { | ||||||
|  |           -- You can use the capture groups defined in textobjects.scm | ||||||
|  |           ['aa'] = '@parameter.outer', | ||||||
|  |           ['ia'] = '@parameter.inner', | ||||||
|  |           ['af'] = '@function.outer', | ||||||
|  |           ['if'] = '@function.inner', | ||||||
|  |           ['ac'] = '@class.outer', | ||||||
|  |           ['ic'] = '@class.inner', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       move = { | ||||||
|  |         enable = true, | ||||||
|  |         set_jumps = true, -- whether to set jumps in the jumplist | ||||||
|  |         goto_next_start = { | ||||||
|  |           [']m'] = '@function.outer', | ||||||
|  |           [']]'] = '@class.outer', | ||||||
|  |         }, | ||||||
|  |         goto_next_end = { | ||||||
|  |           [']M'] = '@function.outer', | ||||||
|  |           [']['] = '@class.outer', | ||||||
|  |         }, | ||||||
|  |         goto_previous_start = { | ||||||
|  |           ['[m'] = '@function.outer', | ||||||
|  |           ['[['] = '@class.outer', | ||||||
|  |         }, | ||||||
|  |         goto_previous_end = { | ||||||
|  |           ['[M'] = '@function.outer', | ||||||
|  |           ['[]'] = '@class.outer', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       swap = { | ||||||
|  |         enable = true, | ||||||
|  |         swap_next = { | ||||||
|  |           ['<leader>a'] = '@parameter.inner', | ||||||
|  |         }, | ||||||
|  |         swap_previous = { | ||||||
|  |           ['<leader>A'] = '@parameter.inner', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   } | ||||||
|  | end, 0) | ||||||
|  | 
 | ||||||
|  | -- [[ Configure LSP ]] | ||||||
|  | --  This function gets run when an LSP connects to a particular buffer. | ||||||
|  | local on_attach = function(_, bufnr) | ||||||
|  |   -- NOTE: Remember that lua is a real programming language, and as such it is possible | ||||||
|  |   -- to define small helper and utility functions so you don't have to repeat yourself | ||||||
|  |   -- many times. | ||||||
|  |   -- | ||||||
|  |   -- In this case, we create a function that lets us more easily define mappings specific | ||||||
|  |   -- for LSP related items. It sets the mode, buffer and description for us each time. | ||||||
|  |   local nmap = function(keys, func, desc) | ||||||
|  |     if desc then | ||||||
|  |       desc = 'LSP: ' .. desc | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame') | ||||||
|  |   -- nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction') Use keys to lazy load plugin(telescope-ui) | ||||||
|  | 
 | ||||||
|  |   nmap('gd', require('telescope.builtin').lsp_definitions, '[G]oto [D]efinition') | ||||||
|  |   nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') | ||||||
|  |   nmap('gI', require('telescope.builtin').lsp_implementations, '[G]oto [I]mplementation') | ||||||
|  |   nmap('<leader>D', require('telescope.builtin').lsp_type_definitions, 'Type [D]efinition') | ||||||
|  |   nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') | ||||||
|  |   nmap('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') | ||||||
|  | 
 | ||||||
|  |   -- See `:help K` for why this keymap | ||||||
|  |   nmap('K', vim.lsp.buf.hover, 'Hover Documentation') | ||||||
|  |   nmap('<C-k>', vim.lsp.buf.signature_help, 'Signature Documentation') | ||||||
|  | 
 | ||||||
|  |   -- Lesser used LSP functionality | ||||||
|  |   nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') | ||||||
|  |   nmap('<leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder') | ||||||
|  |   nmap('<leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder') | ||||||
|  |   nmap('<leader>wl', function() | ||||||
|  |     print(vim.inspect(vim.lsp.buf.list_workspace_folders())) | ||||||
|  |   end, '[W]orkspace [L]ist Folders') | ||||||
|  | 
 | ||||||
|  |   -- Create a command `:Format` local to the LSP buffer | ||||||
|  |   vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_) | ||||||
|  |     vim.lsp.buf.format() | ||||||
|  |   end, { desc = 'Format current buffer with LSP' }) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | -- document existing key chains | ||||||
|  | require('which-key').register { | ||||||
|  |   ['<leader>c'] = { name = '[C]ode', _ = 'which_key_ignore' }, | ||||||
|  |   ['<leader>d'] = { name = '[D]ocument', _ = 'which_key_ignore' }, | ||||||
|  |   ['<leader>g'] = { name = '[G]it', _ = 'which_key_ignore' }, | ||||||
|  |   ['<leader>h'] = { name = 'Git [H]unk', _ = 'which_key_ignore' }, | ||||||
|  |   ['<leader>r'] = { name = '[R]ename', _ = 'which_key_ignore' }, | ||||||
|  |   ['<leader>s'] = { name = '[S]earch', _ = 'which_key_ignore' }, | ||||||
|  |   ['<leader>t'] = { name = '[T]oggle', _ = 'which_key_ignore' }, | ||||||
|  |   ['<leader>w'] = { name = '[W]orkspace', _ = 'which_key_ignore' }, | ||||||
|  | } | ||||||
|  | -- register which-key VISUAL mode | ||||||
|  | -- required for visual <leader>hs (hunk stage) to work | ||||||
|  | require('which-key').register({ | ||||||
|  |   ['<leader>'] = { name = 'VISUAL <leader>' }, | ||||||
|  |   ['<leader>h'] = { 'Git [H]unk' }, | ||||||
|  | }, { mode = 'v' }) | ||||||
|  | 
 | ||||||
|  | -- mason-lspconfig requires that these setup functions are called in this order | ||||||
|  | -- before setting up the servers. | ||||||
|  | require('mason').setup() | ||||||
|  | require('mason-lspconfig').setup() | ||||||
|  | 
 | ||||||
|  | -- Enable the following language servers | ||||||
|  | --  Feel free to add/remove any LSPs that you want here. They will automatically be installed. | ||||||
|  | -- | ||||||
|  | --  Add any additional override configuration in the following tables. They will be passed to | ||||||
|  | --  the `settings` field of the server config. You must look up that documentation yourself. | ||||||
|  | -- | ||||||
|  | --  If you want to override the default filetypes that your language server will attach to you can | ||||||
|  | --  define the property 'filetypes' to the map in question. | ||||||
|  | local servers = { | ||||||
|  |   clangd = {}, | ||||||
|  |   -- gopls = {}, | ||||||
|  |   -- pyright = {}, | ||||||
|  |   rust_analyzer = {}, | ||||||
|  |   tsserver = {}, | ||||||
|  |   html = { filetypes = { 'html', 'twig', 'hbs' } }, | ||||||
|  | 
 | ||||||
|  |   lua_ls = { | ||||||
|  |     Lua = { | ||||||
|  |       workspace = { checkThirdParty = false }, | ||||||
|  |       telemetry = { enable = false }, | ||||||
|  |       -- NOTE: toggle below to ignore Lua_LS's noisy `missing-fields` warnings | ||||||
|  |       -- diagnostics = { disable = { 'missing-fields' } }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | -- Setup neovim lua configuration | ||||||
|  | require('neodev').setup() | ||||||
|  | 
 | ||||||
|  | -- nvim-cmp supports additional completion capabilities, so broadcast that to servers | ||||||
|  | local capabilities = vim.lsp.protocol.make_client_capabilities() | ||||||
|  | capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) | ||||||
|  | 
 | ||||||
|  | -- Ensure the servers above are installed | ||||||
|  | local mason_lspconfig = require 'mason-lspconfig' | ||||||
|  | 
 | ||||||
|  | mason_lspconfig.setup { | ||||||
|  |   ensure_installed = vim.tbl_keys(servers), | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | mason_lspconfig.setup_handlers { | ||||||
|  |   function(server_name) | ||||||
|  |     require('lspconfig')[server_name].setup { | ||||||
|  |       capabilities = capabilities, | ||||||
|  |       on_attach = on_attach, | ||||||
|  |       settings = servers[server_name], | ||||||
|  |       filetypes = (servers[server_name] or {}).filetypes, | ||||||
|  |     } | ||||||
|  |   end, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | -- [[ Configure nvim-cmp ]] | ||||||
|  | -- See `:help cmp` | ||||||
|  | local cmp = require 'cmp' | ||||||
|  | local luasnip = require 'luasnip' | ||||||
|  | require('luasnip.loaders.from_vscode').lazy_load() | ||||||
|  | luasnip.config.setup {} | ||||||
|  | 
 | ||||||
|  | cmp.setup { | ||||||
|  |   snippet = { | ||||||
|  |     expand = function(args) | ||||||
|  |       luasnip.lsp_expand(args.body) | ||||||
|  |     end, | ||||||
|  |   }, | ||||||
|  |   completion = { | ||||||
|  |     completeopt = 'menu,menuone,noinsert', | ||||||
|  |   }, | ||||||
|  |   mapping = cmp.mapping.preset.insert { | ||||||
|  |     ['<C-n>'] = cmp.mapping.select_next_item(), | ||||||
|  |     ['<C-p>'] = cmp.mapping.select_prev_item(), | ||||||
|  |     ['<C-b>'] = cmp.mapping.scroll_docs(-4), | ||||||
|  |     ['<C-f>'] = cmp.mapping.scroll_docs(4), | ||||||
|  |     ['<C-Space>'] = cmp.mapping.complete {}, | ||||||
|  |     ['<CR>'] = cmp.mapping.confirm { | ||||||
|  |       behavior = cmp.ConfirmBehavior.Replace, | ||||||
|  |       select = true, | ||||||
|  |     }, | ||||||
|  |     ['<Tab>'] = cmp.mapping(function(fallback) | ||||||
|  |       if cmp.visible() then | ||||||
|  |         cmp.select_next_item() | ||||||
|  |       elseif luasnip.expand_or_locally_jumpable() then | ||||||
|  |         luasnip.expand_or_jump() | ||||||
|  |       else | ||||||
|  |         fallback() | ||||||
|  |       end | ||||||
|  |     end, { 'i', 's' }), | ||||||
|  |     ['<S-Tab>'] = cmp.mapping(function(fallback) | ||||||
|  |       if cmp.visible() then | ||||||
|  |         cmp.select_prev_item() | ||||||
|  |       elseif luasnip.locally_jumpable(-1) then | ||||||
|  |         luasnip.jump(-1) | ||||||
|  |       else | ||||||
|  |         fallback() | ||||||
|  |       end | ||||||
|  |     end, { 'i', 's' }), | ||||||
|  |   }, | ||||||
|  |   sources = { | ||||||
|  |     { name = 'nvim_lsp' }, | ||||||
|  |     { name = 'luasnip' }, | ||||||
|  |     { name = 'path' }, | ||||||
|  |   }, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | -- The line beneath this is called `modeline`. See `:help modeline` | ||||||
|  | -- vim: ts=2 sts=2 sw=2 et | ||||||
|  | 
 | ||||||
|  | @ -0,0 +1,325 @@ | ||||||
|  | math.randomseed(os.time()) | ||||||
|  | local _ascii_arts = { | ||||||
|  |   kraken = { | ||||||
|  |     "                                   ", | ||||||
|  |     "                                   ", | ||||||
|  |     "                                   ", | ||||||
|  |     "   ⣴⣶⣤⡤⠦⣤⣀⣤⠆     ⣈⣭⣿⣶⣿⣦⣼⣆          ", | ||||||
|  |     "    ⠉⠻⢿⣿⠿⣿⣿⣶⣦⠤⠄⡠⢾⣿⣿⡿⠋⠉⠉⠻⣿⣿⡛⣦       ", | ||||||
|  |     "          ⠈⢿⣿⣟⠦ ⣾⣿⣿⣷    ⠻⠿⢿⣿⣧⣄     ", | ||||||
|  |     "           ⣸⣿⣿⢧ ⢻⠻⣿⣿⣷⣄⣀⠄⠢⣀⡀⠈⠙⠿⠄    ", | ||||||
|  |     "          ⢠⣿⣿⣿⠈    ⣻⣿⣿⣿⣿⣿⣿⣿⣛⣳⣤⣀⣀   ", | ||||||
|  |     "   ⢠⣧⣶⣥⡤⢄ ⣸⣿⣿⠘  ⢀⣴⣿⣿⡿⠛⣿⣿⣧⠈⢿⠿⠟⠛⠻⠿⠄  ", | ||||||
|  |     "  ⣰⣿⣿⠛⠻⣿⣿⡦⢹⣿⣷   ⢊⣿⣿⡏  ⢸⣿⣿⡇ ⢀⣠⣄⣾⠄   ", | ||||||
|  |     " ⣠⣿⠿⠛ ⢀⣿⣿⣷⠘⢿⣿⣦⡀ ⢸⢿⣿⣿⣄ ⣸⣿⣿⡇⣪⣿⡿⠿⣿⣷⡄  ", | ||||||
|  |     " ⠙⠃   ⣼⣿⡟  ⠈⠻⣿⣿⣦⣌⡇⠻⣿⣿⣷⣿⣿⣿ ⣿⣿⡇ ⠛⠻⢷⣄ ", | ||||||
|  |     "      ⢻⣿⣿⣄   ⠈⠻⣿⣿⣿⣷⣿⣿⣿⣿⣿⡟ ⠫⢿⣿⡆     ", | ||||||
|  |     "       ⠻⣿⣿⣿⣿⣶⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⡟⢀⣀⣤⣾⡿⠃     ", | ||||||
|  |   }, | ||||||
|  |   alien = { | ||||||
|  |     "            :h-                                  Nhy`               ", | ||||||
|  |     "           -mh.                           h.    `Ndho               ", | ||||||
|  |     "           hmh+                          oNm.   oNdhh               ", | ||||||
|  |     "          `Nmhd`                        /NNmd  /NNhhd               ", | ||||||
|  |     "          -NNhhy                      `hMNmmm`+NNdhhh               ", | ||||||
|  |     "          .NNmhhs              ```....`..-:/./mNdhhh+               ", | ||||||
|  |     "           mNNdhhh-     `.-::///+++////++//:--.`-/sd`               ", | ||||||
|  |     "           oNNNdhhdo..://++//++++++/+++//++///++/-.`                ", | ||||||
|  |     "      y.   `mNNNmhhhdy+/++++//+/////++//+++///++////-` `/oos:       ", | ||||||
|  |     " .    Nmy:  :NNNNmhhhhdy+/++/+++///:.....--:////+++///:.`:s+        ", | ||||||
|  |     " h-   dNmNmy oNNNNNdhhhhy:/+/+++/-         ---:/+++//++//.`         ", | ||||||
|  |     " hd+` -NNNy`./dNNNNNhhhh+-://///    -+oo:`  ::-:+////++///:`        ", | ||||||
|  |     " /Nmhs+oss-:++/dNNNmhho:--::///    /mmmmmo  ../-///++///////.       ", | ||||||
|  |     "  oNNdhhhhhhhs//osso/:---:::///    /yyyyso  ..o+-//////////:/.      ", | ||||||
|  |     "   /mNNNmdhhhh/://+///::://////     -:::- ..+sy+:////////::/:/.     ", | ||||||
|  |     "     /hNNNdhhs--:/+++////++/////.      ..-/yhhs-/////////::/::/`    ", | ||||||
|  |     "       .ooo+/-::::/+///////++++//-/ossyyhhhhs/:///////:::/::::/:    ", | ||||||
|  |     "       -///:::::::////++///+++/////:/+ooo+/::///////.::://::---+`   ", | ||||||
|  |     "       /////+//++++/////+////-..//////////::-:::--`.:///:---:::/:   ", | ||||||
|  |     "       //+++//++++++////+++///::--                 .::::-------::   ", | ||||||
|  |     "       :/++++///////////++++//////.                -:/:----::../-   ", | ||||||
|  |     "       -/++++//++///+//////////////               .::::---:::-.+`   ", | ||||||
|  |     "       `////////////////////////////:.            --::-----...-/    ", | ||||||
|  |     "        -///://////////////////////::::-..      :-:-:-..-::.`.+`    ", | ||||||
|  |     "         :/://///:///::://::://::::::/:::::::-:---::-.-....``/- -   ", | ||||||
|  |     "           ::::://::://::::::::::::::----------..-:....`.../- -+oo/ ", | ||||||
|  |     "            -/:::-:::::---://:-::-::::----::---.-.......`-/.      ``", | ||||||
|  |     "           s-`::--:::------:////----:---.-:::...-.....`./:          ", | ||||||
|  |     "          yMNy.`::-.--::..-dmmhhhs-..-.-.......`.....-/:`           ", | ||||||
|  |     "         oMNNNh. `-::--...:NNNdhhh/.--.`..``.......:/-              ", | ||||||
|  |     "        :dy+:`      .-::-..NNNhhd+``..`...````.-::-`                ", | ||||||
|  |     "                        .-:mNdhh:.......--::::-`                    ", | ||||||
|  |     "                           yNh/..------..`                          ", | ||||||
|  |     "                                                                    ", | ||||||
|  |   }, | ||||||
|  |   logo = { | ||||||
|  |     "      ░░                                                  ░░      ", | ||||||
|  |     "      ████                                              ████      ", | ||||||
|  |     "      ██▓▓██                                          ██  ██      ", | ||||||
|  |     "      ██▓▓▓▓██                                      ██    ██      ", | ||||||
|  |     "  ██████▓▓▓▓▓▓██████████████████████████████████████      ██████  ", | ||||||
|  |     "  ██░░░░░░▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      ░░░░░░██  ", | ||||||
|  |     "  ██▓▓▒▒▒▒▒▒▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒      ▒▒▒▒▒▒  ██  ", | ||||||
|  |     "  ██▓▓▒▒▒▒▒▒▒▒▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒▒▒      ░░▒▒▒▒    ██  ", | ||||||
|  |     "  ██░░▓▓▓▓▒▒▒▒▒▒▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒▒▒    ▒▒▒▒▒▒    ░░██  ", | ||||||
|  |     "  ██░░▓▓▓▓▓▓▓▓▒▒▒▒▓▓▒▒▒▒▒▒▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒▒▒  ▒▒▒▒        ░░██  ", | ||||||
|  |     "  ██░░▒▒▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒  ▒▒▒▒▒▒        ▒▒░░██  ", | ||||||
|  |     "  ██▒▒▒▒▒▒▓▓▓▓▓▓▒▒▒▒▒▒▓▓▓▓▒▒▒▒▒▒░░▒▒▒▒▒▒    ▒▒▒▒        ▒▒▒▒  ██  ", | ||||||
|  |     "  ██▓▓▓▓▓▓▒▒▒▒▓▓▓▓▒▒▒▒▒▒▓▓▓▓▒▒▒▒░░▒▒▒▒    ▒▒▒▒▒▒    ▒▒▒▒      ██  ", | ||||||
|  |     "  ██░░▓▓▓▓▒▒▒▒▒▒▓▓▒▒▒▒▒▒▒▒▓▓▒▒▒▒░░▒▒    ░░▒▒  ▒▒  ░░▒▒      ░░██  ", | ||||||
|  |     "  ██▒▒▒▒▓▓▓▓▒▒▒▒▒▒▒▒▓▓▒▒▒▒▒▒▓▓    ▒▒  ▒▒▒▒    ▒▒▒▒▒▒      ▒▒  ██  ", | ||||||
|  |     "  ██▓▓▓▓▒▒▓▓▓▓▓▓▒▒▒▒▓▓▓▓▓▓▒▒      ▒▒▒▒▒▒      ▒▒▒▒      ▒▒    ██  ", | ||||||
|  |     "  ██░░▓▓▓▓▒▒▒▒▓▓▒▒▓▓▒▒▒▒▓▓        ▒▒▒▒    ▒▒▒▒  ▒▒  ▒▒▒▒    ░░██  ", | ||||||
|  |     "  ██░░▓▓▓▓▓▓▓▓▒▒▒▒▓▓▒▒▒▒      ░░░░▒▒▒▒  ░░▒▒    ▒▒▒▒        ░░██  ", | ||||||
|  |     "  ██░░▒▒▓▓▓▓▓▓▓▓▒▒▒▒▓▓▓▓    ▒▒▒▒░░  ▒▒▒▒▒▒    ▒▒▒▒        ▒▒░░██  ", | ||||||
|  |     "  ██░░░░░░▓▓▓▓▓▓░░░░░░▓▓  ░░░░      ░░      ░░░░░░      ░░░░░░██  ", | ||||||
|  |     "  ██░░▒▒▒▒▒▒▓▓▓▓░░▒▒▒▒▒▒▒▒▒▒      ░░▒▒    ░░    ▒▒    ░░▒▒▒▒░░██  ", | ||||||
|  |     "  ██░░▓▓▓▓▒▒▒▒▓▓▒▒▓▓▓▓▓▓▒▒    ▒▒░░  ▒▒▒▒▒▒      ▒▒  ▒▒▒▒    ░░██  ", | ||||||
|  |     "  ██░░▒▒▓▓▓▓▓▓▒▒▒▒▒▒▓▓▓▓    ▒▒      ▒▒▒▒      ▒▒▒▒▒▒      ▒▒░░██  ", | ||||||
|  |     "  ██░░▒▒▓▓▓▓▓▓▓▓▒▒▓▓▒▒▓▓  ▒▒      ▒▒▒▒      ▒▒  ▒▒        ▒▒░░██  ", | ||||||
|  |     "  ██░░▒▒▒▒▒▒▓▓▓▓▒▒▓▓▓▓▒▒▒▒    ▒▒░░  ▒▒    ▒▒    ▒▒    ▒▒▒▒▒▒░░██  ", | ||||||
|  |     "  ██░░▒▒▓▓▒▒▒▒▒▒▒▒▓▓▓▓▓▓▒▒  ▒▒      ▒▒▒▒▒▒      ▒▒▒▒▒▒▒▒  ▒▒░░██  ", | ||||||
|  |     "  ██░░▒▒▓▓▓▓▓▓▓▓▒▒▒▒▒▒▓▓  ▒▒      ▒▒▒▒      ▒▒▒▒▒▒        ▒▒░░██  ", | ||||||
|  |     "  ██░░▒▒▒▒▓▓▓▓▓▓▒▒▒▒▒▒▒▒░░    ▒▒░░▒▒▒▒    ░░▒▒  ▒▒      ▒▒▒▒░░██  ", | ||||||
|  |     "  ██░░▒▒▒▒▒▒▒▒▓▓▒▒▓▓▓▓▓▓▒▒  ▒▒      ▒▒▒▒▒▒      ▒▒  ▒▒▒▒▒▒▒▒░░██  ", | ||||||
|  |     "  ██░░▒▒▒▒▓▓▓▓▒▒▒▒▒▒▓▓▓▓  ▒▒      ▒▒▒▒        ▒▒▒▒▒▒    ▒▒▒▒░░██  ", | ||||||
|  |     "  ██░░▒▒▒▒▒▒▓▓▓▓▒▒▒▒▒▒▒▒░░  ▒▒▒▒░░▒▒▒▒    ░░▒▒▒▒      ░░▒▒▒▒░░██  ", | ||||||
|  |     "  ██░░▒▒▒▒▒▒▒▒▓▓▓▓▒▒▓▓▓▓  ▒▒▒▒      ▒▒▒▒▒▒    ▒▒    ▒▒▒▒▒▒▒▒░░██  ", | ||||||
|  |     "  ██░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▒▒▒▒  ▒▒░░▒▒        ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░██  ", | ||||||
|  |     "  ██░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒  ▒▒▒▒    ▒▒    ░░▒▒▒▒      ▒▒▒▒▒▒▒▒░░██  ", | ||||||
|  |     "  ██░░░░▒▒▒▒▒▒▒▒▓▓▓▓▒▒▒▒▒▒      ░░▒▒▒▒      ▒▒    ▒▒▒▒▒▒▒▒░░░░██  ", | ||||||
|  |     "  ██████░░░░▒▒▒▒▒▒▓▓▒▒▒▒    ▒▒▒▒░░        ▒▒▒▒  ▒▒▒▒▒▒░░░░██████  ", | ||||||
|  |     "        ████░░░░▒▒▒▒▒▒    ░░          ▒▒░░▒▒▒▒▒▒▒▒░░░░████        ", | ||||||
|  |     "            ████░░░░▒▒      ▒▒    ▒▒▒▒▓▓▓▓▓▓▒▒░░░░████            ", | ||||||
|  |     "                ██      ▒▒▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒▓▓▓▓▓▓██                ", | ||||||
|  |     "              ██    ████░░░░▒▒▒▒░░▒▒▒▒░░░░████▓▓▓▓██              ", | ||||||
|  |     "            ██    ██    ████░░░░░░░░░░████    ██▓▓▓▓██            ", | ||||||
|  |     "          ████████          ████░░████          ████████          ", | ||||||
|  |     "                                ██                                ", | ||||||
|  |   }, | ||||||
|  |   fsociety_frankfurt = { | ||||||
|  |     [[    .....             .x+=:.                            .                    s                ]], | ||||||
|  |     [[ .H8888888x.  '`+    z`    ^%                          @88>                 :8      ..        ]], | ||||||
|  |     [[:888888888888x.  !      .   <k        u.               %8P                 .88     @L         ]], | ||||||
|  |     [[8~    `"*88888888"    .@8Ned8"  ...ue888b        .      .         .u      :888ooo 9888i   .dL ]], | ||||||
|  |     [[!      .  `f""""    .@^%8888"   888R Y888r  .udR88N   .@88u    ud8888.  -*8888888 `Y888k:*888.]], | ||||||
|  |     [[ ~:...-` :8L <)88: x88:  `)8b.  888R I888> <888'888k ''888E` :888'8888.   8888      888E  888I]], | ||||||
|  |     [[    .   :888:>X88! 8888N=*8888  888R I888> 9888 'Y"    888E  d888 '88%"   8888      888E  888I]], | ||||||
|  |     [[ :~"88x 48888X ^`   %8"    R88  888R I888> 9888        888E  8888.+"      8888      888E  888I]], | ||||||
|  |     [[<  :888k'88888X      @8Wou 9%  u8888cJ888  9888        888E  8888L       .8888Lu=   888E  888I]], | ||||||
|  |     [[  d8888f '88888X   .888888P`    "*888*P"   ?8888u../   888&  '8888c. .+  ^%888*    x888N><888']], | ||||||
|  |     [[ :8888!    ?8888>  `   ^"F        'Y"       "8888P'    R888"  "88888%      'Y"      "88"  888 ]], | ||||||
|  |     [[ X888!      8888~                             "P'       ""      "YP'                      88F ]], | ||||||
|  |     [[ '888       X88f                                                                         98"  ]], | ||||||
|  |     [[  '%8:     .8*"                                                                        ./"    ]], | ||||||
|  |     [[     ^----~"`                                                                         ~`      ]], | ||||||
|  |   }, | ||||||
|  |   fsociety_aligator = { | ||||||
|  |     [[      :::::::::: ::::::::   ::::::::   :::::::: ::::::::::: :::::::::: ::::::::::: :::   ::: ]], | ||||||
|  |     [[     :+:       :+:    :+: :+:    :+: :+:    :+:    :+:     :+:            :+:     :+:   :+:  ]], | ||||||
|  |     [[    +:+       +:+        +:+    +:+ +:+           +:+     +:+            +:+      +:+ +:+    ]], | ||||||
|  |     [[   :#::+::#  +#++:++#++ +#+    +:+ +#+           +#+     +#++:++#       +#+       +#++:      ]], | ||||||
|  |     [[  +#+              +#+ +#+    +#+ +#+           +#+     +#+            +#+        +#+        ]], | ||||||
|  |     [[ #+#       #+#    #+# #+#    #+# #+#    #+#    #+#     #+#            #+#        #+#         ]], | ||||||
|  |     [[###        ########   ########   ######## ########### ##########     ###        ###          ]], | ||||||
|  |   }, | ||||||
|  |   hacker_face = { | ||||||
|  |     [[⠀⠀⠀⢀⣴⣾⣿⣿⣿⡶⢦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⠴⢾⣿⣿⣿⣷⣦⡀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣷⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣡⣴⣾⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀]], | ||||||
|  |     [[⠀⠀⠉⠀⠀⠀⠀⠈⠙⠻⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀⣰⣿⣿⣿⡿⠛⠉⠁⠀⠀⠀⠈⠉⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣯⠁⠀⠀⠀⠀⠀⢈⣿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⢀⡴⢖⣛⣧⣴⣶⣤⣄⠹⡆⡀⠀⠀⠀⠀⡼⢃⣤⣴⣶⣧⣽⣛⡲⣤⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⢱⣄⣴⣟⠾⣿⣿⣿⣿⣿⣿⣿⡇⠀⡇⠀⠀⠀⡇⠀⣿⣿⣿⣿⣿⣿⣿⣿⣞⣷⣄⣴⠃⠀]], | ||||||
|  |     [[⢠⠟⠉⠉⠉⠛⠓⠿⠏⠸⠟⠛⠉⠀⢠⡇⠀⠀⠀⣿⠀⠀⠉⠛⠻⠇⠿⠟⠛⠋⠉⠉⠙⠻⡀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⡇⠀⠀⠀⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡾⢿⡇⠀⠀⠀⢿⠿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⡄⠀⠀⠀⠀⠀⠀⠀⣀⣤⢴⠏⠀⣸⠁⠀⠀⠀⢸⡆⠈⢳⡀⣤⡀⠀⠀⠀⠀⠀⠀⠀⡄⠀]], | ||||||
|  |     [[⠀⢹⣶⢤⣤⡤⠴⠶⠛⠉⠀⠸⠀⣄⢻⣄⠀⠀⢀⣸⢃⣀⠰⠃⠈⠙⠓⠶⠤⣤⣤⢤⣾⠃⠀]], | ||||||
|  |     [[⠀⠈⢿⣆⠻⣿⣄⠀⠀⠀⠀⠀⠀⠉⣱⣬⣍⣉⣯⣥⡉⠁⠀⠀⠀⠀⠀⠀⣴⣿⢃⣾⡏⠀⠀]], | ||||||
|  |     [[⠀⠀⠈⢿⣆⠹⣿⣧⣀⣀⣀⣀⣤⣴⣿⣿⠟⠙⢿⣿⣿⣦⣄⣀⣀⣀⣠⣾⡿⠁⣼⠟⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠈⢿⣦⡈⠻⠿⠿⠿⠿⢿⣿⣿⣋⣀⣀⣀⣻⣿⣿⠿⠿⠿⠿⠿⠛⣠⣾⠏⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⠻⣎⠓⢤⣀⠀⠀⠀⠉⠉⠉⠉⠉⠉⠉⠉⠁⠀⠀⠀⣀⠴⢊⡿⠋⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⠀⠘⢧⠀⠀⠀⠀⠀⠀⠀⢤⣄⣀⣠⡄⠀⠀⠀⠀⠀⠀⢠⠞⠁⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⠀⠀⠀⠱⣄⠀⠀⠀⠀⠀⠀⣿⣿⡏⠀⠀⠀⠀⠀⠀⡠⠃⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠀⣿⣿⣷⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |   }, | ||||||
|  |   pacman = { | ||||||
|  |     [[                                                                              ]], | ||||||
|  |     [[                                    ██████                                    ]], | ||||||
|  |     [[                                ████▒▒▒▒▒▒████                                ]], | ||||||
|  |     [[                              ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒██                              ]], | ||||||
|  |     [[                            ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██                            ]], | ||||||
|  |     [[                          ██▒▒▒▒▒▒▒▒    ▒▒▒▒▒▒▒▒                              ]], | ||||||
|  |     [[                          ██▒▒▒▒▒▒  ▒▒▓▓▒▒▒▒▒▒  ▓▓▓▓                          ]], | ||||||
|  |     [[                          ██▒▒▒▒▒▒  ▒▒▓▓▒▒▒▒▒▒  ▒▒▓▓                          ]], | ||||||
|  |     [[                        ██▒▒▒▒▒▒▒▒▒▒    ▒▒▒▒▒▒▒▒    ██                        ]], | ||||||
|  |     [[                        ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██                        ]], | ||||||
|  |     [[                        ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██                        ]], | ||||||
|  |     [[                        ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██                        ]], | ||||||
|  |     [[                        ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██                        ]], | ||||||
|  |     [[                        ██▒▒██▒▒▒▒▒▒██▒▒▒▒▒▒▒▒██▒▒▒▒██                        ]], | ||||||
|  |     [[                        ████  ██▒▒██  ██▒▒▒▒██  ██▒▒██                        ]], | ||||||
|  |     [[                        ██      ██      ████      ████                        ]], | ||||||
|  |     [[                                                                              ]], | ||||||
|  |   }, | ||||||
|  |   cat = { | ||||||
|  |     [[          ▀████▀▄▄              ▄█ ]], | ||||||
|  |     [[            █▀    ▀▀▄▄▄▄▄    ▄▄▀▀█ ]], | ||||||
|  |     [[    ▄        █          ▀▀▀▀▄  ▄▀  ]], | ||||||
|  |     [[   ▄▀ ▀▄      ▀▄              ▀▄▀  ]], | ||||||
|  |     [[  ▄▀    █     █▀   ▄█▀▄      ▄█    ]], | ||||||
|  |     [[  ▀▄     ▀▄  █     ▀██▀     ██▄█   ]], | ||||||
|  |     [[   ▀▄    ▄▀ █   ▄██▄   ▄  ▄  ▀▀ █  ]], | ||||||
|  |     [[    █  ▄▀  █    ▀██▀    ▀▀ ▀▀  ▄▀  ]], | ||||||
|  |     [[   █   █  █      ▄▄           ▄▀   ]], | ||||||
|  |   }, | ||||||
|  |   skull_emperor = { | ||||||
|  |     [[⠀⠀⠀⠀⠀⠀⠀⢀⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⣀⠀⠀⠀⠀⢀⣾⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⣿⣧⡀⠀⠀⣼⠃⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⠻⣷⣄⡀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣧⠀⠀⠀⠀⠀⢀⣴⡶⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⢸⣿⣧⠀⣰⡏⠀⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣠⣤⣈⣧⠈⠻⣿⣦⣀⣀⠀⠀⠀⣸⣿⣿⣿⣆⠀⠀⠀⣴⣿⣿⠃⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠘⡏⢿⣧⣿⠀⢀⣿⠁⠀⢀⣾⡇⠀⠀⠀⣀⠤⠖⠂⠉⠉⠀⠀⠀⠀⠀⠸⡏⣀⣀⣭⣷⣄⠉⠉⠒⢻⣿⣿⣿⣿⡆⢀⣾⣿⣿⡏⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⣤⣇⠘⣿⠇⠀⢸⡇⠀⢠⣾⣿⣀⡤⠚⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⢻⣽⣿⣿⣿⣧⡀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⢸⣿⣿⡀⢻⡇⢠⡿⠀⣰⣿⡿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣷⡀⢸⣿⣿⣿⣿⠏⠙⢿⣿⣿⣇⠀⠀⠀⠀⢀⣶]], | ||||||
|  |     [[⢸⣿⣿⣧⣈⣧⡿⠁⢠⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣧⠈⣿⣿⣿⡏⠀⠀⣼⢹⣿⣿⠀⠀⠀⢀⣾⣿]], | ||||||
|  |     [[⣿⡟⢿⣿⣿⣿⠁⡴⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⠳⡀⠀⠀⠀⠈⠻⣿⣿⣿⣿⣿⡆⢹⣿⣿⠁⠀⢀⢛⣼⣿⣿⠳⣄⢀⣾⣿⣿]], | ||||||
|  |     [[⢻⡇⠀⢻⣿⣇⡞⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣧⠘⢦⣀⡀⠀⠀⠈⠻⣿⣿⣿⣇⠀⣿⡟⠀⠀⡞⣿⣿⣿⣿⠀⠘⣿⡗⣿⣿]], | ||||||
|  |     [[⠈⣧⠀⠈⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢦⡀⠈⠙⡓⠶⣤⣄⡈⠻⣿⣿⣧⣸⡇⡆⠀⢳⣿⣿⣿⡇⠀⣸⣏⠁⣿⣿]], | ||||||
|  |     [[⠀⠹⡆⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢦⡀⠉⠳⢦⡈⠛⠷⣿⣿⣿⣿⣅⠁⠀⣿⣿⣿⡟⠀⢰⣿⠃⠀⣼⣿]], | ||||||
|  |     [[⠀⠀⢻⣀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠲⣄⣄⣌⣲⣄⠸⣿⡿⣿⣿⣷⣴⣿⣿⠟⠀⠀⣿⡿⠀⠀⣸⡟]], | ||||||
|  |     [[⠀⠀⠘⣿⡏⠀⠀⠀⢀⠀⠀⠀⠀⠀⠐⣿⣿⢿⣶⣶⣦⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⢿⣿⣿⣷⣿⣧⠈⠻⢿⣿⣿⠋⠀⠀⢸⣿⠇⠀⣼⡿⣇]], | ||||||
|  |     [[⠀⣀⡴⢋⣴⣿⣿⣿⣿⣿⡷⠿⣿⣿⣿⢣⣾⣿⣿⣿⣿⣷⣭⣙⠶⡄⠀⠀⢰⡇⠀⠀⠀⠀⠀⠙⠻⣿⣿⣿⣧⠀⠘⠛⣿⣆⠀⠀⣿⡇⠀⢀⣿⠇⢸]], | ||||||
|  |     [[⠀⢻⠀⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠈⢁⣾⣿⣿⣿⣿⣿⣿⣿⣿⣷⡹⡄⠀⠀⠳⡄⠀⠀⠀⠀⠀⠀⠈⠙⠿⣿⣇⠀⠀⠈⢻⡆⢸⠃⠀⠀⣾⠏⠀⢸]], | ||||||
|  |     [[⠀⠈⡇⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠈⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡹⡀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣾⡄⠀⠀⢿⡟⠀⣠⣼⣿⠇⠀⢼]], | ||||||
|  |     [[⠀⠸⣅⢷⣿⣿⣿⣿⣿⣧⡀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⡇⠀⠀⢧⡀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣦⢠⣿⣿⣿⡿⣿⣿⠀⠀⡟]], | ||||||
|  |     [[⠀⣀⡿⠈⢿⣿⣿⡇⢻⣿⡗⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⡿⠃⣸⠁⠀⠀⠀⠀⠉⠁⠀⠀⠀⠀⠀⣠⣴⣿⣿⣿⣿⣿⣿⠿⠋⣴⣿⣿⠀⢀⡟]], | ||||||
|  |     [[⠀⡿⠁⠀⠼⠛⢹⣯⣸⣿⣷⡄⠀⠀⠀⠀⠈⠻⢿⣿⣿⣿⡿⠛⠁⡰⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠞⠉⢿⡿⠿⠟⣻⡟⠁⢠⡾⠛⢩⣿⣰⡿⠀]], | ||||||
|  |     [[⠸⡇⠀⠀⠀⠀⢸⠇⠿⠋⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠜⠁⠀⠀⣠⡴⢻⣿⣿⣶⣶⣶⣾⡿⠀⡖⢸⡇⠀⢠⡟⣠⡾⣋⣴⣴⠟⣽⣿⠃⠀]], | ||||||
|  |     [[⠀⢷⠀⢀⡾⣤⣼⣶⡖⠶⣿⠃⠀⠀⠀⠀⠀⢲⣷⣶⡶⠶⠆⣀⣀⣠⣴⠟⡟⠀⠀⠻⣿⣿⣿⣿⣿⠁⢨⠃⣸⣿⣦⣿⣟⣩⣾⡿⠋⣡⣾⣿⠃⠀⠀]], | ||||||
|  |     [[⠀⠀⠉⠉⠀⢰⠏⠈⠻⠀⠀⠀⠀⠀⠀⠀⠀⠀⣻⣏⣴⣾⣿⡟⠁⠀⠀⣸⡇⠀⠀⠀⢿⠻⠿⢫⠏⠀⠀⠀⣿⣿⣿⣿⣿⠿⠁⣶⣴⣿⣿⠇⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⢀⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡿⣿⠏⣿⡇⠀⢀⣾⣿⠧⠀⠀⠀⢸⡄⣰⠟⠀⠀⠀⢠⣿⣿⣿⣯⣁⣠⣾⣿⣿⠟⠋⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⣼⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠘⠋⢰⣿⣿⣶⡾⣿⣿⠇⠀⣠⠞⢉⠜⠁⡴⠀⢀⣴⡟⠉⠀⠉⠛⠿⠿⠟⠋⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⣹⣶⡦⣴⢲⣴⢦⡤⣤⣤⣄⣤⣤⣤⣤⣤⣴⡿⠋⠙⢿⣯⣿⣿⠀⡰⠃⠀⠋⠀⡼⠁⠀⡞⣸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⡏⣿⢰⡇⢰⠇⢸⡇⣸⣨⣇⣸⣏⣸⢇⣾⣿⣀⣠⠤⠤⠵⣫⠏⠀⠀⠀⠀⠀⠀⠀⠀⡼⠀⢹⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠙⣟⢿⢿⣿⣷⣿⣹⣇⣿⣸⣧⠥⠿⠴⠜⠋⠁⠀⠀⡴⠞⠁⠀⠀⠀⠀⠀⠀⠀⢀⡴⠁⢀⣼⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⣿⠛⠉⠉⠙⠉⠁⠈⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⢀⣠⣾⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⢸⣠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣤⣤⣴⣶⠾⠛⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⣸⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣶⣾⠿⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⢸⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⢀⣠⣾⡾⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⣿⠀⢀⣀⡀⣀⡀⠀⠀⠀⠀⠀⠀⣀⣠⣴⣶⠶⠿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⠘⢷⣂⣀⣀⣀⣍⣳⣶⣾⣿⠿⠟⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠀⠀⠀⠙⠛⠻⠿⠿⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |   }, | ||||||
|  |   skull_bull = { | ||||||
|  |     [[⠀⠀⠀⢀⡤⢤⢄⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⣼⡅⠠⢀⡈⢀⣙⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠤⠤⢤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⢸⠀⠀⠀⠈⠙⠿⣝⢇⠀⠀⣀⣠⠤⠤⠤⠤⣤⡤⠚⠁⠀⠀⠀⠀⠀⠉⠢⡀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⢧⡀⠀⠀⠠⣄⠈⢺⣺⡍⠀⠀⠀⠀⣠⠖⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⡄⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠸⡆⢀⠘⣔⠄⠑⠂⠈⠀⡔⠤⠴⠚⡁⠀⠀⢀⠀⠀⠀⣠⠔⢶⡢⡀⠀⠠⡇⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⢠⣇⠀⢃⡀⠁⠀⠀⠀⡸⠃⢀⡴⠊⢀⠀⠀⠈⢂⡤⠚⠁⠀⠀⠙⢿⠀⠉⡇⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⣠⠾⣹⢤⢼⡆⠀⠀⠀⠀⠀⠀⠈⢀⠞⠁⠀⢠⣴⠏⠀⠀⠀⠀⠀⠀⠸⡇⠀⢇⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⣾⢡⣤⡈⠣⡀⠙⠒⠀⠀⠀⠀⣀⠤⠤⣤⠤⣌⠁⢛⡄⠀⠀⠀⠀⠀⠠⡀⢇⠀⠘⣆⠀⢀⡴⡆]], | ||||||
|  |     [[⠀⠀⣿⢻⣿⣿⣄⡸⠀⡆⠀⠒⣈⣩⣉⣉⡈⠉⠉⠢⣉⠉⠀⠀⠀⠀⠀⠀⠀⢣⠈⠢⣀⠈⠉⢁⡴⠃]], | ||||||
|  |     [[⠀⢀⢿⣿⣿⡿⠛⠁⠀⢻⣿⣿⣿⣿⣿⣿⣿⣷⣦⣄⣸⢿⠀⠀⠀⠀⠀⠀⠀⠸⡄⠀⡇⠉⠉⠁⠀⠀]], | ||||||
|  |     [[⣠⣞⠘⢛⡛⢻⣷⣤⡀⠈⡎⣿⣿⣿⣿⣿⣿⣿⣿⣿⠹⠏⠀⠀⠀⠀⠀⠀⠀⠀⠇⢰⡇⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠻⣌⠯⡁⢠⣸⣿⣿⣷⡄⠁⠈⢻⢿⣿⣿⣿⣿⠿⠋⠃⠰⣀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠇⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠉⢻⠨⠟⠹⢿⣿⢣⠀⠀⢨⡧⣌⠉⠁⣀⠴⠊⠑⠀⡸⠛⠀⠀⠀⠀⠀⣸⢲⡟⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⣠⠏⠀⠀⠀⠉⠉⠁⠀⠐⠁⠀⠀⢉⣉⠁⠀⠀⢀⠔⢷⣄⠀⠀⠀⠀⢠⣻⡞⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⢠⠟⡦⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⢾⠉⠀⣹⣦⠤⣿⣿⡟⠁⠀⠀⠀⢀⣶⠟⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠈⠙⣦⣁⡎⢈⠏⢱⠚⢲⠔⢲⠲⡖⠖⣦⣿⡟⠀⣿⡿⠁⣠⢔⡤⠷⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⢿⣟⠿⡿⠿⠶⢾⠶⠾⠶⠾⠞⢻⠋⠏⣸⠁⠀⡽⠓⠚⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⢸⡏⠳⠷⠴⠣⠜⠢⠜⠓⠛⠊⠀⢀⡴⠣⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⣏⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠊⠁⢀⣀⣀⠴⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠘⢦⡀⠀⠀⠀⠀⠀⠀⢀⣀⠴⠖⠒⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |     [[⠀⠀⠀⠀⠉⠑⠒⠒⠐⠒⠛⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]], | ||||||
|  |   }, | ||||||
|  |   bomb = { | ||||||
|  |     '               ▄▄██████████▄▄             ', | ||||||
|  |     '               ▀▀▀   ██   ▀▀▀             ', | ||||||
|  |     '       ▄██▄   ▄▄████████████▄▄   ▄██▄     ', | ||||||
|  |     '     ▄███▀  ▄████▀▀▀    ▀▀▀████▄  ▀███▄   ', | ||||||
|  |     '    ████▄ ▄███▀              ▀███▄ ▄████  ', | ||||||
|  |     '   ███▀█████▀▄████▄      ▄████▄▀█████▀███ ', | ||||||
|  |     '   ██▀  ███▀ ██████      ██████ ▀███  ▀██ ', | ||||||
|  |     '    ▀  ▄██▀  ▀████▀  ▄▄  ▀████▀  ▀██▄  ▀  ', | ||||||
|  |     '       ███           ▀▀           ███     ', | ||||||
|  |     '       ██████████████████████████████     ', | ||||||
|  |     '   ▄█  ▀██  ███   ██    ██   ███  ██▀  █▄ ', | ||||||
|  |     '   ███  ███ ███   ██    ██   ███▄███  ███ ', | ||||||
|  |     '   ▀██▄████████   ██    ██   ████████▄██▀ ', | ||||||
|  |     '    ▀███▀ ▀████   ██    ██   ████▀ ▀███▀  ', | ||||||
|  |     '     ▀███▄  ▀███████    ███████▀  ▄███▀   ', | ||||||
|  |     '       ▀███    ▀▀██████████▀▀▀   ███▀     ', | ||||||
|  |     '         ▀    ▄▄▄    ██    ▄▄▄    ▀       ', | ||||||
|  |     '               ▀████████████▀             ', | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | local _getFortune = function() | ||||||
|  |   local _fortunes = { | ||||||
|  |     ' \nI\'m sick of following my dreams, man. I\'m just going\nto ask where they\'re going and hook up with ’em later.\n \n—Mitch Hedberg', | ||||||
|  |     ' \nBefore you criticize someone, you should walk a mile in\ntheir shoes. That way when you criticize them, you are a\nmile away from them and you have their shoes. \n \n—Jack Handey', | ||||||
|  |     'Before you marry a person, you should first make them use a computer with slow Internet to see who they really are. —Will Ferrell', | ||||||
|  |     ' \nCommon sense is like deodorant. The people who need it\nmost never use it.\n \n—Anonymous', | ||||||
|  |     ' \nHere’s all you have to know about men and women: Women\nare crazy, men are stupid. And the main reason women\nare crazy is that men are stupid.\n \n—George Carlin', | ||||||
|  |     ' \nCal: “You are really pushing my buttons today.”\nBecky: “Which one is \'mute \'?”\n \n—Waitress, the Musical', | ||||||
|  |     ' \nMy grief counselor died. He was so good, I don’t even\ncare.', | ||||||
|  |     ' \nThe doctor gave me one year to live, so I shot him with\nmy gun. The judge gave me 15 years. Problem solved.', | ||||||
|  |     ' \nMy grandfather said my generation relies too much on\nthe latest technology. So I unplugged his life support.', | ||||||
|  |     ' \nFeminism: because not all women can be pretty.', | ||||||
|  |     ' \nI am busy right now, can I ignore you some other time?', | ||||||
|  |     ' \nIt’s okay if you don’t like me. Not everyone has\ngood taste.', | ||||||
|  |     ' \nLight travels faster than sound. This is why some\npeople appear bright until they speak.\n \n-Steven Wright', | ||||||
|  |     ' \nDon’t worry about what people think. They don’t do it\nvery often.', | ||||||
|  |     ' \nIf at first, you don’t succeed, skydiving is not for\nyou.', | ||||||
|  |     ' \nPeople say that laughter is the best medicine… your\nface must be curing the world.', | ||||||
|  |     ' \nWell at least your mom thinks you’re pretty.', | ||||||
|  |     ' \nThe stuff you heard about me is a lie. I\'m way\nworse.', | ||||||
|  |     ' \nMarriage. Because your crappy day doesn\'t have to\nend at work.', | ||||||
|  |     ' \nI don\'t have a welcome mat at my door because I\'m\nnot a liar.', | ||||||
|  |     ' \nI\'ll get over it. I just need to be dramatic first.', | ||||||
|  |     ' \nSorry for being late. I got caught up enjoying my last\nfew minutes of not being here.', | ||||||
|  |     ' \nYou\'re everything I want in someone I don\'t want\nanymore.', | ||||||
|  |     ' \nFriendships must be built on a solid foundation of\nalcohol, sarcasm, inappropriateness, and shenanigans.', | ||||||
|  |   } | ||||||
|  |   return _fortunes[math.random(1, #_fortunes)] | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | return { | ||||||
|  |   'goolord/alpha-nvim', | ||||||
|  |   dependencies = { 'nvim-tree/nvim-web-devicons', config = true }, | ||||||
|  |   lazy = false, | ||||||
|  |   config = function() | ||||||
|  |     local alpha = require("alpha") | ||||||
|  |     local dashboard = require("alpha.themes.dashboard") | ||||||
|  | 
 | ||||||
|  |     dashboard.section.header.val = _ascii_arts['pacman'] -- require("ascii").art.text.slogons['make_cool_stuff'] | ||||||
|  | 
 | ||||||
|  |     -- Set menu | ||||||
|  |     dashboard.section.buttons.val = { | ||||||
|  |       dashboard.button("e", "  New file", ":ene <BAR> startinsert <CR>"), | ||||||
|  |       dashboard.button("r", "  Recently used files", ":Telescope oldfiles<CR>"), | ||||||
|  |       dashboard.button("f", "  Find file", ":Telescope find_files<CR>"), | ||||||
|  |       dashboard.button("t", "  Find text", ":Telescope live_grep <CR>"), | ||||||
|  |       dashboard.button("q", "  Quit NVIM", ":qa<CR>"), | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     -- Set footer | ||||||
|  |     --[[local handle = assert(io.popen('fortune -s')) | ||||||
|  |     local fortune = handle:read("*all") | ||||||
|  |     handle:close()]] | ||||||
|  |     dashboard.section.footer.val = require('alpha.fortune')() | ||||||
|  |     dashboard.section.header.opts.hl = "DevIconScss" -- "DeviconNPMrc"(red) | ||||||
|  |     dashboard.section.buttons.opts.hl = "Debug" | ||||||
|  |     dashboard.section.footer.opts.hl = "Comment" | ||||||
|  |     dashboard.config.opts.noautocmd = true | ||||||
|  | 
 | ||||||
|  |     vim.cmd [[autocmd User AlphaReady echo 'ready']] | ||||||
|  | 
 | ||||||
|  |     alpha.setup(dashboard.opts) | ||||||
|  |   end | ||||||
|  | } | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | return { 'MaximilianLloyd/ascii.nvim', dependencies = 'MunifTanjim/nui.nvim', lazy = true } | ||||||
|  | @ -0,0 +1,9 @@ | ||||||
|  | return { | ||||||
|  |   'tjdevries/colorbuddy.nvim', | ||||||
|  |   config = function() | ||||||
|  |     -- local Color, colors, Group, groups, styles = require('colorbuddy').setup() | ||||||
|  |     -- Pallet: https://base16.vercel.app/previews/base16-twilight | ||||||
|  |     -- https://github.com/goolord/alpha-nvim/discussions/16#:~:text=I%27m%20not%20quite%20satisfied%20with%20the%20layout%20yet%2C%20I%20started%20out%20with%20some%20colours%20but%20ended%20up%20omitting%20them%20for%20simplicity.%20Here%27s%20what%20it%20looks%20like%20so%20far%3A | ||||||
|  |   end, | ||||||
|  |   lazy = true | ||||||
|  | } | ||||||
|  | @ -0,0 +1,27 @@ | ||||||
|  | return { | ||||||
|  | 	--Gruvbox colorscheme | ||||||
|  | 	{ "ellisonleao/gruvbox.nvim", priority = 1000, config = true, opts = ..., lazy = true }, | ||||||
|  | 
 | ||||||
|  | 	--tokyonight colorscheme | ||||||
|  | 	{ "folke/tokyonight.nvim",    priority = 1000, lazy = true }, | ||||||
|  | 
 | ||||||
|  | 	-- lunar-vim colorschemes | ||||||
|  | 	{ "lunarvim/colorschemes",    priority = 1000, lazy = true }, | ||||||
|  | 
 | ||||||
|  | 	-- kanagawa | ||||||
|  | 	{ "rebelot/kanagawa.nvim",    priority = 1000, lazy = true }, | ||||||
|  | 
 | ||||||
|  | 	-- latte, frappe, macchiato, mocha | ||||||
|  | 	{ "catppuccin/catppuccin",    priority = 1000, lazy = true }, | ||||||
|  | 
 | ||||||
|  | 	-- Theme inspired by Atom | ||||||
|  | 	{ 'navarasu/onedark.nvim',    priority = 1000, lazy = true }, | ||||||
|  | 
 | ||||||
|  | 	--Rosepine (Primeagen) | ||||||
|  | 	{ | ||||||
|  | 		'rose-pine/neovim', | ||||||
|  | 		name = 'rose-pine', | ||||||
|  | 		priority = 1000, | ||||||
|  | 		lazy = false | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,86 @@ | ||||||
|  | -- debug.lua | ||||||
|  | -- | ||||||
|  | -- Shows how to use the DAP plugin to debug your code. | ||||||
|  | -- | ||||||
|  | -- Primarily focused on configuring the debugger for Go, but can | ||||||
|  | -- be extended to other languages as well. That's why it's called | ||||||
|  | -- kickstart.nvim and not kitchen-sink.nvim ;) | ||||||
|  | 
 | ||||||
|  | return { | ||||||
|  |   'mfussenegger/nvim-dap', | ||||||
|  |   dependencies = { | ||||||
|  |     -- Creates a beautiful debugger UI | ||||||
|  |     'rcarriga/nvim-dap-ui', | ||||||
|  | 
 | ||||||
|  |     -- Installs the debug adapters for you | ||||||
|  |     'williamboman/mason.nvim', | ||||||
|  |     'jay-babu/mason-nvim-dap.nvim', | ||||||
|  | 
 | ||||||
|  |     -- Add your own debuggers here | ||||||
|  |     'leoluz/nvim-dap-go', | ||||||
|  |   }, | ||||||
|  |   event = { 'BufReadPre', 'BufNewFile' }, | ||||||
|  |   config = function() | ||||||
|  |     local dap = require 'dap' | ||||||
|  |     local dapui = require 'dapui' | ||||||
|  | 
 | ||||||
|  |     require('mason-nvim-dap').setup { | ||||||
|  |       -- Makes a best effort to setup the various debuggers with | ||||||
|  |       -- reasonable debug configurations | ||||||
|  |       automatic_setup = true, | ||||||
|  | 
 | ||||||
|  |       -- You can provide additional configuration to the handlers, | ||||||
|  |       -- see mason-nvim-dap README for more information | ||||||
|  |       handlers = {}, | ||||||
|  | 
 | ||||||
|  |       -- You'll need to check that you have the required things installed | ||||||
|  |       -- online, please don't ask me how to install them :) | ||||||
|  |       ensure_installed = { | ||||||
|  |         -- Update this to ensure that you have the debuggers for the langs you want | ||||||
|  |         'delve', | ||||||
|  |       }, | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     -- Basic debugging keymaps, feel free to change to your liking! | ||||||
|  |     vim.keymap.set('n', '<F5>', dap.continue, { desc = 'Debug: Start/Continue' }) | ||||||
|  |     vim.keymap.set('n', '<F1>', dap.step_into, { desc = 'Debug: Step Into' }) | ||||||
|  |     vim.keymap.set('n', '<F2>', dap.step_over, { desc = 'Debug: Step Over' }) | ||||||
|  |     vim.keymap.set('n', '<F3>', dap.step_out, { desc = 'Debug: Step Out' }) | ||||||
|  |     vim.keymap.set('n', '<leader>b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' }) | ||||||
|  |     vim.keymap.set('n', '<leader>B', function() | ||||||
|  |       dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ') | ||||||
|  |     end, { desc = 'Debug: Set Breakpoint' }) | ||||||
|  | 
 | ||||||
|  |     -- Dap UI setup | ||||||
|  |     -- For more information, see |:help nvim-dap-ui| | ||||||
|  |     dapui.setup { | ||||||
|  |       -- Set icons to characters that are more likely to work in every terminal. | ||||||
|  |       --    Feel free to remove or use ones that you like more! :) | ||||||
|  |       --    Don't feel like these are good choices. | ||||||
|  |       icons = { expanded = '▾', collapsed = '▸', current_frame = '*' }, | ||||||
|  |       controls = { | ||||||
|  |         icons = { | ||||||
|  |           pause = '⏸', | ||||||
|  |           play = '▶', | ||||||
|  |           step_into = '⏎', | ||||||
|  |           step_over = '⏭', | ||||||
|  |           step_out = '⏮', | ||||||
|  |           step_back = 'b', | ||||||
|  |           run_last = '▶▶', | ||||||
|  |           terminate = '⏹', | ||||||
|  |           disconnect = '⏏', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception. | ||||||
|  |     vim.keymap.set('n', '<F7>', dapui.toggle, { desc = 'Debug: See last session result.' }) | ||||||
|  | 
 | ||||||
|  |     dap.listeners.after.event_initialized['dapui_config'] = dapui.open | ||||||
|  |     dap.listeners.before.event_terminated['dapui_config'] = dapui.close | ||||||
|  |     dap.listeners.before.event_exited['dapui_config'] = dapui.close | ||||||
|  | 
 | ||||||
|  |     -- Install golang specific config | ||||||
|  |     require('dap-go').setup() | ||||||
|  |   end, | ||||||
|  | } | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | return { 'BlakeJC94/alpha-nvim-fortune', lazy = true } | ||||||
|  | @ -0,0 +1,18 @@ | ||||||
|  | return { | ||||||
|  |   'nvimtools/none-ls.nvim', | ||||||
|  |   event = { 'BufReadPre', 'BufNewFile' }, | ||||||
|  |   config = function() | ||||||
|  |     local null_ls = require('null-ls') | ||||||
|  | 
 | ||||||
|  |     null_ls.setup({ | ||||||
|  |       sources = { | ||||||
|  |         null_ls.builtins.formatting.stylua, | ||||||
|  |         null_ls.builtins.formatting.prettier.with({ | ||||||
|  |           disabled_filetypes = { 'javascript', 'typescript', 'json' } -- Use biome | ||||||
|  |         }), | ||||||
|  |         null_ls.builtins.formatting.biome, | ||||||
|  |         -- null_ls.builtins.diagnostics.biome, | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |   end | ||||||
|  | } | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | return { | ||||||
|  |   'nvim-telescope/telescope-ui-select.nvim', | ||||||
|  |   config = function() | ||||||
|  |     require('telescope').setup({ | ||||||
|  |       extensions = { | ||||||
|  |         ['ui-select'] = { | ||||||
|  |           require('telescope.themes').get_dropdown { | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |     require('telescope').load_extension('ui-select') | ||||||
|  |   end, | ||||||
|  |   keys = { { '<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction' } }, | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue