From e2414dc5629e6462304e0226f89e48f0be76bf63 Mon Sep 17 00:00:00 2001 From: williycole <64283810+williycole@users.noreply.github.com> Date: Tue, 17 Sep 2024 14:27:45 -0500 Subject: [PATCH 1/5] First pass at blog post for go, wsl, nvim setup --- content/blog/9-30-24-go-wsl-nvim.md | 241 ++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 content/blog/9-30-24-go-wsl-nvim.md diff --git a/content/blog/9-30-24-go-wsl-nvim.md b/content/blog/9-30-24-go-wsl-nvim.md new file mode 100644 index 0000000..1315ed0 --- /dev/null +++ b/content/blog/9-30-24-go-wsl-nvim.md @@ -0,0 +1,241 @@ +## Introduction + +As a minimalist at heart, I've always been drawn to simplicity - that's part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I'm not quite there yet.As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code.Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let's dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We'll cover everything from WSL installation to configuring Neovim for Go development and debugging. +## Step 1: Installing WSL + +1. Open PowerShell as Administrator and run: + ``` + wsl --install + ``` +2. Restart your computer when prompted. +3. After restart, open Ubuntu from the Start menu to complete the setup. + +## Step 2: Installing Go + +1. Update your package list: + ``` + sudo apt update + ``` +2. Remove any existing Go installation: + ``` + sudo rm -rf /usr/local/go + ``` +3. Download Go 1.22.7, you can use whatever go version you want here + ``` + wget https://go.dev/dl/go1.22.7.linux-amd64.tar.gz + ``` +4. Extract Go to /usr/local: + ``` + sudo tar -C /usr/local -xzf go1.22.7.linux-amd64.tar.gz + ``` +5. Set up your Go environment: + ``` + echo 'export GOROOT=/usr/local/go' >> ~/.bashrc + echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.bashrc + source ~/.bashrc + ``` +6. Verify the installation: + ``` + go version + ``` + +## Step 3: Installing Neovim + +1. Download the latest Neovim AppImage: + ``` + curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage + ``` +2. Make it executable: + ``` + chmod u+x nvim.appimage + ``` +3. Move it to a directory in your PATH: + ``` + sudo mv nvim.appimage /usr/local/bin/nvim + ``` + +## Step 4: Setting Up Kickstart.nvim + +1. Before we get started here be sure to checkout my dotfiles incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them. +2. Back up your existing Neovim configuration: + ``` + mv ~/.config/nvim ~/.config/nvim.bak + ``` +3. Clone Kickstart.nvim: + ``` + git clone https://github.com/nvim-lua/kickstart.nvim.git ~/.config/nvim + ``` +## 5. Configuring Go Development and DAP: +1. Installing Delve Debugger (moved up): + ``` + go install github.com/go-delve/delve/cmd/dlv@latest + ``` +2. Instead of creating separate files(we can do that later), we'll modify the existing `init.lua` in the `custom/plugins` directory. Open `~/.config/nvim/lua/custom/plugins/init.lua` and add the following content: + + ```lua + -- Function to find main.go file in the project incase its not in root +local function find_main_go() + local root = vim.fn.getcwd() + local main_go = vim.fn.globpath(root, '**/main.go', 0, 1) + if #main_go > 0 then + return vim.fn.fnamemodify(main_go[1], ':h') + end + return root +end + +return { + -- Core DAP (Debug Adapter Protocol) plugin + { + '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', + }, + config = function() + local dap = require 'dap' + local dapui = require 'dapui' + + -- Configure Mason to automatically install DAP adapters + 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', '', dap.continue, { desc = 'Debug: Start/Continue' }) + vim.keymap.set('n', '', dap.step_into, { desc = 'Debug: Step Into' }) + vim.keymap.set('n', '', dap.step_over, { desc = 'Debug: Step Over' }) + vim.keymap.set('n', '', dap.step_out, { desc = 'Debug: Step Out' }) + vim.keymap.set('n', 'b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' }) + vim.keymap.set('n', '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', '', 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() + + -- Override dap-go's launch configuration so we can find main.go even if it isn't in the root of our project + dap.configurations.go = { + { + type = 'go', + name = 'Debug', + request = 'launch', + program = function() + return find_main_go() + end, + }, + } + end, + }, +} + ``` +## 6. Final Configuration: +1. Open Neovim: `nvim` and Run `:checkhealth` to ensure everything is set up correctly. +2. Optional tease apart the main `init.lua` file, ie. `nvim\init.lua`. + - To do this find different sections of code you would like to pull out of the main file. For example, see this auto format configuration that comes with kickstart. But before you do this be sure to uncomment ` -- { import = 'custom.plugins' },` in `nvim\init.lua`, this will allow you to tease apart this main init.lua and place the things you tease apart in `nvim\custom\plugin\auto-format.lua` +```lua +-- Everything in the curly braces is alread in the nvim/init.lua, simply cut it out +-- and place it in a file within `nvim\custom\plugin\auto-format.lua`, and be sure +-- to include the return +-- ie. return { paste all the code you just cut here } +-- if you do this sytematically you can really clean up the main init.lua file at nvim root dir +return { -- Autoformat + 'stevearc/conform.nvim', + event = { 'BufWritePre' }, + cmd = { 'ConformInfo' }, + keys = { + { + 'f', + function() + require('conform').format { async = true, lsp_format = 'fallback' } + end, + mode = '', + desc = '[F]ormat buffer', + }, + }, + opts = { + notify_on_error = false, + format_on_save = function(bufnr) + -- Disable "format_on_save lsp_fallback" for languages that don't + -- have a well standardized coding style. You can add additional + -- languages here or re-enable it for the disabled ones. + local disable_filetypes = { c = true, cpp = true } + local lsp_format_opt + if disable_filetypes[vim.bo[bufnr].filetype] then + lsp_format_opt = 'never' + else + lsp_format_opt = 'fallback' + end + return { + timeout_ms = 500, + lsp_format = lsp_format_opt, + } + end, + formatters_by_ft = { + lua = { 'stylua' }, + -- Conform can also run multiple formatters sequentially + -- python = { "isort", "black" }, + -- + -- You can use 'stop_after_first' to run the first available formatter from the list + -- javascript = { "prettierd", "prettier", stop_after_first = true }, + + go = { 'go/fmt' }, -- NOTE: this isn't default, I added this for go formatting, the rest in this example is default + }, + }, +} + +``` +3. Remember any plugin you want to isolate you can do this with, please be sure to follow that plugin's guide/README as best you can to get things work properly. +## Conclusion + +Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experiance, if you looked at or used my dotfiles you might have even noticed plenty of todos as I will likely itterate on this in the future and make another post as I learn/cleanup my neovim setup. + +If you have any questions or trouble feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this! \ No newline at end of file From a1e7b0b723a2216963ae75bf340f9966cb9b5459 Mon Sep 17 00:00:00 2001 From: williycole <64283810+williycole@users.noreply.github.com> Date: Tue, 17 Sep 2024 14:59:50 -0500 Subject: [PATCH 2/5] Added dotfiles links --- content/blog/9-30-24-go-wsl-nvim.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/blog/9-30-24-go-wsl-nvim.md b/content/blog/9-30-24-go-wsl-nvim.md index 1315ed0..20f6782 100644 --- a/content/blog/9-30-24-go-wsl-nvim.md +++ b/content/blog/9-30-24-go-wsl-nvim.md @@ -56,7 +56,7 @@ As a minimalist at heart, I've always been drawn to simplicity - that's part of ## Step 4: Setting Up Kickstart.nvim -1. Before we get started here be sure to checkout my dotfiles incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them. +1. Before we get started here be sure to checkout my (dotfiles)[https://github.com/williycole/dotfiles] incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them. 2. Back up your existing Neovim configuration: ``` mv ~/.config/nvim ~/.config/nvim.bak @@ -236,6 +236,6 @@ return { -- Autoformat 3. Remember any plugin you want to isolate you can do this with, please be sure to follow that plugin's guide/README as best you can to get things work properly. ## Conclusion -Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experiance, if you looked at or used my dotfiles you might have even noticed plenty of todos as I will likely itterate on this in the future and make another post as I learn/cleanup my neovim setup. +Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experiance, if you looked at or used my (dotfiles)[https://github.com/williycole/dotfiles] you might have even noticed plenty of todos as I will likely itterate on this in the future and make another post as I learn/cleanup my neovim setup. If you have any questions or trouble feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this! \ No newline at end of file From d37629f26df15dd9d1e6ea046ebdc9fdc449a963 Mon Sep 17 00:00:00 2001 From: williycole <64283810+williycole@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:38:09 -0500 Subject: [PATCH 3/5] Addressed pr comments, cleaned up format issues, and added template/meta data --- content/blog/9-30-24-go-wsl-nvim.md | 122 ++++- public/blog/9-30-24-go-wsl-nvim/index.html | 495 ++++++++++++++++++ public/blog/index.html | 29 +- public/blog/index.xml | 358 ++++++++++++- ...social_card_bg_hu10367275041299222840.webp | Bin 0 -> 8342 bytes .../social_card_bg_hu5620680302953961978.webp | Bin 0 -> 35554 bytes .../social_card_bg_hu5712067801084515421.webp | Bin 0 -> 35310 bytes public/index.html | 6 +- public/index.xml | 358 ++++++++++++- public/sitemap.xml | 2 + public/tags/about/index.xml | 6 +- public/tags/coding/index.xml | 6 +- public/tags/configuration/index.html | 110 ++++ public/tags/configuration/index.xml | 365 +++++++++++++ public/tags/debugging/index.html | 110 ++++ public/tags/debugging/index.xml | 365 +++++++++++++ public/tags/go/index.html | 110 ++++ public/tags/go/index.xml | 365 +++++++++++++ public/tags/neovim/index.html | 110 ++++ public/tags/neovim/index.xml | 365 +++++++++++++ public/tags/origin/index.xml | 6 +- public/tags/wsl/index.html | 110 ++++ public/tags/wsl/index.xml | 365 +++++++++++++ 23 files changed, 3712 insertions(+), 51 deletions(-) create mode 100644 public/blog/9-30-24-go-wsl-nvim/index.html create mode 100644 public/images/social_card_bg_hu10367275041299222840.webp create mode 100644 public/images/social_card_bg_hu5620680302953961978.webp create mode 100644 public/images/social_card_bg_hu5712067801084515421.webp create mode 100644 public/tags/configuration/index.html create mode 100644 public/tags/configuration/index.xml create mode 100644 public/tags/debugging/index.html create mode 100644 public/tags/debugging/index.xml create mode 100644 public/tags/go/index.html create mode 100644 public/tags/go/index.xml create mode 100644 public/tags/neovim/index.html create mode 100644 public/tags/neovim/index.xml create mode 100644 public/tags/wsl/index.html create mode 100644 public/tags/wsl/index.xml diff --git a/content/blog/9-30-24-go-wsl-nvim.md b/content/blog/9-30-24-go-wsl-nvim.md index 20f6782..6ba2f0d 100644 --- a/content/blog/9-30-24-go-wsl-nvim.md +++ b/content/blog/9-30-24-go-wsl-nvim.md @@ -1,78 +1,120 @@ ++++ +author = "Cole Boren" +title = "Setting up, Running, and Debugging Go Applications with Neovim on WSL" +date = "2024-09-18" +description = "A first pass at my approach to setting up Neovim on WSL with support for Go, debugging, stepping through code, and streamlining my nvim setup process as a windows user." +tags = [ + "neovim", + "configuration", + "go", + "wsl", + "debugging" +] ++++ + +--- + ## Introduction -As a minimalist at heart, I've always been drawn to simplicity - that's part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I'm not quite there yet.As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code.Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let's dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We'll cover everything from WSL installation to configuring Neovim for Go development and debugging. +As a minimalist at heart, I've always been drawn to simplicity - that's part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I'm not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let's dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We'll cover everything from WSL installation to configuring Neovim for Go development and debugging. + ## Step 1: Installing WSL 1. Open PowerShell as Administrator and run: - ``` + + ```powershell wsl --install ``` + 2. Restart your computer when prompted. 3. After restart, open Ubuntu from the Start menu to complete the setup. ## Step 2: Installing Go 1. Update your package list: - ``` + + ```shell sudo apt update ``` + 2. Remove any existing Go installation: - ``` + + ```shell sudo rm -rf /usr/local/go ``` + 3. Download Go 1.22.7, you can use whatever go version you want here - ``` + + ```shell wget https://go.dev/dl/go1.22.7.linux-amd64.tar.gz ``` + 4. Extract Go to /usr/local: - ``` + + ```shell sudo tar -C /usr/local -xzf go1.22.7.linux-amd64.tar.gz ``` + 5. Set up your Go environment: - ``` + + ```shell echo 'export GOROOT=/usr/local/go' >> ~/.bashrc echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.bashrc source ~/.bashrc ``` + 6. Verify the installation: - ``` + + ```shell go version ``` ## Step 3: Installing Neovim 1. Download the latest Neovim AppImage: - ``` + + ```shell curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage ``` + 2. Make it executable: - ``` + + ```shell chmod u+x nvim.appimage ``` + 3. Move it to a directory in your PATH: - ``` + + ```shell sudo mv nvim.appimage /usr/local/bin/nvim ``` ## Step 4: Setting Up Kickstart.nvim -1. Before we get started here be sure to checkout my (dotfiles)[https://github.com/williycole/dotfiles] incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them. +1. Before we get started here be sure to checkout my [dotfiles](https://github.com/williycole/dotfiles) incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them. 2. Back up your existing Neovim configuration: - ``` + + ```shell mv ~/.config/nvim ~/.config/nvim.bak ``` + 3. Clone Kickstart.nvim: - ``` + + ```shell git clone https://github.com/nvim-lua/kickstart.nvim.git ~/.config/nvim ``` -## 5. Configuring Go Development and DAP: + +## 5. Configuring Go Development and DAP + 1. Installing Delve Debugger (moved up): - ``` + + ```shell go install github.com/go-delve/delve/cmd/dlv@latest ``` + 2. Instead of creating separate files(we can do that later), we'll modify the existing `init.lua` in the `custom/plugins` directory. Open `~/.config/nvim/lua/custom/plugins/init.lua` and add the following content: - ```lua +```lua -- Function to find main.go file in the project incase its not in root local function find_main_go() local root = vim.fn.getcwd() @@ -176,15 +218,21 @@ return { end, }, } - ``` -## 6. Final Configuration: + +``` + +## 6. Final Configuration + 1. Open Neovim: `nvim` and Run `:checkhealth` to ensure everything is set up correctly. -2. Optional tease apart the main `init.lua` file, ie. `nvim\init.lua`. - - To do this find different sections of code you would like to pull out of the main file. For example, see this auto format configuration that comes with kickstart. But before you do this be sure to uncomment ` -- { import = 'custom.plugins' },` in `nvim\init.lua`, this will allow you to tease apart this main init.lua and place the things you tease apart in `nvim\custom\plugin\auto-format.lua` +2. Optional tease apart the main `init.lua` file, ie. `nvim\init.lua`. + +- To do this find different sections of code you would like to pull out of the main file. For example see steps and lua snippet below of the auto format configuration that comes with kickstart. +- **But before you do this be sure to uncomment `-- { import = 'custom.plugins' },`** in `nvim\init.lua`, this will allow you to tease apart this main init.lua and place the things you tease apart in `nvim\custom\plugin\auto-format.lua` + ```lua -- Everything in the curly braces is alread in the nvim/init.lua, simply cut it out --- and place it in a file within `nvim\custom\plugin\auto-format.lua`, and be sure --- to include the return +-- and place it in a file within `nvim\custom\plugin\auto-format.lua`, and be sure +-- to include the return -- ie. return { paste all the code you just cut here } -- if you do this sytematically you can really clean up the main init.lua file at nvim root dir return { -- Autoformat @@ -226,16 +274,34 @@ return { -- Autoformat -- -- You can use 'stop_after_first' to run the first available formatter from the list -- javascript = { "prettierd", "prettier", stop_after_first = true }, - - go = { 'go/fmt' }, -- NOTE: this isn't default, I added this for go formatting, the rest in this example is default + + go = { 'go/fmt' }, -- NOTE: this isn't default, I added this for go formatting, the rest in this example is default }, }, } ``` -3. Remember any plugin you want to isolate you can do this with, please be sure to follow that plugin's guide/README as best you can to get things work properly. + +- Generally this approach looks roughly as follows. + 1. Plugin Location: + - Plugins must be defined either in the main `nvim/init.lua` file or within the `lua/custom/plugins` directory. + 2. Modular Approach: + - Gradually separating components from the main `init.lua` is an effective way to experiment with your setup. + - Start by isolating small, manageable pieces of configuration. + 3. Hands-on Practice: + This process also provides valuable Neovim editing practice: + - Open the source file + - Use `cc` to cut the desired code + - Navigate to the target location with `:Ex` + - Create a new file with `%` followed by the filename (e.g., `my-new-file.lua`) + - Enter insert mode with `i`, press return, then `Esc` + - Paste the code with `p` + 4. Troubleshooting: + - When encountering plugin issues, always refer to the plugin's documentation and README. + - Check for recent GitHub issues related to the plugin for potential solutions or known problems. + ## Conclusion -Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experiance, if you looked at or used my (dotfiles)[https://github.com/williycole/dotfiles] you might have even noticed plenty of todos as I will likely itterate on this in the future and make another post as I learn/cleanup my neovim setup. +Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experience, if you looked at or used my [dotfiles](https://github.com/williycole/dotfiles) you might have even noticed plenty of todos as I will likely iterate on this in the future and make another post as I learn/cleanup my neovim setup. -If you have any questions or trouble feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this! \ No newline at end of file +If you have any questions or trouble feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this! diff --git a/public/blog/9-30-24-go-wsl-nvim/index.html b/public/blog/9-30-24-go-wsl-nvim/index.html new file mode 100644 index 0000000..0e5124f --- /dev/null +++ b/public/blog/9-30-24-go-wsl-nvim/index.html @@ -0,0 +1,495 @@ + + + + + + + + +Setting up, Running, and Debugging Go Applications with Neovim on WSL | CB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

CB

+ +
+
+

Setting up, Running, and Debugging Go Applications with Neovim on WSL

+ + +
+

Introduction

+

As a minimalist at heart, I’ve always been drawn to simplicity - that’s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I’m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let’s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We’ll cover everything from WSL installation to configuring Neovim for Go development and debugging.

+

Step 1: Installing WSL

+
    +
  1. +

    Open PowerShell as Administrator and run:

    + + + + + +
    1wsl --install
  2. +
  3. +

    Restart your computer when prompted.

    +
  4. +
  5. +

    After restart, open Ubuntu from the Start menu to complete the setup.

    +
  6. +
+

Step 2: Installing Go

+
    +
  1. +

    Update your package list:

    + + + + + +
    1sudo apt update
  2. +
  3. +

    Remove any existing Go installation:

    + + + + + +
    1sudo rm -rf /usr/local/go
  4. +
  5. +

    Download Go 1.22.7, you can use whatever go version you want here

    + + + + + +
    1wget https://go.dev/dl/go1.22.7.linux-amd64.tar.gz
  6. +
  7. +

    Extract Go to /usr/local:

    + + + + + +
    1sudo tar -C /usr/local -xzf go1.22.7.linux-amd64.tar.gz
  8. +
  9. +

    Set up your Go environment:

    + + + + + +
    1echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
    +2echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.bashrc
    +3source ~/.bashrc
  10. +
  11. +

    Verify the installation:

    + + + + + +
    1go version
  12. +
+

Step 3: Installing Neovim

+
    +
  1. +

    Download the latest Neovim AppImage:

    + + + + + +
    1curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
  2. +
  3. +

    Make it executable:

    + + + + + +
    1chmod u+x nvim.appimage
  4. +
  5. +

    Move it to a directory in your PATH:

    + + + + + +
    1sudo mv nvim.appimage /usr/local/bin/nvim
  6. +
+

Step 4: Setting Up Kickstart.nvim

+
    +
  1. +

    Before we get started here be sure to checkout my dotfiles incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them.

    +
  2. +
  3. +

    Back up your existing Neovim configuration:

    + + + + + +
    1mv ~/.config/nvim ~/.config/nvim.bak
  4. +
  5. +

    Clone Kickstart.nvim:

    + + + + + +
    1git clone https://github.com/nvim-lua/kickstart.nvim.git ~/.config/nvim
  6. +
+

5. Configuring Go Development and DAP

+
    +
  1. +

    Installing Delve Debugger (moved up):

    + + + + + +
    1go install github.com/go-delve/delve/cmd/dlv@latest
  2. +
  3. +

    Instead of creating separate files(we can do that later), we’ll modify the existing init.lua in the custom/plugins directory. Open ~/.config/nvim/lua/custom/plugins/init.lua and add the following content:

    +
  4. +
+ + + + + +
  1   -- Function to find main.go file in the project incase its not in root
+  2local function find_main_go()
+  3  local root = vim.fn.getcwd()
+  4  local main_go = vim.fn.globpath(root, '**/main.go', 0, 1)
+  5  if #main_go > 0 then
+  6    return vim.fn.fnamemodify(main_go[1], ':h')
+  7  end
+  8  return root
+  9end
+ 10
+ 11return {
+ 12  -- Core DAP (Debug Adapter Protocol) plugin
+ 13  {
+ 14    'mfussenegger/nvim-dap',
+ 15    dependencies = {
+ 16      -- Creates a beautiful debugger UI
+ 17      'rcarriga/nvim-dap-ui',
+ 18
+ 19      -- Installs the debug adapters for you
+ 20      'williamboman/mason.nvim',
+ 21      'jay-babu/mason-nvim-dap.nvim',
+ 22
+ 23      -- Add your own debuggers here
+ 24      'leoluz/nvim-dap-go',
+ 25    },
+ 26    config = function()
+ 27      local dap = require 'dap'
+ 28      local dapui = require 'dapui'
+ 29
+ 30      -- Configure Mason to automatically install DAP adapters
+ 31      require('mason-nvim-dap').setup {
+ 32        -- Makes a best effort to setup the various debuggers with
+ 33        -- reasonable debug configurations
+ 34        automatic_setup = true,
+ 35
+ 36        -- You can provide additional configuration to the handlers,
+ 37        -- see mason-nvim-dap README for more information
+ 38        handlers = {},
+ 39
+ 40        -- You'll need to check that you have the required things installed
+ 41        -- online, please don't ask me how to install them :)
+ 42        ensure_installed = {
+ 43          -- Update this to ensure that you have the debuggers for the langs you want
+ 44          'delve',
+ 45        },
+ 46      }
+ 47
+ 48      -- Basic debugging keymaps, feel free to change to your liking!
+ 49      vim.keymap.set('n', '<F5>', dap.continue, { desc = 'Debug: Start/Continue' })
+ 50      vim.keymap.set('n', '<F1>', dap.step_into, { desc = 'Debug: Step Into' })
+ 51      vim.keymap.set('n', '<F2>', dap.step_over, { desc = 'Debug: Step Over' })
+ 52      vim.keymap.set('n', '<F3>', dap.step_out, { desc = 'Debug: Step Out' })
+ 53      vim.keymap.set('n', '<leader>b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' })
+ 54      vim.keymap.set('n', '<leader>B', function()
+ 55        dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ')
+ 56      end, { desc = 'Debug: Set Breakpoint' })
+ 57
+ 58      -- Dap UI setup
+ 59      -- For more information, see |:help nvim-dap-ui|
+ 60      dapui.setup {
+ 61        -- Set icons to characters that are more likely to work in every terminal.
+ 62        --    Feel free to remove or use ones that you like more! :)
+ 63        --    Don't feel like these are good choices.
+ 64        icons = { expanded = '▾', collapsed = '▸', current_frame = '*' },
+ 65        controls = {
+ 66          icons = {
+ 67            pause = '⏸',
+ 68            play = '▶',
+ 69            step_into = '⏎',
+ 70            step_over = '⏭',
+ 71            step_out = '⏮',
+ 72            step_back = 'b',
+ 73            run_last = '▶▶',
+ 74            terminate = '⏹',
+ 75            disconnect = '⏏',
+ 76          },
+ 77        },
+ 78      }
+ 79
+ 80      -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
+ 81      vim.keymap.set('n', '<F7>', dapui.toggle, { desc = 'Debug: See last session result' })
+ 82
+ 83      dap.listeners.after.event_initialized['dapui_config'] = dapui.open
+ 84      dap.listeners.before.event_terminated['dapui_config'] = dapui.close
+ 85      dap.listeners.before.event_exited['dapui_config'] = dapui.close
+ 86
+ 87      -- Install golang specific config
+ 88      require('dap-go').setup()
+ 89
+ 90      -- Override dap-go's launch configuration so we can find main.go even if it isn't in the root of our project
+ 91      dap.configurations.go = {
+ 92        {
+ 93          type = 'go',
+ 94          name = 'Debug',
+ 95          request = 'launch',
+ 96          program = function()
+ 97            return find_main_go()
+ 98          end,
+ 99        },
+100      }
+101    end,
+102  },
+103}

6. Final Configuration

+
    +
  1. Open Neovim: nvim and Run :checkhealth to ensure everything is set up correctly.
  2. +
  3. Optional tease apart the main init.lua file, ie. nvim\init.lua.
  4. +
+
    +
  • To do this find different sections of code you would like to pull out of the main file. For example see steps and lua snippet below of the auto format configuration that comes with kickstart.
  • +
  • But before you do this be sure to uncomment -- { import = 'custom.plugins' }, in nvim\init.lua, this will allow you to tease apart this main init.lua and place the things you tease apart in nvim\custom\plugin\auto-format.lua
  • +
+ + + + + +
 1-- Everything in the curly braces is alread in the nvim/init.lua, simply cut it out
+ 2-- and place it in a file within `nvim\custom\plugin\auto-format.lua`, and be sure
+ 3-- to include the return
+ 4-- ie. return { paste all the code you just cut here }
+ 5-- if you do this sytematically you can really clean up the main init.lua file at nvim root dir
+ 6return { -- Autoformat
+ 7  'stevearc/conform.nvim',
+ 8  event = { 'BufWritePre' },
+ 9  cmd = { 'ConformInfo' },
+10  keys = {
+11    {
+12      '<leader>f',
+13      function()
+14        require('conform').format { async = true, lsp_format = 'fallback' }
+15      end,
+16      mode = '',
+17      desc = '[F]ormat buffer',
+18    },
+19  },
+20  opts = {
+21    notify_on_error = false,
+22    format_on_save = function(bufnr)
+23      -- Disable "format_on_save lsp_fallback" for languages that don't
+24      -- have a well standardized coding style. You can add additional
+25      -- languages here or re-enable it for the disabled ones.
+26      local disable_filetypes = { c = true, cpp = true }
+27      local lsp_format_opt
+28      if disable_filetypes[vim.bo[bufnr].filetype] then
+29        lsp_format_opt = 'never'
+30      else
+31        lsp_format_opt = 'fallback'
+32      end
+33      return {
+34        timeout_ms = 500,
+35        lsp_format = lsp_format_opt,
+36      }
+37    end,
+38    formatters_by_ft = {
+39      lua = { 'stylua' },
+40      -- Conform can also run multiple formatters sequentially
+41      -- python = { "isort", "black" },
+42      --
+43      -- You can use 'stop_after_first' to run the first available formatter from the list
+44      -- javascript = { "prettierd", "prettier", stop_after_first = true },
+45
+46      go = { 'go/fmt' }, -- NOTE: this isn't default, I added this for go formatting, the rest in this example is default
+47    },
+48  },
+49}
    +
  • Generally this approach looks roughly as follows. +
      +
    1. Plugin Location: +
        +
      • Plugins must be defined either in the main nvim/init.lua file or within the lua/custom/plugins directory.
      • +
      +
    2. +
    3. Modular Approach: +
        +
      • Gradually separating components from the main init.lua is an effective way to experiment with your setup.
      • +
      • Start by isolating small, manageable pieces of configuration.
      • +
      +
    4. +
    5. Hands-on Practice: +This process also provides valuable Neovim editing practice: +
        +
      • Open the source file
      • +
      • Use cc to cut the desired code
      • +
      • Navigate to the target location with :Ex
      • +
      • Create a new file with % followed by the filename (e.g., my-new-file.lua)
      • +
      • Enter insert mode with i, press return, then Esc
      • +
      • Paste the code with p
      • +
      +
    6. +
    7. Troubleshooting: +
        +
      • When encountering plugin issues, always refer to the plugin’s documentation and README.
      • +
      • Check for recent GitHub issues related to the plugin for potential solutions or known problems.
      • +
      +
    8. +
    +
  • +
+

Conclusion

+

Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experience, if you looked at or used my dotfiles you might have even noticed plenty of todos as I will likely iterate on this in the future and make another post as I learn/cleanup my neovim setup.

+

If you have any questions or trouble feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this!

+
+

+ + #neovim + + #configuration + + #go + + #wsl + + #debugging + +

+ +

+ + Reply to this post by email ↪ + +

+
+ + + + +
+
+ Cole Boren (CC BY 4.0) | Made with Bear Cub +
+ + + + + diff --git a/public/blog/index.html b/public/blog/index.html index 5affd2d..faa5cff 100644 --- a/public/blog/index.html +++ b/public/blog/index.html @@ -10,7 +10,7 @@ - + @@ -39,8 +39,8 @@ - - + + @@ -80,6 +80,19 @@
    +
  • + + + + + + + Setting up, Running, and Debugging Go Applications with Neovim on WSL + +
  • +
  • @@ -101,8 +114,18 @@ #coding + #configuration + + #debugging + + #go + + #neovim + #origin + #wsl + diff --git a/public/blog/index.xml b/public/blog/index.xml index 9e23aea..b5d5a8f 100644 --- a/public/blog/index.xml +++ b/public/blog/index.xml @@ -9,8 +9,358 @@ cborendev@gmail.com (Cole Boren) cborendev@gmail.com (Cole Boren) Cole Boren (CC BY 4.0) - Tue, 10 Sep 2024 00:00:00 +0000 + Wed, 18 Sep 2024 00:00:00 +0000 + + Setting up, Running, and Debugging Go Applications with Neovim on WSL + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + Wed, 18 Sep 2024 00:00:00 +0000cborendev@gmail.com (Cole Boren) + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + <hr> <h2 id="introduction">Introduction</h2> <p>As a minimalist at heart, I&rsquo;ve always been drawn to simplicity - that&rsquo;s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I&rsquo;m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let&rsquo;s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We&rsquo;ll cover everything from WSL installation to configuring Neovim for Go development and debugging.</p> + +

    Introduction

    +

    As a minimalist at heart, I’ve always been drawn to simplicity - that’s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I’m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let’s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We’ll cover everything from WSL installation to configuring Neovim for Go development and debugging.

    +

    Step 1: Installing WSL

    +
      +
    1. +

      Open PowerShell as Administrator and run:

      + + + + + +
      1wsl --install
    2. +
    3. +

      Restart your computer when prompted.

      +
    4. +
    5. +

      After restart, open Ubuntu from the Start menu to complete the setup.

      +
    6. +
    +

    Step 2: Installing Go

    +
      +
    1. +

      Update your package list:

      + + + + + +
      1sudo apt update
    2. +
    3. +

      Remove any existing Go installation:

      + + + + + +
      1sudo rm -rf /usr/local/go
    4. +
    5. +

      Download Go 1.22.7, you can use whatever go version you want here

      + + + + + +
      1wget https://go.dev/dl/go1.22.7.linux-amd64.tar.gz
    6. +
    7. +

      Extract Go to /usr/local:

      + + + + + +
      1sudo tar -C /usr/local -xzf go1.22.7.linux-amd64.tar.gz
    8. +
    9. +

      Set up your Go environment:

      + + + + + +
      1echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
      +2echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.bashrc
      +3source ~/.bashrc
    10. +
    11. +

      Verify the installation:

      + + + + + +
      1go version
    12. +
    +

    Step 3: Installing Neovim

    +
      +
    1. +

      Download the latest Neovim AppImage:

      + + + + + +
      1curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
    2. +
    3. +

      Make it executable:

      + + + + + +
      1chmod u+x nvim.appimage
    4. +
    5. +

      Move it to a directory in your PATH:

      + + + + + +
      1sudo mv nvim.appimage /usr/local/bin/nvim
    6. +
    +

    Step 4: Setting Up Kickstart.nvim

    +
      +
    1. +

      Before we get started here be sure to checkout my dotfiles incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them.

      +
    2. +
    3. +

      Back up your existing Neovim configuration:

      + + + + + +
      1mv ~/.config/nvim ~/.config/nvim.bak
    4. +
    5. +

      Clone Kickstart.nvim:

      + + + + + +
      1git clone https://github.com/nvim-lua/kickstart.nvim.git ~/.config/nvim
    6. +
    +

    5. Configuring Go Development and DAP

    +
      +
    1. +

      Installing Delve Debugger (moved up):

      + + + + + +
      1go install github.com/go-delve/delve/cmd/dlv@latest
    2. +
    3. +

      Instead of creating separate files(we can do that later), we’ll modify the existing init.lua in the custom/plugins directory. Open ~/.config/nvim/lua/custom/plugins/init.lua and add the following content:

      +
    4. +
    + + + + + +
      1   -- Function to find main.go file in the project incase its not in root
    +  2local function find_main_go()
    +  3  local root = vim.fn.getcwd()
    +  4  local main_go = vim.fn.globpath(root, '**/main.go', 0, 1)
    +  5  if #main_go > 0 then
    +  6    return vim.fn.fnamemodify(main_go[1], ':h')
    +  7  end
    +  8  return root
    +  9end
    + 10
    + 11return {
    + 12  -- Core DAP (Debug Adapter Protocol) plugin
    + 13  {
    + 14    'mfussenegger/nvim-dap',
    + 15    dependencies = {
    + 16      -- Creates a beautiful debugger UI
    + 17      'rcarriga/nvim-dap-ui',
    + 18
    + 19      -- Installs the debug adapters for you
    + 20      'williamboman/mason.nvim',
    + 21      'jay-babu/mason-nvim-dap.nvim',
    + 22
    + 23      -- Add your own debuggers here
    + 24      'leoluz/nvim-dap-go',
    + 25    },
    + 26    config = function()
    + 27      local dap = require 'dap'
    + 28      local dapui = require 'dapui'
    + 29
    + 30      -- Configure Mason to automatically install DAP adapters
    + 31      require('mason-nvim-dap').setup {
    + 32        -- Makes a best effort to setup the various debuggers with
    + 33        -- reasonable debug configurations
    + 34        automatic_setup = true,
    + 35
    + 36        -- You can provide additional configuration to the handlers,
    + 37        -- see mason-nvim-dap README for more information
    + 38        handlers = {},
    + 39
    + 40        -- You'll need to check that you have the required things installed
    + 41        -- online, please don't ask me how to install them :)
    + 42        ensure_installed = {
    + 43          -- Update this to ensure that you have the debuggers for the langs you want
    + 44          'delve',
    + 45        },
    + 46      }
    + 47
    + 48      -- Basic debugging keymaps, feel free to change to your liking!
    + 49      vim.keymap.set('n', '<F5>', dap.continue, { desc = 'Debug: Start/Continue' })
    + 50      vim.keymap.set('n', '<F1>', dap.step_into, { desc = 'Debug: Step Into' })
    + 51      vim.keymap.set('n', '<F2>', dap.step_over, { desc = 'Debug: Step Over' })
    + 52      vim.keymap.set('n', '<F3>', dap.step_out, { desc = 'Debug: Step Out' })
    + 53      vim.keymap.set('n', '<leader>b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' })
    + 54      vim.keymap.set('n', '<leader>B', function()
    + 55        dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ')
    + 56      end, { desc = 'Debug: Set Breakpoint' })
    + 57
    + 58      -- Dap UI setup
    + 59      -- For more information, see |:help nvim-dap-ui|
    + 60      dapui.setup {
    + 61        -- Set icons to characters that are more likely to work in every terminal.
    + 62        --    Feel free to remove or use ones that you like more! :)
    + 63        --    Don't feel like these are good choices.
    + 64        icons = { expanded = '▾', collapsed = '▸', current_frame = '*' },
    + 65        controls = {
    + 66          icons = {
    + 67            pause = '⏸',
    + 68            play = '▶',
    + 69            step_into = '⏎',
    + 70            step_over = '⏭',
    + 71            step_out = '⏮',
    + 72            step_back = 'b',
    + 73            run_last = '▶▶',
    + 74            terminate = '⏹',
    + 75            disconnect = '⏏',
    + 76          },
    + 77        },
    + 78      }
    + 79
    + 80      -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
    + 81      vim.keymap.set('n', '<F7>', dapui.toggle, { desc = 'Debug: See last session result' })
    + 82
    + 83      dap.listeners.after.event_initialized['dapui_config'] = dapui.open
    + 84      dap.listeners.before.event_terminated['dapui_config'] = dapui.close
    + 85      dap.listeners.before.event_exited['dapui_config'] = dapui.close
    + 86
    + 87      -- Install golang specific config
    + 88      require('dap-go').setup()
    + 89
    + 90      -- Override dap-go's launch configuration so we can find main.go even if it isn't in the root of our project
    + 91      dap.configurations.go = {
    + 92        {
    + 93          type = 'go',
    + 94          name = 'Debug',
    + 95          request = 'launch',
    + 96          program = function()
    + 97            return find_main_go()
    + 98          end,
    + 99        },
    +100      }
    +101    end,
    +102  },
    +103}

    6. Final Configuration

    +
      +
    1. Open Neovim: nvim and Run :checkhealth to ensure everything is set up correctly.
    2. +
    3. Optional tease apart the main init.lua file, ie. nvim\init.lua.
    4. +
    +
      +
    • To do this find different sections of code you would like to pull out of the main file. For example see steps and lua snippet below of the auto format configuration that comes with kickstart.
    • +
    • But before you do this be sure to uncomment -- { import = 'custom.plugins' }, in nvim\init.lua, this will allow you to tease apart this main init.lua and place the things you tease apart in nvim\custom\plugin\auto-format.lua
    • +
    + + + + + +
     1-- Everything in the curly braces is alread in the nvim/init.lua, simply cut it out
    + 2-- and place it in a file within `nvim\custom\plugin\auto-format.lua`, and be sure
    + 3-- to include the return
    + 4-- ie. return { paste all the code you just cut here }
    + 5-- if you do this sytematically you can really clean up the main init.lua file at nvim root dir
    + 6return { -- Autoformat
    + 7  'stevearc/conform.nvim',
    + 8  event = { 'BufWritePre' },
    + 9  cmd = { 'ConformInfo' },
    +10  keys = {
    +11    {
    +12      '<leader>f',
    +13      function()
    +14        require('conform').format { async = true, lsp_format = 'fallback' }
    +15      end,
    +16      mode = '',
    +17      desc = '[F]ormat buffer',
    +18    },
    +19  },
    +20  opts = {
    +21    notify_on_error = false,
    +22    format_on_save = function(bufnr)
    +23      -- Disable "format_on_save lsp_fallback" for languages that don't
    +24      -- have a well standardized coding style. You can add additional
    +25      -- languages here or re-enable it for the disabled ones.
    +26      local disable_filetypes = { c = true, cpp = true }
    +27      local lsp_format_opt
    +28      if disable_filetypes[vim.bo[bufnr].filetype] then
    +29        lsp_format_opt = 'never'
    +30      else
    +31        lsp_format_opt = 'fallback'
    +32      end
    +33      return {
    +34        timeout_ms = 500,
    +35        lsp_format = lsp_format_opt,
    +36      }
    +37    end,
    +38    formatters_by_ft = {
    +39      lua = { 'stylua' },
    +40      -- Conform can also run multiple formatters sequentially
    +41      -- python = { "isort", "black" },
    +42      --
    +43      -- You can use 'stop_after_first' to run the first available formatter from the list
    +44      -- javascript = { "prettierd", "prettier", stop_after_first = true },
    +45
    +46      go = { 'go/fmt' }, -- NOTE: this isn't default, I added this for go formatting, the rest in this example is default
    +47    },
    +48  },
    +49}
      +
    • Generally this approach looks roughly as follows. +
        +
      1. Plugin Location: +
          +
        • Plugins must be defined either in the main nvim/init.lua file or within the lua/custom/plugins directory.
        • +
        +
      2. +
      3. Modular Approach: +
          +
        • Gradually separating components from the main init.lua is an effective way to experiment with your setup.
        • +
        • Start by isolating small, manageable pieces of configuration.
        • +
        +
      4. +
      5. Hands-on Practice: +This process also provides valuable Neovim editing practice: +
          +
        • Open the source file
        • +
        • Use cc to cut the desired code
        • +
        • Navigate to the target location with :Ex
        • +
        • Create a new file with % followed by the filename (e.g., my-new-file.lua)
        • +
        • Enter insert mode with i, press return, then Esc
        • +
        • Paste the code with p
        • +
        +
      6. +
      7. Troubleshooting: +
          +
        • When encountering plugin issues, always refer to the plugin’s documentation and README.
        • +
        • Check for recent GitHub issues related to the plugin for potential solutions or known problems.
        • +
        +
      8. +
      +
    • +
    +

    Conclusion

    +

    Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experience, if you looked at or used my dotfiles you might have even noticed plenty of todos as I will likely iterate on this in the future and make another post as I learn/cleanup my neovim setup.

    +

    If you have any questions or trouble feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this!

    +]]>
    +
    My Origin Story http://localhost:1313/blog/9-10-24-origin-story/ @@ -20,9 +370,9 @@

    From Geology & Naval Warfare Maps to Go Developer

    Hi, I’m Cole. My programming journey began in late 2019, but my path there was anything but direct. After studying Geology in college and working as a Field Geologist for about a year, I found myself creating maps for naval warfare ships at the US DOD. It was there that I first dipped my toes into bash scripting to automate my workflow, and I was instantly hooked.

    -

    When 2020 rolled around, like many others with extra time on their hands, I dove deeper into programming. What fascinated me most was the democratization of the field - anyone willing to put in the time and effort could become a programmer, regardless of their background. This realization was particularly exciting for someone like me, coming from a non-traditional tech background. I started with basic C programming, creating simple programs like “Hello World” and a basic calculator. Initially, I thought I wanted to be a ‘frontend developer’, so I also dabbled in HTML and CSS. Little did I know that this curiosity would lead me on a journey from geology and naval warfare maps to becoming a Go developer.

    -

    A turning point came when I read an article about a former geologist who transitioned into programming. I reached out to him (thanks, Adam!) and our chat about geology, programming, and the tech lifestyle convinced me to take the plunge. I quit my job and committed to becoming a work-from-home dev. The challenge of programming, the flexibility of remote work, and the potential earnings were too tempting to resist. I moved back home and enrolled in a course with Tech901, where I learned the basics of HTML, CSS, and JavaScript. Shortly after, Cook Systems reached out and put me through an intensive bootcamp focused on Java and Spring Boot. Almost immediately, I landed a job as a Backend Developer (not frontend, ironically) at FedEx through Cook. Despite feeling underprepared as do most early career devs, I embraced the challenge and learned rapidly. After a year, I felt I had truly cut my teeth in programming professionally, then my career took another turn.

    -

    A company called Green Mountain (formerly Green Mountain Technology) ‘GM’ contacted me about a frontend position. Although I ended up in a backend role with C#/.NET, my time at GM was transformative. I learned about software engineering, unit testing, performance optimization, SQL, Kafka, APIs, architecture, code reviews, mentoring/how to mentor others, and project ownership. The experience and mentorship I received at GM were invaluable, its what helped my find my love for backend programming. However, like many tech companies in 2022-2023, GM faced layoffs. After about two years with GM, I decided it was time to spread my wings further. This led me to Hone Health, a fast-paced telehealth startup where I’ve been for about a year. At Hone, I’ve worn many hats - from helpdesk to bug hunting, infrastructure work to feature development, you name it and I’ve done it. As I write this, I’m transitioning to a new role as a Go developer - an exciting new chapter in my career. This journey from naval warfare maps to Go development has been filled with challenges, growth, and unexpected turns. I’m looking forward to sharing more about my ongoing learning and experiences in future blog posts.

    +

    When 2020 rolled around, like many others with extra time on their hands, I dove deeper into programming. What fascinated me most was the democratization of the field - anyone willing to put in the time and effort could become a programmer, regardless of their background. This realization was particularly exciting for someone like me, coming from a non-traditional tech background. I started with basic C programming, creating simple programs like “Hello World” and a basic calculator. Initially, I thought I wanted to be a ‘frontend developer’, so I also dabbled in HTML and CSS. Little did I know that this curiosity would lead me on a path of learning Javascript, React, .Net/C#, SQL, Java/Springboot, TypeScript, Python, Go and a bit more.

    +

    A turning point came when I read an article about a former geologist who transitioned into programming. I reached out to him (thanks, Adam!) and our chat about geology, programming, and the tech lifestyle convinced me to take the plunge. I quit my job and committed to becoming a work-from-home dev. The challenge of programming, the flexibility of remote work, and the potential earnings were too tempting to resist. I moved back home and enrolled in a course with Tech901, where I learned the basics of HTML, CSS, and JavaScript. Shortly after, Cook Systems reached out and put me through an intensive bootcamp focused on Java and Spring Boot. I’m super grateful to both of these organizations as they paved the way for the path I’m on today. After going through Cook’s fast paced bootcamp, almost immediately, I landed a job as a Backend Developer (not frontend, ironically) at FedEx through Cook. Despite feeling underprepared as do most early career devs, I embraced the challenge and learned rapidly. After a year, I felt I had truly cut my teeth in programming professionally, then my career took another turn.

    +

    A company called Green Mountain (formerly Green Mountain Technology) ‘GM’ contacted me about a frontend position. Although I ended up in a backend role with C#/.NET on team Honey Badgers (a whole blog post of its self, super talented devs), my time at GM was transformative. I learned about software engineering, unit testing, performance optimization, SQL, Kafka, APIs, architecture, code reviews, mentoring/how to mentor others, and project ownership. The experience and mentorship I received at GM were invaluable, its what helped my find my love for backend programming. However, like many tech companies in 2022-2023, GM faced layoffs. After about two years with GM, I decided it was time to spread my wings further. This led me to Hone Health, a fast-paced telehealth startup where I’ve been for about a year. At Hone, I’ve worn many hats - from helpdesk to bug hunting, infrastructure work to feature development, you name it and I’ve done it. As I write this, I’m transitioning to a new role as a Go developer - an exciting new chapter in my career. This journey thus far has been filled with challenges, growth, and unexpected turns. I’m looking forward to sharing more about my ongoing learning and experiences in future blog posts. Expect lots of post about Go.

    ~ Stay tuned as I continue to document my adventures in software development, and hopefully improve my writing along the way! 😆


    ]]>
    diff --git a/public/images/social_card_bg_hu10367275041299222840.webp b/public/images/social_card_bg_hu10367275041299222840.webp new file mode 100644 index 0000000000000000000000000000000000000000..aa5c56e68803ceb33bf17a402a41f57c00f7c1fa GIT binary patch literal 8342 zcmeHsMNk}oq9g>j0fM^**Wfz14L(3{Cj<%ZHo=2Su;6aNJwO=THMo0l*MR~4tJ=#} zZS7w7@PAhy`rKVzeQ0fE1%-H81cXoWGMajt!n7g((U;{2If!gwNWF*%qzKF<9pUR? z5GZx9QW3ETH`7M#xmA`I5rAaf$NM(xmBwpIocc7chDJWGcv2`~}OV*q#xJcW$9c_ZNV0uv$HuOqKW&#e!eYk9V~3sCky15f_1ve!t5NRQ4} z8b`oYi1}Oh+x=7I%g`k*RYEhQ_8#$-5B}>J_(*eOb^>XEygi$~v_2m^Of5sNHs4;3 zUJYJi;80lJy7Q&kGZf)18bbRz|MCM4d73)QdxNaMY&~7R4Bm6Sn7x_6{{5O<;k{vw z6O8&F{znC_e=dKB<8tW94c4otd3nKT@ zIV+<1=rj8zqm*wT;}QeY@LR|F4684~keV|ay)NXyeXC?R0lQfEzK8qry*&lRvOZan z1N4 z5%s42OY*U2N(woh!kS7}@ z6e{&EbH>P}*#07o-D?@9=j(XACBy_x}&85D;G9UN_ICU_HB# zxMLTD{}%`+d~(KF#@L_rno5aK(7Bkk^wH#|D)>dTixx3lqKndV;TLtgPV#}@kbX=n z?h=SNIQev^jJ3{3cZ%F>-F9ptCa$WGeanP>T4*GQn;|U`Lrfp|Cu>mz9l$HNkMw_* zP^i`5El>2{qDSmbV^>c_u09dw)v=A`-u-jeJdB@lRRa&;AOF4kXhVsdu%ej7WV5us`?d7VOBHJ0I z;5E?J;fwE0B5qiL^K57g6z`CT29xoxICd)&h(VZ>@l;sJO_w0z7yWW4`kyqR&fHAX za{G)7JbJwF*8cOB?1JFP8xkd8cvkuZL44$fY{?1P7TMxXMBBVyHavskK~xJNE3JueBLG_}OAx_1CkV=xCOJ~i2yBrPlpboY_q z6DAq2@w;fm_Dr6@9y9g2<>YDUOsYT$gS=}TH1Vp(vmwB^t6meN*bBhx*7&Rkodjq1$%V}o z7AkYoVM%7+_Nr2RV?2`>z}bp4djE~{U_sAti8)%+w%=rqUvIu~DgDy%E_b+?RD_`n zJQY9!XiJr)jZ=`*b780A@iM#*!Zzt%qb!=7F$;C*yozmWu~b1GugK9|vYS!6lU(f9 z67WU(P`q1Hg{iMkbFGN`EC3cIWoPPS{*U^In3T=x=c{y}&&O+uw|b6Vx)4 zI$S9L**!ak{Q3Kllrbi*Sz_+7_z%bl@?PVe5=mi_5x3W3Mtqp0DpX$*VV~kVK3ST< z?V2Ys_4ikN=zga2dH}4>>0C6vsV^yPQ<6W_mr4%I6B8*O@vjEQ z2A--uQW|ymr7^0&&N?lv3eWw;+g0b#b7E(3sjjDMn?_SHkKzvkM>Bk~&J~Y+psd)`kqsjS`7uBZ%+YLaENxCBjKl%}Kz% z>>YL|2!#%!^)JhSP)w`=!KvWR8dKHWJk6&Sa3lel(k_bBzW?B#I2EMyj}$CyClO1v z$UlTZLY6%iEEMg_7gUC5CmEw`Q-F*OCU?#8l>(aND7%(g-kwG3>A#0Xp6@{5+d}c_ zKO=hNtz5%QG^4w4=)SQdZw#V(XG*{-4w(>C*tO}>NuT~jlPw&@%Z6UqDh zCGk6B=uk{$Yi(Pfxkt;n3JYC@GD5L3yvrTtJ1vKD1C4ahFp){>ie{B7wvwdaIvvSz z9`KQqI%5`yYB8Vj(+kwo9P;hIbsixp{l~Ta>l$;HjEl*z{X_3p zobUC_gM6|D+Po}nqE5rA7zEAN{H-q@!E?WF%l>*?jC~E(mlel~vsAoKd;g952&C4e zcR<@@>I=a4kD;lz%@P${=i|#SbU~o=087^uAL7jF30$mdI^K~QE%QneevI@13@=NI zeDKRH37m5hCed;#sT%A3zMgR z6LmAniUM{ARX~-CJe$F`F!)#sV~VEdqmM?@K4lvE#p8 zWqbS&H(&LgwSekE*y<0m(mnmeLq!g5}Qene~sCH}*S2Vz9#ECW3*Gn~a^ zsh~={Jcf>cAqi7Vbq`i#K0cuoEc6P#k)o#L1PnULE2CD*_L27ce!r%IAL#x}i z5c{lV>JdYnw4DA)QtyQu^QUw3N|Ml2KfCMp>{V4(hdspc)^IU7{AyydnZ6?-A)FW+ zjZk21jz#%o{Po1Xne%)P*n)b;OHr|gBW%VXSoq{(L1#mYp2c;UD)Pc?&I8rAq_$g?9UGym> zMThj1Jb+V9FDf)KGrUfvkt1l{FwSn%07e^oB_q{B5P~;JjeJgo^$**EWk3Kdsd@SuWl)OAj7 zowze*N^rEJq7>&#q*~z97X#5UD01#CRVQhMwC+4*W5qJ{bb0RhLrqsYCRg}$>&lul zaWVY>Dc=|TEK;m2dWmgbjS$E;DqnaE^-{+KjrS9onWUmT{6;L=MDjK6{3#(> za8F8>J+$3h3A$M9PI&9p2dHkFgy0xJ{(k_1hA>P@=YV*5BVBbc za!6DxocUXz;J*2xH1+NuKR)WSiD6GZ4wKU5ytxI$gaa>j_P-=45>5^hDl_6qXTZ_M zm0*KgrJ07BT6v%W2kZmwvc|H(QfNFPcu&dxB3*d+pSwwBeWA;rV*lxQUchlC^8N*(t@%~1 zzsT>HT}01I#Xu!r56Kwy8PDxmN`7X{HI3@Aaw3~BX@uu~*WrKUlY27AFwJED#_~`m zzKT6%k!Q)s(t~smD{ZS%)M=^4wcq8Jr8N8y*EV3w~L)kOww_EVcf$)~E$-Nc z+&JkoxKL7k*_HS8F`Sy^&=v5jZ*Z==@#GBpBk-yj#~Hi5nWMx{<*uy=f0w6=YnrZW z?%<8L^XtyvWaNX)sVxTO&x+Y8t!p_pM@F+S^{G8(izS)dQ9P_(%_pG}?6=<=Fd zdf|v^!YxRYjr~xd=if~p-k*Hs`!%z2V;0rAi7nmwT((&vtnNn81ir&?THz(9E6Sm0 z)$>THpi~pGO1$({t!JlR=isXwCq2T1`lq)EgUtvuNUbkyE5vH{`~xJy+)OY%R-X}~ zsJ~3Jda0r+fGDK7E9O-#r=uNyY%w7Gs?d2+FquHjXHESeL}q5Gh4<}l-P|R+Wq}cq z^^M6QFgG_#HfB_9>TaOfgZm0rSxpR zyAbEpUm5T7o~<^1^asQUBa93`j_GlU0VXno3TIX9vEChm>V8+!c||-k4}_cATGsj5 z?hxa*o`7OYFYe*5g~GxnZ@7O#oGuOx8!rETn}g-^|Rvg0(T3#XGWrq_C`)>XL#RzmEE2&OwZF76FQ0FRir2 z8Lh9$pya}Hv#KLh>yLsshph@z+yG`d^z{f&ZY?7j4EKy`vPZvUakipE>M%h_Ed$j=?I_i4ZZR5iy%rN9B9?-qb^x zo-f|oA8&ETi0i{})%MuTR9A3K04s0?EfKsp%}#?}Gw*eqNd1)H&bmyDLZ|x*o{Q;Y zDXyWkKhT;CWW^A;En|XiV=s&fwtRu9X6eKgi%cx}z)5@2H2=zB{nqa=@LsSYMT;>s z#&1+YeV&83M^$5`VaydCvH#;DJ<=4}+}tdPGW)YAp#=|UF91+01A_MDKmd6HYSd7; zwG^m9+=uO_9Rbr6ccXm<;l|Ad#%DqC+Ow5{jRXsRfM7&I@>Ju7#k@3@eBG$07V3CK zcX}QcqNmZR#QMwEB(p2!G5dZuch~oHFRIVwA&asHOzD%z$=qk@tyEVF-?@8wz0~$o zcbdMl-zm2{bsR>ik8r2b!W^73_TiP-Z03csiqjrIyM7iU(I?UDA`Yy`*PL@WsjX^@ z)Oai_2J(nVU998%&6RCX0?DRyOX6xqv-eoPcENWSdIq_lDDlHHs}*VF$oSM*;phHEUAa!e&uTd3FW%aAQ*KpJotxVv!HBHM~X zsB;~|C<{=LVa`Df`KWz{?0)5%Ad`RFJWWP9f+@&ao>`c4Cj{-{;8S`lW&c`bGEk{&iQL@ zkAm6Aju|YkLgK589T;dw{*#k{958N!4?WQxf#rKw$N24v@1a7VeC!5_6ie%Mv?By_ zRyIH+v{~zq>axr^hW*InwsXo=#+43=``^q}LN%l2?cSE*ONsKcU`n3&ROX-~IK95@$?jH)vNFk|_P-9RSo zn1_P6*Bew|ye|jHjMv)WYGEdip*t0^dPLu+}%96cSJ`+{o zF?~pIVU$#Ofe1Xa68hG0R6hw5!?Zul#@bBPJh#=1M#ij|5{x%iwaxr10Hqp|FSEMO zWK6|L!Af|7(h5hpZ{Zx{kB+ho?flC&0tYch@qM-#L`%|IJIv_61nWakqghbVAtB&N zqt$_ffF7a{Y0c$|mu575IhH=NlFa!oqFiZ*NzkHAOvDOo8!miHURGM<*G&$g;o)7Q zlf9pH3Zw|AsxWS3_gWH*WWQxj5NGUnJ(|Iu!20)}(&H2Fh>V)nVGjp2qZ!kmup`e4 zEuEiii#-xsyrhURJlAF|F_v$6ZZZ*+>;EQe5oJ@GdXzuh1+hZ0u0K2_aZ=L;{iJ;2 z-EsH$)SRxwN{^Oz&{C!WYls1IR- z!UB56oi%uPjox?{rGt1GkKG%!0eeIww8JYhxDt%n<$S4*iN??=m z@6p&Mjc*OjT?bMbghE7q9uKOE!4?c$gw6X2mx&VjGE(_64J@o>D3_nZI!iS54!3*W zco9M6NyqR$b(d_et0x9L z3kL^uK(5&504t{510|o+iHIH_Gp3_Q!)0<`^=a1N9W4M7<__0z57g>#_?*RvYTAgkWTB2%`C*^*Hs0VDA`a`> zq+>4rh<{kh-=_mj4;}~&DF!q3CPS&OjaP#Rd1I+)qEDpJ7GSkwK*whLTHO_x)}+{2A|PZx$$S`eXUenOvZdmJZ*ko(Vh*i zMq`G4z6Xj2iP$0Oi{QKR!osoGoucfNTW6RcpKDBKJu;kWW$qi^cAl;8Tkmf13Jau(b? z_~eVe5N(3%KASzEOkg;;`F!PI;!@1N9SQ-)mGn8@oshLh8mwxp8LL^{iO~dr~|Fxd#OC{ccsGk zN^cg0w|m|}#39DsvckziX2)mQ#2`M0dzbZ$V4Mahk~?}niTMS5S7!*FE;9_ z*u<9@#C1JHDe$xPLrtfGx;GxIK=}20$Ck1`kG(g0X@1iUl}2lp^!QGEZcQE{3!+a+ zt!*CdQM!GJQ3jUGSd>2#bMRtFXc_4GM{>$SWyc0F@3&OweUb@o!o#9!G#hPaRGo%> zTUiQu;-=?R;OXCB-h}f5N5s2!mz%&!_K+&{Tg@@ncG#R&c77N=GG z?gG;Z5o;}ERyN6fklh9GvvLx=-!>U6)i_}mjIZOSY8!G%91YL6@QGWdTxz54ODC>Q z3x{tbyGs&M;y$Yoz4vHCN|56`t{MhXF9rA|{j#kjty6vXNnIYI0=pcK~f*G+dc_}Xbu1Yb1ZmcvUPE7*{8>nJ5Z<^G@Gm+TFl?_s~q zI5*wQt*aVT!)3)O-HlxleiGRC6~@LWtu} zp%ba1OI6f#wJSzoC_}5eW!}GB{5En7=%^V}zit{UHy8Y@KLIWY17>63_*(?C0NszV zkIO$oHEAUs|NVR$%})%z*ZMf7j7&l+L@V@ai^MgNUEG0Ji@|az$OF==q?qIGOGZX= z+T+RG{uR1(-R`uO^S&E7j`43cMWTg|jjn9VY86(-VwL1ACQb<{;Y|=goW*|vBk=5$ z!myRKc>e45r)Ig+Z8%-^s>D#aO@)SL{_?O%hzLO(lX8Vj9}LPlNBHRAM*h6!PA?Bg zk~e)P5#YuxXt~hI`p+O&TfI0Or|wC65oPisY8>f?cPHp~_PM&7)bG}1hSmHPj?kX~+Y*eq zh3P~bg|WRqnK4$V;R4}v6HD!;VH!UkOk7iY?z@9N>B`$Dl@5|u_+ovuax2zeB=>y$Gb)gRJq;xG7gC1Qn$vvS9hGB>tB{N77? SBDr3NwYIk)l=pwX#r_MYLlNEp literal 0 HcmV?d00001 diff --git a/public/images/social_card_bg_hu5620680302953961978.webp b/public/images/social_card_bg_hu5620680302953961978.webp new file mode 100644 index 0000000000000000000000000000000000000000..1863af3f632c7ad8cf267ebaf70ad167d9ce2c70 GIT binary patch literal 35554 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 W000000000000000000000000{;XNJz literal 0 HcmV?d00001 diff --git a/public/images/social_card_bg_hu5712067801084515421.webp b/public/images/social_card_bg_hu5712067801084515421.webp new file mode 100644 index 0000000000000000000000000000000000000000..fa2a73eb650d078bd6ce43c7cc0384453f0d3c9f GIT binary patch literal 35310 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
  • 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 literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html index f246978..eed904b 100644 --- a/public/index.html +++ b/public/index.html @@ -11,7 +11,7 @@ - + @@ -40,8 +40,8 @@ - - + + diff --git a/public/index.xml b/public/index.xml index 4db9c8f..439917d 100644 --- a/public/index.xml +++ b/public/index.xml @@ -9,8 +9,358 @@ cborendev@gmail.com (Cole Boren) cborendev@gmail.com (Cole Boren) Cole Boren (CC BY 4.0) - Tue, 10 Sep 2024 00:00:00 +0000 + Wed, 18 Sep 2024 00:00:00 +0000 + + Setting up, Running, and Debugging Go Applications with Neovim on WSL + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + Wed, 18 Sep 2024 00:00:00 +0000cborendev@gmail.com (Cole Boren) + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + <hr> <h2 id="introduction">Introduction</h2> <p>As a minimalist at heart, I&rsquo;ve always been drawn to simplicity - that&rsquo;s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I&rsquo;m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let&rsquo;s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We&rsquo;ll cover everything from WSL installation to configuring Neovim for Go development and debugging.</p> + +

    Introduction

    +

    As a minimalist at heart, I’ve always been drawn to simplicity - that’s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I’m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let’s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We’ll cover everything from WSL installation to configuring Neovim for Go development and debugging.

    +

    Step 1: Installing WSL

    +
      +
    1. +

      Open PowerShell as Administrator and run:

      + + + + + +
      1wsl --install
    2. +
    3. +

      Restart your computer when prompted.

      +
    4. +
    5. +

      After restart, open Ubuntu from the Start menu to complete the setup.

      +
    6. +
    +

    Step 2: Installing Go

    +
      +
    1. +

      Update your package list:

      + + + + + +
      1sudo apt update
    2. +
    3. +

      Remove any existing Go installation:

      + + + + + +
      1sudo rm -rf /usr/local/go
    4. +
    5. +

      Download Go 1.22.7, you can use whatever go version you want here

      + + + + + +
      1wget https://go.dev/dl/go1.22.7.linux-amd64.tar.gz
    6. +
    7. +

      Extract Go to /usr/local:

      + + + + + +
      1sudo tar -C /usr/local -xzf go1.22.7.linux-amd64.tar.gz
    8. +
    9. +

      Set up your Go environment:

      + + + + + +
      1echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
      +2echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.bashrc
      +3source ~/.bashrc
    10. +
    11. +

      Verify the installation:

      + + + + + +
      1go version
    12. +
    +

    Step 3: Installing Neovim

    +
      +
    1. +

      Download the latest Neovim AppImage:

      + + + + + +
      1curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
    2. +
    3. +

      Make it executable:

      + + + + + +
      1chmod u+x nvim.appimage
    4. +
    5. +

      Move it to a directory in your PATH:

      + + + + + +
      1sudo mv nvim.appimage /usr/local/bin/nvim
    6. +
    +

    Step 4: Setting Up Kickstart.nvim

    +
      +
    1. +

      Before we get started here be sure to checkout my dotfiles incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them.

      +
    2. +
    3. +

      Back up your existing Neovim configuration:

      + + + + + +
      1mv ~/.config/nvim ~/.config/nvim.bak
    4. +
    5. +

      Clone Kickstart.nvim:

      + + + + + +
      1git clone https://github.com/nvim-lua/kickstart.nvim.git ~/.config/nvim
    6. +
    +

    5. Configuring Go Development and DAP

    +
      +
    1. +

      Installing Delve Debugger (moved up):

      + + + + + +
      1go install github.com/go-delve/delve/cmd/dlv@latest
    2. +
    3. +

      Instead of creating separate files(we can do that later), we’ll modify the existing init.lua in the custom/plugins directory. Open ~/.config/nvim/lua/custom/plugins/init.lua and add the following content:

      +
    4. +
    + + + + + +
      1   -- Function to find main.go file in the project incase its not in root
    +  2local function find_main_go()
    +  3  local root = vim.fn.getcwd()
    +  4  local main_go = vim.fn.globpath(root, '**/main.go', 0, 1)
    +  5  if #main_go > 0 then
    +  6    return vim.fn.fnamemodify(main_go[1], ':h')
    +  7  end
    +  8  return root
    +  9end
    + 10
    + 11return {
    + 12  -- Core DAP (Debug Adapter Protocol) plugin
    + 13  {
    + 14    'mfussenegger/nvim-dap',
    + 15    dependencies = {
    + 16      -- Creates a beautiful debugger UI
    + 17      'rcarriga/nvim-dap-ui',
    + 18
    + 19      -- Installs the debug adapters for you
    + 20      'williamboman/mason.nvim',
    + 21      'jay-babu/mason-nvim-dap.nvim',
    + 22
    + 23      -- Add your own debuggers here
    + 24      'leoluz/nvim-dap-go',
    + 25    },
    + 26    config = function()
    + 27      local dap = require 'dap'
    + 28      local dapui = require 'dapui'
    + 29
    + 30      -- Configure Mason to automatically install DAP adapters
    + 31      require('mason-nvim-dap').setup {
    + 32        -- Makes a best effort to setup the various debuggers with
    + 33        -- reasonable debug configurations
    + 34        automatic_setup = true,
    + 35
    + 36        -- You can provide additional configuration to the handlers,
    + 37        -- see mason-nvim-dap README for more information
    + 38        handlers = {},
    + 39
    + 40        -- You'll need to check that you have the required things installed
    + 41        -- online, please don't ask me how to install them :)
    + 42        ensure_installed = {
    + 43          -- Update this to ensure that you have the debuggers for the langs you want
    + 44          'delve',
    + 45        },
    + 46      }
    + 47
    + 48      -- Basic debugging keymaps, feel free to change to your liking!
    + 49      vim.keymap.set('n', '<F5>', dap.continue, { desc = 'Debug: Start/Continue' })
    + 50      vim.keymap.set('n', '<F1>', dap.step_into, { desc = 'Debug: Step Into' })
    + 51      vim.keymap.set('n', '<F2>', dap.step_over, { desc = 'Debug: Step Over' })
    + 52      vim.keymap.set('n', '<F3>', dap.step_out, { desc = 'Debug: Step Out' })
    + 53      vim.keymap.set('n', '<leader>b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' })
    + 54      vim.keymap.set('n', '<leader>B', function()
    + 55        dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ')
    + 56      end, { desc = 'Debug: Set Breakpoint' })
    + 57
    + 58      -- Dap UI setup
    + 59      -- For more information, see |:help nvim-dap-ui|
    + 60      dapui.setup {
    + 61        -- Set icons to characters that are more likely to work in every terminal.
    + 62        --    Feel free to remove or use ones that you like more! :)
    + 63        --    Don't feel like these are good choices.
    + 64        icons = { expanded = '▾', collapsed = '▸', current_frame = '*' },
    + 65        controls = {
    + 66          icons = {
    + 67            pause = '⏸',
    + 68            play = '▶',
    + 69            step_into = '⏎',
    + 70            step_over = '⏭',
    + 71            step_out = '⏮',
    + 72            step_back = 'b',
    + 73            run_last = '▶▶',
    + 74            terminate = '⏹',
    + 75            disconnect = '⏏',
    + 76          },
    + 77        },
    + 78      }
    + 79
    + 80      -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
    + 81      vim.keymap.set('n', '<F7>', dapui.toggle, { desc = 'Debug: See last session result' })
    + 82
    + 83      dap.listeners.after.event_initialized['dapui_config'] = dapui.open
    + 84      dap.listeners.before.event_terminated['dapui_config'] = dapui.close
    + 85      dap.listeners.before.event_exited['dapui_config'] = dapui.close
    + 86
    + 87      -- Install golang specific config
    + 88      require('dap-go').setup()
    + 89
    + 90      -- Override dap-go's launch configuration so we can find main.go even if it isn't in the root of our project
    + 91      dap.configurations.go = {
    + 92        {
    + 93          type = 'go',
    + 94          name = 'Debug',
    + 95          request = 'launch',
    + 96          program = function()
    + 97            return find_main_go()
    + 98          end,
    + 99        },
    +100      }
    +101    end,
    +102  },
    +103}

    6. Final Configuration

    +
      +
    1. Open Neovim: nvim and Run :checkhealth to ensure everything is set up correctly.
    2. +
    3. Optional tease apart the main init.lua file, ie. nvim\init.lua.
    4. +
    +
      +
    • To do this find different sections of code you would like to pull out of the main file. For example see steps and lua snippet below of the auto format configuration that comes with kickstart.
    • +
    • But before you do this be sure to uncomment -- { import = 'custom.plugins' }, in nvim\init.lua, this will allow you to tease apart this main init.lua and place the things you tease apart in nvim\custom\plugin\auto-format.lua
    • +
    + + + + + +
     1-- Everything in the curly braces is alread in the nvim/init.lua, simply cut it out
    + 2-- and place it in a file within `nvim\custom\plugin\auto-format.lua`, and be sure
    + 3-- to include the return
    + 4-- ie. return { paste all the code you just cut here }
    + 5-- if you do this sytematically you can really clean up the main init.lua file at nvim root dir
    + 6return { -- Autoformat
    + 7  'stevearc/conform.nvim',
    + 8  event = { 'BufWritePre' },
    + 9  cmd = { 'ConformInfo' },
    +10  keys = {
    +11    {
    +12      '<leader>f',
    +13      function()
    +14        require('conform').format { async = true, lsp_format = 'fallback' }
    +15      end,
    +16      mode = '',
    +17      desc = '[F]ormat buffer',
    +18    },
    +19  },
    +20  opts = {
    +21    notify_on_error = false,
    +22    format_on_save = function(bufnr)
    +23      -- Disable "format_on_save lsp_fallback" for languages that don't
    +24      -- have a well standardized coding style. You can add additional
    +25      -- languages here or re-enable it for the disabled ones.
    +26      local disable_filetypes = { c = true, cpp = true }
    +27      local lsp_format_opt
    +28      if disable_filetypes[vim.bo[bufnr].filetype] then
    +29        lsp_format_opt = 'never'
    +30      else
    +31        lsp_format_opt = 'fallback'
    +32      end
    +33      return {
    +34        timeout_ms = 500,
    +35        lsp_format = lsp_format_opt,
    +36      }
    +37    end,
    +38    formatters_by_ft = {
    +39      lua = { 'stylua' },
    +40      -- Conform can also run multiple formatters sequentially
    +41      -- python = { "isort", "black" },
    +42      --
    +43      -- You can use 'stop_after_first' to run the first available formatter from the list
    +44      -- javascript = { "prettierd", "prettier", stop_after_first = true },
    +45
    +46      go = { 'go/fmt' }, -- NOTE: this isn't default, I added this for go formatting, the rest in this example is default
    +47    },
    +48  },
    +49}
      +
    • Generally this approach looks roughly as follows. +
        +
      1. Plugin Location: +
          +
        • Plugins must be defined either in the main nvim/init.lua file or within the lua/custom/plugins directory.
        • +
        +
      2. +
      3. Modular Approach: +
          +
        • Gradually separating components from the main init.lua is an effective way to experiment with your setup.
        • +
        • Start by isolating small, manageable pieces of configuration.
        • +
        +
      4. +
      5. Hands-on Practice: +This process also provides valuable Neovim editing practice: +
          +
        • Open the source file
        • +
        • Use cc to cut the desired code
        • +
        • Navigate to the target location with :Ex
        • +
        • Create a new file with % followed by the filename (e.g., my-new-file.lua)
        • +
        • Enter insert mode with i, press return, then Esc
        • +
        • Paste the code with p
        • +
        +
      6. +
      7. Troubleshooting: +
          +
        • When encountering plugin issues, always refer to the plugin’s documentation and README.
        • +
        • Check for recent GitHub issues related to the plugin for potential solutions or known problems.
        • +
        +
      8. +
      +
    • +
    +

    Conclusion

    +

    Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experience, if you looked at or used my dotfiles you might have even noticed plenty of todos as I will likely iterate on this in the future and make another post as I learn/cleanup my neovim setup.

    +

    If you have any questions or trouble feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this!

    +]]>
    +
    My Origin Story http://localhost:1313/blog/9-10-24-origin-story/ @@ -20,9 +370,9 @@

    From Geology & Naval Warfare Maps to Go Developer

    Hi, I’m Cole. My programming journey began in late 2019, but my path there was anything but direct. After studying Geology in college and working as a Field Geologist for about a year, I found myself creating maps for naval warfare ships at the US DOD. It was there that I first dipped my toes into bash scripting to automate my workflow, and I was instantly hooked.

    -

    When 2020 rolled around, like many others with extra time on their hands, I dove deeper into programming. What fascinated me most was the democratization of the field - anyone willing to put in the time and effort could become a programmer, regardless of their background. This realization was particularly exciting for someone like me, coming from a non-traditional tech background. I started with basic C programming, creating simple programs like “Hello World” and a basic calculator. Initially, I thought I wanted to be a ‘frontend developer’, so I also dabbled in HTML and CSS. Little did I know that this curiosity would lead me on a journey from geology and naval warfare maps to becoming a Go developer.

    -

    A turning point came when I read an article about a former geologist who transitioned into programming. I reached out to him (thanks, Adam!) and our chat about geology, programming, and the tech lifestyle convinced me to take the plunge. I quit my job and committed to becoming a work-from-home dev. The challenge of programming, the flexibility of remote work, and the potential earnings were too tempting to resist. I moved back home and enrolled in a course with Tech901, where I learned the basics of HTML, CSS, and JavaScript. Shortly after, Cook Systems reached out and put me through an intensive bootcamp focused on Java and Spring Boot. Almost immediately, I landed a job as a Backend Developer (not frontend, ironically) at FedEx through Cook. Despite feeling underprepared as do most early career devs, I embraced the challenge and learned rapidly. After a year, I felt I had truly cut my teeth in programming professionally, then my career took another turn.

    -

    A company called Green Mountain (formerly Green Mountain Technology) ‘GM’ contacted me about a frontend position. Although I ended up in a backend role with C#/.NET, my time at GM was transformative. I learned about software engineering, unit testing, performance optimization, SQL, Kafka, APIs, architecture, code reviews, mentoring/how to mentor others, and project ownership. The experience and mentorship I received at GM were invaluable, its what helped my find my love for backend programming. However, like many tech companies in 2022-2023, GM faced layoffs. After about two years with GM, I decided it was time to spread my wings further. This led me to Hone Health, a fast-paced telehealth startup where I’ve been for about a year. At Hone, I’ve worn many hats - from helpdesk to bug hunting, infrastructure work to feature development, you name it and I’ve done it. As I write this, I’m transitioning to a new role as a Go developer - an exciting new chapter in my career. This journey from naval warfare maps to Go development has been filled with challenges, growth, and unexpected turns. I’m looking forward to sharing more about my ongoing learning and experiences in future blog posts.

    +

    When 2020 rolled around, like many others with extra time on their hands, I dove deeper into programming. What fascinated me most was the democratization of the field - anyone willing to put in the time and effort could become a programmer, regardless of their background. This realization was particularly exciting for someone like me, coming from a non-traditional tech background. I started with basic C programming, creating simple programs like “Hello World” and a basic calculator. Initially, I thought I wanted to be a ‘frontend developer’, so I also dabbled in HTML and CSS. Little did I know that this curiosity would lead me on a path of learning Javascript, React, .Net/C#, SQL, Java/Springboot, TypeScript, Python, Go and a bit more.

    +

    A turning point came when I read an article about a former geologist who transitioned into programming. I reached out to him (thanks, Adam!) and our chat about geology, programming, and the tech lifestyle convinced me to take the plunge. I quit my job and committed to becoming a work-from-home dev. The challenge of programming, the flexibility of remote work, and the potential earnings were too tempting to resist. I moved back home and enrolled in a course with Tech901, where I learned the basics of HTML, CSS, and JavaScript. Shortly after, Cook Systems reached out and put me through an intensive bootcamp focused on Java and Spring Boot. I’m super grateful to both of these organizations as they paved the way for the path I’m on today. After going through Cook’s fast paced bootcamp, almost immediately, I landed a job as a Backend Developer (not frontend, ironically) at FedEx through Cook. Despite feeling underprepared as do most early career devs, I embraced the challenge and learned rapidly. After a year, I felt I had truly cut my teeth in programming professionally, then my career took another turn.

    +

    A company called Green Mountain (formerly Green Mountain Technology) ‘GM’ contacted me about a frontend position. Although I ended up in a backend role with C#/.NET on team Honey Badgers (a whole blog post of its self, super talented devs), my time at GM was transformative. I learned about software engineering, unit testing, performance optimization, SQL, Kafka, APIs, architecture, code reviews, mentoring/how to mentor others, and project ownership. The experience and mentorship I received at GM were invaluable, its what helped my find my love for backend programming. However, like many tech companies in 2022-2023, GM faced layoffs. After about two years with GM, I decided it was time to spread my wings further. This led me to Hone Health, a fast-paced telehealth startup where I’ve been for about a year. At Hone, I’ve worn many hats - from helpdesk to bug hunting, infrastructure work to feature development, you name it and I’ve done it. As I write this, I’m transitioning to a new role as a Go developer - an exciting new chapter in my career. This journey thus far has been filled with challenges, growth, and unexpected turns. I’m looking forward to sharing more about my ongoing learning and experiences in future blog posts. Expect lots of post about Go.

    ~ Stay tuned as I continue to document my adventures in software development, and hopefully improve my writing along the way! 😆


    ]]>
    diff --git a/public/sitemap.xml b/public/sitemap.xml index bd5f16b..f93136d 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -22,6 +22,8 @@ http://localhost:1313/tags/ 2024-09-10T00:00:00+00:00 + + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ http://localhost:1313/categories/ diff --git a/public/tags/about/index.xml b/public/tags/about/index.xml index 0f7969e..618788f 100644 --- a/public/tags/about/index.xml +++ b/public/tags/about/index.xml @@ -20,9 +20,9 @@

    From Geology & Naval Warfare Maps to Go Developer

    Hi, I’m Cole. My programming journey began in late 2019, but my path there was anything but direct. After studying Geology in college and working as a Field Geologist for about a year, I found myself creating maps for naval warfare ships at the US DOD. It was there that I first dipped my toes into bash scripting to automate my workflow, and I was instantly hooked.

    -

    When 2020 rolled around, like many others with extra time on their hands, I dove deeper into programming. What fascinated me most was the democratization of the field - anyone willing to put in the time and effort could become a programmer, regardless of their background. This realization was particularly exciting for someone like me, coming from a non-traditional tech background. I started with basic C programming, creating simple programs like “Hello World” and a basic calculator. Initially, I thought I wanted to be a ‘frontend developer’, so I also dabbled in HTML and CSS. Little did I know that this curiosity would lead me on a journey from geology and naval warfare maps to becoming a Go developer.

    -

    A turning point came when I read an article about a former geologist who transitioned into programming. I reached out to him (thanks, Adam!) and our chat about geology, programming, and the tech lifestyle convinced me to take the plunge. I quit my job and committed to becoming a work-from-home dev. The challenge of programming, the flexibility of remote work, and the potential earnings were too tempting to resist. I moved back home and enrolled in a course with Tech901, where I learned the basics of HTML, CSS, and JavaScript. Shortly after, Cook Systems reached out and put me through an intensive bootcamp focused on Java and Spring Boot. Almost immediately, I landed a job as a Backend Developer (not frontend, ironically) at FedEx through Cook. Despite feeling underprepared as do most early career devs, I embraced the challenge and learned rapidly. After a year, I felt I had truly cut my teeth in programming professionally, then my career took another turn.

    -

    A company called Green Mountain (formerly Green Mountain Technology) ‘GM’ contacted me about a frontend position. Although I ended up in a backend role with C#/.NET, my time at GM was transformative. I learned about software engineering, unit testing, performance optimization, SQL, Kafka, APIs, architecture, code reviews, mentoring/how to mentor others, and project ownership. The experience and mentorship I received at GM were invaluable, its what helped my find my love for backend programming. However, like many tech companies in 2022-2023, GM faced layoffs. After about two years with GM, I decided it was time to spread my wings further. This led me to Hone Health, a fast-paced telehealth startup where I’ve been for about a year. At Hone, I’ve worn many hats - from helpdesk to bug hunting, infrastructure work to feature development, you name it and I’ve done it. As I write this, I’m transitioning to a new role as a Go developer - an exciting new chapter in my career. This journey from naval warfare maps to Go development has been filled with challenges, growth, and unexpected turns. I’m looking forward to sharing more about my ongoing learning and experiences in future blog posts.

    +

    When 2020 rolled around, like many others with extra time on their hands, I dove deeper into programming. What fascinated me most was the democratization of the field - anyone willing to put in the time and effort could become a programmer, regardless of their background. This realization was particularly exciting for someone like me, coming from a non-traditional tech background. I started with basic C programming, creating simple programs like “Hello World” and a basic calculator. Initially, I thought I wanted to be a ‘frontend developer’, so I also dabbled in HTML and CSS. Little did I know that this curiosity would lead me on a path of learning Javascript, React, .Net/C#, SQL, Java/Springboot, TypeScript, Python, Go and a bit more.

    +

    A turning point came when I read an article about a former geologist who transitioned into programming. I reached out to him (thanks, Adam!) and our chat about geology, programming, and the tech lifestyle convinced me to take the plunge. I quit my job and committed to becoming a work-from-home dev. The challenge of programming, the flexibility of remote work, and the potential earnings were too tempting to resist. I moved back home and enrolled in a course with Tech901, where I learned the basics of HTML, CSS, and JavaScript. Shortly after, Cook Systems reached out and put me through an intensive bootcamp focused on Java and Spring Boot. I’m super grateful to both of these organizations as they paved the way for the path I’m on today. After going through Cook’s fast paced bootcamp, almost immediately, I landed a job as a Backend Developer (not frontend, ironically) at FedEx through Cook. Despite feeling underprepared as do most early career devs, I embraced the challenge and learned rapidly. After a year, I felt I had truly cut my teeth in programming professionally, then my career took another turn.

    +

    A company called Green Mountain (formerly Green Mountain Technology) ‘GM’ contacted me about a frontend position. Although I ended up in a backend role with C#/.NET on team Honey Badgers (a whole blog post of its self, super talented devs), my time at GM was transformative. I learned about software engineering, unit testing, performance optimization, SQL, Kafka, APIs, architecture, code reviews, mentoring/how to mentor others, and project ownership. The experience and mentorship I received at GM were invaluable, its what helped my find my love for backend programming. However, like many tech companies in 2022-2023, GM faced layoffs. After about two years with GM, I decided it was time to spread my wings further. This led me to Hone Health, a fast-paced telehealth startup where I’ve been for about a year. At Hone, I’ve worn many hats - from helpdesk to bug hunting, infrastructure work to feature development, you name it and I’ve done it. As I write this, I’m transitioning to a new role as a Go developer - an exciting new chapter in my career. This journey thus far has been filled with challenges, growth, and unexpected turns. I’m looking forward to sharing more about my ongoing learning and experiences in future blog posts. Expect lots of post about Go.

    ~ Stay tuned as I continue to document my adventures in software development, and hopefully improve my writing along the way! 😆


    ]]>
    diff --git a/public/tags/coding/index.xml b/public/tags/coding/index.xml index c70e1dd..8b13206 100644 --- a/public/tags/coding/index.xml +++ b/public/tags/coding/index.xml @@ -20,9 +20,9 @@

    From Geology & Naval Warfare Maps to Go Developer

    Hi, I’m Cole. My programming journey began in late 2019, but my path there was anything but direct. After studying Geology in college and working as a Field Geologist for about a year, I found myself creating maps for naval warfare ships at the US DOD. It was there that I first dipped my toes into bash scripting to automate my workflow, and I was instantly hooked.

    -

    When 2020 rolled around, like many others with extra time on their hands, I dove deeper into programming. What fascinated me most was the democratization of the field - anyone willing to put in the time and effort could become a programmer, regardless of their background. This realization was particularly exciting for someone like me, coming from a non-traditional tech background. I started with basic C programming, creating simple programs like “Hello World” and a basic calculator. Initially, I thought I wanted to be a ‘frontend developer’, so I also dabbled in HTML and CSS. Little did I know that this curiosity would lead me on a journey from geology and naval warfare maps to becoming a Go developer.

    -

    A turning point came when I read an article about a former geologist who transitioned into programming. I reached out to him (thanks, Adam!) and our chat about geology, programming, and the tech lifestyle convinced me to take the plunge. I quit my job and committed to becoming a work-from-home dev. The challenge of programming, the flexibility of remote work, and the potential earnings were too tempting to resist. I moved back home and enrolled in a course with Tech901, where I learned the basics of HTML, CSS, and JavaScript. Shortly after, Cook Systems reached out and put me through an intensive bootcamp focused on Java and Spring Boot. Almost immediately, I landed a job as a Backend Developer (not frontend, ironically) at FedEx through Cook. Despite feeling underprepared as do most early career devs, I embraced the challenge and learned rapidly. After a year, I felt I had truly cut my teeth in programming professionally, then my career took another turn.

    -

    A company called Green Mountain (formerly Green Mountain Technology) ‘GM’ contacted me about a frontend position. Although I ended up in a backend role with C#/.NET, my time at GM was transformative. I learned about software engineering, unit testing, performance optimization, SQL, Kafka, APIs, architecture, code reviews, mentoring/how to mentor others, and project ownership. The experience and mentorship I received at GM were invaluable, its what helped my find my love for backend programming. However, like many tech companies in 2022-2023, GM faced layoffs. After about two years with GM, I decided it was time to spread my wings further. This led me to Hone Health, a fast-paced telehealth startup where I’ve been for about a year. At Hone, I’ve worn many hats - from helpdesk to bug hunting, infrastructure work to feature development, you name it and I’ve done it. As I write this, I’m transitioning to a new role as a Go developer - an exciting new chapter in my career. This journey from naval warfare maps to Go development has been filled with challenges, growth, and unexpected turns. I’m looking forward to sharing more about my ongoing learning and experiences in future blog posts.

    +

    When 2020 rolled around, like many others with extra time on their hands, I dove deeper into programming. What fascinated me most was the democratization of the field - anyone willing to put in the time and effort could become a programmer, regardless of their background. This realization was particularly exciting for someone like me, coming from a non-traditional tech background. I started with basic C programming, creating simple programs like “Hello World” and a basic calculator. Initially, I thought I wanted to be a ‘frontend developer’, so I also dabbled in HTML and CSS. Little did I know that this curiosity would lead me on a path of learning Javascript, React, .Net/C#, SQL, Java/Springboot, TypeScript, Python, Go and a bit more.

    +

    A turning point came when I read an article about a former geologist who transitioned into programming. I reached out to him (thanks, Adam!) and our chat about geology, programming, and the tech lifestyle convinced me to take the plunge. I quit my job and committed to becoming a work-from-home dev. The challenge of programming, the flexibility of remote work, and the potential earnings were too tempting to resist. I moved back home and enrolled in a course with Tech901, where I learned the basics of HTML, CSS, and JavaScript. Shortly after, Cook Systems reached out and put me through an intensive bootcamp focused on Java and Spring Boot. I’m super grateful to both of these organizations as they paved the way for the path I’m on today. After going through Cook’s fast paced bootcamp, almost immediately, I landed a job as a Backend Developer (not frontend, ironically) at FedEx through Cook. Despite feeling underprepared as do most early career devs, I embraced the challenge and learned rapidly. After a year, I felt I had truly cut my teeth in programming professionally, then my career took another turn.

    +

    A company called Green Mountain (formerly Green Mountain Technology) ‘GM’ contacted me about a frontend position. Although I ended up in a backend role with C#/.NET on team Honey Badgers (a whole blog post of its self, super talented devs), my time at GM was transformative. I learned about software engineering, unit testing, performance optimization, SQL, Kafka, APIs, architecture, code reviews, mentoring/how to mentor others, and project ownership. The experience and mentorship I received at GM were invaluable, its what helped my find my love for backend programming. However, like many tech companies in 2022-2023, GM faced layoffs. After about two years with GM, I decided it was time to spread my wings further. This led me to Hone Health, a fast-paced telehealth startup where I’ve been for about a year. At Hone, I’ve worn many hats - from helpdesk to bug hunting, infrastructure work to feature development, you name it and I’ve done it. As I write this, I’m transitioning to a new role as a Go developer - an exciting new chapter in my career. This journey thus far has been filled with challenges, growth, and unexpected turns. I’m looking forward to sharing more about my ongoing learning and experiences in future blog posts. Expect lots of post about Go.

    ~ Stay tuned as I continue to document my adventures in software development, and hopefully improve my writing along the way! 😆


    ]]>
    diff --git a/public/tags/configuration/index.html b/public/tags/configuration/index.html new file mode 100644 index 0000000..71f912b --- /dev/null +++ b/public/tags/configuration/index.html @@ -0,0 +1,110 @@ + + + + + + + + +Configuration | CB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    CB

    + +
    +
    + + +

    Filtering for "Configuration"

    + + + +
    + +
    +
    + Cole Boren (CC BY 4.0) | Made with Bear Cub +
    + + + + + diff --git a/public/tags/configuration/index.xml b/public/tags/configuration/index.xml new file mode 100644 index 0000000..a240553 --- /dev/null +++ b/public/tags/configuration/index.xml @@ -0,0 +1,365 @@ + + + + Configuration on CB + http://localhost:1313/tags/configuration/ + Recent content in Configuration on CB + Hugo -- gohugo.io + en-US + cborendev@gmail.com (Cole Boren) + cborendev@gmail.com (Cole Boren) + Cole Boren (CC BY 4.0) + Wed, 18 Sep 2024 00:00:00 +0000 + + + Setting up, Running and Debugging Go Applications with Neovim on WSL + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + Wed, 18 Sep 2024 00:00:00 +0000cborendev@gmail.com (Cole Boren) + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + <hr> <h2 id="introduction">Introduction</h2> <p>As a minimalist at heart, I&rsquo;ve always been drawn to simplicity - that&rsquo;s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I&rsquo;m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let&rsquo;s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We&rsquo;ll cover everything from WSL installation to configuring Neovim for Go development and debugging.</p> + +

    Introduction

    +

    As a minimalist at heart, I’ve always been drawn to simplicity - that’s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I’m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let’s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We’ll cover everything from WSL installation to configuring Neovim for Go development and debugging.

    +

    Step 1: Installing WSL

    +
      +
    1. +

      Open PowerShell as Administrator and run:

      + + + + + +
      1wsl --install
    2. +
    3. +

      Restart your computer when prompted.

      +
    4. +
    5. +

      After restart, open Ubuntu from the Start menu to complete the setup.

      +
    6. +
    +

    Step 2: Installing Go

    +
      +
    1. +

      Update your package list:

      + + + + + +
      1sudo apt update
    2. +
    3. +

      Remove any existing Go installation:

      + + + + + +
      1sudo rm -rf /usr/local/go
    4. +
    5. +

      Download Go 1.22.7, you can use whatever go version you want here

      + + + + + +
      1wget https://go.dev/dl/go1.22.7.linux-amd64.tar.gz
    6. +
    7. +

      Extract Go to /usr/local:

      + + + + + +
      1sudo tar -C /usr/local -xzf go1.22.7.linux-amd64.tar.gz
    8. +
    9. +

      Set up your Go environment:

      + + + + + +
      1echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
      +2echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.bashrc
      +3source ~/.bashrc
    10. +
    11. +

      Verify the installation:

      + + + + + +
      1go version
    12. +
    +

    Step 3: Installing Neovim

    +
      +
    1. +

      Download the latest Neovim AppImage:

      + + + + + +
      1curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
    2. +
    3. +

      Make it executable:

      + + + + + +
      1chmod u+x nvim.appimage
    4. +
    5. +

      Move it to a directory in your PATH:

      + + + + + +
      1sudo mv nvim.appimage /usr/local/bin/nvim
    6. +
    +

    Step 4: Setting Up Kickstart.nvim

    +
      +
    1. +

      Before we get started here be sure to checkout my dotfiles incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them.

      +
    2. +
    3. +

      Back up your existing Neovim configuration:

      + + + + + +
      1mv ~/.config/nvim ~/.config/nvim.bak
    4. +
    5. +

      Clone Kickstart.nvim:

      + + + + + +
      1git clone https://github.com/nvim-lua/kickstart.nvim.git ~/.config/nvim
    6. +
    +

    5. Configuring Go Development and DAP

    +
      +
    1. +

      Installing Delve Debugger (moved up):

      + + + + + +
      1go install github.com/go-delve/delve/cmd/dlv@latest
    2. +
    3. +

      Instead of creating separate files(we can do that later), we’ll modify the existing init.lua in the custom/plugins directory. Open ~/.config/nvim/lua/custom/plugins/init.lua and add the following content:

      +
    4. +
    + + + + + +
      1   -- Function to find main.go file in the project incase its not in root
    +  2local function find_main_go()
    +  3  local root = vim.fn.getcwd()
    +  4  local main_go = vim.fn.globpath(root, '**/main.go', 0, 1)
    +  5  if #main_go > 0 then
    +  6    return vim.fn.fnamemodify(main_go[1], ':h')
    +  7  end
    +  8  return root
    +  9end
    + 10
    + 11return {
    + 12  -- Core DAP (Debug Adapter Protocol) plugin
    + 13  {
    + 14    'mfussenegger/nvim-dap',
    + 15    dependencies = {
    + 16      -- Creates a beautiful debugger UI
    + 17      'rcarriga/nvim-dap-ui',
    + 18
    + 19      -- Installs the debug adapters for you
    + 20      'williamboman/mason.nvim',
    + 21      'jay-babu/mason-nvim-dap.nvim',
    + 22
    + 23      -- Add your own debuggers here
    + 24      'leoluz/nvim-dap-go',
    + 25    },
    + 26    config = function()
    + 27      local dap = require 'dap'
    + 28      local dapui = require 'dapui'
    + 29
    + 30      -- Configure Mason to automatically install DAP adapters
    + 31      require('mason-nvim-dap').setup {
    + 32        -- Makes a best effort to setup the various debuggers with
    + 33        -- reasonable debug configurations
    + 34        automatic_setup = true,
    + 35
    + 36        -- You can provide additional configuration to the handlers,
    + 37        -- see mason-nvim-dap README for more information
    + 38        handlers = {},
    + 39
    + 40        -- You'll need to check that you have the required things installed
    + 41        -- online, please don't ask me how to install them :)
    + 42        ensure_installed = {
    + 43          -- Update this to ensure that you have the debuggers for the langs you want
    + 44          'delve',
    + 45        },
    + 46      }
    + 47
    + 48      -- Basic debugging keymaps, feel free to change to your liking!
    + 49      vim.keymap.set('n', '<F5>', dap.continue, { desc = 'Debug: Start/Continue' })
    + 50      vim.keymap.set('n', '<F1>', dap.step_into, { desc = 'Debug: Step Into' })
    + 51      vim.keymap.set('n', '<F2>', dap.step_over, { desc = 'Debug: Step Over' })
    + 52      vim.keymap.set('n', '<F3>', dap.step_out, { desc = 'Debug: Step Out' })
    + 53      vim.keymap.set('n', '<leader>b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' })
    + 54      vim.keymap.set('n', '<leader>B', function()
    + 55        dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ')
    + 56      end, { desc = 'Debug: Set Breakpoint' })
    + 57
    + 58      -- Dap UI setup
    + 59      -- For more information, see |:help nvim-dap-ui|
    + 60      dapui.setup {
    + 61        -- Set icons to characters that are more likely to work in every terminal.
    + 62        --    Feel free to remove or use ones that you like more! :)
    + 63        --    Don't feel like these are good choices.
    + 64        icons = { expanded = '▾', collapsed = '▸', current_frame = '*' },
    + 65        controls = {
    + 66          icons = {
    + 67            pause = '⏸',
    + 68            play = '▶',
    + 69            step_into = '⏎',
    + 70            step_over = '⏭',
    + 71            step_out = '⏮',
    + 72            step_back = 'b',
    + 73            run_last = '▶▶',
    + 74            terminate = '⏹',
    + 75            disconnect = '⏏',
    + 76          },
    + 77        },
    + 78      }
    + 79
    + 80      -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
    + 81      vim.keymap.set('n', '<F7>', dapui.toggle, { desc = 'Debug: See last session result' })
    + 82
    + 83      dap.listeners.after.event_initialized['dapui_config'] = dapui.open
    + 84      dap.listeners.before.event_terminated['dapui_config'] = dapui.close
    + 85      dap.listeners.before.event_exited['dapui_config'] = dapui.close
    + 86
    + 87      -- Install golang specific config
    + 88      require('dap-go').setup()
    + 89
    + 90      -- Override dap-go's launch configuration so we can find main.go even if it isn't in the root of our project
    + 91      dap.configurations.go = {
    + 92        {
    + 93          type = 'go',
    + 94          name = 'Debug',
    + 95          request = 'launch',
    + 96          program = function()
    + 97            return find_main_go()
    + 98          end,
    + 99        },
    +100      }
    +101    end,
    +102  },
    +103}

    6. Final Configuration

    +
      +
    1. Open Neovim: nvim and Run :checkhealth to ensure everything is set up correctly.
    2. +
    3. Optional tease apart the main init.lua file, ie. nvim\init.lua.
    4. +
    +
      +
    • To do this find different sections of code you would like to pull out of the main file. For example see steps and lua snippet below of the auto format configuration that comes with kickstart.
    • +
    • **But before you do this be sure to uncomment -- { import = 'custom.plugins' }**, in nvim\init.lua, this will allow you to tease apart this main init.lua and place the things you tease apart in nvim\custom\plugin\auto-format.lua
    • +
    + + + + + +
     1-- Everything in the curly braces is alread in the nvim/init.lua, simply cut it out
    + 2-- and place it in a file within `nvim\custom\plugin\auto-format.lua`, and be sure
    + 3-- to include the return
    + 4-- ie. return { paste all the code you just cut here }
    + 5-- if you do this sytematically you can really clean up the main init.lua file at nvim root dir
    + 6return { -- Autoformat
    + 7  'stevearc/conform.nvim',
    + 8  event = { 'BufWritePre' },
    + 9  cmd = { 'ConformInfo' },
    +10  keys = {
    +11    {
    +12      '<leader>f',
    +13      function()
    +14        require('conform').format { async = true, lsp_format = 'fallback' }
    +15      end,
    +16      mode = '',
    +17      desc = '[F]ormat buffer',
    +18    },
    +19  },
    +20  opts = {
    +21    notify_on_error = false,
    +22    format_on_save = function(bufnr)
    +23      -- Disable "format_on_save lsp_fallback" for languages that don't
    +24      -- have a well standardized coding style. You can add additional
    +25      -- languages here or re-enable it for the disabled ones.
    +26      local disable_filetypes = { c = true, cpp = true }
    +27      local lsp_format_opt
    +28      if disable_filetypes[vim.bo[bufnr].filetype] then
    +29        lsp_format_opt = 'never'
    +30      else
    +31        lsp_format_opt = 'fallback'
    +32      end
    +33      return {
    +34        timeout_ms = 500,
    +35        lsp_format = lsp_format_opt,
    +36      }
    +37    end,
    +38    formatters_by_ft = {
    +39      lua = { 'stylua' },
    +40      -- Conform can also run multiple formatters sequentially
    +41      -- python = { "isort", "black" },
    +42      --
    +43      -- You can use 'stop_after_first' to run the first available formatter from the list
    +44      -- javascript = { "prettierd", "prettier", stop_after_first = true },
    +45
    +46      go = { 'go/fmt' }, -- NOTE: this isn't default, I added this for go formatting, the rest in this example is default 
    +47    },
    +48  },
    +49}
      +
    • Generally this approach looks roughly as follows. +
        +
      1. Plugin Location: +
          +
        • Plugins must be defined either in the main nvim/init.lua file or within the lua/custom/plugins directory.
        • +
        +
      2. +
      3. Modular Approach: +
          +
        • Gradually separating components from the main init.lua is an effective way to experiment with your setup.
        • +
        • Start by isolating small, manageable pieces of configuration.
        • +
        +
      4. +
      5. Hands-on Practice: +This process also provides valuable Neovim editing practice: +
          +
        • Open the source file
        • +
        • Use cc to cut the desired code
        • +
        • Navigate to the target location with :Ex
        • +
        • Create a new file with % followed by the filename (e.g., my-new-file.lua)
        • +
        • Enter insert mode with i, press return, then Esc
        • +
        • Paste the code with p
        • +
        +
      6. +
      7. Troubleshooting: +
          +
        • When encountering plugin issues, always refer to the plugin’s documentation and README.
        • +
        • Check for recent GitHub issues related to the plugin for potential solutions or known problems.
        • +
        +
      8. +
      +
    • +
    +

    Conclusion

    +

    Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experience, if you looked at or used my dotfiles you might have even noticed plenty of todos as I will likely iterate on this in the future and make another post as I learn/cleanup my neovim setup.

    +

    If you have any questions or trouble feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this!

    +]]>
    +
    +
    +
    diff --git a/public/tags/debugging/index.html b/public/tags/debugging/index.html new file mode 100644 index 0000000..5a5ee4f --- /dev/null +++ b/public/tags/debugging/index.html @@ -0,0 +1,110 @@ + + + + + + + + +Debugging | CB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    CB

    + +
    +
    + + +

    Filtering for "Debugging"

    + + + +
    + +
    +
    + Cole Boren (CC BY 4.0) | Made with Bear Cub +
    + + + + + diff --git a/public/tags/debugging/index.xml b/public/tags/debugging/index.xml new file mode 100644 index 0000000..508b963 --- /dev/null +++ b/public/tags/debugging/index.xml @@ -0,0 +1,365 @@ + + + + Debugging on CB + http://localhost:1313/tags/debugging/ + Recent content in Debugging on CB + Hugo -- gohugo.io + en-US + cborendev@gmail.com (Cole Boren) + cborendev@gmail.com (Cole Boren) + Cole Boren (CC BY 4.0) + Wed, 18 Sep 2024 00:00:00 +0000 + + + Setting up, Running and Debugging Go Applications with Neovim on WSL + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + Wed, 18 Sep 2024 00:00:00 +0000cborendev@gmail.com (Cole Boren) + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + <hr> <h2 id="introduction">Introduction</h2> <p>As a minimalist at heart, I&rsquo;ve always been drawn to simplicity - that&rsquo;s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I&rsquo;m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let&rsquo;s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We&rsquo;ll cover everything from WSL installation to configuring Neovim for Go development and debugging.</p> + +

    Introduction

    +

    As a minimalist at heart, I’ve always been drawn to simplicity - that’s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I’m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let’s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We’ll cover everything from WSL installation to configuring Neovim for Go development and debugging.

    +

    Step 1: Installing WSL

    +
      +
    1. +

      Open PowerShell as Administrator and run:

      + + + + + +
      1wsl --install
    2. +
    3. +

      Restart your computer when prompted.

      +
    4. +
    5. +

      After restart, open Ubuntu from the Start menu to complete the setup.

      +
    6. +
    +

    Step 2: Installing Go

    +
      +
    1. +

      Update your package list:

      + + + + + +
      1sudo apt update
    2. +
    3. +

      Remove any existing Go installation:

      + + + + + +
      1sudo rm -rf /usr/local/go
    4. +
    5. +

      Download Go 1.22.7, you can use whatever go version you want here

      + + + + + +
      1wget https://go.dev/dl/go1.22.7.linux-amd64.tar.gz
    6. +
    7. +

      Extract Go to /usr/local:

      + + + + + +
      1sudo tar -C /usr/local -xzf go1.22.7.linux-amd64.tar.gz
    8. +
    9. +

      Set up your Go environment:

      + + + + + +
      1echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
      +2echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.bashrc
      +3source ~/.bashrc
    10. +
    11. +

      Verify the installation:

      + + + + + +
      1go version
    12. +
    +

    Step 3: Installing Neovim

    +
      +
    1. +

      Download the latest Neovim AppImage:

      + + + + + +
      1curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
    2. +
    3. +

      Make it executable:

      + + + + + +
      1chmod u+x nvim.appimage
    4. +
    5. +

      Move it to a directory in your PATH:

      + + + + + +
      1sudo mv nvim.appimage /usr/local/bin/nvim
    6. +
    +

    Step 4: Setting Up Kickstart.nvim

    +
      +
    1. +

      Before we get started here be sure to checkout my dotfiles incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them.

      +
    2. +
    3. +

      Back up your existing Neovim configuration:

      + + + + + +
      1mv ~/.config/nvim ~/.config/nvim.bak
    4. +
    5. +

      Clone Kickstart.nvim:

      + + + + + +
      1git clone https://github.com/nvim-lua/kickstart.nvim.git ~/.config/nvim
    6. +
    +

    5. Configuring Go Development and DAP

    +
      +
    1. +

      Installing Delve Debugger (moved up):

      + + + + + +
      1go install github.com/go-delve/delve/cmd/dlv@latest
    2. +
    3. +

      Instead of creating separate files(we can do that later), we’ll modify the existing init.lua in the custom/plugins directory. Open ~/.config/nvim/lua/custom/plugins/init.lua and add the following content:

      +
    4. +
    + + + + + +
      1   -- Function to find main.go file in the project incase its not in root
    +  2local function find_main_go()
    +  3  local root = vim.fn.getcwd()
    +  4  local main_go = vim.fn.globpath(root, '**/main.go', 0, 1)
    +  5  if #main_go > 0 then
    +  6    return vim.fn.fnamemodify(main_go[1], ':h')
    +  7  end
    +  8  return root
    +  9end
    + 10
    + 11return {
    + 12  -- Core DAP (Debug Adapter Protocol) plugin
    + 13  {
    + 14    'mfussenegger/nvim-dap',
    + 15    dependencies = {
    + 16      -- Creates a beautiful debugger UI
    + 17      'rcarriga/nvim-dap-ui',
    + 18
    + 19      -- Installs the debug adapters for you
    + 20      'williamboman/mason.nvim',
    + 21      'jay-babu/mason-nvim-dap.nvim',
    + 22
    + 23      -- Add your own debuggers here
    + 24      'leoluz/nvim-dap-go',
    + 25    },
    + 26    config = function()
    + 27      local dap = require 'dap'
    + 28      local dapui = require 'dapui'
    + 29
    + 30      -- Configure Mason to automatically install DAP adapters
    + 31      require('mason-nvim-dap').setup {
    + 32        -- Makes a best effort to setup the various debuggers with
    + 33        -- reasonable debug configurations
    + 34        automatic_setup = true,
    + 35
    + 36        -- You can provide additional configuration to the handlers,
    + 37        -- see mason-nvim-dap README for more information
    + 38        handlers = {},
    + 39
    + 40        -- You'll need to check that you have the required things installed
    + 41        -- online, please don't ask me how to install them :)
    + 42        ensure_installed = {
    + 43          -- Update this to ensure that you have the debuggers for the langs you want
    + 44          'delve',
    + 45        },
    + 46      }
    + 47
    + 48      -- Basic debugging keymaps, feel free to change to your liking!
    + 49      vim.keymap.set('n', '<F5>', dap.continue, { desc = 'Debug: Start/Continue' })
    + 50      vim.keymap.set('n', '<F1>', dap.step_into, { desc = 'Debug: Step Into' })
    + 51      vim.keymap.set('n', '<F2>', dap.step_over, { desc = 'Debug: Step Over' })
    + 52      vim.keymap.set('n', '<F3>', dap.step_out, { desc = 'Debug: Step Out' })
    + 53      vim.keymap.set('n', '<leader>b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' })
    + 54      vim.keymap.set('n', '<leader>B', function()
    + 55        dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ')
    + 56      end, { desc = 'Debug: Set Breakpoint' })
    + 57
    + 58      -- Dap UI setup
    + 59      -- For more information, see |:help nvim-dap-ui|
    + 60      dapui.setup {
    + 61        -- Set icons to characters that are more likely to work in every terminal.
    + 62        --    Feel free to remove or use ones that you like more! :)
    + 63        --    Don't feel like these are good choices.
    + 64        icons = { expanded = '▾', collapsed = '▸', current_frame = '*' },
    + 65        controls = {
    + 66          icons = {
    + 67            pause = '⏸',
    + 68            play = '▶',
    + 69            step_into = '⏎',
    + 70            step_over = '⏭',
    + 71            step_out = '⏮',
    + 72            step_back = 'b',
    + 73            run_last = '▶▶',
    + 74            terminate = '⏹',
    + 75            disconnect = '⏏',
    + 76          },
    + 77        },
    + 78      }
    + 79
    + 80      -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
    + 81      vim.keymap.set('n', '<F7>', dapui.toggle, { desc = 'Debug: See last session result' })
    + 82
    + 83      dap.listeners.after.event_initialized['dapui_config'] = dapui.open
    + 84      dap.listeners.before.event_terminated['dapui_config'] = dapui.close
    + 85      dap.listeners.before.event_exited['dapui_config'] = dapui.close
    + 86
    + 87      -- Install golang specific config
    + 88      require('dap-go').setup()
    + 89
    + 90      -- Override dap-go's launch configuration so we can find main.go even if it isn't in the root of our project
    + 91      dap.configurations.go = {
    + 92        {
    + 93          type = 'go',
    + 94          name = 'Debug',
    + 95          request = 'launch',
    + 96          program = function()
    + 97            return find_main_go()
    + 98          end,
    + 99        },
    +100      }
    +101    end,
    +102  },
    +103}

    6. Final Configuration

    +
      +
    1. Open Neovim: nvim and Run :checkhealth to ensure everything is set up correctly.
    2. +
    3. Optional tease apart the main init.lua file, ie. nvim\init.lua.
    4. +
    +
      +
    • To do this find different sections of code you would like to pull out of the main file. For example see steps and lua snippet below of the auto format configuration that comes with kickstart.
    • +
    • **But before you do this be sure to uncomment -- { import = 'custom.plugins' }**, in nvim\init.lua, this will allow you to tease apart this main init.lua and place the things you tease apart in nvim\custom\plugin\auto-format.lua
    • +
    + + + + + +
     1-- Everything in the curly braces is alread in the nvim/init.lua, simply cut it out
    + 2-- and place it in a file within `nvim\custom\plugin\auto-format.lua`, and be sure
    + 3-- to include the return
    + 4-- ie. return { paste all the code you just cut here }
    + 5-- if you do this sytematically you can really clean up the main init.lua file at nvim root dir
    + 6return { -- Autoformat
    + 7  'stevearc/conform.nvim',
    + 8  event = { 'BufWritePre' },
    + 9  cmd = { 'ConformInfo' },
    +10  keys = {
    +11    {
    +12      '<leader>f',
    +13      function()
    +14        require('conform').format { async = true, lsp_format = 'fallback' }
    +15      end,
    +16      mode = '',
    +17      desc = '[F]ormat buffer',
    +18    },
    +19  },
    +20  opts = {
    +21    notify_on_error = false,
    +22    format_on_save = function(bufnr)
    +23      -- Disable "format_on_save lsp_fallback" for languages that don't
    +24      -- have a well standardized coding style. You can add additional
    +25      -- languages here or re-enable it for the disabled ones.
    +26      local disable_filetypes = { c = true, cpp = true }
    +27      local lsp_format_opt
    +28      if disable_filetypes[vim.bo[bufnr].filetype] then
    +29        lsp_format_opt = 'never'
    +30      else
    +31        lsp_format_opt = 'fallback'
    +32      end
    +33      return {
    +34        timeout_ms = 500,
    +35        lsp_format = lsp_format_opt,
    +36      }
    +37    end,
    +38    formatters_by_ft = {
    +39      lua = { 'stylua' },
    +40      -- Conform can also run multiple formatters sequentially
    +41      -- python = { "isort", "black" },
    +42      --
    +43      -- You can use 'stop_after_first' to run the first available formatter from the list
    +44      -- javascript = { "prettierd", "prettier", stop_after_first = true },
    +45
    +46      go = { 'go/fmt' }, -- NOTE: this isn't default, I added this for go formatting, the rest in this example is default 
    +47    },
    +48  },
    +49}
      +
    • Generally this approach looks roughly as follows. +
        +
      1. Plugin Location: +
          +
        • Plugins must be defined either in the main nvim/init.lua file or within the lua/custom/plugins directory.
        • +
        +
      2. +
      3. Modular Approach: +
          +
        • Gradually separating components from the main init.lua is an effective way to experiment with your setup.
        • +
        • Start by isolating small, manageable pieces of configuration.
        • +
        +
      4. +
      5. Hands-on Practice: +This process also provides valuable Neovim editing practice: +
          +
        • Open the source file
        • +
        • Use cc to cut the desired code
        • +
        • Navigate to the target location with :Ex
        • +
        • Create a new file with % followed by the filename (e.g., my-new-file.lua)
        • +
        • Enter insert mode with i, press return, then Esc
        • +
        • Paste the code with p
        • +
        +
      6. +
      7. Troubleshooting: +
          +
        • When encountering plugin issues, always refer to the plugin’s documentation and README.
        • +
        • Check for recent GitHub issues related to the plugin for potential solutions or known problems.
        • +
        +
      8. +
      +
    • +
    +

    Conclusion

    +

    Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experience, if you looked at or used my dotfiles you might have even noticed plenty of todos as I will likely iterate on this in the future and make another post as I learn/cleanup my neovim setup.

    +

    If you have any questions or trouble feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this!

    +]]>
    +
    +
    +
    diff --git a/public/tags/go/index.html b/public/tags/go/index.html new file mode 100644 index 0000000..e93b676 --- /dev/null +++ b/public/tags/go/index.html @@ -0,0 +1,110 @@ + + + + + + + + +Go | CB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    CB

    + +
    +
    + + +

    Filtering for "Go"

    + + + +
    + +
    +
    + Cole Boren (CC BY 4.0) | Made with Bear Cub +
    + + + + + diff --git a/public/tags/go/index.xml b/public/tags/go/index.xml new file mode 100644 index 0000000..5ed8bb1 --- /dev/null +++ b/public/tags/go/index.xml @@ -0,0 +1,365 @@ + + + + Go on CB + http://localhost:1313/tags/go/ + Recent content in Go on CB + Hugo -- gohugo.io + en-US + cborendev@gmail.com (Cole Boren) + cborendev@gmail.com (Cole Boren) + Cole Boren (CC BY 4.0) + Wed, 18 Sep 2024 00:00:00 +0000 + + + Setting up, Running and Debugging Go Applications with Neovim on WSL + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + Wed, 18 Sep 2024 00:00:00 +0000cborendev@gmail.com (Cole Boren) + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + <hr> <h2 id="introduction">Introduction</h2> <p>As a minimalist at heart, I&rsquo;ve always been drawn to simplicity - that&rsquo;s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I&rsquo;m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let&rsquo;s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We&rsquo;ll cover everything from WSL installation to configuring Neovim for Go development and debugging.</p> + +

    Introduction

    +

    As a minimalist at heart, I’ve always been drawn to simplicity - that’s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I’m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let’s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We’ll cover everything from WSL installation to configuring Neovim for Go development and debugging.

    +

    Step 1: Installing WSL

    +
      +
    1. +

      Open PowerShell as Administrator and run:

      + + + + + +
      1wsl --install
    2. +
    3. +

      Restart your computer when prompted.

      +
    4. +
    5. +

      After restart, open Ubuntu from the Start menu to complete the setup.

      +
    6. +
    +

    Step 2: Installing Go

    +
      +
    1. +

      Update your package list:

      + + + + + +
      1sudo apt update
    2. +
    3. +

      Remove any existing Go installation:

      + + + + + +
      1sudo rm -rf /usr/local/go
    4. +
    5. +

      Download Go 1.22.7, you can use whatever go version you want here

      + + + + + +
      1wget https://go.dev/dl/go1.22.7.linux-amd64.tar.gz
    6. +
    7. +

      Extract Go to /usr/local:

      + + + + + +
      1sudo tar -C /usr/local -xzf go1.22.7.linux-amd64.tar.gz
    8. +
    9. +

      Set up your Go environment:

      + + + + + +
      1echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
      +2echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.bashrc
      +3source ~/.bashrc
    10. +
    11. +

      Verify the installation:

      + + + + + +
      1go version
    12. +
    +

    Step 3: Installing Neovim

    +
      +
    1. +

      Download the latest Neovim AppImage:

      + + + + + +
      1curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
    2. +
    3. +

      Make it executable:

      + + + + + +
      1chmod u+x nvim.appimage
    4. +
    5. +

      Move it to a directory in your PATH:

      + + + + + +
      1sudo mv nvim.appimage /usr/local/bin/nvim
    6. +
    +

    Step 4: Setting Up Kickstart.nvim

    +
      +
    1. +

      Before we get started here be sure to checkout my dotfiles incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them.

      +
    2. +
    3. +

      Back up your existing Neovim configuration:

      + + + + + +
      1mv ~/.config/nvim ~/.config/nvim.bak
    4. +
    5. +

      Clone Kickstart.nvim:

      + + + + + +
      1git clone https://github.com/nvim-lua/kickstart.nvim.git ~/.config/nvim
    6. +
    +

    5. Configuring Go Development and DAP

    +
      +
    1. +

      Installing Delve Debugger (moved up):

      + + + + + +
      1go install github.com/go-delve/delve/cmd/dlv@latest
    2. +
    3. +

      Instead of creating separate files(we can do that later), we’ll modify the existing init.lua in the custom/plugins directory. Open ~/.config/nvim/lua/custom/plugins/init.lua and add the following content:

      +
    4. +
    + + + + + +
      1   -- Function to find main.go file in the project incase its not in root
    +  2local function find_main_go()
    +  3  local root = vim.fn.getcwd()
    +  4  local main_go = vim.fn.globpath(root, '**/main.go', 0, 1)
    +  5  if #main_go > 0 then
    +  6    return vim.fn.fnamemodify(main_go[1], ':h')
    +  7  end
    +  8  return root
    +  9end
    + 10
    + 11return {
    + 12  -- Core DAP (Debug Adapter Protocol) plugin
    + 13  {
    + 14    'mfussenegger/nvim-dap',
    + 15    dependencies = {
    + 16      -- Creates a beautiful debugger UI
    + 17      'rcarriga/nvim-dap-ui',
    + 18
    + 19      -- Installs the debug adapters for you
    + 20      'williamboman/mason.nvim',
    + 21      'jay-babu/mason-nvim-dap.nvim',
    + 22
    + 23      -- Add your own debuggers here
    + 24      'leoluz/nvim-dap-go',
    + 25    },
    + 26    config = function()
    + 27      local dap = require 'dap'
    + 28      local dapui = require 'dapui'
    + 29
    + 30      -- Configure Mason to automatically install DAP adapters
    + 31      require('mason-nvim-dap').setup {
    + 32        -- Makes a best effort to setup the various debuggers with
    + 33        -- reasonable debug configurations
    + 34        automatic_setup = true,
    + 35
    + 36        -- You can provide additional configuration to the handlers,
    + 37        -- see mason-nvim-dap README for more information
    + 38        handlers = {},
    + 39
    + 40        -- You'll need to check that you have the required things installed
    + 41        -- online, please don't ask me how to install them :)
    + 42        ensure_installed = {
    + 43          -- Update this to ensure that you have the debuggers for the langs you want
    + 44          'delve',
    + 45        },
    + 46      }
    + 47
    + 48      -- Basic debugging keymaps, feel free to change to your liking!
    + 49      vim.keymap.set('n', '<F5>', dap.continue, { desc = 'Debug: Start/Continue' })
    + 50      vim.keymap.set('n', '<F1>', dap.step_into, { desc = 'Debug: Step Into' })
    + 51      vim.keymap.set('n', '<F2>', dap.step_over, { desc = 'Debug: Step Over' })
    + 52      vim.keymap.set('n', '<F3>', dap.step_out, { desc = 'Debug: Step Out' })
    + 53      vim.keymap.set('n', '<leader>b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' })
    + 54      vim.keymap.set('n', '<leader>B', function()
    + 55        dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ')
    + 56      end, { desc = 'Debug: Set Breakpoint' })
    + 57
    + 58      -- Dap UI setup
    + 59      -- For more information, see |:help nvim-dap-ui|
    + 60      dapui.setup {
    + 61        -- Set icons to characters that are more likely to work in every terminal.
    + 62        --    Feel free to remove or use ones that you like more! :)
    + 63        --    Don't feel like these are good choices.
    + 64        icons = { expanded = '▾', collapsed = '▸', current_frame = '*' },
    + 65        controls = {
    + 66          icons = {
    + 67            pause = '⏸',
    + 68            play = '▶',
    + 69            step_into = '⏎',
    + 70            step_over = '⏭',
    + 71            step_out = '⏮',
    + 72            step_back = 'b',
    + 73            run_last = '▶▶',
    + 74            terminate = '⏹',
    + 75            disconnect = '⏏',
    + 76          },
    + 77        },
    + 78      }
    + 79
    + 80      -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
    + 81      vim.keymap.set('n', '<F7>', dapui.toggle, { desc = 'Debug: See last session result' })
    + 82
    + 83      dap.listeners.after.event_initialized['dapui_config'] = dapui.open
    + 84      dap.listeners.before.event_terminated['dapui_config'] = dapui.close
    + 85      dap.listeners.before.event_exited['dapui_config'] = dapui.close
    + 86
    + 87      -- Install golang specific config
    + 88      require('dap-go').setup()
    + 89
    + 90      -- Override dap-go's launch configuration so we can find main.go even if it isn't in the root of our project
    + 91      dap.configurations.go = {
    + 92        {
    + 93          type = 'go',
    + 94          name = 'Debug',
    + 95          request = 'launch',
    + 96          program = function()
    + 97            return find_main_go()
    + 98          end,
    + 99        },
    +100      }
    +101    end,
    +102  },
    +103}

    6. Final Configuration

    +
      +
    1. Open Neovim: nvim and Run :checkhealth to ensure everything is set up correctly.
    2. +
    3. Optional tease apart the main init.lua file, ie. nvim\init.lua.
    4. +
    +
      +
    • To do this find different sections of code you would like to pull out of the main file. For example see steps and lua snippet below of the auto format configuration that comes with kickstart.
    • +
    • **But before you do this be sure to uncomment -- { import = 'custom.plugins' }**, in nvim\init.lua, this will allow you to tease apart this main init.lua and place the things you tease apart in nvim\custom\plugin\auto-format.lua
    • +
    + + + + + +
     1-- Everything in the curly braces is alread in the nvim/init.lua, simply cut it out
    + 2-- and place it in a file within `nvim\custom\plugin\auto-format.lua`, and be sure
    + 3-- to include the return
    + 4-- ie. return { paste all the code you just cut here }
    + 5-- if you do this sytematically you can really clean up the main init.lua file at nvim root dir
    + 6return { -- Autoformat
    + 7  'stevearc/conform.nvim',
    + 8  event = { 'BufWritePre' },
    + 9  cmd = { 'ConformInfo' },
    +10  keys = {
    +11    {
    +12      '<leader>f',
    +13      function()
    +14        require('conform').format { async = true, lsp_format = 'fallback' }
    +15      end,
    +16      mode = '',
    +17      desc = '[F]ormat buffer',
    +18    },
    +19  },
    +20  opts = {
    +21    notify_on_error = false,
    +22    format_on_save = function(bufnr)
    +23      -- Disable "format_on_save lsp_fallback" for languages that don't
    +24      -- have a well standardized coding style. You can add additional
    +25      -- languages here or re-enable it for the disabled ones.
    +26      local disable_filetypes = { c = true, cpp = true }
    +27      local lsp_format_opt
    +28      if disable_filetypes[vim.bo[bufnr].filetype] then
    +29        lsp_format_opt = 'never'
    +30      else
    +31        lsp_format_opt = 'fallback'
    +32      end
    +33      return {
    +34        timeout_ms = 500,
    +35        lsp_format = lsp_format_opt,
    +36      }
    +37    end,
    +38    formatters_by_ft = {
    +39      lua = { 'stylua' },
    +40      -- Conform can also run multiple formatters sequentially
    +41      -- python = { "isort", "black" },
    +42      --
    +43      -- You can use 'stop_after_first' to run the first available formatter from the list
    +44      -- javascript = { "prettierd", "prettier", stop_after_first = true },
    +45
    +46      go = { 'go/fmt' }, -- NOTE: this isn't default, I added this for go formatting, the rest in this example is default 
    +47    },
    +48  },
    +49}
      +
    • Generally this approach looks roughly as follows. +
        +
      1. Plugin Location: +
          +
        • Plugins must be defined either in the main nvim/init.lua file or within the lua/custom/plugins directory.
        • +
        +
      2. +
      3. Modular Approach: +
          +
        • Gradually separating components from the main init.lua is an effective way to experiment with your setup.
        • +
        • Start by isolating small, manageable pieces of configuration.
        • +
        +
      4. +
      5. Hands-on Practice: +This process also provides valuable Neovim editing practice: +
          +
        • Open the source file
        • +
        • Use cc to cut the desired code
        • +
        • Navigate to the target location with :Ex
        • +
        • Create a new file with % followed by the filename (e.g., my-new-file.lua)
        • +
        • Enter insert mode with i, press return, then Esc
        • +
        • Paste the code with p
        • +
        +
      6. +
      7. Troubleshooting: +
          +
        • When encountering plugin issues, always refer to the plugin’s documentation and README.
        • +
        • Check for recent GitHub issues related to the plugin for potential solutions or known problems.
        • +
        +
      8. +
      +
    • +
    +

    Conclusion

    +

    Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experience, if you looked at or used my dotfiles you might have even noticed plenty of todos as I will likely iterate on this in the future and make another post as I learn/cleanup my neovim setup.

    +

    If you have any questions or trouble feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this!

    +]]>
    +
    +
    +
    diff --git a/public/tags/neovim/index.html b/public/tags/neovim/index.html new file mode 100644 index 0000000..eb2d5fb --- /dev/null +++ b/public/tags/neovim/index.html @@ -0,0 +1,110 @@ + + + + + + + + +Neovim | CB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    CB

    + +
    +
    + + +

    Filtering for "Neovim"

    + + + +
    + +
    +
    + Cole Boren (CC BY 4.0) | Made with Bear Cub +
    + + + + + diff --git a/public/tags/neovim/index.xml b/public/tags/neovim/index.xml new file mode 100644 index 0000000..7244fc9 --- /dev/null +++ b/public/tags/neovim/index.xml @@ -0,0 +1,365 @@ + + + + Neovim on CB + http://localhost:1313/tags/neovim/ + Recent content in Neovim on CB + Hugo -- gohugo.io + en-US + cborendev@gmail.com (Cole Boren) + cborendev@gmail.com (Cole Boren) + Cole Boren (CC BY 4.0) + Wed, 18 Sep 2024 00:00:00 +0000 + + + Setting up, Running and Debugging Go Applications with Neovim on WSL + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + Wed, 18 Sep 2024 00:00:00 +0000cborendev@gmail.com (Cole Boren) + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + <hr> <h2 id="introduction">Introduction</h2> <p>As a minimalist at heart, I&rsquo;ve always been drawn to simplicity - that&rsquo;s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I&rsquo;m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let&rsquo;s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We&rsquo;ll cover everything from WSL installation to configuring Neovim for Go development and debugging.</p> + +

    Introduction

    +

    As a minimalist at heart, I’ve always been drawn to simplicity - that’s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I’m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let’s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We’ll cover everything from WSL installation to configuring Neovim for Go development and debugging.

    +

    Step 1: Installing WSL

    +
      +
    1. +

      Open PowerShell as Administrator and run:

      + + + + + +
      1wsl --install
    2. +
    3. +

      Restart your computer when prompted.

      +
    4. +
    5. +

      After restart, open Ubuntu from the Start menu to complete the setup.

      +
    6. +
    +

    Step 2: Installing Go

    +
      +
    1. +

      Update your package list:

      + + + + + +
      1sudo apt update
    2. +
    3. +

      Remove any existing Go installation:

      + + + + + +
      1sudo rm -rf /usr/local/go
    4. +
    5. +

      Download Go 1.22.7, you can use whatever go version you want here

      + + + + + +
      1wget https://go.dev/dl/go1.22.7.linux-amd64.tar.gz
    6. +
    7. +

      Extract Go to /usr/local:

      + + + + + +
      1sudo tar -C /usr/local -xzf go1.22.7.linux-amd64.tar.gz
    8. +
    9. +

      Set up your Go environment:

      + + + + + +
      1echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
      +2echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.bashrc
      +3source ~/.bashrc
    10. +
    11. +

      Verify the installation:

      + + + + + +
      1go version
    12. +
    +

    Step 3: Installing Neovim

    +
      +
    1. +

      Download the latest Neovim AppImage:

      + + + + + +
      1curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
    2. +
    3. +

      Make it executable:

      + + + + + +
      1chmod u+x nvim.appimage
    4. +
    5. +

      Move it to a directory in your PATH:

      + + + + + +
      1sudo mv nvim.appimage /usr/local/bin/nvim
    6. +
    +

    Step 4: Setting Up Kickstart.nvim

    +
      +
    1. +

      Before we get started here be sure to checkout my dotfiles incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them.

      +
    2. +
    3. +

      Back up your existing Neovim configuration:

      + + + + + +
      1mv ~/.config/nvim ~/.config/nvim.bak
    4. +
    5. +

      Clone Kickstart.nvim:

      + + + + + +
      1git clone https://github.com/nvim-lua/kickstart.nvim.git ~/.config/nvim
    6. +
    +

    5. Configuring Go Development and DAP

    +
      +
    1. +

      Installing Delve Debugger (moved up):

      + + + + + +
      1go install github.com/go-delve/delve/cmd/dlv@latest
    2. +
    3. +

      Instead of creating separate files(we can do that later), we’ll modify the existing init.lua in the custom/plugins directory. Open ~/.config/nvim/lua/custom/plugins/init.lua and add the following content:

      +
    4. +
    + + + + + +
      1   -- Function to find main.go file in the project incase its not in root
    +  2local function find_main_go()
    +  3  local root = vim.fn.getcwd()
    +  4  local main_go = vim.fn.globpath(root, '**/main.go', 0, 1)
    +  5  if #main_go > 0 then
    +  6    return vim.fn.fnamemodify(main_go[1], ':h')
    +  7  end
    +  8  return root
    +  9end
    + 10
    + 11return {
    + 12  -- Core DAP (Debug Adapter Protocol) plugin
    + 13  {
    + 14    'mfussenegger/nvim-dap',
    + 15    dependencies = {
    + 16      -- Creates a beautiful debugger UI
    + 17      'rcarriga/nvim-dap-ui',
    + 18
    + 19      -- Installs the debug adapters for you
    + 20      'williamboman/mason.nvim',
    + 21      'jay-babu/mason-nvim-dap.nvim',
    + 22
    + 23      -- Add your own debuggers here
    + 24      'leoluz/nvim-dap-go',
    + 25    },
    + 26    config = function()
    + 27      local dap = require 'dap'
    + 28      local dapui = require 'dapui'
    + 29
    + 30      -- Configure Mason to automatically install DAP adapters
    + 31      require('mason-nvim-dap').setup {
    + 32        -- Makes a best effort to setup the various debuggers with
    + 33        -- reasonable debug configurations
    + 34        automatic_setup = true,
    + 35
    + 36        -- You can provide additional configuration to the handlers,
    + 37        -- see mason-nvim-dap README for more information
    + 38        handlers = {},
    + 39
    + 40        -- You'll need to check that you have the required things installed
    + 41        -- online, please don't ask me how to install them :)
    + 42        ensure_installed = {
    + 43          -- Update this to ensure that you have the debuggers for the langs you want
    + 44          'delve',
    + 45        },
    + 46      }
    + 47
    + 48      -- Basic debugging keymaps, feel free to change to your liking!
    + 49      vim.keymap.set('n', '<F5>', dap.continue, { desc = 'Debug: Start/Continue' })
    + 50      vim.keymap.set('n', '<F1>', dap.step_into, { desc = 'Debug: Step Into' })
    + 51      vim.keymap.set('n', '<F2>', dap.step_over, { desc = 'Debug: Step Over' })
    + 52      vim.keymap.set('n', '<F3>', dap.step_out, { desc = 'Debug: Step Out' })
    + 53      vim.keymap.set('n', '<leader>b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' })
    + 54      vim.keymap.set('n', '<leader>B', function()
    + 55        dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ')
    + 56      end, { desc = 'Debug: Set Breakpoint' })
    + 57
    + 58      -- Dap UI setup
    + 59      -- For more information, see |:help nvim-dap-ui|
    + 60      dapui.setup {
    + 61        -- Set icons to characters that are more likely to work in every terminal.
    + 62        --    Feel free to remove or use ones that you like more! :)
    + 63        --    Don't feel like these are good choices.
    + 64        icons = { expanded = '▾', collapsed = '▸', current_frame = '*' },
    + 65        controls = {
    + 66          icons = {
    + 67            pause = '⏸',
    + 68            play = '▶',
    + 69            step_into = '⏎',
    + 70            step_over = '⏭',
    + 71            step_out = '⏮',
    + 72            step_back = 'b',
    + 73            run_last = '▶▶',
    + 74            terminate = '⏹',
    + 75            disconnect = '⏏',
    + 76          },
    + 77        },
    + 78      }
    + 79
    + 80      -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
    + 81      vim.keymap.set('n', '<F7>', dapui.toggle, { desc = 'Debug: See last session result' })
    + 82
    + 83      dap.listeners.after.event_initialized['dapui_config'] = dapui.open
    + 84      dap.listeners.before.event_terminated['dapui_config'] = dapui.close
    + 85      dap.listeners.before.event_exited['dapui_config'] = dapui.close
    + 86
    + 87      -- Install golang specific config
    + 88      require('dap-go').setup()
    + 89
    + 90      -- Override dap-go's launch configuration so we can find main.go even if it isn't in the root of our project
    + 91      dap.configurations.go = {
    + 92        {
    + 93          type = 'go',
    + 94          name = 'Debug',
    + 95          request = 'launch',
    + 96          program = function()
    + 97            return find_main_go()
    + 98          end,
    + 99        },
    +100      }
    +101    end,
    +102  },
    +103}

    6. Final Configuration

    +
      +
    1. Open Neovim: nvim and Run :checkhealth to ensure everything is set up correctly.
    2. +
    3. Optional tease apart the main init.lua file, ie. nvim\init.lua.
    4. +
    +
      +
    • To do this find different sections of code you would like to pull out of the main file. For example see steps and lua snippet below of the auto format configuration that comes with kickstart.
    • +
    • **But before you do this be sure to uncomment -- { import = 'custom.plugins' }**, in nvim\init.lua, this will allow you to tease apart this main init.lua and place the things you tease apart in nvim\custom\plugin\auto-format.lua
    • +
    + + + + + +
     1-- Everything in the curly braces is alread in the nvim/init.lua, simply cut it out
    + 2-- and place it in a file within `nvim\custom\plugin\auto-format.lua`, and be sure
    + 3-- to include the return
    + 4-- ie. return { paste all the code you just cut here }
    + 5-- if you do this sytematically you can really clean up the main init.lua file at nvim root dir
    + 6return { -- Autoformat
    + 7  'stevearc/conform.nvim',
    + 8  event = { 'BufWritePre' },
    + 9  cmd = { 'ConformInfo' },
    +10  keys = {
    +11    {
    +12      '<leader>f',
    +13      function()
    +14        require('conform').format { async = true, lsp_format = 'fallback' }
    +15      end,
    +16      mode = '',
    +17      desc = '[F]ormat buffer',
    +18    },
    +19  },
    +20  opts = {
    +21    notify_on_error = false,
    +22    format_on_save = function(bufnr)
    +23      -- Disable "format_on_save lsp_fallback" for languages that don't
    +24      -- have a well standardized coding style. You can add additional
    +25      -- languages here or re-enable it for the disabled ones.
    +26      local disable_filetypes = { c = true, cpp = true }
    +27      local lsp_format_opt
    +28      if disable_filetypes[vim.bo[bufnr].filetype] then
    +29        lsp_format_opt = 'never'
    +30      else
    +31        lsp_format_opt = 'fallback'
    +32      end
    +33      return {
    +34        timeout_ms = 500,
    +35        lsp_format = lsp_format_opt,
    +36      }
    +37    end,
    +38    formatters_by_ft = {
    +39      lua = { 'stylua' },
    +40      -- Conform can also run multiple formatters sequentially
    +41      -- python = { "isort", "black" },
    +42      --
    +43      -- You can use 'stop_after_first' to run the first available formatter from the list
    +44      -- javascript = { "prettierd", "prettier", stop_after_first = true },
    +45
    +46      go = { 'go/fmt' }, -- NOTE: this isn't default, I added this for go formatting, the rest in this example is default 
    +47    },
    +48  },
    +49}
      +
    • Generally this approach looks roughly as follows. +
        +
      1. Plugin Location: +
          +
        • Plugins must be defined either in the main nvim/init.lua file or within the lua/custom/plugins directory.
        • +
        +
      2. +
      3. Modular Approach: +
          +
        • Gradually separating components from the main init.lua is an effective way to experiment with your setup.
        • +
        • Start by isolating small, manageable pieces of configuration.
        • +
        +
      4. +
      5. Hands-on Practice: +This process also provides valuable Neovim editing practice: +
          +
        • Open the source file
        • +
        • Use cc to cut the desired code
        • +
        • Navigate to the target location with :Ex
        • +
        • Create a new file with % followed by the filename (e.g., my-new-file.lua)
        • +
        • Enter insert mode with i, press return, then Esc
        • +
        • Paste the code with p
        • +
        +
      6. +
      7. Troubleshooting: +
          +
        • When encountering plugin issues, always refer to the plugin’s documentation and README.
        • +
        • Check for recent GitHub issues related to the plugin for potential solutions or known problems.
        • +
        +
      8. +
      +
    • +
    +

    Conclusion

    +

    Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experience, if you looked at or used my dotfiles you might have even noticed plenty of todos as I will likely iterate on this in the future and make another post as I learn/cleanup my neovim setup.

    +

    If you have any questions or trouble feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this!

    +]]>
    +
    +
    +
    diff --git a/public/tags/origin/index.xml b/public/tags/origin/index.xml index bfdc09d..879e2a5 100644 --- a/public/tags/origin/index.xml +++ b/public/tags/origin/index.xml @@ -20,9 +20,9 @@

    From Geology & Naval Warfare Maps to Go Developer

    Hi, I’m Cole. My programming journey began in late 2019, but my path there was anything but direct. After studying Geology in college and working as a Field Geologist for about a year, I found myself creating maps for naval warfare ships at the US DOD. It was there that I first dipped my toes into bash scripting to automate my workflow, and I was instantly hooked.

    -

    When 2020 rolled around, like many others with extra time on their hands, I dove deeper into programming. What fascinated me most was the democratization of the field - anyone willing to put in the time and effort could become a programmer, regardless of their background. This realization was particularly exciting for someone like me, coming from a non-traditional tech background. I started with basic C programming, creating simple programs like “Hello World” and a basic calculator. Initially, I thought I wanted to be a ‘frontend developer’, so I also dabbled in HTML and CSS. Little did I know that this curiosity would lead me on a journey from geology and naval warfare maps to becoming a Go developer.

    -

    A turning point came when I read an article about a former geologist who transitioned into programming. I reached out to him (thanks, Adam!) and our chat about geology, programming, and the tech lifestyle convinced me to take the plunge. I quit my job and committed to becoming a work-from-home dev. The challenge of programming, the flexibility of remote work, and the potential earnings were too tempting to resist. I moved back home and enrolled in a course with Tech901, where I learned the basics of HTML, CSS, and JavaScript. Shortly after, Cook Systems reached out and put me through an intensive bootcamp focused on Java and Spring Boot. Almost immediately, I landed a job as a Backend Developer (not frontend, ironically) at FedEx through Cook. Despite feeling underprepared as do most early career devs, I embraced the challenge and learned rapidly. After a year, I felt I had truly cut my teeth in programming professionally, then my career took another turn.

    -

    A company called Green Mountain (formerly Green Mountain Technology) ‘GM’ contacted me about a frontend position. Although I ended up in a backend role with C#/.NET, my time at GM was transformative. I learned about software engineering, unit testing, performance optimization, SQL, Kafka, APIs, architecture, code reviews, mentoring/how to mentor others, and project ownership. The experience and mentorship I received at GM were invaluable, its what helped my find my love for backend programming. However, like many tech companies in 2022-2023, GM faced layoffs. After about two years with GM, I decided it was time to spread my wings further. This led me to Hone Health, a fast-paced telehealth startup where I’ve been for about a year. At Hone, I’ve worn many hats - from helpdesk to bug hunting, infrastructure work to feature development, you name it and I’ve done it. As I write this, I’m transitioning to a new role as a Go developer - an exciting new chapter in my career. This journey from naval warfare maps to Go development has been filled with challenges, growth, and unexpected turns. I’m looking forward to sharing more about my ongoing learning and experiences in future blog posts.

    +

    When 2020 rolled around, like many others with extra time on their hands, I dove deeper into programming. What fascinated me most was the democratization of the field - anyone willing to put in the time and effort could become a programmer, regardless of their background. This realization was particularly exciting for someone like me, coming from a non-traditional tech background. I started with basic C programming, creating simple programs like “Hello World” and a basic calculator. Initially, I thought I wanted to be a ‘frontend developer’, so I also dabbled in HTML and CSS. Little did I know that this curiosity would lead me on a path of learning Javascript, React, .Net/C#, SQL, Java/Springboot, TypeScript, Python, Go and a bit more.

    +

    A turning point came when I read an article about a former geologist who transitioned into programming. I reached out to him (thanks, Adam!) and our chat about geology, programming, and the tech lifestyle convinced me to take the plunge. I quit my job and committed to becoming a work-from-home dev. The challenge of programming, the flexibility of remote work, and the potential earnings were too tempting to resist. I moved back home and enrolled in a course with Tech901, where I learned the basics of HTML, CSS, and JavaScript. Shortly after, Cook Systems reached out and put me through an intensive bootcamp focused on Java and Spring Boot. I’m super grateful to both of these organizations as they paved the way for the path I’m on today. After going through Cook’s fast paced bootcamp, almost immediately, I landed a job as a Backend Developer (not frontend, ironically) at FedEx through Cook. Despite feeling underprepared as do most early career devs, I embraced the challenge and learned rapidly. After a year, I felt I had truly cut my teeth in programming professionally, then my career took another turn.

    +

    A company called Green Mountain (formerly Green Mountain Technology) ‘GM’ contacted me about a frontend position. Although I ended up in a backend role with C#/.NET on team Honey Badgers (a whole blog post of its self, super talented devs), my time at GM was transformative. I learned about software engineering, unit testing, performance optimization, SQL, Kafka, APIs, architecture, code reviews, mentoring/how to mentor others, and project ownership. The experience and mentorship I received at GM were invaluable, its what helped my find my love for backend programming. However, like many tech companies in 2022-2023, GM faced layoffs. After about two years with GM, I decided it was time to spread my wings further. This led me to Hone Health, a fast-paced telehealth startup where I’ve been for about a year. At Hone, I’ve worn many hats - from helpdesk to bug hunting, infrastructure work to feature development, you name it and I’ve done it. As I write this, I’m transitioning to a new role as a Go developer - an exciting new chapter in my career. This journey thus far has been filled with challenges, growth, and unexpected turns. I’m looking forward to sharing more about my ongoing learning and experiences in future blog posts. Expect lots of post about Go.

    ~ Stay tuned as I continue to document my adventures in software development, and hopefully improve my writing along the way! 😆


    ]]>
    diff --git a/public/tags/wsl/index.html b/public/tags/wsl/index.html new file mode 100644 index 0000000..14afdbb --- /dev/null +++ b/public/tags/wsl/index.html @@ -0,0 +1,110 @@ + + + + + + + + +Wsl | CB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    CB

    + +
    +
    + + +

    Filtering for "Wsl"

    + + + +
    + +
    +
    + Cole Boren (CC BY 4.0) | Made with Bear Cub +
    + + + + + diff --git a/public/tags/wsl/index.xml b/public/tags/wsl/index.xml new file mode 100644 index 0000000..2d2c4a3 --- /dev/null +++ b/public/tags/wsl/index.xml @@ -0,0 +1,365 @@ + + + + Wsl on CB + http://localhost:1313/tags/wsl/ + Recent content in Wsl on CB + Hugo -- gohugo.io + en-US + cborendev@gmail.com (Cole Boren) + cborendev@gmail.com (Cole Boren) + Cole Boren (CC BY 4.0) + Wed, 18 Sep 2024 00:00:00 +0000 + + + Setting up, Running and Debugging Go Applications with Neovim on WSL + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + Wed, 18 Sep 2024 00:00:00 +0000cborendev@gmail.com (Cole Boren) + http://localhost:1313/blog/9-30-24-go-wsl-nvim/ + <hr> <h2 id="introduction">Introduction</h2> <p>As a minimalist at heart, I&rsquo;ve always been drawn to simplicity - that&rsquo;s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I&rsquo;m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let&rsquo;s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We&rsquo;ll cover everything from WSL installation to configuring Neovim for Go development and debugging.</p> + +

    Introduction

    +

    As a minimalist at heart, I’ve always been drawn to simplicity - that’s part of what attracted me to Go. Years of skateboarding and wrist injuries, combined with my ADHD-induced tendency to get distracted by complex IDEs, led me to explore Vim motions and Neovim. While my ultimate goal is to run ArchLinux, blast some breakcore, and hack away on Neovim like a true power user, I’m not quite there yet. As a Windows user, I wanted to find a middle ground - a way to use Neovim and Go without completely abandoning my current setup. Enter WSL (Windows Subsystem for Linux). This guide is my first attempt at setting up a development environment that combines the best of both worlds: Neovim and Go on WSL, with the added ability to debug and step through code. Fair warning: this is just the beginning. Expect more blogs as I continue to refine and expand my Neovim setup. For now, let’s dive into setting up WSL, Go, and the Debug Adapter Protocol (DAP) with Kickstart.nvim. We’ll cover everything from WSL installation to configuring Neovim for Go development and debugging.

    +

    Step 1: Installing WSL

    +
      +
    1. +

      Open PowerShell as Administrator and run:

      + + + + + +
      1wsl --install
    2. +
    3. +

      Restart your computer when prompted.

      +
    4. +
    5. +

      After restart, open Ubuntu from the Start menu to complete the setup.

      +
    6. +
    +

    Step 2: Installing Go

    +
      +
    1. +

      Update your package list:

      + + + + + +
      1sudo apt update
    2. +
    3. +

      Remove any existing Go installation:

      + + + + + +
      1sudo rm -rf /usr/local/go
    4. +
    5. +

      Download Go 1.22.7, you can use whatever go version you want here

      + + + + + +
      1wget https://go.dev/dl/go1.22.7.linux-amd64.tar.gz
    6. +
    7. +

      Extract Go to /usr/local:

      + + + + + +
      1sudo tar -C /usr/local -xzf go1.22.7.linux-amd64.tar.gz
    8. +
    9. +

      Set up your Go environment:

      + + + + + +
      1echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
      +2echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.bashrc
      +3source ~/.bashrc
    10. +
    11. +

      Verify the installation:

      + + + + + +
      1go version
    12. +
    +

    Step 3: Installing Neovim

    +
      +
    1. +

      Download the latest Neovim AppImage:

      + + + + + +
      1curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
    2. +
    3. +

      Make it executable:

      + + + + + +
      1chmod u+x nvim.appimage
    4. +
    5. +

      Move it to a directory in your PATH:

      + + + + + +
      1sudo mv nvim.appimage /usr/local/bin/nvim
    6. +
    +

    Step 4: Setting Up Kickstart.nvim

    +
      +
    1. +

      Before we get started here be sure to checkout my dotfiles incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them.

      +
    2. +
    3. +

      Back up your existing Neovim configuration:

      + + + + + +
      1mv ~/.config/nvim ~/.config/nvim.bak
    4. +
    5. +

      Clone Kickstart.nvim:

      + + + + + +
      1git clone https://github.com/nvim-lua/kickstart.nvim.git ~/.config/nvim
    6. +
    +

    5. Configuring Go Development and DAP

    +
      +
    1. +

      Installing Delve Debugger (moved up):

      + + + + + +
      1go install github.com/go-delve/delve/cmd/dlv@latest
    2. +
    3. +

      Instead of creating separate files(we can do that later), we’ll modify the existing init.lua in the custom/plugins directory. Open ~/.config/nvim/lua/custom/plugins/init.lua and add the following content:

      +
    4. +
    + + + + + +
      1   -- Function to find main.go file in the project incase its not in root
    +  2local function find_main_go()
    +  3  local root = vim.fn.getcwd()
    +  4  local main_go = vim.fn.globpath(root, '**/main.go', 0, 1)
    +  5  if #main_go > 0 then
    +  6    return vim.fn.fnamemodify(main_go[1], ':h')
    +  7  end
    +  8  return root
    +  9end
    + 10
    + 11return {
    + 12  -- Core DAP (Debug Adapter Protocol) plugin
    + 13  {
    + 14    'mfussenegger/nvim-dap',
    + 15    dependencies = {
    + 16      -- Creates a beautiful debugger UI
    + 17      'rcarriga/nvim-dap-ui',
    + 18
    + 19      -- Installs the debug adapters for you
    + 20      'williamboman/mason.nvim',
    + 21      'jay-babu/mason-nvim-dap.nvim',
    + 22
    + 23      -- Add your own debuggers here
    + 24      'leoluz/nvim-dap-go',
    + 25    },
    + 26    config = function()
    + 27      local dap = require 'dap'
    + 28      local dapui = require 'dapui'
    + 29
    + 30      -- Configure Mason to automatically install DAP adapters
    + 31      require('mason-nvim-dap').setup {
    + 32        -- Makes a best effort to setup the various debuggers with
    + 33        -- reasonable debug configurations
    + 34        automatic_setup = true,
    + 35
    + 36        -- You can provide additional configuration to the handlers,
    + 37        -- see mason-nvim-dap README for more information
    + 38        handlers = {},
    + 39
    + 40        -- You'll need to check that you have the required things installed
    + 41        -- online, please don't ask me how to install them :)
    + 42        ensure_installed = {
    + 43          -- Update this to ensure that you have the debuggers for the langs you want
    + 44          'delve',
    + 45        },
    + 46      }
    + 47
    + 48      -- Basic debugging keymaps, feel free to change to your liking!
    + 49      vim.keymap.set('n', '<F5>', dap.continue, { desc = 'Debug: Start/Continue' })
    + 50      vim.keymap.set('n', '<F1>', dap.step_into, { desc = 'Debug: Step Into' })
    + 51      vim.keymap.set('n', '<F2>', dap.step_over, { desc = 'Debug: Step Over' })
    + 52      vim.keymap.set('n', '<F3>', dap.step_out, { desc = 'Debug: Step Out' })
    + 53      vim.keymap.set('n', '<leader>b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' })
    + 54      vim.keymap.set('n', '<leader>B', function()
    + 55        dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ')
    + 56      end, { desc = 'Debug: Set Breakpoint' })
    + 57
    + 58      -- Dap UI setup
    + 59      -- For more information, see |:help nvim-dap-ui|
    + 60      dapui.setup {
    + 61        -- Set icons to characters that are more likely to work in every terminal.
    + 62        --    Feel free to remove or use ones that you like more! :)
    + 63        --    Don't feel like these are good choices.
    + 64        icons = { expanded = '▾', collapsed = '▸', current_frame = '*' },
    + 65        controls = {
    + 66          icons = {
    + 67            pause = '⏸',
    + 68            play = '▶',
    + 69            step_into = '⏎',
    + 70            step_over = '⏭',
    + 71            step_out = '⏮',
    + 72            step_back = 'b',
    + 73            run_last = '▶▶',
    + 74            terminate = '⏹',
    + 75            disconnect = '⏏',
    + 76          },
    + 77        },
    + 78      }
    + 79
    + 80      -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
    + 81      vim.keymap.set('n', '<F7>', dapui.toggle, { desc = 'Debug: See last session result' })
    + 82
    + 83      dap.listeners.after.event_initialized['dapui_config'] = dapui.open
    + 84      dap.listeners.before.event_terminated['dapui_config'] = dapui.close
    + 85      dap.listeners.before.event_exited['dapui_config'] = dapui.close
    + 86
    + 87      -- Install golang specific config
    + 88      require('dap-go').setup()
    + 89
    + 90      -- Override dap-go's launch configuration so we can find main.go even if it isn't in the root of our project
    + 91      dap.configurations.go = {
    + 92        {
    + 93          type = 'go',
    + 94          name = 'Debug',
    + 95          request = 'launch',
    + 96          program = function()
    + 97            return find_main_go()
    + 98          end,
    + 99        },
    +100      }
    +101    end,
    +102  },
    +103}

    6. Final Configuration

    +
      +
    1. Open Neovim: nvim and Run :checkhealth to ensure everything is set up correctly.
    2. +
    3. Optional tease apart the main init.lua file, ie. nvim\init.lua.
    4. +
    +
      +
    • To do this find different sections of code you would like to pull out of the main file. For example see steps and lua snippet below of the auto format configuration that comes with kickstart.
    • +
    • **But before you do this be sure to uncomment -- { import = 'custom.plugins' }**, in nvim\init.lua, this will allow you to tease apart this main init.lua and place the things you tease apart in nvim\custom\plugin\auto-format.lua
    • +
    + + + + + +
     1-- Everything in the curly braces is alread in the nvim/init.lua, simply cut it out
    + 2-- and place it in a file within `nvim\custom\plugin\auto-format.lua`, and be sure
    + 3-- to include the return
    + 4-- ie. return { paste all the code you just cut here }
    + 5-- if you do this sytematically you can really clean up the main init.lua file at nvim root dir
    + 6return { -- Autoformat
    + 7  'stevearc/conform.nvim',
    + 8  event = { 'BufWritePre' },
    + 9  cmd = { 'ConformInfo' },
    +10  keys = {
    +11    {
    +12      '<leader>f',
    +13      function()
    +14        require('conform').format { async = true, lsp_format = 'fallback' }
    +15      end,
    +16      mode = '',
    +17      desc = '[F]ormat buffer',
    +18    },
    +19  },
    +20  opts = {
    +21    notify_on_error = false,
    +22    format_on_save = function(bufnr)
    +23      -- Disable "format_on_save lsp_fallback" for languages that don't
    +24      -- have a well standardized coding style. You can add additional
    +25      -- languages here or re-enable it for the disabled ones.
    +26      local disable_filetypes = { c = true, cpp = true }
    +27      local lsp_format_opt
    +28      if disable_filetypes[vim.bo[bufnr].filetype] then
    +29        lsp_format_opt = 'never'
    +30      else
    +31        lsp_format_opt = 'fallback'
    +32      end
    +33      return {
    +34        timeout_ms = 500,
    +35        lsp_format = lsp_format_opt,
    +36      }
    +37    end,
    +38    formatters_by_ft = {
    +39      lua = { 'stylua' },
    +40      -- Conform can also run multiple formatters sequentially
    +41      -- python = { "isort", "black" },
    +42      --
    +43      -- You can use 'stop_after_first' to run the first available formatter from the list
    +44      -- javascript = { "prettierd", "prettier", stop_after_first = true },
    +45
    +46      go = { 'go/fmt' }, -- NOTE: this isn't default, I added this for go formatting, the rest in this example is default 
    +47    },
    +48  },
    +49}
      +
    • Generally this approach looks roughly as follows. +
        +
      1. Plugin Location: +
          +
        • Plugins must be defined either in the main nvim/init.lua file or within the lua/custom/plugins directory.
        • +
        +
      2. +
      3. Modular Approach: +
          +
        • Gradually separating components from the main init.lua is an effective way to experiment with your setup.
        • +
        • Start by isolating small, manageable pieces of configuration.
        • +
        +
      4. +
      5. Hands-on Practice: +This process also provides valuable Neovim editing practice: +
          +
        • Open the source file
        • +
        • Use cc to cut the desired code
        • +
        • Navigate to the target location with :Ex
        • +
        • Create a new file with % followed by the filename (e.g., my-new-file.lua)
        • +
        • Enter insert mode with i, press return, then Esc
        • +
        • Paste the code with p
        • +
        +
      6. +
      7. Troubleshooting: +
          +
        • When encountering plugin issues, always refer to the plugin’s documentation and README.
        • +
        • Check for recent GitHub issues related to the plugin for potential solutions or known problems.
        • +
        +
      8. +
      +
    • +
    +

    Conclusion

    +

    Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experience, if you looked at or used my dotfiles you might have even noticed plenty of todos as I will likely iterate on this in the future and make another post as I learn/cleanup my neovim setup.

    +

    If you have any questions or trouble feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this!

    +]]>
    +
    +
    +
    From f12b5d3398e751581686da5539eda8ae9b227a35 Mon Sep 17 00:00:00 2001 From: williycole <64283810+williycole@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:42:57 -0500 Subject: [PATCH 4/5] Further clean up and addressing comments --- content/blog/9-30-24-go-wsl-nvim.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/blog/9-30-24-go-wsl-nvim.md b/content/blog/9-30-24-go-wsl-nvim.md index 6ba2f0d..708e831 100644 --- a/content/blog/9-30-24-go-wsl-nvim.md +++ b/content/blog/9-30-24-go-wsl-nvim.md @@ -91,7 +91,7 @@ As a minimalist at heart, I've always been drawn to simplicity - that's part of ## Step 4: Setting Up Kickstart.nvim -1. Before we get started here be sure to checkout my [dotfiles](https://github.com/williycole/dotfiles) incase you want to see the final result or need a reference along the way. Also feel free to fork/clone them. +1. Before we get started here, be sure to checkout my [dotfiles](https://github.com/williycole/dotfiles) in case you want to see the final result or need a reference along the way. Also feel free to fork/clone them. 2. Back up your existing Neovim configuration: ```shell @@ -304,4 +304,4 @@ return { -- Autoformat Now you should be fully setup to Debug your Go projects with Neovim on WSL! Obviously there still a lot that could be done to further clean up this setup/debug experience, if you looked at or used my [dotfiles](https://github.com/williycole/dotfiles) you might have even noticed plenty of todos as I will likely iterate on this in the future and make another post as I learn/cleanup my neovim setup. -If you have any questions or trouble feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this! +If you have any questions or trouble, feel free to leave a comment. I really hope this was helpful to someone, and I appreciate you if you made it this far and are reading this! From 2df35e88273a519c3e5ad0e63f26dd66f89fe912 Mon Sep 17 00:00:00 2001 From: williycole <64283810+williycole@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:44:33 -0500 Subject: [PATCH 5/5] Final clean up before merge --- content/blog/9-30-24-go-wsl-nvim.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/9-30-24-go-wsl-nvim.md b/content/blog/9-30-24-go-wsl-nvim.md index 708e831..d8fe30c 100644 --- a/content/blog/9-30-24-go-wsl-nvim.md +++ b/content/blog/9-30-24-go-wsl-nvim.md @@ -224,7 +224,7 @@ return { ## 6. Final Configuration 1. Open Neovim: `nvim` and Run `:checkhealth` to ensure everything is set up correctly. -2. Optional tease apart the main `init.lua` file, ie. `nvim\init.lua`. +2. Optional: Tease apart the main `init.lua` file, ie. `nvim\init.lua`. - To do this find different sections of code you would like to pull out of the main file. For example see steps and lua snippet below of the auto format configuration that comes with kickstart. - **But before you do this be sure to uncomment `-- { import = 'custom.plugins' },`** in `nvim\init.lua`, this will allow you to tease apart this main init.lua and place the things you tease apart in `nvim\custom\plugin\auto-format.lua`