neovim

Personal neovim configuration files
git clone git://gtms.dev/neovim.git
Log | Files | Refs

commit 38652d462b14bdd52805e442f97bc14951ce50aa
parent 8b7ed26d9d08b825687b1ab534841e64937c651f
Author: Tomas Nemec <nemi@skaut.cz>
Date:   Thu, 29 Jul 2021 10:48:46 +0200

update

Diffstat:
Minit.lua | 9++++++---
Mlua/tms/colors.lua | 16+++++++++++++++-
Mlua/tms/colors/solarized.lua | 1-
Alua/tms/ts/range.lua | 108+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atest/dart/dart.lua | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atest/dart/print.lua | 18++++++++++++++++++
Atest/dart/test.dart | 15+++++++++++++++
7 files changed, 222 insertions(+), 5 deletions(-)

diff --git a/init.lua b/init.lua @@ -4,10 +4,12 @@ if vim.fn.empty(vim.fn.glob(install_path)) > 0 then vim.api.nvim_command('!git clone https://github.com/wbthomason/packer.nvim ' .. install_path) end +local colors = require('tms.colors') vim.g.mapleader = ',' vim.cmd('syntax enable') -vim.opt.background = 'dark' -vim.cmd [[colorscheme solarized]] +vim.opt.background = colors.get_theme() or 'dark' +print(vim.opt.background:get()) +vim.cmd('colorscheme ' .. (colors.get_scheme() or 'solarized')) -- OPTIONS -- external vimrc @@ -74,7 +76,7 @@ nmap {'Q', '<nop>'} -- kb.nnoremap('<tab>', 'za') nmap {'<esc>', '<cmd>nohl<cr>', silent = true} nnoremap {'gA', 'ga'} --- saving +-- shortcuts nnoremap {'<leader>w', '<cmd>write<cr>'} nnoremap {'<leader>W', '<cmd>wall<cr>'} nnoremap {'<leader>e', '<cmd>edit<cr>'} @@ -82,6 +84,7 @@ nnoremap {'<leader>E', '<cmd>enew<cr>'} nnoremap {'<leader>q', '<cmd>quit<cr>'} nnoremap {'<leader>Q', '<cmd>qall<cr>'} nnoremap {'<leader>m', '<cmd>messages<cr>'} +nnoremap {'<leader>so', '<cmd>source<cr>'} -- window movement nnoremap {'<a-h>', '<c-w>h'} nnoremap {'<a-j>', '<c-w>j'} diff --git a/lua/tms/colors.lua b/lua/tms/colors.lua @@ -3,7 +3,7 @@ local solarized = require('tms.colors.solarized') local M = {} M.setup = function() - local color = string.sub(vim.g.colors_name,0, 5) + local color = string.sub(vim.g.colors_name, 0, 5) if color == 'solar' then solarized.setup() elseif color == 'gruvb' then @@ -11,4 +11,18 @@ M.setup = function() end end +M.get_theme = function() + if os.getenv('SCHEME') then + local theme = io.open(os.getenv('THEME') or os.getenv('CONFIG') .. '/theme'):read(); + return theme + end +end + +M.get_scheme = function() + local scheme = os.getenv('SCHEME') + if scheme then + return scheme + end +end + return M diff --git a/lua/tms/colors/solarized.lua b/lua/tms/colors/solarized.lua @@ -2,7 +2,6 @@ -- map <buffer> ,c <cmd>execute 'lua ' . getline('.')<cr> local M = {} -local dec2hex = function(dec) string.format('%x', dec * 255) end local get_color = function(name, part) return vim.fn.synIDattr(vim.fn.synIDtrans(vim.fn.hlID(name)), part) end diff --git a/lua/tms/ts/range.lua b/lua/tms/ts/range.lua @@ -0,0 +1,108 @@ +local function get_selection_range() + local _, start_row, start_col, _ = unpack(vim.fn.getpos("'<")) + local _, end_row, _, _ = unpack(vim.fn.getpos("'>")) + local end_col = vim.fn.col("'>") + + -- end_col :: TS is 0 based, and '> on line selections is char_count + 1 + -- I think - 2 is correct on + -- + -- end_row : end_row is exclusive in TS, so we don't minus + return start_row, start_col, end_row, end_col +end + +---@class Region +--- The following fields act similar to a cursor +---@field start_row number: The 1-based row +---@field start_col number: The 0-based col +---@field end_row number: The 1-based row +---@field end_col number: The 0-based col +---@field bufnr number: the buffer that the region is from +local Region = {} +Region.__index = Region + +--- Get a Region from the current selection +---@return Region +function Region:from_current_selection() + local start_row, start_col, end_row, end_col = get_selection_range() + + return setmetatable({ + bufnr = vim.fn.bufnr(), + from_vim = true, + start_row = start_row, + start_col = start_col, + end_row = end_row, + end_col = end_col, + }, self) +end + +--- Get a region from a Treesitter Node +---@return Region +function Region:from_node(node, bufnr) + bufnr = bufnr or vim.fn.bufnr() + local start_line, start_col, end_line, end_col = node:range() + + -- todo: is col correct? + return setmetatable({ + bufnr = vim.fn.bufnr(bufnr), + start_row = start_line + 1, + start_col = start_col, + end_row = end_line + 1, + end_col = end_col, + }, self) +end + +function Region:from_lsp_range(lsp_range, bufnr) + bufnr = bufnr or vim.fn.bufnr() + + -- todo: is col correct? + return setmetatable({ + bufnr = vim.fn.bufnr(bufnr), + start_row = lsp_range.start.line + 1, + start_col = lsp_range.start.character, + end_row = lsp_range["end"].line + 1, + end_col = lsp_range["end"].character, + }, self) +end + +--- Convert a region to a vim region +function Region:to_vim() + return self.start_row, self.start_col, self.end_row, self.end_col +end + +--- Convert a region to a tree sitter region +function Region:to_ts() + return self.start_row - 1, self.start_col, self.end_row - 1, self.end_col +end + +function Region:get_text(bufnr) + local text = vim.api.nvim_buf_get_lines( + bufnr or 0, + self.start_row - 1, + self.end_row, + false + ) + return text +end + +--- Convert a region to an LSP Range +function Region:to_lsp_range() + return { + ["start"] = { + line = self.start_row - 1, + character = self.start_col, + }, + ["end"] = { + line = self.end_row - 1, + character = self.end_col, + }, + } +end + +function Region:to_lsp_text_edit(text) + return { + range = self:to_lsp_range(), + newText = text, + } +end + +return Region diff --git a/test/dart/dart.lua b/test/dart/dart.lua @@ -0,0 +1,60 @@ +local tsu = require('nvim-treesitter.ts_utils') + +local M = {} + +M.getNameFromBody = function(node) + if (node:type():find('function_body')) then + local previous = tsu.get_previous_node(node) + if previous:type() == 'method_signature' then + previous = previous:child() + for i, v in previous:iter_children() do + if v == 'name' then + return tsu.get_node_text(i)[1] or nil + end + end + elseif previous:type() == 'function_signature' then + for i, v in previous:iter_children() do + if v == 'name' then + return tsu.get_node_text(i)[1] or nil + end + end + end + end +end + +M.getNameForClassDef = function(node) + if node:type() == 'class_definition' then + for no, na in node:iter_children() do + if na == 'name' then + return tsu.get_node_text(no)[1] or nil + end + end + end +end + +M.getMethodName = function(n) + local node = n or tsu.get_node_at_cursor() + while node do + if (node:type():find('function_body')) then + return M.getNameFromBody(node) + end + node = node:parent() + end +end + +M.treeFor = function(node) + node = node or tsu.get_node_at_cursor() + local out = {} + while node do + if node:type() == 'function_body' then + local name = M.getNameFromBody(node) + table.insert(out, name) + elseif node:type() == 'class_definition' then + table.insert(out, M.getNameForClassDef(node)) + end + node = node:parent() + end + return out +end + +return M diff --git a/test/dart/print.lua b/test/dart/print.lua @@ -0,0 +1,18 @@ +local tsu = require('nvim-treesitter.ts_utils') +local parsers = require('nvim-treesitter.parsers') +local range = require('tms.ts.range') +local du = require('dart') +local api = vim.api +local ts = vim.treesitter + +local function get_line_indent() return api.nvim_get_current_line():match('^%s+') or '' end + +Test = function() + local tree = du.treeFor() + local _, sr, _, _, _ = unpack(vim.fn.getcurpos()) + local bufnr = api.nvim_get_current_buf() + local r = range:from_lsp_range(vim.lsp.util.make_range_params().range, bufnr) + local string = string.format('print(\'%s\');', table.concat(tree, '.')) + vim.lsp.util.apply_text_edits({r:to_lsp_text_edit(string)}, bufnr) + api.nvim_feedkeys('==', 'n', false) +end diff --git a/test/dart/test.dart b/test/dart/test.dart @@ -0,0 +1,15 @@ +class Test extends A { + void test() { + void trem() { + print('trem.test.Test'); + } + + print(''); + } + + void aha() { + print(''); + } +} + +class A {}