Skip to content

Commit aec03d5

Browse files
Merge pull request #51 from gennaro-tedesco/session_sort
Session sort
2 parents c6adf12 + a47f47c commit aec03d5

File tree

7 files changed

+108
-35
lines changed

7 files changed

+108
-35
lines changed

.github/workflows/panvimdoc.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,5 @@ jobs:
2424
treesitter: true
2525
- uses: stefanzweifel/git-auto-commit-action@v4
2626
with:
27-
commit_message: "Auto generate docs"
27+
commit_message: "docs: auto generate vim documentation"
2828
branch: ${{ github.head_ref }}

README.md

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,12 @@ Install `nvim-possession` with your favourite plugin manager (`fzf-lua` is requi
3636
"ibhagwan/fzf-lua",
3737
},
3838
config = true,
39-
init = function()
40-
local possession = require("nvim-possession")
41-
vim.keymap.set("n", "<leader>sl", function()
42-
possession.list()
43-
end)
44-
vim.keymap.set("n", "<leader>sn", function()
45-
possession.new()
46-
end)
47-
vim.keymap.set("n", "<leader>su", function()
48-
possession.update()
49-
end)
50-
vim.keymap.set("n", "<leader>sd", function()
51-
possession.delete()
52-
end)
53-
end,
39+
keys = {
40+
{ "<leader>sl", function() require("nvim-possession").list() end, desc = "📌list sessions", },
41+
{ "<leader>sn", function() require("nvim-possession").new() end, desc = "📌create new session", },
42+
{ "<leader>su", function() require("nvim-possession").update() end, desc = "📌update current session", },
43+
{ "<leader>sd", function() require("nvim-possession").delete() end, desc = "📌delete selected session"},
44+
},
5445
}
5546
```
5647

@@ -110,6 +101,9 @@ require("nvim-possession").setup({
110101
vertical = "right:30%"
111102
}
112103
}
104+
sort = require("nvim-possession.sorting").alpha_sort -- callback, sorting function to list sessions
105+
-- require("nvim-possession.sorting").time_sort
106+
-- to sort by last updated instead
113107
})
114108
```
115109

doc/possession.txt

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
*possession.txt* For Neovim >= 0.8.0 Last change: 2024 December 19
1+
*possession.txt* For Neovim >= 0.8.0 Last change: 2025 January 31
22

33
==============================================================================
44
Table of Contents *possession-table-of-contents*
@@ -44,21 +44,12 @@ quickstart configuration is, for instance
4444
"ibhagwan/fzf-lua",
4545
},
4646
config = true,
47-
init = function()
48-
local possession = require("nvim-possession")
49-
vim.keymap.set("n", "<leader>sl", function()
50-
possession.list()
51-
end)
52-
vim.keymap.set("n", "<leader>sn", function()
53-
possession.new()
54-
end)
55-
vim.keymap.set("n", "<leader>su", function()
56-
possession.update()
57-
end)
58-
vim.keymap.set("n", "<leader>sd", function()
59-
possession.delete()
60-
end)
61-
end,
47+
keys = {
48+
{ "<leader>sl", function() require("nvim-possession").list() end, desc = "📌list sessions", },
49+
{ "<leader>sn", function() require("nvim-possession").new() end, desc = "📌create new session", },
50+
{ "<leader>su", function() require("nvim-possession").update() end, desc = "📌update current session", },
51+
{ "<leader>sd", function() require("nvim-possession").delete() end, desc = "📌delete selected session"},
52+
},
6253
}
6354
<
6455

@@ -139,6 +130,9 @@ however if you really want to do so:
139130
vertical = "right:30%"
140131
}
141132
}
133+
sort = require("nvim-possession.sorting").alpha_sort -- callback, sorting function to list sessions
134+
-- require("nvim-possession.sorting").time_sort
135+
-- to sort by last updated instead
142136
})
143137
<
144138

lua/nvim-possession/config.lua

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
local sort = require("nvim-possession.sorting")
2+
13
local M = {}
24

35
M.sessions = {
@@ -14,7 +16,9 @@ M.autoswitch = {
1416
exclude_ft = {},
1517
}
1618

19+
---@type function
1720
M.save_hook = nil
21+
---@type function
1822
M.post_hook = nil
1923

2024
---@class possession.Hls
@@ -46,4 +50,7 @@ M.fzf_winopts = {
4650
},
4751
}
4852

53+
---@type function
54+
M.sort = sort.alpha_sort
55+
4956
return M

lua/nvim-possession/init.lua

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
local config = require("nvim-possession.config")
22
local ui = require("nvim-possession.ui")
33
local utils = require("nvim-possession.utils")
4+
local sort = require("nvim-possession.sorting")
45

56
local M = {}
67

@@ -45,6 +46,7 @@ M.setup = function(user_opts)
4546
end
4647
end
4748
end
49+
fzf.config.set_action_helpstr(M.new, "new-session")
4850

4951
---update loaded session with current status
5052
M.update = function()
@@ -125,23 +127,51 @@ M.setup = function(user_opts)
125127
return
126128
end
127129

128-
return fzf.files({
130+
local function list_sessions(fzf_cb)
131+
local sessions = {}
132+
for name, type in vim.fs.dir(user_config.sessions.sessions_path) do
133+
if type == "file" then
134+
local stat = vim.uv.fs_stat(user_config.sessions.sessions_path .. name)
135+
if stat then
136+
table.insert(sessions, { name = name, mtime = stat.mtime })
137+
end
138+
end
139+
end
140+
table.sort(sessions, function(a, b)
141+
if type(user_config.sort) == "function" then
142+
return user_config.sort(a, b)
143+
else
144+
return sort.alpha_sort(a, b)
145+
end
146+
end)
147+
for _, sess in ipairs(sessions) do
148+
fzf_cb(sess.name)
149+
end
150+
fzf_cb()
151+
end
152+
153+
local opts = {
129154
user_config = user_config,
130155
prompt = user_config.sessions.sessions_icon .. user_config.sessions.sessions_prompt,
131156
cwd_prompt = false,
132157
file_icons = false,
133158
git_icons = false,
134159
cwd_header = false,
160+
no_header = true,
135161

136162
previewer = ui.session_previewer,
137163
hls = user_config.fzf_hls,
138164
winopts = user_config.fzf_winopts,
139165
cwd = user_config.sessions.sessions_path,
140166
actions = {
141167
["enter"] = M.load,
142-
["ctrl-x"] = { M.delete_selected, fzf.actions.resume },
168+
["ctrl-x"] = { M.delete_selected, fzf.actions.resume, header = "delete session" },
169+
["ctrl-n"] = { fn = M.new, header = "new session" },
143170
},
144-
})
171+
}
172+
opts = require("fzf-lua.config").normalize_opts(opts, {})
173+
opts = require("fzf-lua.core").set_header(opts, { "actions" })
174+
fzf.fzf_exec(list_sessions, opts)
145175
end
146176

147177
if user_config.autoload and vim.fn.argc() == 0 then

lua/nvim-possession/sorting.lua

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
local M = {}
2+
3+
---sort sessions by last updated
4+
---@param a table
5+
---@param b table
6+
---@return boolean
7+
M.time_sort = function(a, b)
8+
if a.mtime.sec ~= b.mtime.sec then
9+
return a.mtime.sec > b.mtime.sec
10+
end
11+
if a.mtime.nsec ~= b.mtime.nsec then
12+
return a.mtime.nsec > b.mtime.nsec
13+
end
14+
return M.alpha_sort(a, b)
15+
end
16+
17+
---sort sessions by name
18+
---@param a table
19+
---@param b table
20+
---@return boolean
21+
M.alpha_sort = function(a, b)
22+
return a.name < b.name
23+
end
24+
25+
return M

lua/spec/sort_spec.lua

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
describe("test matching sorting functions", function()
2+
local sort
3+
local sessions, time_sorted_sessions
4+
5+
setup(function()
6+
sort = require("nvim-possession.sorting")
7+
sessions = {
8+
{ name = "aaa", mtime = { sec = 0, nsec = 1 } },
9+
{ name = "zzz", mtime = { sec = 0, nsec = 2 } },
10+
}
11+
time_sorted_sessions =
12+
{ { name = "zzz", mtime = { sec = 0, nsec = 2 } }, { name = "aaa", mtime = { sec = 0, nsec = 1 } } }
13+
end)
14+
15+
teardown(function()
16+
sort = nil
17+
end)
18+
19+
it("time sorting", function()
20+
table.sort(sessions, sort.time_sort)
21+
assert.same(time_sorted_sessions, sessions)
22+
end)
23+
end)

0 commit comments

Comments
 (0)