diff --git a/README.org b/README.org index 802c1db..06219ec 100644 --- a/README.org +++ b/README.org @@ -30,11 +30,37 @@ you to add anything extra to your ~init.el~. cmd = { "OrgExecute", "OrgTangle" }, opts = { -- by default, none are enabled - langs = { "python", "lua", ... } + langs = { "python", "lua", ... }, + + -- paths to emacs packages to additionally load + load_paths = {} } }, #+end_src +*** Packer + +#+begin_src lua +use { + "mrshmllow/orgmode-babel.nvim", + requires = { + "nvim-orgmode/orgmode", + "nvim-treesitter/nvim-treesitter" + }, + cmd = { "OrgExecute", "OrgTangle" }, + opt = true, + config = function () + require("orgmode-babel").setup({ + -- by default, none are enabled + langs = { "python", "lua", ... }, + + -- paths to emacs packages to additionally load + load_paths = {} + }) + end +} +#+end_src + ** Usage All commands accept a ~!~ to skip confirmation. @@ -67,3 +93,37 @@ Tangles all blocks in range. If the range is NOT ~%~, the tangled file will likely only contain the contents of the last block, which is expected behaviour. +** Advanced Configuration +*** Adding extra org-mode languages + +Your emacs ~init.el~ will *not* be sourced during execution of ~:OrgExecute~ and +~:OrgTangle~, so packages you install there wont be available. + +However, ~orgmode-babel.nvim~ allows us to specify extra load paths, so we can +make packages available that way. + +**** Example + +As an example, lets add [[https://github.com/arnm/ob-mermaid][ob-mermaid]] for +mermaid functionality in ~orgmode-babel.nvim~! + +We have two options to get the package. We could either create an +=~/.emacs.d/init.el= and install it through a package manager, which will likely +have a randomish name, or for the sake of simplicity and this being a neovim +plugin, we can simply manually clone the repo to a known location. + +#+begin_example +git clone https://github.com/arnm/ob-mermaid ~/.../clone-location/ob-mermaid +#+end_example + +#+begin_src lua +{ + "mrshmllow/orgmode-babel.nvim", + ... + opts = { + langs = { ..., "mermaid" } + load_paths = { "~/.../clone-location/ob-mermaid" } + } +}, +#+end_src + diff --git a/doc/orgmode-babel.nvim.txt b/doc/orgmode-babel.nvim.txt index 031d1da..2d97cd1 100644 --- a/doc/orgmode-babel.nvim.txt +++ b/doc/orgmode-babel.nvim.txt @@ -1,4 +1,4 @@ -*orgmode-babel.nvim.txt* For NVIM v0.9.0 Last change: 2023 June 27 +*orgmode-babel.nvim.txt* For NVIM v0.9.0 Last change: 2023 July 23 ============================================================================== Table of Contents *orgmode-babel.nvim-table-of-contents* @@ -46,12 +46,39 @@ LAZY.NVIM ~ cmd = { "OrgExecute", "OrgTangle" }, opts = { -- by default, none are enabled - langs = { "python", "lua", ... } + langs = { "python", "lua", ... }, + + -- paths to emacs packages to additionally load + load_paths = {} } }, < +PACKER ~ + +>lua + use { + "mrshmllow/orgmode-babel.nvim", + requires = { + "nvim-orgmode/orgmode", + "nvim-treesitter/nvim-treesitter" + }, + cmd = { "OrgExecute", "OrgTangle" }, + opt = true, + config = function () + require("orgmode-babel").setup({ + -- by default, none are enabled + langs = { "python", "lua", ... }, + + -- paths to emacs packages to additionally load + load_paths = {} + }) + end + } +< + + USAGE *orgmode-babel.nvim-orgmode-babel.nvim-usage* All commands accept a `!` to skip confirmation. @@ -95,43 +122,33 @@ ADVANCED CONFIGURATION*orgmode-babel.nvim-orgmode-babel.nvim-advanced-configurat ADDING EXTRA ORG-MODE LANGUAGES ~ -Your emacs `init.el` will be sourced during execution of `:OrgExecute` and -`:OrgTangle`, so packages you install there that provide extra babel languages -will be available! +Your emacs `init.el` will **not** be sourced during execution of `:OrgExecute` +and `:OrgTangle`, so packages you install there wont be available. -Follow the package's installation steps, and if they tell you to include it in -`org-babel-load-languages`, additionally make sure that you include it in -`opts.langs`. +However, `orgmode-babel.nvim` allows us to specify extra load paths, so we can +make packages available that way. 1. Example As an example, lets add ob-mermaid for mermaid functionality in `orgmode-babel.nvim`! -First, lets create a `~/.emacs.d/init.el`. +We have two options to get the package. We could either create an +`~/.emacs.d/init.el` and install it through a package manager, which will +likely have a randomish name, or for the sake of simplicity and this being a +neovim plugin, we can simply manually clone the repo to a known location. -> - ; ~/.emacs.d/init.el - - ; Add the melpa package manager - (require 'package) - (add-to-list 'package-archives - '("melpa" . "https://melpa.org/packages/") t) - (package-initialize) - - ; Install ob-mermaid - (unless (package-installed-p 'ob-mermaid) - (package-install 'ob-mermaid)) +>example + git clone https://github.com/arnm/ob-mermaid ~/.../clone-location/ob-mermaid < -Then, in our plugin configuration, we can add `mermaid` to our `opts.langs`. - >lua { "mrshmllow/orgmode-babel.nvim", ... opts = { langs = { ..., "mermaid" } + load_paths = { "~/.../clone-location/ob-mermaid" } } }, < diff --git a/lua/orgmode-babel/init.lua b/lua/orgmode-babel/init.lua index c8ab345..ffe7e29 100644 --- a/lua/orgmode-babel/init.lua +++ b/lua/orgmode-babel/init.lua @@ -3,9 +3,10 @@ local M = { } function M.setup(opts) - opts = opts or opts + opts = opts or {} M.langs = opts.langs and opts.langs or {} + M.load_paths = opts.load_paths and opts.load_paths or {} M._here = vim.fn.fnamemodify(debug.getinfo(1).source:sub(2), ":p:h") M._run_by_name = M._here .. "/run_by_name.el" @@ -26,6 +27,17 @@ function M.setup(opts) "(setq make-backup-files nil)", } + vim.list_extend( + M._base_cmd, + vim.fn.reduce(M.load_paths, function(acc, value) + vim.list_extend(acc, { + "--eval", + [[(add-to-list 'load-path "]] .. value .. [[")]], + }) + return acc + end, {}) + ) + vim.list_extend(M._base_cmd, { "--eval", "(org-babel-do-load-languages 'org-babel-load-languages '(" .. vim.fn.reduce(M.langs, function(acc, value) @@ -77,26 +89,29 @@ function M.get_names_in_buffer(bufnr, line1, line2) local passed = not range local name - for id, node in pairs(match) do - local row1, col1, row2, col2 = node:range() - local text = vim.api.nvim_buf_get_text(bufnr, row1, col1, row2, col2, {})[1] + for id, nodes in pairs(match) do + for _, node in ipairs(nodes) do + local row1, col1, row2, col2 = node:range() - if named_blocks_query.captures[id] == "block" and not passed then - if single and line1 - 1 > row1 and line1 - 1 < row2 then - passed = true - elseif not single and line1 - 1 <= row1 and row2 <= line2 - 1 then - passed = true + local text = vim.api.nvim_buf_get_text(bufnr, row1, col1, row2, col2, {})[1] + + if named_blocks_query.captures[id] == "block" and not passed then + if single and line1 - 1 > row1 and line1 - 1 < row2 then + passed = true + elseif not single and line1 - 1 <= row1 and row2 <= line2 - 1 then + passed = true + end + end + + if named_blocks_query.captures[id] == "name" then + name = text end end - if named_blocks_query.captures[id] == "name" then - name = text + if passed then + table.insert(names, name) end end - - if passed then - table.insert(names, name) - end end return names end @@ -118,14 +133,16 @@ function M.get_blocks_in_buffer(bufnr, line1, line2) for _, match in unnamed_blocks_query:iter_matches(root, bufnr, 0, -1) do local passed = not range - for id, node in pairs(match) do - local row1, _, row2 = node:range() + for id, nodes in pairs(match) do + for _, node in ipairs(nodes) do + local row1, _, row2 = node:range() - if unnamed_blocks_query.captures[id] == "block" and not passed then - if single and line1 - 1 > row1 and line1 - 1 < row2 then - passed = true - elseif not single and line1 - 1 <= row1 and row2 <= line2 - 1 then - passed = true + if unnamed_blocks_query.captures[id] == "block" and not passed then + if single and line1 - 1 > row1 and line1 - 1 < row2 then + passed = true + elseif not single and line1 - 1 <= row1 and row2 <= line2 - 1 then + passed = true + end end end end