Setup

-- init.lua

-- Load custom tree-sitter grammar for org filetype
require('orgmode').setup_ts_grammar()

-- Tree-sitter configuration
require'nvim-treesitter.configs'.setup {
  -- If TS highlights are not enabled at all, or disabled via ``disable`` prop, highlighting will fallback to default Vim syntax highlighting
  highlight = {
    enable = true,
    disable = {'org'}, -- Remove this to use TS highlighter for some of the highlights (Experimental)
    additional_vim_regex_highlighting = {'org'}, -- Required since TS highlighter doesn't support all syntax features (conceal)
  },
  ensure_installed = {'org'}, -- Or run :TSUpdate org
}

require('orgmode').setup({
  org_agenda_files = {'~/Dropbox/org/*', '~/my-orgs/**/*'},
  org_default_notes_file = '~/Dropbox/org/refile.org',
})

Or if you are using init.vim:

" init.vim
lua << EOF

-- Load custom tree-sitter grammar for org filetype
require('orgmode').setup_ts_grammar()

-- Tree-sitter configuration
require'nvim-treesitter.configs'.setup {
  -- If TS highlights are not enabled at all, or disabled via `disable` prop, highlighting will fallback to default Vim syntax highlighting
  highlight = {
    enable = true,
    disable = {'org'}, -- Remove this to use TS highlighter for some of the highlights (Experimental)
    additional_vim_regex_highlighting = {'org'}, -- Required since TS highlighter doesn't support all syntax features (conceal)
  },
  ensure_installed = {'org'}, -- Or run :TSUpdate org
}

require('orgmode').setup({
  org_agenda_files = {'~/Dropbox/org/*', '~/my-orgs/**/*'},
  org_default_notes_file = '~/Dropbox/org/refile.org',
})
EOF
  • Open agenda prompt: <Leader>oa
  • Open capture prompt: <Leader>oc
  • In any orgmode buffer press g? for help

If you are new to Orgmode, see Getting started section in Docs.

Completion

If you use nvim-compe and want to enable autocompletion, add this to your compe config:

require'compe'.setup({
  source = {
    orgmode = true
  }
})

For nvim-cmp, add orgmode to list of sources:

require'cmp'.setup({
  sources = {
    { name = 'orgmode' }
  }
})

For completion.nvim, just add omni mode to chain complete list and add additional keyword chars:

vim.g.completion_chain_complete_list = {
  org = {
    { mode = 'omni'},
  },
}
vim.cmd[[autocmd FileType org setlocal iskeyword+=:,#,+]]

Or just use omnifunc via <C-x><C-o>

Tree-sitter info

Built in tree-sitter parser is used for parsing the org files. Highlights are experimental and partially supported.

Advantages of tree-sitter over built in parsing/syntax:

  • More reliable, since parsing is done with proper parsing tool
  • Better highlighting (Experimental, still requires improvements)
  • Future features will be easier to implement because grammar already parses some things that were not parsed before (tables, latex, etc.)
  • Allows for easier hacking (custom motions that can work with TS nodes, etc.)

Known highlighting issues and limitations

Improvements over Vim’s syntax highlighting

Troubleshoot

  • Folding is not working

Make sure you are not overriding foldexpr in Org buffers with nvim-treesitter folding

  • Indentation is not working

Make sure you are not overriding indentexpr in Org buffers with nvim-treesitter indentation

  • I get treesitter/query.lua errors when opening agenda/capture prompt or org files

Make sure you are using latest changes from tree-sitter-org grammar by running :TSUpdate org and restarting the editor.

  • Dates are not in English

Dates are generated with Lua native date support, and it reads your current locale when creating them.

To use different locale you can add this to your init.lua:

vim.cmd('language en_US.utf8')

or init.vim:

language en_US.utf8

Just make sure you have en_US locale installed on your system. To see what you have available on the system you can start the command :language and press <TAB> to autocomplete possible options.

  • Links are not concealed

Links are concealed with Vim’s conceal feature (see :help conceal). To enable concealing, add this to your init.lua:

vim.opt.conceallevel = 2
vim.opt.concealcursor = 'nc'

Or if you are using init.vim:

set conceallevel=2
set concealcursor=nc