From 31e602e8c9f2abb1b058ca80382acf07a2075cd5 Mon Sep 17 00:00:00 2001 From: Navid Sassan Date: Mon, 5 Sep 2022 09:43:26 +0200 Subject: [PATCH] first working prototype --- lua/ansible/init.lua | 149 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 lua/ansible/init.lua diff --git a/lua/ansible/init.lua b/lua/ansible/init.lua new file mode 100644 index 0000000..d07da8a --- /dev/null +++ b/lua/ansible/init.lua @@ -0,0 +1,149 @@ +-- TODO +-- reuse existing split +-- use fqcn as buffer name +-- add function to convert to fqcn, with telescope dropdown if there are multiple options +-- telescope window to search through all available module names, enter inserts, other key opens doc in split + + +local ts_utils = require("nvim-treesitter.ts_utils") + +local M = {} + +M.example = function() + local lines = {} + + local current_line_nr = 1 + local buf_handle = vim.api.nvim_win_get_buf(0) + local last_line_nr = vim.api.nvim_buf_line_count(buf_handle) + while (current_line_nr <= last_line_nr) do + -- skip empty lines + if vim.fn.getline(current_line_nr) == '' then + print('skipping ' .. current_line_nr) + current_line_nr = current_line_nr + 1 + else + vim.api.nvim_win_set_cursor(0, {current_line_nr, 1}) + local node = ts_utils.get_node_at_cursor(0) + local parent = node:parent() + while (parent ~= nil and node:type() ~= 'block_mapping_pair') do + node = parent + parent = node:parent() + end + -- ts_utils.update_selection(0, node) + local start_row, start_column, end_row, end_column = node:range() + -- vim.api.nvim_command(start_row + 1 .. ',' .. end_row + 1 .. 's/\\n/`') + -- print(start_row) + -- print(end_row) + + lines[current_line_nr] = vim.fn.getline(start_row + 1, end_row + 1) + + current_line_nr = current_line_nr + 1 + (end_row - start_row) + end + end + + -- sort does not work if the index is not a continuous integer, so lets make sure it is. if we are sure that we dont need the original line number, we can do this from the start in `lines` + a = {} + for i,v in pairs(lines) do table.insert(a, v) end + table.sort( + a, + function(k1, k2) + return k1[1] < k2[1] + end + ) + + insert_row = 1 + last_prefix = vim.split(a[1][1], '__')[1] + for _, lines in ipairs(a) do + current_prefix = vim.split(lines[1], '__')[1] + if current_prefix ~= last_prefix then + vim.fn.setline(insert_row, '') + insert_row = insert_row + 1 + end + last_prefix = current_prefix + for i, line in ipairs(lines) do + vim.fn.setline(insert_row, line) + insert_row = insert_row + 1 + end + end + + -- nvim_put() + -- *nvim_set_current_line()* + + -- if multiline: + -- vim.api.nvim_command("'<,'>s/\\n/`") +end + + +M.display_ansible_doc = function(keyword) + + local Job = require'plenary.job' + + -- local keyword = 'get_url' + local doc = {} + + Job:new({ + command = 'ansible-doc', + args = { keyword }, + on_exit = function(j, return_val) + -- print(return_val) + -- print(vim.inspect(j:result())) + doc = j:result() + end, + }):sync() -- or start() + + -- TODO unlisted / scratch buffer? + local fqcn = string.lower(vim.split(doc[1], ' ')[2]) + + vim.api.nvim_command('vsplit ' .. fqcn) + + local win_handle = vim.api.nvim_tabpage_get_win(0) + local buf_handle = vim.api.nvim_win_get_buf(0) + + vim.api.nvim_buf_set_lines(buf_handle, 0, -1, false, doc) + + vim.api.nvim_buf_set_option(buf_handle, 'readonly', true) + vim.api.nvim_buf_set_option(buf_handle, 'modifiable', false) + + -- Now we set some options for our buffer. + -- nofile prevent mark buffer as modified so we never get warnings about not saved changes. + -- Also some plugins treat nofile buffers different. + -- For example coc.nvim don't triggers aoutcompletation for these. + vim.api.nvim_buf_set_option(buf_handle, 'buftype', 'nofile') + -- We do not need swapfile for this buffer. + vim.api.nvim_buf_set_option(buf_handle, 'swapfile', false) + -- And we would rather prefer that this buffer will be destroyed when hide. + vim.api.nvim_buf_set_option(buf_handle, 'bufhidden', 'wipe') + -- It's not necessary but it is good practice to set custom filetype. + -- This allows users to create their own autocommand or colorschemes on filetype. + -- and prevent collisions with other plugins. + vim.api.nvim_buf_set_option(buf_handle, 'filetype', 'ansible-doc') + + -- vim.api.nvim_command('wincmd p') -- go back to previous window +end + + +M.replace_fqcn = function() + + local Job = require'plenary.job' + + -- keyword = 'get_url' + doc = {} + + Job:new({ + command = 'ansible-doc', + args = { keyword }, + on_exit = function(j, return_val) + -- print(return_val) + -- print(vim.inspect(j:result())) + doc = j:result() + end, + }):sync() -- or start() + + fqcn = string.lower(vim.split(doc[1], ' ')[2]) + cur_pos = vim.api.nvim_win_get_cursor(0) + + buf_handle = vim.api.nvim_win_get_buf(0) + vim.api.nvim_buf_set_lines(buf_handle, 0, -1, false, doc) + +end + +return M