36 Commits

Author SHA1 Message Date
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
Diogo Duarte
35da1073b7 Merge pull request #31 from wekauwau/main
Sort bookmarks when saving
2024-12-18 11:16:40 +00:00
wekauwau
a91fe1cb85 sort bookmarks when saving 2024-12-16 14:29:38 +07:00
Diogo Duarte
20ece7e1ef Add support in the entry function for Yazi stable release 2024-12-03 21:43:32 +00:00
Diogo Duarte
e755ebc1e6 Merge pull request #29 from TornaxO7/update-config
update config according to https://github.com/sxyazi/yazi/pull/1966
2024-12-02 16:28:38 +00:00
TornaxO7
d9b722a7e4 update config according to https://github.com/sxyazi/yazi/pull/1966 2024-11-29 17:36:50 +01:00
Diogo Duarte
600f87c021 Update README.md 2024-09-09 12:05:21 +01:00
Diogo Duarte
ae06e0c1c0 Merge pull request #24 from nralbrecht/bookmark_file_pick_mode
Add option to disable using hovered directory
2024-08-30 20:53:47 +01:00
nralbrecht
6769310fa2 Change to directory if the parent is stored
When storing a hovered file as bookmark it makes sense to use the reveal command to move to it. When storing the parent directory however, one has to cd to it. Otherwise the parent directory is opened and the stored directory is only focused.
2024-08-28 17:34:29 +02:00
nralbrecht
5b4258225b Rename bookmark_file_pick_mode option to file_pick_mode 2024-08-28 17:18:29 +02:00
nralbrecht
7ef1a95da1 Add bookmark_file_pick_mode option to README 2024-08-27 20:04:01 +02:00
nralbrecht
53ae96aed8 Rename bookmark_file_pick_mode option value from current to parent 2024-08-27 20:02:38 +02:00
nralbrecht
17702a3752 Add option to always pick the current folder and ignore hovered folder 2024-08-27 17:43:40 +02:00
Diogo Duarte
f65fa5e7e9 Merge pull request #23 from dedukun/save-last-bookmark
Save last bookmark
2024-08-18 17:11:49 +01:00
Diogo Duarte
5039aaa7d3 Update README.md 2024-08-14 09:56:02 +01:00
Diogo Duarte
944f7fd2b3 update README 2024-08-14 09:51:58 +01:00
Diogo Duarte
a5a4ea1bd1 Update README 2024-08-14 09:46:09 +01:00
Diogo Duarte
feffe662ee refactored last_directory configs + added persistence to last directory 2024-08-14 09:44:02 +01:00
Diogo Duarte
748efed3b9 Merge branch 'main' of github.com:dedukun/bookmarks.yazi 2024-07-14 19:56:48 +01:00
Diogo Duarte
b5dd86a7dd adapt to sxyazi/yazi#1257 2024-07-14 19:56:40 +01:00
Diogo Duarte
08b3f85c5d Update README.md 2024-06-28 21:34:39 +01:00
Diogo Duarte
15304f3535 Updated DDS interface 2024-06-24 13:05:31 +01:00
2 changed files with 188 additions and 59 deletions

View File

@@ -6,7 +6,7 @@ https://github.com/dedukun/bookmarks.yazi/assets/25795432/9a9fe345-dd06-442e-99f
## Requirements
- [Yazi](https://github.com/sxyazi/yazi) v0.2.5+
- [Yazi](https://github.com/sxyazi/yazi) v25.2.7+
## Features
@@ -17,35 +17,16 @@ https://github.com/dedukun/bookmarks.yazi/assets/25795432/9a9fe345-dd06-442e-99f
## Installation
<details>
<summary>Yazi v0.2.5 (manual installation)</summary>
```sh
# Linux/macOS
git clone https://github.com/dedukun/bookmarks.yazi.git ~/.config/yazi/plugins/bookmarks.yazi
# Windows
git clone https://github.com/dedukun/bookmarks.yazi.git %AppData%\yazi\config\plugins\bookmarks.yazi
```
</details>
<details>
<summary>Latest commit in Yazi (package manager)</summary>
```sh
# Add the plugin
ya pack -a dedukun/bookmarks
# Install plugin
ya pack -i
# Update plugin
ya pack -u
```
</details>
## 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
@@ -54,22 +35,22 @@ Add this to your `keymap.toml`:
```toml
[[manager.prepend_keymap]]
on = [ "m" ]
run = "plugin bookmarks --args=save"
run = "plugin bookmarks save"
desc = "Save current position as a bookmark"
[[manager.prepend_keymap]]
on = [ "'" ]
run = "plugin bookmarks --args=jump"
run = "plugin bookmarks jump"
desc = "Jump to a bookmark"
[[manager.prepend_keymap]]
on = [ "b", "d" ]
run = "plugin bookmarks --args=delete"
run = "plugin bookmarks delete"
desc = "Delete a bookmark"
[[manager.prepend_keymap]]
on = [ "b", "D" ]
run = "plugin bookmarks --args=delete_all"
run = "plugin bookmarks delete_all"
desc = "Delete all bookmarks"
```
@@ -81,9 +62,11 @@ The following are the default configurations:
```lua
-- ~/.config/yazi/init.lua
require("bookmarks"):setup({
save_last_directory = false,
last_directory = { enable = false, persist = false, mode="dir" },
persist = "none",
desc_format = "full",
file_pick_mode = "hover",
custom_desc_input = false,
notify = {
enable = false,
timeout = 1,
@@ -96,11 +79,21 @@ require("bookmarks"):setup({
})
```
### `save_last_directory`
### `last_directory`
When enabled, a new bookmark is automatically created in `'` which allows the user to jump back to
the last directory.
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`
When enabled the bookmarks will persist, i.e. if you close and reopen Yazi they will still be
@@ -125,6 +118,17 @@ There are two possible values for this option:
| `full` | The default, it shows the full path of the bookmark, i.e., the parent folder + the hovered file |
| `parent` | Only shows the parent folder of the bookmark |
### `file_pick_mode`
The mode for choosing which directory to bookmark.
There are two possible values for this option:
| Value | Description |
| -------- | ------------------------------------------------------------------- |
| `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 |
### `notify`
When enabled, notifications will be shown when the user creates a new bookmark and deletes one or
@@ -134,3 +138,9 @@ 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`.
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.

View File

@@ -1,3 +1,4 @@
--- @since 25.2.7
-- stylua: ignore
local SUPPORTED_KEYS = {
{ on = "0"}, { on = "1"}, { on = "2"}, { on = "3"}, { on = "4"},
@@ -33,17 +34,18 @@ local _get_real_index = ya.sync(function(state, idx)
return nil
end)
local _get_hovered_file = ya.sync(function()
local folder = Folder:by_kind(Folder.CURRENT)
if not folder.hovered then
return { url = folder.cwd, is_cwd = true }
local _get_bookmark_file = ya.sync(function(state)
local folder = cx.active.current
if state.file_pick_mode == "parent" or not folder.hovered then
return { url = folder.cwd, is_parent = true }
end
return { url = folder.hovered.url, is_cwd = false }
return { url = folder.hovered.url, is_parent = false }
end)
local _generate_description = ya.sync(function(state, file)
-- if this is true, we don't have information about the folder, so just return the folder url
if file.is_cwd then
if file.is_parent then
return tostring(file.url)
end
@@ -55,7 +57,7 @@ local _generate_description = ya.sync(function(state, file)
end)
local _load_state = ya.sync(function(state)
ps.sub_remote("bookmarks", function(body)
ps.sub_remote("@bookmarks", function(body)
if not state.bookmarks and body then
state.bookmarks = {}
for _, value in pairs(body) do
@@ -67,7 +69,7 @@ end)
local _save_state = ya.sync(function(state, bookmarks)
if not bookmarks then
ps.pub_static(10, "bookmarks", nil)
ps.pub_to(0, "@bookmarks", nil)
return
end
@@ -85,33 +87,66 @@ local _save_state = ya.sync(function(state, bookmarks)
end
end
ps.pub_static(10, "bookmarks", save_state)
ps.pub_to(0, "@bookmarks", save_state)
end)
local _save_last_directory = ya.sync(function(state)
ps.sub("cd", function()
local file = _get_hovered_file()
state.last_dir = state.curr_dir
state.curr_dir = {
on = "'",
desc = _generate_description(file),
path = tostring(file.url),
}
local _load_last = ya.sync(function(state)
ps.sub_remote("@bookmarks-last", function(body)
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
if persist and state.last_dir then
ps.pub_to(0, "@bookmarks-last", state.last_dir)
end
end)
local get_last_mode = ya.sync(function(state) return state.last_mode end)
local save_last_dir = ya.sync(function(state)
ps.sub("cd", function() _save_last(state.last_persist, false) end)
ps.sub("hover", function()
local file = _get_hovered_file()
local file = _get_bookmark_file()
state.curr_dir.desc = _generate_description(file)
state.curr_dir.path = tostring(file.url)
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_custom_desc_input_enabled = ya.sync(function(state) return state.custom_desc_input end)
-- ***********************************************
-- **============= C O M M A N D S =============**
-- ***********************************************
local save_bookmark = ya.sync(function(state, idx)
local file = _get_hovered_file()
local save_bookmark = ya.sync(function(state, idx, custom_desc)
local file = _get_bookmark_file()
state.bookmarks = state.bookmarks or {}
@@ -120,12 +155,40 @@ local save_bookmark = ya.sync(function(state, idx)
_idx = #state.bookmarks + 1
end
local bookmark_desc = tostring(file.url)
if custom_desc then
bookmark_desc = tostring(custom_desc)
end
state.bookmarks[_idx] = {
on = SUPPORTED_KEYS[idx].on,
desc = _generate_description(file),
desc = bookmark_desc,
path = tostring(file.url),
is_parent = file.is_parent,
}
-- Custom sorting function
table.sort(state.bookmarks, function(a, b)
local key_a, key_b = a.on, b.on
-- Numbers first
if key_a:match("%d") and not key_b:match("%d") then
return true
elseif key_b:match("%d") and not key_a:match("%d") then
return false
end
-- Uppercase before lowercase
if key_a:match("%u") and key_b:match("%l") then
return true
elseif key_b:match("%u") and key_a:match("%l") then
return false
end
-- Regular alphabetical sorting
return key_a < key_b
end)
if state.persist then
_save_state(state.bookmarks)
end
@@ -136,6 +199,10 @@ local save_bookmark = ya.sync(function(state, idx)
message, _ = message:gsub("<folder>", state.bookmarks[_idx].desc)
_send_notification(message)
end
if get_last_mode() == "mark" then
save_last_mark()
end
end)
local all_bookmarks = ya.sync(function(state, append_last_dir)
@@ -182,8 +249,8 @@ local delete_all_bookmarks = ya.sync(function(state)
end)
return {
entry = function(_, args)
local action = args[1]
entry = function(_, job)
local action = job.args[1]
if not action then
return
end
@@ -191,6 +258,19 @@ return {
if action == "save" then
local key = ya.which { cands = SUPPORTED_KEYS, silent = true }
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)
end
return
@@ -207,7 +287,15 @@ return {
end
if action == "jump" then
ya.manager_emit("reveal", { bookmarks[selected].path })
if get_last_mode() == "jump" then
save_last_jump()
end
if bookmarks[selected].is_parent then
ya.manager_emit("cd", { bookmarks[selected].path })
else
ya.manager_emit("reveal", { bookmarks[selected].path })
end
elseif action == "delete" then
delete_bookmark(selected)
end
@@ -217,8 +305,29 @@ return {
return
end
if args.save_last_directory then
_save_last_directory()
if type(args.last_directory) == "table" then
if args.last_directory.enable then
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
if args.persist == "all" or args.persist == "vim" then
@@ -232,6 +341,16 @@ return {
state.desc_format = "full"
end
if args.file_pick_mode == "parent" then
state.file_pick_mode = "parent"
else
state.file_pick_mode = "hover"
end
if type(args.custom_desc_input) == "boolean" then
state.custom_desc_input = args.custom_desc_input
end
state.notify = {
enable = false,
timeout = 1,