commit 38652d462b14bdd52805e442f97bc14951ce50aa
parent 8b7ed26d9d08b825687b1ab534841e64937c651f
Author: Tomas Nemec <nemi@skaut.cz>
Date: Thu, 29 Jul 2021 10:48:46 +0200
update
Diffstat:
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 {}