I know, I know, it's been a while since we last delved into the wonderful world of LazyVim customization.
In Part 1, we laid the groundwork with LazyVim, establishing a solid foundation for our Neovim journey. Now, it's time to take things to the next level – personalization!
In the next section, I want to express my gratitude to Takuya Matsuyama, who is a true inspiration to me. I have learned a great deal from his work, and I am deeply appreciative of his contributions to the field.
And now, let's start cowboy 🤠🤠🤠.
Folder Structure Tree of LazyVim
Before starting to customize anything, we need to quickly look through the default File Structure Diagram of Lazy.vim to get an overview of it.
For more information: General Settings
autocmds.lua (auto commands): are used to automatically execute specific commands or functions in response to certain events in the editors.
Greatly enhance your Vim workflow, it very wonderful 😍.
keymaps (key mappings): are configurations that define custom keyboard shortcuts. These mappings allow users to bind specific keys or combinations of keys to Vimcommands, functions, or scripts, … thereby streamlining their workflow and making repetitive tasks quicker and easier.
Suppose you don’t know about Key Mappings. In that case, I think this is a useful blog to get started with: Basic Vim Mapping.
Thanks for the great post!
lazy.lua: this is a place to set the default configuration of the Lazy.vim
options.lua (optional): you can set anything to custom your Vim if you want like: autoindent, smartindent, hlsearch, showcmd, shiftwidth, … I will show my config later 🫣
Overview of the bullet points
Now, we are an overview of the bullet points I will configure in the next section:
williamboman/mason.nvim (Portable package manager for Neovim that runs everywhere Neovim runs.
Easily install and manage LSP servers, DAP servers, linters, and formatters.)
treesitters:
nvim-treesitter/nvim-treesitter (to provide a simple and easy way to use the interface for tree-sitter in Neovim and to provide some basic functionality such as highlighting based on it)
b0o/incline.nvim (When editing many files in a single tabpage, you can't quickly know which file is opened in the tabpage. That's because lualine's globalstatus option is set to false in LazyVim.)
telescope.nvim (It is an extendable _fuzzy finder _over lists.)
As you configure each plugin, it's a good idea to save your changes and restart nvim quickly. This helps you catch any errors right away and makes troubleshooting smoother down the line. Think of it like a mini test drive after each tweak! 🤠🤠🤠
Solarized Osaka theme:
To change your theme create a file like colorscheme.lua
Create: lua/plugins/colorscheme.lua and config:
The LazyVim has already configured many things for me now, but I added some customizations like those in the file: lua/config/keymaps.lua
localkeymap=vim.keymaplocalopts={noremap=true,silent=true}keymap.set("n","x",'"_x')-- Increment/decrementkeymap.set("n","+","<C-a>")keymap.set("n","-","<C-x>")-- Delete a word backwardskeymap.set("n","dw",'vb"_d')-- Select allkeymap.set("n","<C-a>","gg<S-v>G")-- Save with root permission (not working for now)--vim.api.nvim_create_user_command('W', 'w !sudo tee > /dev/null %', {})-- Disable continuationskeymap.set("n","<Leader>o","o<Esc>^Da",opts)keymap.set("n","<Leader>O","O<Esc>^Da",opts)-- Jumplistkeymap.set("n","<C-m>","<C-i>",opts)-- New tabkeymap.set("n","te",":tabedit")keymap.set("n","<tab>",":tabnext<Return>",opts)keymap.set("n","<s-tab>",":tabprev<Return>",opts)-- Split windowkeymap.set("n","ss",":split<Return>",opts)keymap.set("n","sv",":vsplit<Return>",opts)-- Move windowkeymap.set("n","sh","<C-w>h")keymap.set("n","sk","<C-w>k")keymap.set("n","sj","<C-w>j")keymap.set("n","sl","<C-w>l")-- Resize windowkeymap.set("n","<C-w><left>","<C-w><")keymap.set("n","<C-w><right>","<C-w>>")keymap.set("n","<C-w><up>","<C-w>+")keymap.set("n","<C-w><down>","<C-w>-")-- Pick a bufferkeymap.set("n","<Leader>1","<Cmd>BufferLineGoToBuffer 1<CR>",{})keymap.set("n","<Leader>2","<Cmd>BufferLineGoToBuffer 2<CR>",{})keymap.set("n","<Leader>3","<Cmd>BufferLineGoToBuffer 3<CR>",{})keymap.set("n","<Leader>4","<Cmd>BufferLineGoToBuffer 4<CR>",{})keymap.set("n","<Leader>5","<Cmd>BufferLineGoToBuffer 5<CR>",{})keymap.set("n","<Leader>6","<Cmd>BufferLineGoToBuffer 6<CR>",{})keymap.set("n","<Leader>9","<Cmd>BufferLineGoToBuffer -1<CR>",{})-- Moving text-- Move text up and downkeymap.set("n","<C-Down>","<Esc>:m .+1<CR>",opts)keymap.set("n","<C-Up>","<Esc>:m .-2<CR>",opts)keymap.set("v","<C-Down>",":m .+1<CR>",opts)keymap.set("v","<C-Up>",":m .-2<CR>",opts)keymap.set("x","<C-Down>",":move '>+1<CR>gv-gv",opts)keymap.set("x","<C-Up>",":move '<-2<CR>gv-gv",opts)-- Diagnosticskeymap.set("n","<C-j>",function()vim.diagnostic.goto_next()end,opts)
Auto Commands
lua/config/autocmds.lua
I don’t want to show concealing when using json and markdown files and turn off paste mode when leaving insert. So, I set conceallevel to 0 for json files and turned off paste mode like below.
If you want to use them, you can skip this config file 🙄
-- Turn off paste mode when leaving insertvim.api.nvim_create_autocmd("InsertLeave",{pattern="*",command="set nopaste",})-- Disable the concealing in some file formats-- The default conceallevel is 3 in LazyVimvim.api.nvim_create_autocmd("FileType",{pattern={"json","jsonc","markdown"},callback=function()vim.opt.conceallevel=0end,})
Awesome 🥸🥸🥸!!!
Options Configuration Vim
I have some config for default Vim, it’s only just an old config for normal nvim in the past: lua/config/options.lua. I will omit to explain this file 🫣
vim.g.mapleader=" "vim.opt.encoding="utf-8"vim.opt.fileencoding="utf-8"vim.opt.spell=truevim.opt.spelllang={"en_us"}vim.opt.number=truevim.opt.title=truevim.opt.autoindent=truevim.opt.smartindent=truevim.opt.hlsearch=truevim.opt.backup=falsevim.opt.showcmd=truevim.opt.cmdheight=1vim.opt.laststatus=2vim.opt.expandtab=truevim.opt.scrolloff=10vim.opt.shell="fish"vim.opt.backupskip={"/tmp/*","/private/tmp/*"}vim.opt.inccommand="split"vim.opt.ignorecase=true-- Case insensitive searching UNLESS /C or capital in searchvim.opt.smarttab=truevim.opt.breakindent=truevim.opt.shiftwidth=2vim.opt.tabstop=2vim.opt.wrap=false-- No Wrap linesvim.opt.backspace={"start","eol","indent"}vim.opt.path:append({"**"})-- Finding files - Search down into subfoldersvim.opt.wildignore:append({"*/node_modules/*"})vim.opt.splitbelow=true-- Put new windows below currentvim.opt.splitright=true-- Put new windows right of currentvim.opt.splitkeep="cursor"vim.opt.mouse=""vim.g.deprecation_warnings=true-- Undercurlvim.cmd([[let &t_Cs = "\e[4:3m"]])vim.cmd([[let &t_Ce = "\e[4:0m"]])-- Add asterisks in block commentsvim.opt.formatoptions:append({"r"})vim.cmd([[au BufNewFile,BufRead *.astro setf astro]])vim.cmd([[au BufNewFile,BufRead Podfile setf ruby]])ifvim.fn.has("nvim-0.8")==1thenvim.opt.cmdheight=0end
Honestly, I don’t want this post to be too long, so I’ll cover the Plugin configuration section in the next article.