obsidian-nvim
Original:🇺🇸 English
Translated
Guide for implementing obsidian.nvim - a Neovim plugin for Obsidian vault management. Use when configuring, troubleshooting, or extending obsidian.nvim features including workspace setup, daily notes, templates, completion, pickers, and UI customization.
7installs
Added on
NPX Install
npx skill4agent add julianobarbosa/claude-code-skills obsidian-nvimTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →obsidian.nvim Skill
A comprehensive guide for implementing and configuring obsidian.nvim - the Neovim plugin for managing Obsidian vaults.
Quick Start
Minimal Installation (lazy.nvim)
lua
return {
"obsidian-nvim/obsidian.nvim",
version = "*",
ft = "markdown",
opts = {
workspaces = {
{ name = "personal", path = "~/vaults/personal" },
},
},
}System Requirements
- Neovim: >= 0.10.0
- ripgrep: Required for completion and search ()
brew install ripgrep - pngpaste (macOS): For image pasting ()
brew install pngpaste - xclip/wl-clipboard (Linux): For image pasting
Configuration
See references/configuration.md for complete configuration options.
Essential Configuration Options
lua
require("obsidian").setup({
-- Workspace configuration (required)
workspaces = {
{ name = "personal", path = "~/vaults/personal" },
{ name = "work", path = "~/vaults/work" },
},
-- Daily notes
daily_notes = {
folder = "daily",
date_format = "%Y-%m-%d",
alias_format = "%B %-d, %Y",
default_tags = { "daily-notes" },
},
-- Templates
templates = {
folder = "templates",
date_format = "%Y-%m-%d",
time_format = "%H:%M",
},
-- Note ID generation (Zettelkasten-style by default)
note_id_func = function(title)
local suffix = ""
if title ~= nil then
suffix = title:gsub(" ", "-"):gsub("[^A-Za-z0-9-]", ""):lower()
else
for _ = 1, 4 do
suffix = suffix .. string.char(math.random(65, 90))
end
end
return tostring(os.time()) .. "-" .. suffix
end,
-- Completion settings
completion = {
nvim_cmp = true, -- or blink = true for blink.cmp
min_chars = 2,
},
-- UI customization
ui = {
enable = true,
checkboxes = {
[" "] = { char = "", hl_group = "ObsidianTodo" },
["x"] = { char = "", hl_group = "ObsidianDone" },
},
},
})Commands
See references/commands.md for complete command reference.
Primary Commands
| Command | Description |
|---|---|
| Open command picker |
| Open/create daily note |
| Create new note |
| Search vault with ripgrep |
| Fuzzy find notes |
| Show references to current note |
| Insert template |
| Switch workspace |
Visual Mode Commands
| Command | Description |
|---|---|
| Link selection to existing note |
| Create note and link selection |
| Extract selection to new note |
Keymaps
Smart Action (Recommended: <CR>
)
<CR>lua
vim.keymap.set("n", "<CR>", function()
if require("obsidian").util.cursor_on_markdown_link() then
return "<cmd>Obsidian follow_link<CR>"
else
return "<CR>"
end
end, { expr = true })Navigation Links
lua
vim.keymap.set("n", "[o", function()
require("obsidian").util.nav_link("prev")
end, { buffer = true, desc = "Previous link" })
vim.keymap.set("n", "]o", function()
require("obsidian").util.nav_link("next")
end, { buffer = true, desc = "Next link" })Picker Integration
Configure your preferred picker:
lua
picker = {
name = "telescope", -- or "fzf-lua", "mini.pick", "snacks.picker"
note_mappings = {
new = "<C-x>",
insert_link = "<C-l>",
},
tag_mappings = {
tag_note = "<C-x>",
insert_tag = "<C-l>",
},
},Completion Integration
With blink.cmp
lua
completion = {
blink = true,
nvim_cmp = false,
min_chars = 2,
},With nvim-cmp
lua
completion = {
nvim_cmp = true,
blink = false,
min_chars = 2,
},Triggers:
- - Wiki link completion
[[ - - Markdown link completion
[ - - Tag completion
#
Templates
Template Variables
| Variable | Description |
|---|---|
| Note title |
| Current date |
| Current time |
| Note ID |
Custom Substitutions
lua
templates = {
folder = "templates",
substitutions = {
yesterday = function()
return os.date("%Y-%m-%d", os.time() - 86400)
end,
tomorrow = function()
return os.date("%Y-%m-%d", os.time() + 86400)
end,
},
},Frontmatter Management
lua
frontmatter = {
enabled = true,
func = function(note)
local out = { id = note.id, aliases = note.aliases, tags = note.tags }
if note.metadata ~= nil and not vim.tbl_isempty(note.metadata) then
for k, v in pairs(note.metadata) do
out[k] = v
end
end
return out
end,
sort = { "id", "aliases", "tags" },
},Troubleshooting
See references/troubleshooting.md for comprehensive troubleshooting.
Health Check
vim
:checkhealth obsidianQuick Fixes
| Issue | Solution |
|---|---|
| Completion not working | Install ripgrep: |
| Picker not opening | Verify picker name matches installed plugin |
| Images not pasting | macOS: |
| Links not following | Ensure cursor is on |
| Checkboxes not rendering | Set |
| Workspace not found | Verify path exists and file is inside vault |
Debug Mode
lua
log_level = vim.log.levels.DEBUG,Examples
See references/examples.md for practical configuration examples.