This code is a proof, that your software developer is safe and you shouldn’t worry too much. I asked Claude, o1, 4o, deepseek to create a writer mode for neovim. They all failed. So I wrote my own… feel free to use it.
The Why?
As a writer, having a distraction-free environment is crucial for focusing on your craft. Neovim, a fork of the popular neovim text editor, offers a highly customizable platform for creating a minimal writing environment. In this blog post, we’ll explore how to create a simple writing environment in Neovim using a custom function, without relying on any plugins.
The Goal
Our goal is to create a writing environment that is free from distractions, with a clean and minimal interface. We want to achieve the following:
- A distraction-free writing area with no line numbers, no relative line numbers, and no highlights
- No status line
- A spell-checking feature to help with grammar and spelling
The Function
To create our minimal writing environment, we’ll define a custom function in our Neovim configuration file (init.lua
). Here’s the code:
local function create_margins()
-- Store current buffer number
local current_buf = vim.api.nvim_get_current_buf()
-- Create splits
vim.cmd("vsplit")
vim.cmd("vsplit")
vim.cmd("vertical resize 20")
-- Set up left margin window
vim.cmd("wincmd h")
vim.cmd("wincmd h")
vim.cmd("vertical resize 20")
vim.cmd("enew")
-- Set up middle window with content
vim.cmd("wincmd l")
vim.cmd("wincmd l")
vim.cmd("wincmd l")
vim.cmd("vertical resize 70")
vim.cmd("enew")
vim.cmd("wincmd h")
vim.cmd("wincmd h")
-- Hide split lines
vim.opt.fillchars = { vert = " " }
-- Remove numbers and make all windows 'invisible'
for _, win in pairs(vim.api.nvim_list_wins()) do
vim.api.nvim_win_set_option(win, "number", false)
vim.api.nvim_win_set_option(win, "relativenumber", false)
vim.api.nvim_win_set_option(win, "wrap", true)
end
-- Go to left window and remove all highlights including cursor
vim.cmd("wincmd h")
vim.cmd("wincmd h")
vim.api.nvim_win_set_option(0, "winhl", "Normal:NonText,CursorLine:NonText,CursorColumn:NonText")
vim.wo.cursorline = false
vim.wo.cursorcolumn = false
vim.opt.guicursor = "n:block-NonText"
-- Go to right window and remove all highlights including cursor
vim.cmd("wincmd l")
vim.cmd("wincmd l")
vim.api.nvim_win_set_option(0, "winhl", "Normal:NonText,CursorLine:NonText,CursorColumn:NonText")
vim.wo.cursorline = false
vim.wo.cursorcolumn = false
vim.opt.guicursor = "n:block-NonText"
-- Return to middle window and set its options
vim.cmd("wincmd h")
vim.opt.spell = true
vim.opt.spelllang = "en_us"
vim.opt.laststatus = 0 -- Always show the status line
end
vim.api.nvim_create_user_command("WritingMode", create_margins, {})
This function creates a new writing environment with the following features:
- Two vertical splits on either side of the main writing area, each with a width of 20 and 50 characters
- The main writing area has a width of 70 characters, change for your own taste
- All windows have line wrapping enabled, and line numbers and relative line numbers are disabled
- The left and right windows have no highlights, including the cursor, removed
- The middle window has spell-checking enabled, with the language set to English (US)
- The status line is not visible
Using the Function
To use the create_margins
function, simply run the :WritingMode
command in Neovim. This will create the minimal writing environment, and you can start writing immediately.
Conclusion
Creating a minimal writing environment in Neovim using a simple function is a great way to customize your writing experience without relying on plugins. With this function, you can focus on your writing, free from distractions, and take advantage of Neovim’s powerful features, such as spell-checking and line wrapping. Give it a try and see how it can improve your writing workflow!
My full neovim config, heavily based on josean:
https://github.com/sq5rix/ai_nvim
