27 Commits
0.3.3 ... main

Author SHA1 Message Date
Diogo Duarte
9ef1254d8a Merge pull request #52 from segur7g/patch-1
Update README.md
2025-07-09 22:24:49 +01:00
Diogo Duarte
fcf947a3e5 Merge pull request #50 from KaiExec/main
Add the support of higher version.
2025-07-09 22:23:08 +01:00
Diogo Duarte
320ac801ea Merge pull request #48 from nisemono0/show_saved_keys
Show keys when saving bookmark
2025-07-09 22:21:26 +01:00
Cristhian Betancur
e3b69263e1 Update README.md
A small update to the installation command on line 21
2025-06-21 04:47:45 -05:00
KaiExecutor
c6ea5aece0 Update README.md
Add the support of higher version.
2025-06-10 17:02:17 +08:00
nisemono0
c841641bfa Update README.md 2025-06-04 17:25:26 +03:00
nisemono0
0f27237688 Add option to show available keys when saving a bookmark
Useful to not accidentally overwrite a saved bookmark
2025-06-04 17:10:59 +03:00
Diogo Duarte
fbb7c00b6f Merge pull request #46 from kirpy0x/description-format
Make desk_format apply when creating new bookmarks
2025-05-06 11:22:24 +01:00
Richard Potter
3b6932eea6 Make desk_format apply when creating new bookmarks
fixes: https://github.com/dedukun/bookmarks.yazi/issues/45

If a user may choose to set multiple marks in the same parent dir for
various hovered items, this won't look good. They would be better off
setting desc_format = "full".

This is however closer to Ranger marks and will look clean for those who
only set one mark per directory.
2025-04-24 20:34:31 -06:00
Diogo Duarte
a70648a22b Merge branch 'main' of github.com:dedukun/bookmarks.yazi 2025-04-16 10:54:22 +01:00
Diogo Duarte
41536aac59 Removed deprecated functions + minimal yazi version is now v25.4.8 2025-04-16 10:54:10 +01:00
Diogo Duarte
95b2c586f4 Merge pull request #41 from dedukun/last_dir_mode
Add different behaviours for `last` jump
2025-02-26 10:25:55 +00:00
Diogo Duarte
430592ba57 Update README 2025-02-26 10:25:33 +00:00
Diogo Duarte
7a2f62fbb3 Change default mode to 'dir' 2025-02-26 10:23:59 +00:00
Diogo Duarte
d897f6b0bd Merge branch 'main' into last_dir_mode 2025-02-26 10:21:12 +00:00
Diogo Duarte
a7963b784a Merge pull request #40 from panda7789/feature/allow-custom-bookmark-description
Add custom bookmark description when creating
2025-02-26 10:19:13 +00:00
Diogo Duarte
e2614a18fc Save last_dir before jump 2025-02-23 22:30:33 +00:00
Linhart Lukáš
a0c8299704 formatting 2025-02-19 22:58:19 +01:00
Linhart Lukáš
2fc6a0a938 Add custom bookmark description when creating 2025-02-19 22:58:19 +01:00
Diogo Duarte
fe0b1de939 minimum required version is now Yazi v25.2.7 2025-02-18 11:15:14 +00:00
Diogo Duarte
023bde5a53 Add last modes 2025-02-18 11:07:42 +00:00
Diogo Duarte
420a384f51 Merge pull request #37 from dedukun/import-export-readme
Update README with import/export documentation
2025-02-16 18:42:41 +00:00
Diogo Duarte
af92d051ee Merge branch 'main' into import-export-readme 2025-02-16 18:42:05 +00:00
Diogo Duarte
3382460eb0 Update README.md 2025-02-16 18:38:11 +00:00
Diogo Duarte
14573ea884 Update README.md 2025-01-29 18:08:36 +00:00
Diogo Duarte
202e450b00 Update README.md 2025-01-07 14:58:11 +00:00
Diogo Duarte
5116df5e95 Remove deprecated code 2025-01-06 11:48:18 +00:00
2 changed files with 182 additions and 67 deletions

View File

@@ -6,7 +6,7 @@ https://github.com/dedukun/bookmarks.yazi/assets/25795432/9a9fe345-dd06-442e-99f
## Requirements ## Requirements
- [Yazi](https://github.com/sxyazi/yazi) v0.3.0+ - [Yazi](https://github.com/sxyazi/yazi) v25.4.8+
## Features ## Features
@@ -18,32 +18,40 @@ https://github.com/dedukun/bookmarks.yazi/assets/25795432/9a9fe345-dd06-442e-99f
## Installation ## Installation
```sh ```sh
ya pack -a dedukun/bookmarks ya pkg add dedukun/bookmarks
``` ```
## Import/Export bookmarks
This plugin uses [Yazi's DDS](https://yazi-rs.github.io/docs/dds/) for bookmark persistence, as such,
the bookmarks are saved in DDS's state file (`~/.local/state/yazi/.dds` on Linux and `C:\Users\USERNAME\AppData\Roaming\yazi\state\.dds` on Windows)
**_NOTE:_** This system may be used by other plugins that you have installed, so this file might have more data than just the bookmarks.
## Configuration ## Configuration
Add this to your `keymap.toml`: Add this to your `keymap.toml`:
```toml ```toml
[[manager.prepend_keymap]] # If your yazi version is lower than v25.5.28, repleace "mgr" by "manager".
[[mgr.prepend_keymap]]
on = [ "m" ] on = [ "m" ]
run = "plugin bookmarks --args=save" run = "plugin bookmarks save"
desc = "Save current position as a bookmark" desc = "Save current position as a bookmark"
[[manager.prepend_keymap]] [[mgr.prepend_keymap]]
on = [ "'" ] on = [ "'" ]
run = "plugin bookmarks --args=jump" run = "plugin bookmarks jump"
desc = "Jump to a bookmark" desc = "Jump to a bookmark"
[[manager.prepend_keymap]] [[mgr.prepend_keymap]]
on = [ "b", "d" ] on = [ "b", "d" ]
run = "plugin bookmarks --args=delete" run = "plugin bookmarks delete"
desc = "Delete a bookmark" desc = "Delete a bookmark"
[[manager.prepend_keymap]] [[mgr.prepend_keymap]]
on = [ "b", "D" ] on = [ "b", "D" ]
run = "plugin bookmarks --args=delete_all" run = "plugin bookmarks delete_all"
desc = "Delete all bookmarks" desc = "Delete all bookmarks"
``` ```
@@ -55,11 +63,12 @@ The following are the default configurations:
```lua ```lua
-- ~/.config/yazi/init.lua -- ~/.config/yazi/init.lua
require("bookmarks"):setup({ require("bookmarks"):setup({
save_last_directory = false, -- DEPRECATED - will be removed in the future. Use `last_directory` last_directory = { enable = false, persist = false, mode="dir" },
last_directory = { enable = false, persist = false },
persist = "none", persist = "none",
desc_format = "full", desc_format = "full",
file_pick_mode = "hover", file_pick_mode = "hover",
custom_desc_input = false,
show_keys = false,
notify = { notify = {
enable = false, enable = false,
timeout = 1, timeout = 1,
@@ -72,13 +81,6 @@ require("bookmarks"):setup({
}) })
``` ```
### `save_last_directory`
When enabled, a new bookmark is automatically created in `'` which allows the user to jump back to
the last directory.
***NOTE:*** This option is **DEPRECATED** and will be removed in the future in favor of `last_directory`.
### `last_directory` ### `last_directory`
When enabled, a new bookmark is automatically created in `'` which allows the user to jump back to When enabled, a new bookmark is automatically created in `'` which allows the user to jump back to
@@ -86,6 +88,14 @@ the last directory.
There's also the option to enable persistence to this automatic bookmark. There's also the option to enable persistence to this automatic bookmark.
Finally, there's a `mode` option with the following options:
| Value | Description |
| ------ | ------------------------------------------------------------ |
| `jump` | It saves the position before the last used mark |
| `mark` | It saves the last created mark |
| `dir` | Default, it saves the last visited directory (old behaviour) |
### `persist` ### `persist`
When enabled the bookmarks will persist, i.e. if you close and reopen Yazi they will still be When enabled the bookmarks will persist, i.e. if you close and reopen Yazi they will still be
@@ -116,10 +126,10 @@ The mode for choosing which directory to bookmark.
There are two possible values for this option: There are two possible values for this option:
| Value | Description | | Value | Description |
| -------- | ----------------------------------------------------------------------------------------------- | | -------- | ------------------------------------------------------------------- |
| `hover` | The default, it uses the path of the hovered file for new bookmarks | | `hover` | The default, it uses the path of the hovered file for new bookmarks |
| `parent` | Uses the path of the parent folder for new bookmarks | | `parent` | Uses the path of the parent folder for new bookmarks |
### `notify` ### `notify`
@@ -130,3 +140,19 @@ By default the notification has a 1 second timeout that can be changed with `not
Furthermore, you can customize the notification messages with `notify.message`. Furthermore, you can customize the notification messages with `notify.message`.
For the `new` and `delete` messages, the `<key>` and `<folder>` keywords can be used, which will be replaced by the respective new/deleted bookmark's associated key and folder. For the `new` and `delete` messages, the `<key>` and `<folder>` keywords can be used, which will be replaced by the respective new/deleted bookmark's associated key and folder.
### `custom_desc_input`
When enabled, user can change description for new bookmark before it is saved.
By default the custom description input is filled with path.
### `show_keys`
When enabled, saving a new bookmark will display a list of all available keys.
If a key already has a saved bookmark, its description will be shown.
This helps prevent accidental overwriting of existing bookmarks.
By default no information is shown.

View File

@@ -1,17 +1,18 @@
--- @since 25.4.8
-- stylua: ignore -- stylua: ignore
local SUPPORTED_KEYS = { local SUPPORTED_KEYS = {
{ on = "0"}, { on = "1"}, { on = "2"}, { on = "3"}, { on = "4"}, { on = "0", desc = "Free" }, { on = "1", desc = "Free" }, { on = "2", desc = "Free" }, { on = "3", desc = "Free" }, { on = "4", desc = "Free"},
{ on = "5"}, { on = "6"}, { on = "7"}, { on = "8"}, { on = "9"}, { on = "5", desc = "Free" }, { on = "6", desc = "Free" }, { on = "7", desc = "Free" }, { on = "8", desc = "Free" }, { on = "9", desc = "Free"},
{ on = "A"}, { on = "B"}, { on = "C"}, { on = "D"}, { on = "E"}, { on = "A", desc = "Free" }, { on = "B", desc = "Free" }, { on = "C", desc = "Free" }, { on = "D", desc = "Free" }, { on = "E", desc = "Free"},
{ on = "F"}, { on = "G"}, { on = "H"}, { on = "I"}, { on = "J"}, { on = "F", desc = "Free" }, { on = "G", desc = "Free" }, { on = "H", desc = "Free" }, { on = "I", desc = "Free" }, { on = "J", desc = "Free"},
{ on = "K"}, { on = "L"}, { on = "M"}, { on = "N"}, { on = "O"}, { on = "K", desc = "Free" }, { on = "L", desc = "Free" }, { on = "M", desc = "Free" }, { on = "N", desc = "Free" }, { on = "O", desc = "Free"},
{ on = "P"}, { on = "Q"}, { on = "R"}, { on = "S"}, { on = "T"}, { on = "P", desc = "Free" }, { on = "Q", desc = "Free" }, { on = "R", desc = "Free" }, { on = "S", desc = "Free" }, { on = "T", desc = "Free"},
{ on = "U"}, { on = "V"}, { on = "W"}, { on = "X"}, { on = "Y"}, { on = "Z"}, { on = "U", desc = "Free" }, { on = "V", desc = "Free" }, { on = "W", desc = "Free" }, { on = "X", desc = "Free" }, { on = "Y", desc = "Free"}, { on = "Z", desc = "Free" },
{ on = "a"}, { on = "b"}, { on = "c"}, { on = "d"}, { on = "e"}, { on = "a", desc = "Free" }, { on = "b", desc = "Free" }, { on = "c", desc = "Free" }, { on = "d", desc = "Free" }, { on = "e", desc = "Free"},
{ on = "f"}, { on = "g"}, { on = "h"}, { on = "i"}, { on = "j"}, { on = "f", desc = "Free" }, { on = "g", desc = "Free" }, { on = "h", desc = "Free" }, { on = "i", desc = "Free" }, { on = "j", desc = "Free"},
{ on = "k"}, { on = "l"}, { on = "m"}, { on = "n"}, { on = "o"}, { on = "k", desc = "Free" }, { on = "l", desc = "Free" }, { on = "m", desc = "Free" }, { on = "n", desc = "Free" }, { on = "o", desc = "Free"},
{ on = "p"}, { on = "q"}, { on = "r"}, { on = "s"}, { on = "t"}, { on = "p", desc = "Free" }, { on = "q", desc = "Free" }, { on = "r", desc = "Free" }, { on = "s", desc = "Free" }, { on = "t", desc = "Free"},
{ on = "u"}, { on = "v"}, { on = "w"}, { on = "x"}, { on = "y"}, { on = "z"}, { on = "u", desc = "Free" }, { on = "v", desc = "Free" }, { on = "w", desc = "Free" }, { on = "x", desc = "Free" }, { on = "y", desc = "Free"}, { on = "z", desc = "Free" },
} }
local _send_notification = ya.sync( local _send_notification = ya.sync(
@@ -49,7 +50,7 @@ local _generate_description = ya.sync(function(state, file)
end end
if state.desc_format == "parent" then if state.desc_format == "parent" then
return tostring(file.url:parent()) return tostring(file.url.parent)
end end
-- full description -- full description
return tostring(file.url) return tostring(file.url)
@@ -89,26 +90,43 @@ local _save_state = ya.sync(function(state, bookmarks)
ps.pub_to(0, "@bookmarks", save_state) ps.pub_to(0, "@bookmarks", save_state)
end) end)
local _save_last_directory = ya.sync(function(state, persist) local _load_last = ya.sync(function(state)
if persist then ps.sub_remote("@bookmarks-last", function(body)
ps.sub_remote("@bookmarks-lastdir", function(body) state.curr_dir = body end) state.last_dir = body
if state.last_mode ~= "dir" then
ps.unsub_remote("@bookmarks-last")
end
end)
end)
local _save_last = ya.sync(function(state, persist, imediate)
local file = _get_bookmark_file()
local curr = {
on = "'",
desc = _generate_description(file),
path = tostring(file.url),
is_parent = file.is_parent,
}
if imediate then
state.curr_dir = nil
state.last_dir = curr
else
state.last_dir = state.curr_dir
state.curr_dir = curr
end end
ps.sub("cd", function() if persist and state.last_dir then
local file = _get_bookmark_file() ps.pub_to(0, "@bookmarks-last", state.last_dir)
state.last_dir = state.curr_dir end
end)
if persist and state.last_dir then local get_last_mode = ya.sync(function(state) return state.last_mode end)
ps.pub_to(0, "@bookmarks-lastdir", state.last_dir)
end
state.curr_dir = { local save_last_dir = ya.sync(function(state)
on = "'", ps.sub("cd", function() _save_last(state.last_persist, false) end)
desc = _generate_description(file),
path = tostring(file.url),
is_parent = file.is_parent,
}
end)
ps.sub("hover", function() ps.sub("hover", function()
local file = _get_bookmark_file() local file = _get_bookmark_file()
@@ -117,11 +135,32 @@ local _save_last_directory = ya.sync(function(state, persist)
end) end)
end) end)
local save_last_jump = ya.sync(function(state) _save_last(state.last_persist, true) end)
local save_last_mark = ya.sync(function(state) _save_last(state.last_persist, true) end)
local _is_show_keys_enabled = ya.sync(function(state) return state.show_keys end)
local _is_custom_desc_input_enabled = ya.sync(function(state) return state.custom_desc_input end)
-- *********************************************** -- ***********************************************
-- **============= C O M M A N D S =============** -- **============= C O M M A N D S =============**
-- *********************************************** -- ***********************************************
local save_bookmark = ya.sync(function(state, idx) local get_updated_keys = ya.sync(function(state, keys)
if state.bookmarks then
for _, bookmarks_value in pairs(state.bookmarks) do
for _, keys_value in pairs(keys) do
if keys_value.on == bookmarks_value.on then
keys_value.desc = bookmarks_value.desc
end
end
end
end
return keys
end)
local save_bookmark = ya.sync(function(state, idx, custom_desc)
local file = _get_bookmark_file() local file = _get_bookmark_file()
state.bookmarks = state.bookmarks or {} state.bookmarks = state.bookmarks or {}
@@ -131,9 +170,14 @@ local save_bookmark = ya.sync(function(state, idx)
_idx = #state.bookmarks + 1 _idx = #state.bookmarks + 1
end end
local bookmark_desc = tostring(_generate_description(file))
if custom_desc then
bookmark_desc = tostring(custom_desc)
end
state.bookmarks[_idx] = { state.bookmarks[_idx] = {
on = SUPPORTED_KEYS[idx].on, on = SUPPORTED_KEYS[idx].on,
desc = _generate_description(file), desc = bookmark_desc,
path = tostring(file.url), path = tostring(file.url),
is_parent = file.is_parent, is_parent = file.is_parent,
} }
@@ -170,6 +214,10 @@ local save_bookmark = ya.sync(function(state, idx)
message, _ = message:gsub("<folder>", state.bookmarks[_idx].desc) message, _ = message:gsub("<folder>", state.bookmarks[_idx].desc)
_send_notification(message) _send_notification(message)
end end
if get_last_mode() == "mark" then
save_last_mark()
end
end) end)
local all_bookmarks = ya.sync(function(state, append_last_dir) local all_bookmarks = ya.sync(function(state, append_last_dir)
@@ -216,18 +264,31 @@ local delete_all_bookmarks = ya.sync(function(state)
end) end)
return { return {
entry = function(_, job_or_args) entry = function(_, job)
-- TODO: DEPRECATE IN Yazi 0.4 local action = job.args[1]
-- https://github.com/sxyazi/yazi/pull/1966
local args = job_or_args.args or job_or_args
local action = args[1]
if not action then if not action then
return return
end end
if action == "save" then if action == "save" then
local key = ya.which { cands = SUPPORTED_KEYS, silent = true } if _is_show_keys_enabled() then
SUPPORTED_KEYS = get_updated_keys(SUPPORTED_KEYS)
end
local key = ya.which { cands = SUPPORTED_KEYS, silent = not _is_show_keys_enabled() }
if key then if key then
if _is_custom_desc_input_enabled() then
local value, event = ya.input {
title = "Save with custom description:",
position = { "top-center", y = 3, w = 60 },
value = tostring(_get_bookmark_file().url),
}
if event ~= 1 then
return
end
save_bookmark(key, value)
return
end
save_bookmark(key) save_bookmark(key)
end end
return return
@@ -244,10 +305,14 @@ return {
end end
if action == "jump" then if action == "jump" then
if get_last_mode() == "jump" then
save_last_jump()
end
if bookmarks[selected].is_parent then if bookmarks[selected].is_parent then
ya.manager_emit("cd", { bookmarks[selected].path }) ya.mgr_emit("cd", { bookmarks[selected].path })
else else
ya.manager_emit("reveal", { bookmarks[selected].path }) ya.mgr_emit("reveal", { bookmarks[selected].path })
end end
elseif action == "delete" then elseif action == "delete" then
delete_bookmark(selected) delete_bookmark(selected)
@@ -258,12 +323,28 @@ return {
return return
end end
-- TODO: DEPRECATED Yazi 0.4 if type(args.last_directory) == "table" then
if args.save_last_directory then
_save_last_directory()
elseif type(args.last_directory) == "table" then
if args.last_directory.enable then if args.last_directory.enable then
_save_last_directory(args.last_directory.persist) if args.last_directory.mode == "mark" then
state.last_persist = args.last_directory.persist
state.last_mode = "mark"
elseif args.last_directory.mode == "jump" then
state.last_persist = args.last_directory.persist
state.last_mode = "jump"
elseif args.last_directory.mode == "dir" then
state.last_persist = args.last_directory.persist
state.last_mode = "dir"
save_last_dir()
else
-- default
state.last_persist = args.last_directory.persist
state.last_mode = "dir"
save_last_dir()
end
if args.last_directory.persist then
_load_last()
end
end end
end end
@@ -284,6 +365,14 @@ return {
state.file_pick_mode = "hover" state.file_pick_mode = "hover"
end end
if type(args.custom_desc_input) == "boolean" then
state.custom_desc_input = args.custom_desc_input
end
if type(args.show_keys) == "boolean" then
state.show_keys = args.show_keys
end
state.notify = { state.notify = {
enable = false, enable = false,
timeout = 1, timeout = 1,