secluded/content/posts/vim-as-a-markdown-editor.md

144 lines
7.0 KiB
Markdown

---
title: "Vim as a Markdown Editor"
description: "Configuring Vim to act as a first-class markdown editor for various purposes"
cover: /assets/pngs/editor.png
date: 2020-04-30T23:06:59-04:00
categories:
- Technology
tags:
- Vim
- Markdown
- Zettelkasten
- 100 Days To Offload
toc: true
---
I've recently decided to attempt to keep all of my notes and everything I've learned in a [Zettelkasten](https://zettelkasten.de/). After reading [Daryl Sun's blog post](https://write.privacytools.io/darylsun/100-days-to-offload-day-4), I started looking more into the method and found it *incredibly* intriguing. I've tried the "Evernote way" of throwing everything I come across in a single place but it inevitable gets lost. I don't remember what it was called but I tried another app that actually tags your files and organises them in a nice manner. This worked well for the most part but the graphical client was badly optimised Electron and *very* heavy. I've also tried keeping notes in books but I was never really able to keep up with any of it. The thing that is especially compelling about a Zettelkasten is that I put *everything* I learn in a single text file but link around to as many different ideas as I can, drawing my *own* connections for me to rediscover later on.
Because it's all in a simple text file, I'm also able to create a keybinding in [Sway](https://github.com/swaywm/sway/) that will open it in Vim, jump to the bottom, and have a nice markdown environment ready for me to write in. It did take a bit of configuration and looking around for different plugins but I'm very happy with what I have so far.
The first thing is telling Vim to treat all `.md` files as Markdown
```vim
" Treat all .md files as markdown
autocmd BufNewFile,BufRead *.md set filetype=markdown
```
## Visuals
In a long text file with a great many lines, it can be useful to find your cursor quickly without having to search around the screen for it.
```vim
" Highlight the line the cursor is on
autocmd FileType markdown set cursorline
```
It can also be nice to not see a ton of \[links](https\://example.com) and \*\*bold** or \*italic* text everywhere. Sure, my eye has gotten used to it but still. I'd rather have my terminal actually render bold text as bold.
```vim
" Hide and format markdown elements like **bold**
autocmd FileType markdown set conceallevel=2
```
If you use the `vim-markdown` plugin mentioned further on, I recommend using its option for concealing rather than Vim's.
## Spell check
One of the things every good editor needs is spell check and Vim is no exception. This line enables spell check with British English for all markdown files.
```vim
" Set spell check to British English
autocmd FileType markdown setlocal spell spelllang=en_gb
```
Here's a short crash course in Vim spelling commands:
- `[s` to search for misspelled words above the cursor
- `]s` to search for misspelled words below the cursor
- `z=` to see replacement suggestions
- `zg` to add the word to your dictionary
## Goyo
The very first component is something I use across *all* markdown files. [Goyo](https://github.com/junegunn/goyo.vim) is one of the first plugins I install on any machine I'll be writing with. It enables a "distraction-free writing environment" and I absolutely love it. It disables pretty much all visual elements in Vim except for what mode you're in: visual, command, insert, etc. I have a keybinding set to quickly open/close Goyo because there is an odd issue when I switch workspaces to and away from Vim. With two taps of `Ctrl+g`, it's back to normal.
```vim
nnoremap <C-g> :Goyo<CR>
```
Another line in my Vim config automatically opens Goyo for all markdown files:
```vim
autocmd FileType markdown Goyo
```
## vim-markdown
That latest plugin I installed is [vim-markdown](https://github.com/plasticboy/vim-markdown) and it is *wonderful*. I really recommend reading about all of the options but here's what I have set.
```vim
" Configuration for vim-markdown
let g:vim_markdown_conceal = 2
let g:vim_markdown_conceal_code_blocks = 0
let g:vim_markdown_math = 1
let g:vim_markdown_toml_frontmatter = 1
let g:vim_markdown_frontmatter = 1
let g:vim_markdown_strikethrough = 1
let g:vim_markdown_autowrite = 1
let g:vim_markdown_edit_url_in = 'tab'
let g:vim_markdown_follow_anchor = 1
```
In addition to the rest of the awesome features, the main one I wanted is the last: `follow_anchor`. With this, I can create internal links within the same markdown document and jump between them with `ge`. It also lets me open both files and URLs from within Vim and without ever having to reach for the mouse.
## General Vim things
Other, more general Vim settings that I use globally but might also be nice for editing markdown
```vim
" Have lines wrap instead of continue off-screen
set linebreak
" Gives Vim access to a broader range of colours
set termguicolors
" Converts tabs to spaces
set expandtab
" Use two spaces instead of tabs
set tabstop=2
" The same but for indents
set shiftwidth=2
" Keep cursor in approximately the middle of the screen
set scrolloff=12
" Disable mouse support
set mouse=
```
---
In all, I'm hoping that the work I've done today for improving my markdown workflow will help me create a more effective Zettelkasten. The *big* thing was really being able to follow internal links around because that's the main thing with keeping a Zettelkasten: following your ideas to see where they lead and discovering what connections you can make to form entirely new ideas. Mine will be stored in [Gitea](https://git.nixnet.xyz/Amolith/zettelkasten) for now but I'm thinking about putting it here at some point. It would be cool to have a map of my own mind very easily accessible from anywhere.
![screenshot of my setup](/assets/jpgs/zettelkasten.jpg)
## Edit
### Time stamps
```vim
" Insert timestamp at the end of the line in this format: 20200527T113245
nnoremap <C-t><C-s> m'A<C-R>=strftime('%Y%m%dT%H%M%S')<CR>
```
### Portable `autocmd`s
Put all the `autocmd` lines in the `if` statement so they don't throw errors when the config is added to a version of vim without `autocmd` support
```vim
" Only enable autocommands when Vim supports them
if has("autocmd")
""
" Markdown Configuration
""
" Spellcheck in British English
autocmd FileType markdown setlocal spell spelllang=en_gb
" Automatically open Goyo
autocmd FileType markdown Goyo
" Hide plaintext formatting and use color instead
autocmd FileType markdown set conceallevel=3
" Disable cursor line and column highlight
autocmd FileType markdown set nocursorline
autocmd FileType markdown set nocursorcolumn
endif
```
I won't keep editing this post to provide updates on my config. Instead, I recommend looking at my ["production" version on Gitea](https://git.nixnet.xyz/Amolith/dotfiles/src/branch/master/dotfiles/pc/.config/nvim/init.vim).
---
This was posted as part of [#100DaysToOffload](https://100daystooffload.com/), an [awesome idea](https://fosstodon.org/@kev/104053977554016690) from [Kev Quirk](https://kevq.uk/). If you want to participate, just write something every day for 100 days and post a link on social media with the hashtag!