From 3d2fd90b2869f2b4679d540dd0145d002d9688c3 Mon Sep 17 00:00:00 2001 From: Cyber Oliveira Date: Sat, 8 Jul 2023 23:31:06 -0300 Subject: [PATCH] feat: add sort_by "filetype" (#2302) * feat: adds new type of sorting based on vim's filetype detection * fix(ft/sorter): fallbacks to C.name when both ft's are nil or equal * feat: adds new type of sorting based on vim's filetype detection --------- Co-authored-by: Alexander Courtis --- doc/nvim-tree-lua.txt | 5 +++-- lua/nvim-tree/explorer/sorters.lua | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index 882c90b0..2c93ae0f 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -568,8 +568,8 @@ Reloads the explorer every time a buffer is written to. *nvim-tree.sort_by* Changes how files within the same directory are sorted. -Can be one of `name`, `case_sensitive`, `modification_time`, `extension` or a -function. +Can be one of `name`, `case_sensitive`, `modification_time`, `extension`, +`filetype` or a function. Type: `string` | `function(nodes)`, Default: `"name"` Function may perform a sort or return a string with one of the above @@ -577,6 +577,7 @@ function. - `absolute_path`: `string` - `executable`: `boolean` - `extension`: `string` + - `filetype`: `string` - `link_to`: `string` - `name`: `string` - `type`: `"directory"` | `"file"` | `"link"` diff --git a/lua/nvim-tree/explorer/sorters.lua b/lua/nvim-tree/explorer/sorters.lua index 9ceb64c2..4414e335 100644 --- a/lua/nvim-tree/explorer/sorters.lua +++ b/lua/nvim-tree/explorer/sorters.lua @@ -80,6 +80,7 @@ function M.sort(t) absolute_path = n.absolute_path, executable = n.executable, extension = n.extension, + filetype = vim.filetype.match { filename = n.name }, link_to = n.link_to, name = n.name, type = n.type, @@ -191,6 +192,32 @@ function C.extension(a, b) return a.extension:lower() <= b.extension:lower() end +function C.filetype(a, b) + local a_ft = vim.filetype.match { filename = a.name } + local b_ft = vim.filetype.match { filename = b.name } + + -- directories first + if a.nodes and not b.nodes then + return true + elseif not a.nodes and b.nodes then + return false + end + + -- one is nil, the other wins + if a_ft and not b_ft then + return true + elseif not a_ft and b_ft then + return false + end + + -- same filetype or both nil, sort by name + if a_ft == b_ft then + return C.name(a, b) + end + + return a_ft < b_ft +end + function M.setup(opts) M.config = {} M.config.sort_by = opts.sort_by