aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
authorkiyan42 <yazdani.kiyan@protonmail.com>2020-06-19 13:45:33 +0200
committerkiyan42 <yazdani.kiyan@protonmail.com>2020-06-19 13:45:33 +0200
commit38af29a912a607d3d703f57b840bfc61671679cc (patch)
tree28c4fca6a638b28c923088e240dce064211cb349 /lua
parentMerge pull request #88 from PitcherTear22/master (diff)
downloadnvim-treesitter-38af29a912a607d3d703f57b840bfc61671679cc.tar
nvim-treesitter-38af29a912a607d3d703f57b840bfc61671679cc.tar.gz
nvim-treesitter-38af29a912a607d3d703f57b840bfc61671679cc.tar.bz2
nvim-treesitter-38af29a912a607d3d703f57b840bfc61671679cc.tar.lz
nvim-treesitter-38af29a912a607d3d703f57b840bfc61671679cc.tar.xz
nvim-treesitter-38af29a912a607d3d703f57b840bfc61671679cc.tar.zst
nvim-treesitter-38af29a912a607d3d703f57b840bfc61671679cc.zip
refacto: remove buf_state
- remove buf_state and related code - add get_node_at_cursor() - better incremental selection (code is localized)
Diffstat (limited to 'lua')
-rw-r--r--lua/nvim-treesitter.lua21
-rw-r--r--lua/nvim-treesitter/configs.lua76
-rw-r--r--lua/nvim-treesitter/incremental_selection.lua76
-rw-r--r--lua/nvim-treesitter/install.lua3
-rw-r--r--lua/nvim-treesitter/locals.lua4
-rw-r--r--lua/nvim-treesitter/parsers.lua5
-rw-r--r--lua/nvim-treesitter/state.lua122
-rw-r--r--lua/nvim-treesitter/ts_utils.lua7
-rw-r--r--lua/nvim-treesitter/utils.lua19
9 files changed, 100 insertions, 233 deletions
diff --git a/lua/nvim-treesitter.lua b/lua/nvim-treesitter.lua
index 100324e36..d3c7fa75f 100644
--- a/lua/nvim-treesitter.lua
+++ b/lua/nvim-treesitter.lua
@@ -2,10 +2,9 @@ local api = vim.api
local install = require'nvim-treesitter.install'
local utils = require'nvim-treesitter.utils'
+local ts_utils = require'nvim-treesitter.ts_utils'
local info = require'nvim-treesitter.info'
local configs = require'nvim-treesitter.configs'
-local state = require'nvim-treesitter.state'
-local ts_utils = require'nvim-treesitter.ts_utils'
local M = {}
@@ -21,20 +20,13 @@ function M.setup()
api.nvim_command(string.format("autocmd NvimTreesitter FileType %s %s", ft, cmd))
end
end
- local cmd = string.format("lua require'nvim-treesitter.state'.attach_to_buffer(%s)", ft)
- api.nvim_command(string.format('autocmd NvimTreesitter FileType %s %s', ft, cmd))
end
-
- state.run_update()
end
function M.statusline(indicator_size)
local indicator_size = indicator_size or 100
- local bufnr = api.nvim_get_current_buf()
- local buf_state = state.get_buf_state(bufnr)
- if not buf_state then return "" end
- local current_node = buf_state.current_node
+ local current_node = ts_utils.get_node_at_cursor()
if not current_node then return "" end
local expr = current_node:parent()
@@ -56,13 +48,4 @@ function M.statusline(indicator_size)
end
end
-function M.get_buf_state()
- local bufnr = api.nvim_get_current_buf()
- return state.exposed_state(bufnr)
-end
-
-function M.get_node_api()
- return ts_utils
-end
-
return M
diff --git a/lua/nvim-treesitter/configs.lua b/lua/nvim-treesitter/configs.lua
index f7b5ff2cf..633f9d21c 100644
--- a/lua/nvim-treesitter/configs.lua
+++ b/lua/nvim-treesitter/configs.lua
@@ -1,137 +1,137 @@
local api = vim.api
local queries = require'nvim-treesitter.query'
-local utils = require'nvim-treesitter.utils'
+local parsers = require'nvim-treesitter.parsers'
-local parsers = {}
+local parserlist = {}
-parsers.javascript = {
+parserlist.javascript = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-javascript",
files = { "src/parser.c", "src/scanner.c" },
}
}
-parsers.c = {
+parserlist.c = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-c",
files = { "src/parser.c" }
}
}
-parsers.cpp = {
+parserlist.cpp = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-cpp",
files = { "src/parser.c", "src/scanner.cc" }
}
}
-parsers.rust = {
+parserlist.rust = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-rust",
files = { "src/parser.c", "src/scanner.c" },
}
}
-parsers.lua = {
+parserlist.lua = {
install_info = {
url = "https://github.com/nvim-treesitter/tree-sitter-lua",
files = { "src/parser.c", "src/scanner.cc" }
}
}
-parsers.python = {
+parserlist.python = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-python",
files = { "src/parser.c", "src/scanner.cc" },
}
}
-parsers.go = {
+parserlist.go = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-go",
files = { "src/parser.c" },
}
}
-parsers.ruby = {
+parserlist.ruby = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-ruby",
files = { "src/parser.c", "src/scanner.cc" },
}
}
-parsers.bash = {
+parserlist.bash = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-bash",
files = { "src/parser.c", "src/scanner.cc" },
}
}
-parsers.php = {
+parserlist.php = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-php",
files = { "src/parser.c", "src/scanner.cc" },
}
}
-parsers.java = {
+parserlist.java = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-java",
files = { "src/parser.c" },
}
}
-parsers.html = {
+parserlist.html = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-html",
files = { "src/parser.c", "src/scanner.cc" },
}
}
-parsers.julia = {
+parserlist.julia = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-julia",
files = { "src/parser.c", "src/scanner.c" },
}
}
-parsers.json = {
+parserlist.json = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-json",
files = { "src/parser.c" },
}
}
-parsers.css = {
+parserlist.css = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-css",
files = { "src/parser.c", "src/scanner.c" },
}
}
-parsers.ocaml = {
+parserlist.ocaml = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-ocaml",
files = { "src/parser.c", "src/scanner.cc" },
}
}
-parsers.swift = {
+parserlist.swift = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-swift",
files = { "src/parser.c" },
}
}
-parsers.csharp = {
+parserlist.csharp = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-c-sharp",
files = { "src/parser.c", "src/scanner.c" },
}
}
-parsers.typescript = {
+parserlist.typescript = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-typescript",
files = { "src/parser.c", "src/scanner.c" },
@@ -139,7 +139,7 @@ parsers.typescript = {
}
}
-parsers.tsx = {
+parserlist.tsx = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-typescript",
files = { "src/parser.c", "src/scanner.c" },
@@ -147,63 +147,63 @@ parsers.tsx = {
}
}
-parsers.scala = {
+parserlist.scala = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-scala",
files = { "src/parser.c", "src/scanner.c" },
}
}
-parsers.haskell = {
+parserlist.haskell = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-haskell",
files = { "src/parser.c", "src/scanner.cc" },
}
}
-parsers.markdown = {
+parserlist.markdown = {
install_info = {
url = "https://github.com/ikatyang/tree-sitter-markdown",
files = { "src/parser.c", "src/scanner.cc" },
}
}
-parsers.toml = {
+parserlist.toml = {
install_info = {
url = "https://github.com/ikatyang/tree-sitter-toml",
files = { "src/parser.c", "src/scanner.c" },
}
}
-parsers.vue = {
+parserlist.vue = {
install_info = {
url = "https://github.com/ikatyang/tree-sitter-vue",
files = { "src/parser.c", "src/scanner.cc" },
}
}
-parsers.elm = {
+parserlist.elm = {
install_info = {
url = "https://github.com//razzeee/tree-sitter-elm",
files = { "src/parser.c", "src/scanner.cc" },
}
}
-parsers.yaml = {
+parserlist.yaml = {
install_info = {
url = "https://github.com/ikatyang/tree-sitter-yaml",
files = { "src/parser.c", "src/scanner.cc" },
}
}
-parsers.nix = {
+parserlist.nix = {
install_info = {
url = "https://github.com/cstrahan/tree-sitter-nix",
files = { "src/parser.c", "src/scanner.cc" },
}
}
-parsers.regex = {
+parserlist.regex = {
install_info = {
url = "https://github.com/tree-sitter/tree-sitter-regex",
files = { "src/parser.c" }
@@ -245,7 +245,7 @@ local M = {}
local function enable_module(mod, bufnr, ft)
local bufnr = bufnr or api.nvim_get_current_buf()
local ft = ft or api.nvim_buf_get_option(bufnr, 'ft')
- if not parsers[ft] or not config.modules[mod] then
+ if not parserlist[ft] or not config.modules[mod] then
return
end
@@ -275,12 +275,12 @@ local function enable_all(mod, ft)
end
end
if ft then
- if utils.has_parser(ft) then
+ if parsers.has_parser(ft) then
enable_mod_conf_autocmd(mod, ft)
end
else
for _, ft in pairs(M.available_parsers()) do
- if utils.has_parser(ft) then
+ if parsers.has_parser(ft) then
enable_mod_conf_autocmd(mod, ft)
end
end
@@ -291,7 +291,7 @@ end
local function disable_module(mod, bufnr, ft)
local bufnr = bufnr or api.nvim_get_current_buf()
local ft = ft or api.nvim_buf_get_option(bufnr, 'ft')
- if not parsers[ft] or not config.modules[mod] then
+ if not parserlist[ft] or not config.modules[mod] then
return
end
@@ -360,7 +360,7 @@ M.commands = {
-- @param mod: module (string)
-- @param ft: filetype (string)
function M.is_enabled(mod, ft)
- if not M.get_parser_configs()[ft] or not utils.has_parser(ft) then
+ if not M.get_parser_configs()[ft] or not parsers.has_parser(ft) then
return false
end
@@ -404,11 +404,11 @@ function M.setup(user_data)
end
function M.get_parser_configs()
- return parsers
+ return parserlist
end
function M.available_parsers()
- return vim.tbl_keys(parsers)
+ return vim.tbl_keys(parserlist)
end
function M.available_modules()
diff --git a/lua/nvim-treesitter/incremental_selection.lua b/lua/nvim-treesitter/incremental_selection.lua
index 9876f2e01..6a9999303 100644
--- a/lua/nvim-treesitter/incremental_selection.lua
+++ b/lua/nvim-treesitter/incremental_selection.lua
@@ -1,11 +1,13 @@
local api = vim.api
-local state = require'nvim-treesitter.state'
local configs = require'nvim-treesitter.configs'
local ts_utils = require'nvim-treesitter.ts_utils'
+local parsers = require'nvim-treesitter.parsers'
local M = {}
+local selections = {}
+
local function update_selection(buf, node)
local start_row, start_col, end_row, end_col = node:range()
@@ -18,32 +20,49 @@ local function update_selection(buf, node)
vim.fn.setpos(".", { buf, end_row+1, end_col+1, 0 })
end
+function M.init_selection()
+ local buf = api.nvim_get_current_buf()
+ local node = ts_utils.get_node_at_cursor()
+ selections[buf] = { [1] = node }
+ update_selection(buf, node)
+end
+
+local function visual_selection_range()
+ local _, csrow, cscol, _ = unpack(vim.fn.getpos("'<"))
+ local _, cerow, cecol, _ = unpack(vim.fn.getpos("'>"))
+ if csrow < cerow then
+ return csrow-1, cscol-1, cerow-1, cecol-1
+ else
+ return cerow-1, cecol-1, csrow-1, cscol-1
+ end
+end
+
+local function range_matches(node)
+ local csrow, cscol, cerow, cecol = visual_selection_range()
+ local srow, scol, erow, ecol = node:range()
+ return srow == csrow and scol == cscol and erow == cerow and ecol == cecol
+end
+
local function select_incremental(get_parent)
return function()
local buf = api.nvim_get_current_buf()
- local buf_state = state.get_buf_state(buf)
-
- local node
- -- initialize incremental selection with current range
- if #buf_state.selection.nodes == 0 then
- local cur_range = buf_state.selection.range
- if not cur_range then
- local _, cursor_row, cursor_col, _ = unpack(vim.fn.getpos("."))
- cur_range = { cursor_row, cursor_col, cursor_row, cursor_col + 1 }
- end
-
- local root = buf_state.parser.tree:root()
- if not root then return end
+ local nodes = selections[buf]
- node = root:named_descendant_for_range(cur_range[1]-1, cur_range[2]-1, cur_range[3]-1, cur_range[4]-1)
- else
- node = get_parent(buf_state.selection.nodes[#buf_state.selection.nodes])
+ -- initialize incremental selection with current selection
+ if not nodes or #nodes == 0 or not range_matches(nodes[#nodes]) then
+ local csrow, cscol, cerow, cecol = visual_selection_range()
+ local root = parsers.get_parser().tree:root()
+ local node = root:named_descendant_for_range(csrow, cscol, cerow, cecol)
+ update_selection(buf, node)
+ selections[buf] = { [1] = node }
+ return
end
+ node = get_parent(nodes[#nodes])
if not node then return end
- if node ~= buf_state.selection.nodes[#buf_state.selection.nodes] then
- state.insert_selection_node(buf, node)
+ if node ~= nodes[#nodes] then
+ table.insert(nodes, node)
end
update_selection(buf, node)
@@ -60,13 +79,10 @@ end)
function M.node_decremental()
local buf = api.nvim_get_current_buf()
- local buf_state = state.get_buf_state(buf)
-
- local nodes = buf_state.selection.nodes
- if #nodes < 2 then return end
-
- state.pop_selection_node(buf)
+ local nodes = selections[buf]
+ if not nodes or #nodes < 2 then return end
+ table.remove(selections[buf])
local node = nodes[#nodes]
update_selection(buf, node)
end
@@ -76,14 +92,14 @@ function M.attach(bufnr)
local config = configs.get_module('incremental_selection')
for funcname, mapping in pairs(config.keymaps) do
-
+ local mode
if funcname == "init_selection" then
- local cmd = ":lua require'nvim-treesitter.incremental_selection'.node_incremental()<CR>"
- api.nvim_buf_set_keymap(buf, 'n', mapping, cmd, { silent = true })
+ mode = 'n'
else
- local cmd = string.format(":lua require'nvim-treesitter.incremental_selection'.%s()<CR>", funcname)
- api.nvim_buf_set_keymap(buf, 'v', mapping, cmd, { silent = true })
+ mode = 'v'
end
+ local cmd = string.format(":lua require'nvim-treesitter.incremental_selection'.%s()<CR>", funcname)
+ api.nvim_buf_set_keymap(buf, mode, mapping, cmd, { silent = true })
end
end
diff --git a/lua/nvim-treesitter/install.lua b/lua/nvim-treesitter/install.lua
index 637f1dedb..381afaa4a 100644
--- a/lua/nvim-treesitter/install.lua
+++ b/lua/nvim-treesitter/install.lua
@@ -4,6 +4,7 @@ local luv = vim.loop
local configs = require'nvim-treesitter.configs'
local utils = require'nvim-treesitter.utils'
+local parsers = require'nvim-treesitter.parsers'
local M = {}
@@ -128,7 +129,7 @@ M.ensure_installed = function(languages)
end
for _, ft in ipairs(languages) do
- if not utils.has_parser(ft) then
+ if not parsers.has_parser(ft) then
install(ft)
end
end
diff --git a/lua/nvim-treesitter/locals.lua b/lua/nvim-treesitter/locals.lua
index 313d7655d..cbea89108 100644
--- a/lua/nvim-treesitter/locals.lua
+++ b/lua/nvim-treesitter/locals.lua
@@ -5,7 +5,7 @@ local api = vim.api
local ts = vim.treesitter
local queries = require'nvim-treesitter.query'
-local utils = require'nvim-treesitter.utils'
+local parsers = require'nvim-treesitter.parsers'
local M = {
locals = {}
@@ -18,7 +18,7 @@ function M.collect_locals(bufnr)
local query = queries.get_query(ft, 'locals')
if not query then return end
- local parser = utils.get_parser(bufnr, ft)
+ local parser = parsers.get_parser(bufnr, ft)
if not parser then return end
local root = parser:parse():root()
diff --git a/lua/nvim-treesitter/parsers.lua b/lua/nvim-treesitter/parsers.lua
index 07f3e9d34..3789b7afe 100644
--- a/lua/nvim-treesitter/parsers.lua
+++ b/lua/nvim-treesitter/parsers.lua
@@ -10,9 +10,10 @@ function M.has_parser(lang)
end
function M.get_parser(bufnr, lang)
+ local buf = bufnr or api.nvim_get_current_buf()
+ local lang = lang or api.nvim_buf_get_option(buf, 'ft')
+
if M.has_parser(lang) then
- local buf = bufnr or api.nvim_get_current_buf()
- local lang = lang or api.nvim_buf_get_option(buf, 'ft')
if not M[buf] then
M[buf] = {}
end
diff --git a/lua/nvim-treesitter/state.lua b/lua/nvim-treesitter/state.lua
deleted file mode 100644
index adff7eeaf..000000000
--- a/lua/nvim-treesitter/state.lua
+++ /dev/null
@@ -1,122 +0,0 @@
-local api = vim.api
-
-local utils = require'nvim-treesitter.utils'
-
-local M = {}
-
-local buffers = {}
-
-local g_mode = api.nvim_get_mode().mode
-
-local function get_selection_range()
- local _, vstart_row, vstart_col, _ = unpack(vim.fn.getpos("v"))
- local _, cursor_row, cursor_col, _ = unpack(vim.fn.getpos("."))
- if vstart_row < cursor_row then
- return vstart_row, vstart_col, cursor_row, cursor_col
- else
- return cursor_row, cursor_col, vstart_row, vstart_col
- end
-end
-
-function M.update()
- local bufnr = api.nvim_get_current_buf()
- local buf_config = buffers[bufnr]
- if not buf_config then return end
-
- local mode = api.nvim_get_mode().mode
- local cursor = api.nvim_win_get_cursor(0)
- local row = cursor[1]
- local col = cursor[2]
- if row == buf_config.cursor_pos.row
- and col == buf_config.cursor_pos.col
- and mode == g_mode
- then
- return
- end
-
- local root = buf_config.parser.tree:root()
- if not root then return end
-
- local new_node = root:named_descendant_for_range(row - 1, col, row - 1, col)
-
- if new_node ~= buf_config.current_node then
- buf_config.current_node = new_node
- end
-
- -- We only want to update the range when the incremental selection has not started yet
- if mode == "v" and #buf_config.selection.nodes == 0 then
- local row_start, col_start, row_end, col_end = get_selection_range()
- buf_config.selection.range = { row_start, col_start, row_end, col_end }
- elseif mode ~= "v" then
- buf_config.selection.nodes = {}
- buf_config.selection.range = nil
- end
-
- g_mode = mode
- buf_config.cursor_pos.row = row
- buf_config.cursor_pos.col = col
-end
-
-function M.insert_selection_node(bufnr, range)
- local buf_config = buffers[bufnr]
- if not buf_config then return end
-
- table.insert(buffers[bufnr].selection.nodes, range)
-end
-
-function M.pop_selection_node(bufnr)
- local buf_config = buffers[bufnr]
- if not buf_config then return end
-
- table.remove(
- buffers[bufnr].selection.nodes,
- #buffers[bufnr].selection.nodes
- )
-end
-
-function M.run_update()
- local cmd = "lua require'nvim-treesitter.state'.update()"
- api.nvim_command('autocmd NvimTreesitter CursorMoved * '..cmd)
-end
-
-function M.attach_to_buffer(ft)
- local bufnr = api.nvim_get_current_buf()
- local ft = ft or api.nvim_buf_get_option(bufnr, 'ft')
-
- if buffers[bufnr] then return end
-
- local parser = utils.get_parser(bufnr, ft)
- if not parser then return end
-
- buffers[bufnr] = {
- cursor_pos = {},
- current_node = nil,
- selection = {
- range = nil,
- nodes = {}
- },
- parser = parser,
- }
-
- M.update()
- api.nvim_buf_attach(bufnr, false, {
- -- TODO(kyazdani): on lines should only parse the changed content
- -- TODO(kyazdani): add a timer to avoid too frequent updates
- on_lines = function(_, buf) buffers[buf].parser:parse() end,
- on_detach = function(bufnr) buffers[bufnr] = nil end,
- })
-end
-
-function M.get_buf_state(bufnr)
- return buffers[bufnr]
-end
-
-function M.exposed_state(bufnr)
- local buf_state = buffers[bufnr]
- return {
- cursor_pos = buf_state.cursor_pos,
- current_node = buf_state.current_node
- }
-end
-
-return M
diff --git a/lua/nvim-treesitter/ts_utils.lua b/lua/nvim-treesitter/ts_utils.lua
index 1445418e0..a85934c0b 100644
--- a/lua/nvim-treesitter/ts_utils.lua
+++ b/lua/nvim-treesitter/ts_utils.lua
@@ -1,6 +1,7 @@
local api = vim.api
local locals = require'nvim-treesitter.locals'
+local parsers = require'nvim-treesitter.parsers'
local M = {}
@@ -205,4 +206,10 @@ function M.previous_scope(node)
end
end
+function M.get_node_at_cursor()
+ local cursor = api.nvim_win_get_cursor(0)
+ local root = parsers.get_parser().tree:root()
+ return root:named_descendant_for_range(cursor[1]-1,cursor[2],cursor[1]-1,cursor[2])
+end
+
return M
diff --git a/lua/nvim-treesitter/utils.lua b/lua/nvim-treesitter/utils.lua
index 9dc5d17bd..6fa159817 100644
--- a/lua/nvim-treesitter/utils.lua
+++ b/lua/nvim-treesitter/utils.lua
@@ -45,23 +45,4 @@ function M.get_cache_dir()
return nil, 'Invalid cache rights, $XDG_CACHE_HOME or /tmp should be read/write'
end
-function M.has_parser(lang)
- local lang = lang or api.nvim_buf_get_option(0, 'filetype')
- return #api.nvim_get_runtime_file('parser/' .. lang .. '.so', false) > 0
-end
-
-function M.get_parser(bufnr, lang)
- if M.has_parser() then
- local buf = bufnr or api.nvim_get_current_buf()
- local lang = lang or api.nvim_buf_get_option(buf, 'ft')
- if not M[buf] then
- M[buf] = {}
- end
- if not M[buf][lang] then
- M[buf][lang] = ts.get_parser(buf, lang)
- end
- return M[buf][lang]
- end
-end
-
return M