From c516919105c66c228e4705bf3a3e12b7a82e2ede Mon Sep 17 00:00:00 2001 From: Schistos Tega Date: Thu, 30 May 2024 16:19:17 +0300 Subject: [PATCH] add custom config for net-tree --- lua/custom/icons/nerd_font.lua | 60 +++++++++++++++ lua/custom/icons/text.lua | 41 ++++++++++ lua/custom/plugins/init.lua | 9 +-- lua/custom/plugins/neo-tree.lua | 130 ++++++++++++++++++++++++++++++++ lua/custom/utils/init.lua | 22 ++++++ 5 files changed, 257 insertions(+), 5 deletions(-) create mode 100644 lua/custom/icons/nerd_font.lua create mode 100644 lua/custom/icons/text.lua create mode 100644 lua/custom/plugins/neo-tree.lua create mode 100644 lua/custom/utils/init.lua diff --git a/lua/custom/icons/nerd_font.lua b/lua/custom/icons/nerd_font.lua new file mode 100644 index 00000000..68782cf7 --- /dev/null +++ b/lua/custom/icons/nerd_font.lua @@ -0,0 +1,60 @@ +return { + ActiveLSP = '', + ActiveTS = '', + ArrowLeft = '', + ArrowRight = '', + Bookmarks = '', + BufferClose = '󰅖', + DapBreakpoint = '', + DapBreakpointCondition = '', + DapBreakpointRejected = '', + DapLogPoint = '.>', + DapStopped = '󰁕', + Debugger = '', + DefaultFile = '󰈙', + Diagnostic = '󰒡', + DiagnosticError = '', + DiagnosticHint = '󰌵', + DiagnosticInfo = '󰋼', + DiagnosticWarn = '', + Ellipsis = '…', + FileNew = '', + FileModified = '', + FileReadOnly = '', + FoldClosed = '', + FoldOpened = '', + FoldSeparator = ' ', + FolderClosed = '', + FolderEmpty = '', + FolderOpen = '', + Git = '󰊢', + GitAdd = '', + GitBranch = '', + GitChange = '', + GitConflict = '', + GitDelete = '', + GitIgnored = '◌', + GitRenamed = '➜', + GitSign = '▎', + GitStaged = '✓', + GitUnstaged = '✗', + GitUntracked = '★', + LSPLoaded = '', -- TODO: Remove unused icon in AstroNvim v4 + LSPLoading1 = '', + LSPLoading2 = '󰀚', + LSPLoading3 = '', + MacroRecording = '', + Package = '󰏖', + Paste = '󰅌', + Refresh = '', + Search = '', + Selected = '❯', + Session = '󱂬', + Sort = '󰒺', + Spellcheck = '󰓆', + Tab = '󰓩', + TabClose = '󰅙', + Terminal = '', + Window = '', + WordFile = '󰈭', +} diff --git a/lua/custom/icons/text.lua b/lua/custom/icons/text.lua new file mode 100644 index 00000000..ae699be5 --- /dev/null +++ b/lua/custom/icons/text.lua @@ -0,0 +1,41 @@ +return { + ActiveLSP = 'LSP:', + ArrowLeft = '<', + ArrowRight = '>', + BufferClose = 'x', + DapBreakpoint = 'B', + DapBreakpointCondition = 'C', + DapBreakpointRejected = 'R', + DapLogPoint = 'L', + DapStopped = '>', + DefaultFile = '[F]', + DiagnosticError = 'X', + DiagnosticHint = '?', + DiagnosticInfo = 'i', + DiagnosticWarn = '!', + Ellipsis = '...', + FileModified = '*', + FileReadOnly = '[lock]', + FoldClosed = '+', + FoldOpened = '-', + FoldSeparator = ' ', + FolderClosed = '[D]', + FolderEmpty = '[E]', + FolderOpen = '[O]', + GitAdd = '[+]', + GitChange = '[/]', + GitConflict = '[!]', + GitDelete = '[-]', + GitIgnored = '[I]', + GitRenamed = '[R]', + GitSign = '|', + GitStaged = '[S]', + GitUnstaged = '[U]', + GitUntracked = '[?]', + MacroRecording = 'Recording:', + Paste = '[PASTE]', + Search = '?', + Selected = '*', + Spellcheck = '[SPELL]', + TabClose = 'X', +} diff --git a/lua/custom/plugins/init.lua b/lua/custom/plugins/init.lua index 8304573f..9aee54a7 100644 --- a/lua/custom/plugins/init.lua +++ b/lua/custom/plugins/init.lua @@ -3,13 +3,12 @@ -- -- See the kickstart.nvim README for more information vim.opt.relativenumber = true -vim.g.have_nerd_font = false +vim.g.have_nerd_font = true -return { - -- require 'kickstart.plugins.debug', +require('lazy').setup { require 'kickstart.plugins.indent_line', - -- require 'kickstart.plugins.lint', require 'kickstart.plugins.autopairs', - require 'kickstart.plugins.neo-tree', require 'kickstart.plugins.gitsigns', -- adds gitsigns recommend keymaps } + +return {} diff --git a/lua/custom/plugins/neo-tree.lua b/lua/custom/plugins/neo-tree.lua new file mode 100644 index 00000000..3a94de58 --- /dev/null +++ b/lua/custom/plugins/neo-tree.lua @@ -0,0 +1,130 @@ +-- Neo-tree is a Neovim plugin to browse the file system +-- https://github.com/nvim-neo-tree/neo-tree.nvim + +local utils = require 'custom.utils' +local get_icon = utils.get_icon + +return { + 'nvim-neo-tree/neo-tree.nvim', + version = '*', + dependencies = { + 'nvim-lua/plenary.nvim', + 'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended + 'MunifTanjim/nui.nvim', + }, + cmd = 'Neotree', + keys = { + { '\\', ':Neotree reveal', { desc = 'NeoTree reveal' } }, + }, + opts = { + close_if_last_window = true, + sources = { 'filesystem', 'git_status' }, + source_selector = { + winbar = true, + content_layout = 'center', + sources = { + { source = 'filesystem', display_name = get_icon('FolderClosed', 1, true) .. 'File' }, + { source = 'git_status', display_name = get_icon('Git', 1, true) .. 'Git' }, + }, + }, + default_component_configs = { + indent = { padding = 0 }, + icon = { + folder_closed = get_icon 'FolderClosed', + folder_open = get_icon 'FolderOpen', + folder_empty = get_icon 'FolderEmpty', + folder_empty_open = get_icon 'FolderEmpty', + default = get_icon 'DefaultFile', + }, + modified = { symbol = get_icon 'FileModified' }, + git_status = { + symbols = { + added = get_icon 'GitAdd', + deleted = get_icon 'GitDelete', + modified = get_icon 'GitChange', + renamed = get_icon 'GitRenamed', + untracked = get_icon 'GitUntracked', + ignored = get_icon 'GitIgnored', + unstaged = get_icon 'GitUnstaged', + staged = get_icon 'GitStaged', + conflict = get_icon 'GitConflict', + }, + }, + }, + commands = { + parent_or_close = function(state) + local node = state.tree:get_node() + if (node.type == 'directory' or node:has_children()) and node:is_expanded() then + state.commands.toggle_node(state) + else + require('neo-tree.ui.renderer').focus_node(state, node:get_parent_id()) + end + end, + child_or_open = function(state) + local node = state.tree:get_node() + if node.type == 'directory' or node:has_children() then + if not node:is_expanded() then -- if unexpanded, expand + state.commands.toggle_node(state) + else -- if expanded and has children, seleect the next child + require('neo-tree.ui.renderer').focus_node(state, node:get_child_ids()[1]) + end + else -- if not a directory just open it + state.commands.open(state) + end + end, + copy_selector = function(state) + local node = state.tree:get_node() + local filepath = node:get_id() + local filename = node.name + local modify = vim.fn.fnamemodify + + local vals = { + ['BASENAME'] = modify(filename, ':r'), + ['EXTENSION'] = modify(filename, ':e'), + ['FILENAME'] = filename, + ['PATH (CWD)'] = modify(filepath, ':.'), + ['PATH (HOME)'] = modify(filepath, ':~'), + ['PATH'] = filepath, + ['URI'] = vim.uri_from_fname(filepath), + } + + local options = vim.tbl_filter(function(val) + return vals[val] ~= '' + end, vim.tbl_keys(vals)) + if vim.tbl_isempty(options) then + utils.notify('No values to copy', vim.log.levels.WARN) + return + end + table.sort(options) + vim.ui.select(options, { + prompt = 'Choose to copy to clipboard:', + format_item = function(item) + return ('%s: %s'):format(item, vals[item]) + end, + }, function(choice) + local result = vals[choice] + if result then + utils.notify(('Copied: `%s`'):format(result)) + vim.fn.setreg('+', result) + end + end) + end, + }, + window = { + mappings = { + ['[b'] = 'prev_source', + [']b'] = 'next_source', + Y = 'copy_selector', + h = 'parent_or_close', + l = 'child_or_open', + }, + }, + filesystem = { + window = { + mappings = { + ['\\'] = 'close_window', + }, + }, + }, + }, +} diff --git a/lua/custom/utils/init.lua b/lua/custom/utils/init.lua new file mode 100644 index 00000000..1120b4e8 --- /dev/null +++ b/lua/custom/utils/init.lua @@ -0,0 +1,22 @@ +local M = {} + +function M.notify(msg, type, opts) + vim.schedule(function() + vim.notify(msg, type, opts) + end) +end + +function M.get_icon(kind, padding, no_fallback) + if not vim.g.have_nerd_font and no_fallback then + return '' + end + local icon_pack = vim.g.have_nerd_font and 'icons' or 'text_icons' + if not M[icon_pack] then + M.icons = require 'custom.icons.nerd_font' + M.text_icons = require 'custom.icons.text' + end + local icon = M[icon_pack] and M[icon_pack][kind] + return icon and icon .. string.rep(' ', padding or 0) or '' +end + +return M