pull/77/head
Onns 2024-03-27 13:08:21 +08:00
parent 914c60ae75
commit 85d5e41dfc
11 changed files with 637 additions and 247 deletions

1
.gitignore vendored
View File

@ -6,3 +6,4 @@ debug
foo.*
*.log
data
lazy-lock.json

9
lazyvim.json 100644
View File

@ -0,0 +1,9 @@
{
"extras": [
"lazyvim.plugins.extras.formatting.prettier"
],
"news": {
"NEWS.md": "2123"
},
"version": 3
}

View File

@ -1,3 +1,289 @@
-- Keymaps are automatically loaded on the VeryLazy event
-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua
-- Add any additional keymaps here
function SaveHttpResp()
-- 获取当前时间并格式化为时间戳
local timestamp = os.date("%Y%m%d%H%M%S")
-- 获取当前文件的目录路径
local current_path = vim.fn.expand('%:p:h')
-- 定位到 rest.nvim 的响应缓冲区
for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do
if vim.bo[bufnr].filetype == 'httpResult' then
-- 设置保存文件的完整路径,包含时间戳
local filename = current_path .. "/log/response_" .. timestamp .. ".txt"
vim.api.nvim_buf_call(bufnr, function()
vim.cmd('w ' .. filename)
end)
print("Response saved to " .. filename)
break
end
end
end
vim.api.nvim_set_keymap('n', '<leader>rr',
":lua require('rest-nvim').run()<CR>",
{ noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<leader>rs',
":lua SaveHttpResp()<CR>",
{ noremap = true, silent = true })
function GetGoplsRootDir()
local clients = vim.lsp.get_active_clients()
for _, client in ipairs(clients) do
if client.name == "gopls" and client.config.root_dir then
return client.config.root_dir
end
end
return nil -- 返回 nil 如果没有找到 gopls 或者 gopls 没有根目录
end
function GoToPathAndLine(input)
if input == '' then
return
end
local parts = vim.split(input, ':')
local file = parts[1]
local line = 1
if #parts > 1 then
line = parts[2]
end
-- 如果有工作路径,选第一个,否则选当前路径
local pwd = vim.fn.getcwd()
-- if vim.g.WorkspaceFolders and #vim.g.WorkspaceFolders > 0 then
-- pwd = vim.g.WorkspaceFolders[1]
-- end
local goplsRootDir = GetGoplsRootDir()
if goplsRootDir then
pwd = goplsRootDir
end
vim.cmd('edit +' .. line .. ' ' .. pwd .. '/' .. file)
end
vim.api.nvim_set_keymap('n', 'gto', ':lua GoToPathAndLine(vim.fn.input("Enter path and line: "))<CR>', { noremap = true })
function ExportExpandToClipboard()
local pwd = vim.fn.getcwd()
local goplsRootDir = GetGoplsRootDir()
if goplsRootDir then
pwd = goplsRootDir
end
local rf = vim.fn.expand('%:p') .. ':' .. vim.fn.line('.')
local expanded = string.sub(rf, string.len(pwd .. '/') + 1)
vim.fn.setreg('+', expanded)
print('Expanded path copied to clipboard: ' .. expanded)
end
vim.api.nvim_set_keymap('n', 'gcr', ':lua ExportExpandToClipboard()<CR>', { noremap = true })
local function check_spelling()
-- 保存当前文件
vim.cmd('write')
-- 获取当前文件的路径
local current_file = vim.fn.expand('%:p')
print('Spell check in: ' .. current_file)
-- 构建CSpell命令
local command = 'cspell --config /Users/onns/.onns/weiyun/code/config/vim/cspell.yaml -r "/Users/onns" ' ..
current_file
-- 在新的终端窗口中执行CSpell
vim.cmd('split | terminal ' .. command)
end
-- 将Lua函数绑定到Neovim命令
vim.api.nvim_create_user_command('SpellCheck', check_spelling, {})
vim.api.nvim_set_keymap('n', '<leader>pj',
[[:.s/\v(\w+) \= (\d+).*;/\1 = \2 [(gogoproto.jsontag) = '\1', json_name = '\1'];<CR>]],
{ noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<leader>pf',
[[:.s/\v(\w+) \= (\d+).*;/\1 = \2 [(gogoproto.moretags) = 'form:"\1"',(gogoproto.jsontag) = '\1', json_name = '\1'];<CR>]],
{ noremap = true, silent = true })
function TodoTelescopeWithCWD()
local pwd = vim.fn.getcwd()
local goplsRootDir = GetGoplsRootDir()
if goplsRootDir then
pwd = goplsRootDir
end
print('TodoTelescope at : ' .. pwd)
vim.cmd("TodoTelescope cwd=" .. pwd)
end
vim.api.nvim_set_keymap('n', '<leader>fw', ':lua TodoTelescopeWithCWD()<CR>', { noremap = true })
-- 待定列表
local targets = { "cmd", "CHANGELOG.md", "go.mod", ".git" }
-- 检查文件或目录是否存在
local function file_exists(path)
local ok, err, code = os.rename(path, path)
if not ok then
if code == 13 then
-- Permission denied, but it exists
return true
end
end
return ok, err
end
-- 从当前路径向上查找目标文件或目录
local function find_upwards()
-- 获取当前文件的路径
local path = vim.fn.expand('%:p:h')
while path and path ~= '' do
-- 检查目标文件或目录是否在当前路径
for _, target in pairs(targets) do
local fullpath = path .. '/' .. target
if file_exists(fullpath) then
return path
end
end
-- 移动到上一级目录
path = vim.fn.fnamemodify(path, ':h')
end
return nil
end
function TodoTelescopeWithProject()
local pwd = vim.fn.getcwd()
local projectDir = find_upwards()
if projectDir then
pwd = projectDir
end
print('TodoTelescope at : ' .. pwd)
vim.cmd("TodoTelescope cwd=" .. pwd)
end
vim.api.nvim_set_keymap('n', '<leader>fp', ':lua TodoTelescopeWithProject()<CR>', { noremap = true })
function InsertGitBranch()
local cwd = vim.fn.getcwd()
local git_branch_cmd = "git -C " .. cwd .. " branch --show-current"
local handle = io.popen(git_branch_cmd)
local git_branch = handle:read("*a")
handle:close()
git_branch = git_branch:gsub("%s+$", "")
if git_branch ~= "" then
-- vim.api.nvim_put({ git_branch }, "", false, true)
local line_num = vim.api.nvim_win_get_cursor(0)[1]
local todo_info = "// TODO: onns " .. git_branch .. " "
vim.api.nvim_buf_set_lines(0, line_num - 1, line_num - 1, false, { todo_info })
vim.api.nvim_command('startinsert')
vim.api.nvim_win_set_cursor(0, { line_num, #todo_info })
end
end
vim.api.nvim_set_keymap('n', '<leader>ig', ':lua InsertGitBranch()<CR>', { noremap = true })
local ts_utils = require 'nvim-treesitter.ts_utils'
function JumpToFunctionName()
-- vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes('[f', true, true, true), 'm', true)
local node = ts_utils.get_node_at_cursor()
while node do
-- print(node:type())
if node:type() == "function_declaration" or node:type() == "method_declaration" then
local child_count = node:child_count()
for i = 0, child_count - 1 do
local child = node:child(i)
-- print("Child " .. i .. ": " .. child:type())
if child then
if node:type() == "function_declaration" and child:type() == "identifier" then
local start_row, start_col, _, _ = child:range()
vim.api.nvim_win_set_cursor(0, { start_row + 1, start_col })
return
end
if node:type() == "method_declaration" and child:type() == "field_identifier" then
local start_row, start_col, _, _ = child:range()
vim.api.nvim_win_set_cursor(0, { start_row + 1, start_col })
return
end
end
end
end
node = node:parent()
end
end
vim.api.nvim_set_keymap('n', '[n', '<cmd>lua JumpToFunctionName()<CR>', { noremap = true, silent = true })
function GetGoImportPath()
local current_file = vim.api.nvim_buf_get_name(0)
local current_path = vim.fn.fnamemodify(current_file, ":h")
local go_mod_path = vim.fn.findfile("go.mod", current_path .. ";")
if go_mod_path == "" then
return
end
local go_mod_content = vim.fn.readfile(go_mod_path)
local module_name = nil
for _, line in ipairs(go_mod_content) do
module_name = line:match("^module%s+(%S+)")
if module_name then
break
end
end
if not module_name then
return
end
local module_root = vim.fn.fnamemodify(go_mod_path, ":h")
local package_path = string.sub(current_path, string.len(module_root .. '/') + 1)
local import_package_name = module_name .. "/" .. package_path
vim.fn.setreg('+', import_package_name)
print("Import path copied to clipboard: " .. import_package_name)
end
vim.api.nvim_set_keymap('n', 'gcp', ':lua GetGoImportPath()<CR>', { noremap = true })
vim.api.nvim_set_keymap('n', '<leader>fm',
":lua require('bookmarks').toggle_bookmarks()<CR>",
{ noremap = true, silent = true })
function LiveGrepUp(n)
-- 获取当前工作目录
local cwd = vim.fn.getcwd()
-- 用系统的路径分隔符分割路径
local path_sep = package.config:sub(1, 1)
local components = {}
-- 分割路径到各个组件
for component in string.gmatch(cwd, "[^" .. path_sep .. "]+") do
table.insert(components, component)
end
-- 计算向上n级的路径
local up_n = #components - n
if up_n < 1 then up_n = 1 end -- 确保不会超出根目录
local new_cwd = path_sep
for i = 1, up_n do
new_cwd = new_cwd .. components[i] .. (i < up_n and path_sep or "")
end
-- 使用新的目录执行Telescope live_grep
require('telescope.builtin').live_grep({ cwd = new_cwd })
end
vim.api.nvim_create_user_command(
'Lg',
function(opts)
local n = tonumber(opts.args) or 0
LiveGrepUp(n)
end,
{ nargs = 1 } -- 命令接受一个参数
)

View File

@ -2,7 +2,8 @@ local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
-- bootstrap lazy.nvim
-- stylua: ignore
vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", lazypath })
vim.fn.system({ "git", "clone", "--filter=blob:none", "git@github.com:folke/lazy.nvim.git", "--branch=stable",
lazypath })
end
vim.opt.rtp:prepend(vim.env.LAZY or lazypath)
@ -26,7 +27,7 @@ require("lazy").setup({
version = false, -- always use the latest git commit
-- version = "*", -- try installing the latest stable version for plugins that support semver
},
install = { colorscheme = { "tokyonight", "habamax" } },
install = { colorscheme = { "onedark", "tokyonight", "habamax" } },
checker = { enabled = true }, -- automatically check for plugin updates
performance = {
rtp = {
@ -44,3 +45,27 @@ require("lazy").setup({
},
},
})
require("gitsigns").setup({
current_line_blame = true, -- Toggle with `:Gitsigns toggle_current_line_blame`
current_line_blame_opts = {
virt_text = true,
virt_text_pos = "eol", -- 'eol' | 'overlay' | 'right_align'
delay = 100,
ignore_whitespace = false,
virt_text_priority = 100,
},
})
require("lspconfig").gopls.setup({
cmd = { "gopls", "-remote=unix;/tmp/gopls-daemon-socket" },
})
require("lspconfig").bufls.setup({})
-- https://github.com/hrsh7th/nvim-cmp/issues/1809
-- gopls 在返回提示词的时候随机选择,理论上应该默认选第一个
local cmp = require("cmp")
cmp.setup({
preselect = cmp.PreselectMode.None
})

View File

@ -1,3 +1,39 @@
-- Options are automatically loaded before lazy.nvim startup
-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua
-- Add any additional options here
-- 拼写检查
-- vim.opt.spell = true
-- vim.opt.spelllang = "en_us"
vim.g.go_fmt_command = "gofmt"
vim.g.go_fillstruct_mode = "gopls"
vim.g.go_autodetect_gopath = 1
vim.g.go_highlight_types = 1
vim.g.go_highlight_fields = 1
vim.g.go_highlight_functions = 1
vim.g.go_highlight_function_calls = 1
vim.g.go_highlight_extra_types = 1
vim.g.go_highlight_generate_tags = 1
vim.g.go_gopls_enabled = 1
vim.g.go_imports_autosave = 0
vim.g.go_gopls_options = { "-remote=unix;/tmp/gopls-daemon-socket" }
vim.g.go_def_mode = "gopls"
vim.g.go_info_mode = "gopls"
vim.g.go_referrers_mode = "gopls"
-- vim.api.nvim_set_keymap('n', 'gd', ':GoDef<CR>', { noremap = true, silent = true })
-- vim.api.nvim_set_keymap('n', 'gr', ':GoReferrers', { noremap = true, silent = true })
-- vim.api.nvim_set_keymap('n', 'gm', ':GoImplements', { noremap = true, silent = true })
vim.api.nvim_set_keymap("n", "<C-g>", ":GoDeclsDir<CR>", { silent = true })
vim.api.nvim_set_keymap("i", "<C-g> <esc>", ":<C-u>GoDeclsDir<CR>", { silent = true })
-- vim.api.nvim_set_keymap('n', 'gd', "<Plug>(coc-definition)", { noremap = true, silent = true })
-- vim.api.nvim_set_keymap('n', 'gr', "<Plug>(coc-references)", { noremap = true, silent = true })
-- vim.api.nvim_set_keymap('n', 'gm', "<Plug>(coc-implementation)", { noremap = true, silent = true })
-- tagbar 打开后自动聚焦
vim.g.tagbar_autofocus = 1
vim.opt.wrap = true
vim.g.startify_files_number = 20

View File

@ -0,0 +1,70 @@
return {
-- {
-- 'neoclide/coc.nvim',
-- branch = 'master',
-- build = "yarn install --frozen-lockfile",
-- },
{
'onns/bookmarks.nvim',
keys = {},
branch = 'main',
dependencies = { 'nvim-web-devicons' },
config = function()
require("bookmarks").setup()
require("telescope").load_extension("bookmarks")
end
},
-- {
-- "scrooloose/nerdtree",
-- keys = {
-- {
-- "<leader>e",
-- "<cmd>NERDTreeToggle<cr>",
-- desc = "NERDTreeToggle"
-- },
-- {
-- "<leader>v",
-- "<cmd>NERDTreeFind<cr>",
-- desc = "NERDTreeFind"
-- }
-- },
-- config = function()
-- require("neo-tree").setup()
-- end
-- },
{
"git@github.com:navarasu/onedark.nvim.git",
lazy = false,
config = function()
require('onedark').setup {
style = 'darker'
}
require('onedark').load()
end
},
{
'git@github.com:fatih/vim-go.git'
},
{
"git@github.com:junegunn/fzf.git"
},
{
"git@github.com:majutsushi/tagbar.git",
keys = {
{
"<leader>t",
"<cmd>TagbarToggle<cr>",
desc = "TagbarToggle"
}
}
},
{
"git@github.com:mhinz/vim-startify.git", lazy = false
},
{
'git@github.com:wakatime/vim-wakatime.git'
},
{
'buoto/gotests-vim'
},
}

View File

@ -0,0 +1,5 @@
return {
-- disable trouble
-- { "hrsh7th:/nvim-cmp", enabled = false },
-- { "hrsh7th/nvim-cmp", enabled = false },
}

View File

@ -1,245 +0,0 @@
-- since this is just an example spec, don't actually load anything here and return an empty spec
-- stylua: ignore
if true then return {} end
-- every spec file under the "plugins" directory will be loaded automatically by lazy.nvim
--
-- In your plugin files, you can:
-- * add extra plugins
-- * disable/enabled LazyVim plugins
-- * override the configuration of LazyVim plugins
return {
-- add gruvbox
{ "ellisonleao/gruvbox.nvim" },
-- Configure LazyVim to load gruvbox
{
"LazyVim/LazyVim",
opts = {
colorscheme = "gruvbox",
},
},
-- change trouble config
{
"folke/trouble.nvim",
-- opts will be merged with the parent spec
opts = { use_diagnostic_signs = true },
},
-- disable trouble
{ "folke/trouble.nvim", enabled = false },
-- override nvim-cmp and add cmp-emoji
{
"hrsh7th/nvim-cmp",
dependencies = { "hrsh7th/cmp-emoji" },
---@param opts cmp.ConfigSchema
opts = function(_, opts)
table.insert(opts.sources, { name = "emoji" })
end,
},
-- change some telescope options and a keymap to browse plugin files
{
"nvim-telescope/telescope.nvim",
keys = {
-- add a keymap to browse plugin files
-- stylua: ignore
{
"<leader>fp",
function() require("telescope.builtin").find_files({ cwd = require("lazy.core.config").options.root }) end,
desc = "Find Plugin File",
},
},
-- change some options
opts = {
defaults = {
layout_strategy = "horizontal",
layout_config = { prompt_position = "top" },
sorting_strategy = "ascending",
winblend = 0,
},
},
},
-- add pyright to lspconfig
{
"neovim/nvim-lspconfig",
---@class PluginLspOpts
opts = {
---@type lspconfig.options
servers = {
-- pyright will be automatically installed with mason and loaded with lspconfig
pyright = {},
},
},
},
-- add tsserver and setup with typescript.nvim instead of lspconfig
{
"neovim/nvim-lspconfig",
dependencies = {
"jose-elias-alvarez/typescript.nvim",
init = function()
require("lazyvim.util").lsp.on_attach(function(_, buffer)
-- stylua: ignore
vim.keymap.set( "n", "<leader>co", "TypescriptOrganizeImports", { buffer = buffer, desc = "Organize Imports" })
vim.keymap.set("n", "<leader>cR", "TypescriptRenameFile", { desc = "Rename File", buffer = buffer })
end)
end,
},
---@class PluginLspOpts
opts = {
---@type lspconfig.options
servers = {
-- tsserver will be automatically installed with mason and loaded with lspconfig
tsserver = {},
},
-- you can do any additional lsp server setup here
-- return true if you don't want this server to be setup with lspconfig
---@type table<string, fun(server:string, opts:_.lspconfig.options):boolean?>
setup = {
-- example to setup with typescript.nvim
tsserver = function(_, opts)
require("typescript").setup({ server = opts })
return true
end,
-- Specify * to use this function as a fallback for any server
-- ["*"] = function(server, opts) end,
},
},
},
-- for typescript, LazyVim also includes extra specs to properly setup lspconfig,
-- treesitter, mason and typescript.nvim. So instead of the above, you can use:
{ import = "lazyvim.plugins.extras.lang.typescript" },
-- add more treesitter parsers
{
"nvim-treesitter/nvim-treesitter",
opts = {
ensure_installed = {
"bash",
"html",
"javascript",
"json",
"lua",
"markdown",
"markdown_inline",
"python",
"query",
"regex",
"tsx",
"typescript",
"vim",
"yaml",
},
},
},
-- since `vim.tbl_deep_extend`, can only merge tables and not lists, the code above
-- would overwrite `ensure_installed` with the new value.
-- If you'd rather extend the default config, use the code below instead:
{
"nvim-treesitter/nvim-treesitter",
opts = function(_, opts)
-- add tsx and treesitter
vim.list_extend(opts.ensure_installed, {
"tsx",
"typescript",
})
end,
},
-- the opts function can also be used to change the default opts:
{
"nvim-lualine/lualine.nvim",
event = "VeryLazy",
opts = function(_, opts)
table.insert(opts.sections.lualine_x, "😄")
end,
},
-- or you can return new options to override all the defaults
{
"nvim-lualine/lualine.nvim",
event = "VeryLazy",
opts = function()
return {
--[[add your custom lualine config here]]
}
end,
},
-- use mini.starter instead of alpha
{ import = "lazyvim.plugins.extras.ui.mini-starter" },
-- add jsonls and schemastore packages, and setup treesitter for json, json5 and jsonc
{ import = "lazyvim.plugins.extras.lang.json" },
-- add any tools you want to have installed below
{
"williamboman/mason.nvim",
opts = {
ensure_installed = {
"stylua",
"shellcheck",
"shfmt",
"flake8",
},
},
},
-- Use <tab> for completion and snippets (supertab)
-- first: disable default <tab> and <s-tab> behavior in LuaSnip
{
"L3MON4D3/LuaSnip",
keys = function()
return {}
end,
},
-- then: setup supertab in cmp
{
"hrsh7th/nvim-cmp",
dependencies = {
"hrsh7th/cmp-emoji",
},
---@param opts cmp.ConfigSchema
opts = function(_, opts)
local has_words_before = function()
unpack = unpack or table.unpack
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
end
local luasnip = require("luasnip")
local cmp = require("cmp")
opts.mapping = vim.tbl_extend("force", opts.mapping, {
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
-- You could replace the expand_or_jumpable() calls with expand_or_locally_jumpable()
-- this way you will only jump inside the snippet region
elseif luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
elseif has_words_before() then
cmp.complete()
else
fallback()
end
end, { "i", "s" }),
["<S-Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif luasnip.jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, { "i", "s" }),
})
end,
},
}

View File

@ -0,0 +1,11 @@
return {
{
"stevearc/conform.nvim",
optional = true,
opts = {
formatters_by_ft = {
["sql"] = { "sql_formatter" },
},
},
},
}

View File

@ -0,0 +1,43 @@
return {
"git@github.com:onns/rest.nvim.git",
dependencies = { { "git@github.com:nvim-lua/plenary.nvim.git" } },
config = function()
require("rest-nvim").setup({
-- Open request results in a horizontal split
result_split_horizontal = false,
-- Keep the http file buffer above|left when split horizontal|vertical
result_split_in_place = false,
-- Skip SSL verification, useful for unknown certificates
skip_ssl_verification = false,
-- Encode URL before making request
encode_url = true,
-- Highlight request on run
highlight = {
enabled = true,
timeout = 150,
},
result = {
-- toggle showing URL, HTTP info, headers at top the of result window
show_url = true,
-- show the generated curl command in case you want to launch
-- the same request via the terminal (can be verbose)
show_curl_command = true,
show_http_info = true,
show_headers = true,
-- executables or functions for formatting response body [optional]
-- set them to false if you want to disable them
formatters = {
json = "jq",
html = function(body)
return vim.fn.system({ "tidy", "-i", "-q", "-" }, body)
end
},
},
-- Jump to request line on run
jump_to_request = false,
env_file = '.env',
custom_dynamic_variables = {},
yank_dry_run = true,
})
end
}

View File

@ -0,0 +1,149 @@
return {
-- Treesitter is a new parser generator tool that we can
-- use in Neovim to power faster and more accurate
-- syntax highlighting.
{
"nvim-treesitter/nvim-treesitter",
version = false, -- last release is way too old and doesn't work on Windows
build = ":TSUpdate",
event = { "LazyFile", "VeryLazy" },
init = function(plugin)
-- PERF: add nvim-treesitter queries to the rtp and it's custom query predicates early
-- This is needed because a bunch of plugins no longer `require("nvim-treesitter")`, which
-- no longer trigger the **nvim-treesitter** module to be loaded in time.
-- Luckily, the only things that those plugins need are the custom queries, which we make available
-- during startup.
require("lazy.core.loader").add_to_rtp(plugin)
require("nvim-treesitter.query_predicates")
end,
dependencies = {
{
"nvim-treesitter/nvim-treesitter-textobjects",
config = function()
-- When in diff mode, we want to use the default
-- vim text objects c & C instead of the treesitter ones.
local move = require("nvim-treesitter.textobjects.move") ---@type table<string,fun(...)>
local configs = require("nvim-treesitter.configs")
for name, fn in pairs(move) do
if name:find("goto") == 1 then
move[name] = function(q, ...)
if vim.wo.diff then
local config = configs.get_module("textobjects.move")[name] ---@type table<string,string>
for key, query in pairs(config or {}) do
if q == query and key:find("[%]%[][cC]") then
vim.cmd("normal! " .. key)
return
end
end
end
return fn(q, ...)
end
end
end
end,
},
},
cmd = { "TSUpdateSync", "TSUpdate", "TSInstall" },
keys = {
{ "<c-space>", desc = "Increment selection" },
{ "<bs>", desc = "Decrement selection", mode = "x" },
},
---@type TSConfig
---@diagnostic disable-next-line: missing-fields
opts = {
highlight = { enable = true },
indent = { enable = true },
ensure_installed = {
"bash",
"c",
"diff",
"html",
"javascript",
"jsdoc",
"json",
"jsonc",
"lua",
"luadoc",
"luap",
"markdown",
"markdown_inline",
"python",
"query",
"regex",
"toml",
"tsx",
"typescript",
"vim",
"vimdoc",
"xml",
"yaml",
"go",
"http",
"sql",
},
incremental_selection = {
enable = true,
keymaps = {
init_selection = "<C-space>",
node_incremental = "<C-space>",
scope_incremental = false,
node_decremental = "<bs>",
},
},
textobjects = {
move = {
enable = true,
goto_next_start = { ["]f"] = "@function.outer", ["]c"] = "@class.outer" },
goto_next_end = { ["]F"] = "@function.outer", ["]C"] = "@class.outer" },
goto_previous_start = { ["[f"] = "@function.outer", ["[c"] = "@class.outer" },
goto_previous_end = { ["[F"] = "@function.outer", ["[C"] = "@class.outer" },
},
},
},
---@param opts TSConfig
config = function(_, opts)
if type(opts.ensure_installed) == "table" then
---@type table<string, boolean>
local added = {}
opts.ensure_installed = vim.tbl_filter(function(lang)
if added[lang] then
return false
end
added[lang] = true
return true
end, opts.ensure_installed)
end
require("nvim-treesitter.configs").setup(opts)
end,
},
-- Show context of the current function
{
"nvim-treesitter/nvim-treesitter-context",
event = "LazyFile",
enabled = true,
opts = { mode = "cursor", max_lines = 3 },
keys = {
{
"<leader>ut",
function()
local tsc = require("treesitter-context")
tsc.toggle()
if LazyVim.inject.get_upvalue(tsc.toggle, "enabled") then
LazyVim.info("Enabled Treesitter Context", { title = "Option" })
else
LazyVim.warn("Disabled Treesitter Context", { title = "Option" })
end
end,
desc = "Toggle Treesitter Context",
},
},
},
-- Automatically add closing tags for HTML and JSX
{
"windwp/nvim-ts-autotag",
event = "LazyFile",
opts = {},
},
}