diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b357c18 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Ignore the yazi packages and only store the commit in the dotfiles +/cli/dot-config/yazi/flavors +/cli/dot-config/yazi/plugins diff --git a/README.md b/README.md new file mode 100644 index 0000000..6726df4 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# Jonas dotfiles + +This repo works well with `stow`. When the binary is present the dotfiles can be installed with `stow ` from the root directory of the project. +When there are conflicts the resolve script can be used with care. It can be used the same way `stow` does by providing a package name. +When `stow` is run with the dotfiles flag then the prefix is parsed and replaced. Be careful that there still exist dotfiles in this repo. + +Be sure to only use the `stow.sh` wrapper scripts as this sets some defaults. diff --git a/cli/.config/yazi/flavors/kanagawa.yazi/LICENSE b/cli/.config/yazi/flavors/kanagawa.yazi/LICENSE deleted file mode 100644 index 1b1dfdc..0000000 --- a/cli/.config/yazi/flavors/kanagawa.yazi/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 Dmitry Nefedov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/cli/.config/yazi/flavors/kanagawa.yazi/LICENSE-tmtheme b/cli/.config/yazi/flavors/kanagawa.yazi/LICENSE-tmtheme deleted file mode 100644 index 1b1dfdc..0000000 --- a/cli/.config/yazi/flavors/kanagawa.yazi/LICENSE-tmtheme +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 Dmitry Nefedov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/cli/.config/yazi/flavors/kanagawa.yazi/README.md b/cli/.config/yazi/flavors/kanagawa.yazi/README.md deleted file mode 100644 index 5211d9d..0000000 --- a/cli/.config/yazi/flavors/kanagawa.yazi/README.md +++ /dev/null @@ -1,32 +0,0 @@ -
- Yazi logo -
- -

- Kanagawa Flavor for Yazi -

- -## 👀 Preview - - - -## 🎨 Installation - -```bash -ya pack -a dangooddd/kanagawa -``` - -## ⚙️ Usage - -Add these lines to your `theme.toml` configuration file to use it: - -```toml -[flavor] -dark = "kanagawa" -``` - -## 📜 License - -The flavor is MIT-licensed, and the included tmTheme is also MIT-licensed. - -Check the [LICENSE](LICENSE) and [LICENSE-tmtheme](LICENSE-tmtheme) file for more details. diff --git a/cli/.config/yazi/flavors/kanagawa.yazi/flavor.toml b/cli/.config/yazi/flavors/kanagawa.yazi/flavor.toml deleted file mode 100644 index 5090402..0000000 --- a/cli/.config/yazi/flavors/kanagawa.yazi/flavor.toml +++ /dev/null @@ -1,136 +0,0 @@ -## Color palette -## Check https://github.com/rebelot/kanagawa.nvim for more details -# sumiInk0 "#16161d" -# sumiInk3 "#1f1f28" bg -# sumiInk4 "#2a2a37" -# sumiInk6 "#54546d" -# fujiWhite "#dcd7ba" fg -# fujiGray "#727169" -# peachRed "#ff5d62" -# autumnRed "#c34043" -# crystalBlue "#7e9cd8" -# waveRed "#e46876" -# carpYellow "#e6c384" -# springGreen "#98bb6c" -# autumnGreen "#76946a" -# oniViolet "#957fb8" -# waveAqua1 "#6a9589" -# surimiOrange "#ffa066" -# waveAqua2 "#7aa89f" - -[manager] -marker_copied = { fg = "#98bb6c", bg = "#98bb6c" } -marker_cut = { fg = "#e46876", bg = "#e46876" } -marker_marked = { fg = "#957fb8", bg = "#957fb8" } -marker_selected = { fg = "#ffa066", bg = "#ffa066" } - -cwd = { fg = "#e6c384" } -hovered = { reversed = true } -preview_hovered = { reversed = true } - -find_keyword = { fg = "#ffa066", bg = "#1f1f28" } -find_position = {} - -tab_active = { reversed = true } -tab_inactive = {} -tab_width = 1 - -count_copied = { fg = "#1f1f28", bg = "#98bb6c" } -count_cut = { fg = "#1f1f28", bg = "#e46876" } -count_selected = { fg = "#1f1f28", bg = "#e6c384" } - -border_symbol = "│" -border_style = { fg = "#dcd7ba" } - - -[mode] -normal_main = { fg = "#1f1f28", bg = "#7e9cd8" } -normal_alt = { fg = "#7e9cd8", bg = "#2a2a37" } -select_main = { fg = "#1f1f28", bg = "#957fb8" } -select_alt = { fg = "#957fb8", bg = "#2a2a37" } -unset_main = { fg = "#1f1f28", bg = "#e6c384" } -unset_alt = { fg = "#e6c384", bg = "#2a2a37" } - - -[status] -separator_open = "" -separator_close = "" -separator_style = { fg = "reset", bg = "#2a2a37" } - -progress_label = { fg = "#7e9cd8", bg = "#2a2a37", bold = true } -progress_normal = { fg = "#2a2a37", bg = "#1f1f28" } -progress_error = { fg = "#2a2a37", bg = "#1f1f28" } - -perm_type = { fg = "#98bb6c" } -perm_read = { fg = "#e6c384" } -perm_write = { fg = "#ff5d62" } -perm_exec = { fg = "#7aa89f" } -perm_sep = { fg = "#957fb8" } - - -[pick] -border = { fg = "#7fb4ca" } -active = { fg = "#957fb8", bold = true } -inactive = {} - -[input] -border = { fg = "#7fb4ca" } -title = {} -value = {} -selected = { reversed = true } - -[completion] -border = { fg = "#7fb4ca" } -active = { reversed = true } -inactive = {} - -[tasks] -border = { fg = "#7fb4ca" } -title = {} -hovered = { fg = "#957fb8" } - -[which] -cols = 2 -separator = " - " -separator_style = { fg = "#727169" } -mask = { bg = "#16161d" } -rest = { fg = "#727169" } -cand = { fg = "#7e9cd8" } -desc = { fg = "#54546d" } - -[help] -on = { fg = "#7aa89f" } -run = { fg = "#957fb8" } -desc = {} -hovered = { reversed = true, bold = true } -footer = { fg = "#1f1f28", bg = "#dcd7ba" } - -[notify] -title_info = { fg = "#98bb6c" } -title_warn = { fg = "#e6c384" } -title_error = { fg = "#ff5d62" } - -[filetype] -rules = [ - # images - { mime = "image/*", fg = "#e6c384" }, - - # media - { mime = "{audio,video}/*", fg = "#957fb8" }, - - # archives - { mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", fg = "#e46876" }, - - # documents - { mime = "application/{pdf,doc,rtf,vnd.*}", fg = "#6a9589" }, - - # broken links - { name = "*", is = "orphan", fg = "#c34043" }, - - # executables - { name = "*", is = "exec", fg = "#76946a" }, - - # fallback - { name = "*", fg = "#dcd7ba" }, - { name = "*/", fg = "#7e9cd8" }, -] diff --git a/cli/.config/yazi/flavors/kanagawa.yazi/preview.png b/cli/.config/yazi/flavors/kanagawa.yazi/preview.png deleted file mode 100644 index 3d61c5e..0000000 Binary files a/cli/.config/yazi/flavors/kanagawa.yazi/preview.png and /dev/null differ diff --git a/cli/.config/yazi/flavors/kanagawa.yazi/tmtheme.xml b/cli/.config/yazi/flavors/kanagawa.yazi/tmtheme.xml deleted file mode 100644 index 737e459..0000000 --- a/cli/.config/yazi/flavors/kanagawa.yazi/tmtheme.xml +++ /dev/null @@ -1,448 +0,0 @@ - - - - - name - Kanagawa - settings - - - settings - - background - #1F1F28 - caret - #C8C093 - foreground - #DCD7BA - invisibles - #54546D - lineHighlight - #2D4F67 - selection - #2D4F67 - findHighlight - #2D4F67 - selectionBorder - #222218 - gutterForeground - #54546D - - - - name - Comment - scope - comment - settings - - foreground - #727169 - - - - name - String - scope - string - settings - - foreground - #98BB6C - - - - name - Number - scope - constant.numeric - settings - - foreground - #D27E99 - - - - name - Built-in constant - scope - constant.language - settings - - foreground - #FFA066 - - - - name - User-defined constant - scope - constant.character, constant.other - settings - - foreground - #E6C384 - - - - name - Variable - scope - variable - settings - - fontStyle - #E6C384 - - - - name - Ruby's @variable - scope - variable.other.readwrite.instance - settings - - fontStyle - - foreground - #E6C384 - - - - name - String interpolation - scope - constant.character.escaped, constant.character.escape, string source, string source.ruby - settings - - fontStyle - - foreground - #C0A36E - - - - name - Keyword - scope - keyword - settings - - foreground - #E46876 - - - - name - Storage - scope - storage - settings - - fontStyle - - foreground - #957FB8 - - - - name - Storage type - scope - storage.type - settings - - foreground - #957FB8 - - - - name - Class name - scope - entity.name.class - settings - - foreground - #7AA89F - - - - name - Inherited class - scope - entity.other.inherited-class - settings - - foreground - #7AA89F - - - - name - Function name - scope - entity.name.function - settings - - fontStyle - - foreground - #7E9CD8 - - - - name - Function argument - scope - variable.parameter - settings - - foreground - #b8b4d0 - - - - name - Tag name - scope - entity.name.tag - settings - - fontStyle - - foreground - #7FB4CA - - - - name - Tag attribute - scope - entity.other.attribute-name - settings - - fontStyle - - foreground - #E6C384 - - - - name - Library function - scope - support.function - settings - - fontStyle - - foreground - #7FB4CA - - - - name - Library constant - scope - support.constant - settings - - fontStyle - - foreground - #7FB4CA - - - - name - Library class/type - scope - support.type, support.class - settings - - foreground - #7AA89F - - - - name - Library variable - scope - support.other.variable - settings - - foreground - #FFA066 - - - - name - Invalid - scope - invalid - settings - - fontStyle - - foreground - #FF5D62 - - - - name - Invalid deprecated - scope - invalid.deprecated - settings - - foreground - #717C7C - - - - name - JSON String - scope - meta.structure.dictionary.json string.quoted.double.json - settings - - foreground - #957FB8 - - - - name - diff.header - scope - meta.diff, meta.diff.header - settings - - foreground - #7E9CD8 - - - - name - diff.deleted - scope - markup.deleted - settings - - background - #43242B - - - - name - diff.inserted - scope - markup.inserted - settings - - background - #2B3328 - - - - name - diff.changed - scope - markup.changed - settings - - background - #49443C - - - - scope - constant.numeric.line-number.find-in-files - match - settings - - foreground - #54546D - - - - scope - entity.name.filename - settings - - foreground - #C8C093 - - - - scope - message.error - settings - - foreground - #E82424 - - - - name - JSON Punctuation - scope - punctuation.definition.string.begin.json - meta.structure.dictionary.value.json, punctuation.definition.string.end.json - meta.structure.dictionary.value.json - settings - - foreground - #9CABCA - - - - name - JSON Structure - scope - meta.structure.dictionary.json string.quoted.double.json - settings - - foreground - #957FB8 - - - - name - JSON String - scope - meta.structure.dictionary.value.json string.quoted.double.json - settings - - foreground - #ffffff - - - - name - Escape Characters - scope - constant.character.escape - settings - - foreground - #FF5D62 - - - - name - Regular Expressions - scope - string.regexp - settings - - foreground - #E6C384 - - - - uuid - 592FC036-6BB7-4676-A2F5-2894D48C8E33 - colorSpaceName - sRGB - semanticClass - theme.dark.kanagawa - - diff --git a/cli/.config/yazi/package.toml b/cli/.config/yazi/package.toml deleted file mode 100644 index f8311c1..0000000 --- a/cli/.config/yazi/package.toml +++ /dev/null @@ -1,29 +0,0 @@ -[[plugin.deps]] -use = "Lil-Dank/lazygit" -rev = "7a08a09" -hash = "a1fa2b3e1826c3a34804ea8c548e9f80" - -[[plugin.deps]] -use = "yazi-rs/plugins:chmod" -rev = "b12a9ab" -hash = "2f1053f89d1a301a648ab181d0948e38" - -[[plugin.deps]] -use = "boydaihungst/restore" -rev = "328dd88" -hash = "ad406e4a5ada589211e6ffe8bad3c983" - -[[plugin.deps]] -use = "pirafrank/what-size" -rev = "f1c6b69" -hash = "6e789212eb41d937bab04877ca361099" - -[[plugin.deps]] -use = "dedukun/bookmarks" -rev = "a70648a" -hash = "b836fb264381f35dec79930438a906d5" - -[[flavor.deps]] -use = "dangooddd/kanagawa" -rev = "d98f0c3" -hash = "cada780385f75abbcfbf5343256b441" diff --git a/cli/.config/yazi/plugins/bookmarks.yazi/LICENSE b/cli/.config/yazi/plugins/bookmarks.yazi/LICENSE deleted file mode 100644 index f8ead01..0000000 --- a/cli/.config/yazi/plugins/bookmarks.yazi/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2024 dedukun - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/cli/.config/yazi/plugins/bookmarks.yazi/README.md b/cli/.config/yazi/plugins/bookmarks.yazi/README.md deleted file mode 100644 index 577a2c4..0000000 --- a/cli/.config/yazi/plugins/bookmarks.yazi/README.md +++ /dev/null @@ -1,146 +0,0 @@ -# bookmarks.yazi - -A [Yazi](https://github.com/sxyazi/yazi) plugin that adds the basic functionality of [vi-like marks](https://neovim.io/doc/user/motion.html#mark-motions). - -https://github.com/dedukun/bookmarks.yazi/assets/25795432/9a9fe345-dd06-442e-99f1-8475ab22fad5 - -## Requirements - -- [Yazi](https://github.com/sxyazi/yazi) v25.4.8+ - -## Features - -- Create/delete bookmarks -- Custom Notifications -- `''` to go back to the previous folder -- Bookmarks persistence - -## Installation - -```sh -ya pack -a 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 - -Add this to your `keymap.toml`: - -```toml -[[manager.prepend_keymap]] -on = [ "m" ] -run = "plugin bookmarks save" -desc = "Save current position as a bookmark" - -[[manager.prepend_keymap]] -on = [ "'" ] -run = "plugin bookmarks jump" -desc = "Jump to a bookmark" - -[[manager.prepend_keymap]] -on = [ "b", "d" ] -run = "plugin bookmarks delete" -desc = "Delete a bookmark" - -[[manager.prepend_keymap]] -on = [ "b", "D" ] -run = "plugin bookmarks delete_all" -desc = "Delete all bookmarks" -``` - ---- - -Additionally there are configurations that can be done using the plugin's `setup` function in Yazi's `init.lua`, i.e. `~/.config/yazi/init.lua`. -The following are the default configurations: - -```lua --- ~/.config/yazi/init.lua -require("bookmarks"):setup({ - 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, - message = { - new = "New bookmark '' -> ''", - delete = "Deleted bookmark in ''", - delete_all = "Deleted all bookmarks", - }, - }, -}) -``` - -### `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 -present. - -There are three possible values for this option: - -| Value | Description | -| ------ | -------------------------------------------------------------------------------------------------------------------- | -| `none` | The default value, i.e., no persistance | -| `all` | All the bookmarks are saved in persistent memory | -| `vim` | This mode emulates the vim global marks, i.e., only the bookmarks in upper case (A-Z) are saved to persistent memory | - -### `desc_format` - -The format for the bookmark description. - -There are two possible values for this option: - -| Value | Description | -| -------- | ----------------------------------------------------------------------------------------------- | -| `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 -all saved bookmarks. - -By default the notification has a 1 second timeout that can be changed with `notify.timeout`. - -Furthermore, you can customize the notification messages with `notify.message`. -For the `new` and `delete` messages, the `` and `` 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. diff --git a/cli/.config/yazi/plugins/bookmarks.yazi/main.lua b/cli/.config/yazi/plugins/bookmarks.yazi/main.lua deleted file mode 100644 index 5b155fd..0000000 --- a/cli/.config/yazi/plugins/bookmarks.yazi/main.lua +++ /dev/null @@ -1,383 +0,0 @@ ---- @since 25.4.8 --- stylua: ignore -local SUPPORTED_KEYS = { - { on = "0"}, { on = "1"}, { on = "2"}, { on = "3"}, { on = "4"}, - { on = "5"}, { on = "6"}, { on = "7"}, { on = "8"}, { on = "9"}, - { on = "A"}, { on = "B"}, { on = "C"}, { on = "D"}, { on = "E"}, - { on = "F"}, { on = "G"}, { on = "H"}, { on = "I"}, { on = "J"}, - { on = "K"}, { on = "L"}, { on = "M"}, { on = "N"}, { on = "O"}, - { on = "P"}, { on = "Q"}, { on = "R"}, { on = "S"}, { on = "T"}, - { on = "U"}, { on = "V"}, { on = "W"}, { on = "X"}, { on = "Y"}, { on = "Z"}, - { on = "a"}, { on = "b"}, { on = "c"}, { on = "d"}, { on = "e"}, - { on = "f"}, { on = "g"}, { on = "h"}, { on = "i"}, { on = "j"}, - { on = "k"}, { on = "l"}, { on = "m"}, { on = "n"}, { on = "o"}, - { on = "p"}, { on = "q"}, { on = "r"}, { on = "s"}, { on = "t"}, - { on = "u"}, { on = "v"}, { on = "w"}, { on = "x"}, { on = "y"}, { on = "z"}, -} - -local _send_notification = ya.sync( - function(state, message) - ya.notify { - title = "Bookmarks", - content = message, - timeout = state.notify.timeout, - } - end -) - -local _get_real_index = ya.sync(function(state, idx) - for key, value in pairs(state.bookmarks) do - if value.on == SUPPORTED_KEYS[idx].on then - return key - end - end - return nil -end) - -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_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_parent then - return tostring(file.url) - end - - if state.desc_format == "parent" then - return tostring(file.url.parent) - end - -- full description - return tostring(file.url) -end) - -local _load_state = ya.sync(function(state) - ps.sub_remote("@bookmarks", function(body) - if not state.bookmarks and body then - state.bookmarks = {} - for _, value in pairs(body) do - table.insert(state.bookmarks, value) - end - end - end) -end) - -local _save_state = ya.sync(function(state, bookmarks) - if not bookmarks then - ps.pub_to(0, "@bookmarks", nil) - return - end - - local save_state = {} - if state.persist == "all" then - save_state = bookmarks - else -- VIM mode - local idx = 1 - for _, value in pairs(bookmarks) do - -- Only save bookmarks in upper case keys - if string.match(value.on, "%u") then - save_state[idx] = value - idx = idx + 1 - end - end - end - - ps.pub_to(0, "@bookmarks", save_state) -end) - -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_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, custom_desc) - local file = _get_bookmark_file() - - state.bookmarks = state.bookmarks or {} - - local _idx = _get_real_index(idx) - if not _idx then - _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 = 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 - - if state.notify and state.notify.enable then - local message = state.notify.message.new - message, _ = message:gsub("", state.bookmarks[_idx].on) - message, _ = message:gsub("", 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) - local bookmarks = {} - - if state.bookmarks then - for _, value in pairs(state.bookmarks) do - table.insert(bookmarks, value) - end - end - - if append_last_dir and state.last_dir then - table.insert(bookmarks, state.last_dir) - end - - return bookmarks -end) - -local delete_bookmark = ya.sync(function(state, idx) - if state.notify and state.notify.enable then - local message = state.notify.message.delete - message, _ = message:gsub("", state.bookmarks[idx].on) - message, _ = message:gsub("", state.bookmarks[idx].desc) - _send_notification(message) - end - - table.remove(state.bookmarks, idx) - - if state.persist then - _save_state(state.bookmarks) - end -end) - -local delete_all_bookmarks = ya.sync(function(state) - state.bookmarks = nil - - if state.persist then - _save_state(nil) - end - - if state.notify and state.notify.enable then - _send_notification(state.notify.message.delete_all) - end -end) - -return { - entry = function(_, job) - local action = job.args[1] - if not action then - return - end - - 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 - end - - if action == "delete_all" then - return delete_all_bookmarks() - end - - local bookmarks = all_bookmarks(action == "jump") - local selected = #bookmarks > 0 and ya.which { cands = bookmarks } - if not selected then - return - end - - if action == "jump" then - if get_last_mode() == "jump" then - save_last_jump() - end - - if bookmarks[selected].is_parent then - ya.mgr_emit("cd", { bookmarks[selected].path }) - else - ya.mgr_emit("reveal", { bookmarks[selected].path }) - end - elseif action == "delete" then - delete_bookmark(selected) - end - end, - setup = function(state, args) - if not args then - return - end - - 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 - state.persist = args.persist - _load_state() - end - - if args.desc_format == "parent" then - state.desc_format = "parent" - else - 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, - message = { - new = "New bookmark '' -> ''", - delete = "Deleted bookmark in ''", - delete_all = "Deleted all bookmarks", - }, - } - if type(args.notify) == "table" then - if type(args.notify.enable) == "boolean" then - state.notify.enable = args.notify.enable - end - if type(args.notify.timeout) == "number" then - state.notify.timeout = args.notify.timeout - end - if type(args.notify.message) == "table" then - if type(args.notify.message.new) == "string" then - state.notify.message.new = args.notify.message.new - end - if type(args.notify.message.delete) == "string" then - state.notify.message.delete = args.notify.message.delete - end - if type(args.notify.message.delete_all) == "string" then - state.notify.message.delete_all = args.notify.message.delete_all - end - end - end - end, -} diff --git a/cli/.config/yazi/plugins/chmod.yazi/LICENSE b/cli/.config/yazi/plugins/chmod.yazi/LICENSE deleted file mode 100644 index fb5b1d6..0000000 --- a/cli/.config/yazi/plugins/chmod.yazi/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 yazi-rs - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/cli/.config/yazi/plugins/chmod.yazi/README.md b/cli/.config/yazi/plugins/chmod.yazi/README.md deleted file mode 100644 index e8a6614..0000000 --- a/cli/.config/yazi/plugins/chmod.yazi/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# chmod.yazi - -Execute `chmod` on the selected files to change their mode. This plugin is only available on Unix platforms since it relies on [`chmod(2)`](https://man7.org/linux/man-pages/man2/chmod.2.html). - -https://github.com/yazi-rs/plugins/assets/17523360/7aa3abc2-d057-498c-8473-a6282c59c464 - -## Installation - -```sh -ya pack -a yazi-rs/plugins:chmod -``` - -## Usage - -Add this to your `~/.config/yazi/keymap.toml`: - -```toml -[[manager.prepend_keymap]] -on = [ "c", "m" ] -run = "plugin chmod" -desc = "Chmod on selected files" -``` - -Make sure the c => m key is not used elsewhere. - -## License - -This plugin is MIT-licensed. For more information check the [LICENSE](LICENSE) file. diff --git a/cli/.config/yazi/plugins/chmod.yazi/main.lua b/cli/.config/yazi/plugins/chmod.yazi/main.lua deleted file mode 100644 index ad565c6..0000000 --- a/cli/.config/yazi/plugins/chmod.yazi/main.lua +++ /dev/null @@ -1,41 +0,0 @@ ---- @since 25.2.26 - -local selected_or_hovered = ya.sync(function() - local tab, paths = cx.active, {} - for _, u in pairs(tab.selected) do - paths[#paths + 1] = tostring(u) - end - if #paths == 0 and tab.current.hovered then - paths[1] = tostring(tab.current.hovered.url) - end - return paths -end) - -return { - entry = function() - ya.mgr_emit("escape", { visual = true }) - - local urls = selected_or_hovered() - if #urls == 0 then - return ya.notify { title = "Chmod", content = "No file selected", level = "warn", timeout = 5 } - end - - local value, event = ya.input { - title = "Chmod:", - position = { "top-center", y = 3, w = 40 }, - } - if event ~= 1 then - return - end - - local status, err = Command("chmod"):arg(value):args(urls):spawn():wait() - if not status or not status.success then - ya.notify { - title = "Chmod", - content = string.format("Chmod on selected files failed, error: %s", status and status.code or err), - level = "error", - timeout = 5, - } - end - end, -} diff --git a/cli/.config/yazi/plugins/lazygit.yazi/LICENSE b/cli/.config/yazi/plugins/lazygit.yazi/LICENSE deleted file mode 100644 index ae1f60d..0000000 --- a/cli/.config/yazi/plugins/lazygit.yazi/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 Darius - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/cli/.config/yazi/plugins/lazygit.yazi/README.md b/cli/.config/yazi/plugins/lazygit.yazi/README.md deleted file mode 100644 index e96c9c6..0000000 --- a/cli/.config/yazi/plugins/lazygit.yazi/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# lazygit.yazi -Plugin for [Yazi](https://github.com/sxyazi/yazi) to manage git repos with [lazygit](https://github.com/jesseduffield/lazygit) -## Dependencies -Make sure [lazygit](https://github.com/jesseduffield/lazygit) is installed and in your `PATH`. -## Installation - -### Using `ya pack` -``` -ya pack -a Lil-Dank/lazygit -``` - -### Manual -**Linux/macOS** -``` -git clone https://github.com/Lil-Dank/lazygit.yazi.git ~/.config/yazi/plugins/lazygit.yazi -``` -**Windows** -``` -git clone https://github.com/Lil-Dank/lazygit.yazi.git %AppData%\yazi\config\plugins\lazygit.yazi -``` -## Configuration -add this to your **keymap.toml** file -```toml -[[manager.prepend_keymap]] -on = [ "g", "i" ] -run = "plugin lazygit" -desc = "run lazygit" -``` -you can customize the keybinding however you like. Please refer to the [keymap.toml](https://yazi-rs.github.io/docs/configuration/keymap) documentation diff --git a/cli/.config/yazi/plugins/lazygit.yazi/main.lua b/cli/.config/yazi/plugins/lazygit.yazi/main.lua deleted file mode 100644 index 32d7f18..0000000 --- a/cli/.config/yazi/plugins/lazygit.yazi/main.lua +++ /dev/null @@ -1,31 +0,0 @@ -return { - entry = function() - local output = Command("git"):arg("status"):stderr(Command.PIPED):output() - if output.stderr ~= "" then - ya.notify({ - title = "lazygit", - content = "Not in a git directory\nError: " .. output.stderr, - level = "warn", - timeout = 5, - }) - else - permit = ya.hide() - local output, err_code = Command("lazygit"):stderr(Command.PIPED):output() - if err_code ~= nil then - ya.notify({ - title = "Failed to run lazygit command", - content = "Status: " .. err_code, - level = "error", - timeout = 5, - }) - elseif not output.status.success then - ya.notify({ - title = "lazygit in" .. cwd .. "failed, exit code " .. output.status.code, - content = output.stderr, - level = "error", - timeout = 5, - }) - end - end - end, -} diff --git a/cli/.config/yazi/plugins/restore.yazi/LICENSE b/cli/.config/yazi/plugins/restore.yazi/LICENSE deleted file mode 100644 index 0ad25db..0000000 --- a/cli/.config/yazi/plugins/restore.yazi/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/cli/.config/yazi/plugins/restore.yazi/README.md b/cli/.config/yazi/plugins/restore.yazi/README.md deleted file mode 100644 index 9dda9fe..0000000 --- a/cli/.config/yazi/plugins/restore.yazi/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# restore.yazi - - - -- [restore.yazi](#restoreyazi) - - [Requirements](#requirements) - - [Installation](#installation) - - [Linux/MacOS](#linuxmacos) - - [Usage](#usage) - - -[Yazi](https://github.com/sxyazi/yazi) plugin to restore/recover latest deleted files/folders. - -## Requirements - -- [yazi >= v25.2.7](https://github.com/sxyazi/yazi) -- [trash-cli](https://github.com/andreafrancia/trash-cli) - - If you have `Can't Get Trash Directory` error and running `trash-cli --volumes` - in terminal throw `AttributeError: 'PrintVolumesList' object has no attribute 'run_action'`. - Remove the old version of trash-cli and install newer version [How to install](https://github.com/andreafrancia/trash-cli?tab=readme-ov-file#the-easy-way). - -## Installation - -### Linux - -```sh -git clone https://github.com/boydaihungst/restore.yazi ~/.config/yazi/plugins/restore.yazi -``` - -or - -```sh -ya pack -a boydaihungst/restore -``` - -## Usage - -1. Key binding - - - Add this to your `keymap.toml`: - - ```toml - [manager] - keymap = [ - { on = "u", run = "plugin restore", desc = "Restore last deleted files/folders" }, - # or use "d + u" like me - { on = ["d", "u"], run = "plugin restore", desc = "Restore last deleted files/folders" }, - # ... Other keymaps - ] - ``` - -2. Configuration (Optional) - - - Default: - - ```lua - require("restore"):setup({ - -- Set the position for confirm and overwrite dialogs. - -- don't forget to set height: `h = xx` - -- https://yazi-rs.github.io/docs/plugins/utils/#ya.input - position = { "center", w = 70, h = 40 }, -- Optional - - -- Show confirm dialog before restore. - -- NOTE: even if set this to false, overwrite dialog still pop up - show_confirm = true, -- Optional - - -- colors for confirm and overwrite dialogs - theme = { -- Optional - -- Default using style from your flavor or theme.lua -> [confirm] -> title. - -- If you edit flavor or theme.lua you can add more style than just color. - -- Example in theme.lua -> [confirm]: title = { fg = "blue", bg = "green" } - title = "blue", -- Optional. This valid has higher priority than flavor/theme.lua - - -- Default using style from your flavor or theme.lua -> [confirm] -> content - -- Sample logic as title above - header = "green", -- Optional. This valid has higher priority than flavor/theme.lua - - -- header color for overwrite dialog - -- Default using color "yellow" - header_warning = "yellow", -- Optional - -- Default using style from your flavor or theme.lua -> [confirm] -> list - -- Sample logic as title and header above - list_item = { odd = "blue", even = "blue" }, -- Optional. This valid has higher priority than flavor/theme.lua - }, - }) - ``` diff --git a/cli/.config/yazi/plugins/restore.yazi/main.lua b/cli/.config/yazi/plugins/restore.yazi/main.lua deleted file mode 100644 index 4d081e4..0000000 --- a/cli/.config/yazi/plugins/restore.yazi/main.lua +++ /dev/null @@ -1,269 +0,0 @@ ---- @since 25.2.7 - -local M = {} -local shell = os.getenv("SHELL") or "" -local PackageName = "Restore" -local function success(s, ...) - ya.notify({ title = PackageName, content = string.format(s, ...), timeout = 5, level = "info" }) -end - -local function fail(s, ...) - ya.notify({ title = PackageName, content = string.format(s, ...), timeout = 5, level = "error" }) -end - ----@enum STATE -local STATE = { - POSITION = "position", - SHOW_CONFIRM = "show_confirm", - THEME = "theme", -} - -local set_state = ya.sync(function(state, key, value) - if state then - state[key] = value - else - state = {} - state[key] = value - end -end) - -local get_state = ya.sync(function(state, key) - if state then - return state[key] - else - return nil - end -end) - ----@enum File_Type -local File_Type = { - File = "file", - Dir = "dir_all", - None_Exist = "unknown", -} - ----@alias TRASHED_ITEM {trash_index: number, trashed_date_time: string, trashed_path: string, type: File_Type} Item in trash list - -local get_cwd = ya.sync(function() - return tostring(cx.active.current.cwd) -end) - -local function path_quote(path) - local result = "'" .. string.gsub(path, "'", "'\\''") .. "'" - return result -end - -local function get_file_type(path) - local cha, _ = fs.cha(Url(path)) - if cha then - return cha.is_dir and File_Type.Dir or File_Type.File - else - return File_Type.None_Exist - end -end - -local function get_trash_volume() - local cwd = get_cwd() - local trash_volumes_stream, cmr_err = - Command("trash-list"):args({ "--volumes" }):stdout(Command.PIPED):stderr(Command.PIPED):output() - - local matched_vol_path = nil - if trash_volumes_stream then - local matched_vol_length = 0 - for vol in trash_volumes_stream.stdout:gmatch("[^\r\n]+") do - local vol_length = utf8.len(vol) or 0 - if cwd:sub(1, vol_length) == vol and vol_length > matched_vol_length then - matched_vol_path = vol - matched_vol_length = vol_length - end - end - if not matched_vol_path then - fail("Can't get trash directory") - end - else - fail("Failed to start `trash-list` with error: `%s`. Do you have `trash-cli` installed?", cmr_err) - end - return matched_vol_path -end - ----get list of latest files/folders trashed ----@param curr_working_volume currently working volume ----@return TRASHED_ITEM[]|nil -local function get_latest_trashed_items(curr_working_volume) - ---@type TRASHED_ITEM[] - local restorable_items = {} - local fake_enter = Command("printf"):stderr(Command.PIPED):stdout(Command.PIPED):spawn():take_stdout() - local trash_list_stream, err_cmd = Command(shell) - :args({ "-c", "trash-restore " .. path_quote(curr_working_volume) }) - :stdin(fake_enter) - :stdout(Command.PIPED) - :stderr(Command.PIPED) - :output() - - if trash_list_stream then - ---@type TRASHED_ITEM[] - local trash_list = {} - for line in trash_list_stream.stdout:gmatch("[^\r\n]+") do - -- remove leading spaces - line = line:match("^%s*(.+)$") - local trash_index, item_date, item_path = line:match("^(%d+) (%S+ %S+) (.+)$") - if item_date and item_path and trash_index ~= nil then - table.insert(trash_list, { - trash_index = tonumber(trash_index), - trashed_date_time = item_date, - trashed_path = item_path, - type = File_Type.None_Exist, - }) - end - end - - if #trash_list == 0 then - success("Nothing left to restore") - return - end - - local last_item_datetime = trash_list[#trash_list].trashed_date_time - - for _, trash_item in ipairs(trash_list) do - if trash_item then - if trash_item.trashed_date_time == last_item_datetime then - trash_item.type = get_file_type(trash_item.trashed_path) - table.insert(restorable_items, trash_item) - end - end - end - else - fail("Failed to start `trash-restore` with error: `%s`. Do you have `trash-cli` installed?", err_cmd) - return - end - return restorable_items - -- return newest_trashed_items -end - ----@param trash_list TRASHED_ITEM[] -local function filter_none_exised_paths(trash_list) - ---@type TRASHED_ITEM[] - local existed_trash_items = {} - for _, v in ipairs(trash_list) do - if v.type ~= File_Type.None_Exist then - table.insert(existed_trash_items, v) - end - end - return existed_trash_items -end - -local function restore_files(curr_working_volume, start_index, end_index) - if type(start_index) ~= "number" or type(end_index) ~= "number" or start_index < 0 or end_index < 0 then - fail("Failed to restore file(s): out of range") - return - end - - ya.manager_emit("shell", { - "echo " .. ya.quote(start_index .. "-" .. end_index) .. " | trash-restore --overwrite " .. path_quote( - curr_working_volume - ), - confirm = true, - }) - local file_to_restore_count = end_index - start_index + 1 - success("Restored " .. tostring(file_to_restore_count) .. " file" .. (file_to_restore_count > 1 and "s" or "")) -end - -function M:setup(opts) - if opts and opts.position and type(opts.position) == "table" then - set_state(STATE.POSITION, opts.position) - else - set_state(STATE.POSITION, { "center", w = 70, h = 40 }) - end - if opts and opts.show_confirm then - set_state(STATE.SHOW_CONFIRM, opts.show_confirm) - else - set_state(STATE.SHOW_CONFIRM, false) - end - if opts and opts.theme and type(opts.theme) == "table" then - set_state(STATE.THEME, opts.theme) - else - set_state(STATE.THEME, {}) - end -end - ----@param trash_list TRASHED_ITEM[] -local function get_components(trash_list) - local theme = get_state(STATE.THEME) or {} - local item_odd_style = theme.list_item and theme.list_item.odd and ui.Style():fg(theme.list_item.odd) - or (th and th.confirm and th.confirm.list or ui.Style():fg("blue")) - local item_even_style = theme.list_item and theme.list_item.even and ui.Style():fg(theme.list_item.even) - or (th and th.confirm and th.confirm.list or ui.Style():fg("blue")) - - local trashed_items_components = {} - for idx, item in pairs(trash_list) do - table.insert( - trashed_items_components, - ui.Line({ - ui.Span(" "), - ui.Span(item.trashed_path):style(idx % 2 == 0 and item_even_style or item_odd_style), - }):align(ui.Line.LEFT) - ) - end - return trashed_items_components -end - -function M:entry() - local curr_working_volume = get_trash_volume() - if not curr_working_volume then - return - end - local trashed_items = get_latest_trashed_items(curr_working_volume) - if trashed_items == nil then - return - end - local collided_items = filter_none_exised_paths(trashed_items) - local overwrite_confirmed = true - local show_confirm = get_state(STATE.SHOW_CONFIRM) - local pos = get_state(STATE.POSITION) - pos = pos or { "center", w = 70, h = 40 } - - local theme = get_state(STATE.THEME) or {} - theme.title = theme.title and ui.Style():fg(theme.title):bold() or (th and th.confirm and th.confirm.title) - theme.header = theme.header and ui.Style():fg(theme.header) or (th and th.confirm and th.confirm.content) - theme.header_warning = ui.Style():fg(theme.header_warning or "yellow") - if ya.confirm and show_confirm then - local continue_restore = ya.confirm({ - -- title = ui.Line("Restore files/folders"):fg(theme.title):bold(), - title = ui.Line("Restore files/folders"):style(theme.title), - content = ui.Text({ - ui.Line(""), - ui.Line("The following files and folders are going to be restored:"):style(theme.header), - ui.Line(""), - table.unpack(get_components(trashed_items)), - }) - :align(ui.Text.LEFT) - :wrap(ui.Text.WRAP), - pos = pos, - }) - -- stopping - if not continue_restore then - return - end - end - - -- show Confirm dialog with list of collided items - if #collided_items > 0 then - overwrite_confirmed = ya.confirm({ - title = ui.Line("Restore files/folders"):style(theme.title), - content = ui.Text({ - ui.Line(""), - ui.Line("The following files and folders are existed, overwrite?"):style(theme.header_warning), - ui.Line(""), - table.unpack(get_components(collided_items)), - }) - :align(ui.Text.LEFT) - :wrap(ui.Text.WRAP), - pos = pos, - }) - end - if overwrite_confirmed then - restore_files(curr_working_volume, trashed_items[1].trash_index, trashed_items[#trashed_items].trash_index) - end -end - -return M diff --git a/cli/.config/yazi/plugins/what-size.yazi/LICENSE b/cli/.config/yazi/plugins/what-size.yazi/LICENSE deleted file mode 100644 index dc36871..0000000 --- a/cli/.config/yazi/plugins/what-size.yazi/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 Francesco Pira - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/cli/.config/yazi/plugins/what-size.yazi/README.md b/cli/.config/yazi/plugins/what-size.yazi/README.md deleted file mode 100644 index c70b81c..0000000 --- a/cli/.config/yazi/plugins/what-size.yazi/README.md +++ /dev/null @@ -1,83 +0,0 @@ -# what-size.yazi - -A plugin for [yazi](https://github.com/sxyazi/yazi) to calculate the size of the current selection or the current working directory (if no selection is made). - -## Compatibility - -what-size supports Yazi on Linux, macOS, and Windows. - -### OS - -- Linux since first commit -- macOS since commit `42c6a0efb7245badb16781da5380be1a1705f3f2` ([link](https://github.com/pirafrank/what-size.yazi/commit/42c6a0efb7245badb16781da5380be1a1705f3f2)) -- Windows since commit `4a56ead2a84c5969791fb17416e0b451ab906c5d` ([link](https://github.com/pirafrank/what-size.yazi/commit/4a56ead2a84c5969791fb17416e0b451ab906c5d)) - -### Yazi - -- yazi `25.x` since commit `fce1778d911621dc57796cdfdf11dcda3c2e28de` ([link](https://github.com/pirafrank/what-size.yazi/commit/fce1778d911621dc57796cdfdf11dcda3c2e28de)). -- yazi `0.4.x` since commit `2780de5aeef1ed16d1973dd6e0cd4d630c900d56` ([link](https://github.com/pirafrank/what-size.yazi/commit/2780de5aeef1ed16d1973dd6e0cd4d630c900d56)). -- yazi `0.3.x` up to commit `f08f7f2d5c94958ac4cb66c51a7c24b4319c6c93` ([link](https://github.com/pirafrank/what-size.yazi/commit/f08f7f2d5c94958ac4cb66c51a7c24b4319c6c93)). - -## Requirements - -- `du` on Linux and macOS -- PowerShell on Windows - -## Installation - -```sh -ya pack -a 'pirafrank/what-size' -``` - -## Usage - -Add this to your `~/.config/yazi/keymap.toml`: - -```toml -[manager] -prepend_keymap = [ - { on = [ ".", "s" ], run = "plugin what-size", desc = "Calc size of selection or cwd" }, -] -``` - -If you want to copy the result to clipboard, you can add `--clipboard` or `-c` as 2nd positional argument: - -```toml -[manager] -prepend_keymap = [ - { on = [ ".", "s" ], run = "plugin what-size -- '--clipboard'", desc = "Calc size of selection or cwd" }, -] -``` - -```toml -[manager] -prepend_keymap = [ - { on = [ ".", "s" ], run = "plugin what-size -- '-c'", desc = "Calc size of selection or cwd" }, -] -``` - -Change to whatever keybinding you like. - -## Feedback - -If you have any feedback, suggestions, or ideas please let me know by opening an issue. - -## Dev setup - -Check the debug config [here](https://yazi-rs.github.io/docs/plugins/overview/#debugging). - -To get debug logs while develoing use `ya.dbg()` in your code, then set the `YAZI_LOG` environment variable to `debug` before running Yazi. - -```sh -YAZI_LOG=debug yazi -``` - -Logs will be saved to `~.local/state/yazi/yazi.log` file. - -## Contributing - -Contributions are welcome. Please fork the repository and submit a PR. - -## License - -MIT diff --git a/cli/.config/yazi/plugins/what-size.yazi/main.lua b/cli/.config/yazi/plugins/what-size.yazi/main.lua deleted file mode 100644 index 80b92c1..0000000 --- a/cli/.config/yazi/plugins/what-size.yazi/main.lua +++ /dev/null @@ -1,96 +0,0 @@ - --- function to get paths of selected elements or current directory --- if no elements are selected -local get_paths = ya.sync(function() - local paths = {} - -- get selected files - for _, u in pairs(cx.active.selected) do - paths[#paths + 1] = tostring(u) - end - -- if no files are selected, get current directory - if #paths == 0 then - if cx.active.current.cwd then - paths[1] = tostring(cx.active.current.cwd) - else - ya.err("what-size would return nil paths") - end - end - return paths -end) - --- Function to get total size from output --- Unix use `du`, Windows use PowerShell -local function get_total_size(items) - local is_windows = package.config:sub(1,1) == '\\' - - if is_windows then - local total = 0 - for _, path in ipairs(items) do - path = path:gsub('"', '\\"') - local ps_cmd = string.format( - [[powershell -Command "& { $p = '%s'; if (Test-Path $p) { if ((Get-ChildItem -Path $p -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum) { (Get-ChildItem -Path $p -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum } else { (Get-Item $p).Length } } }"]], - path - ) - local pipe = io.popen(ps_cmd) - local result = pipe:read("*a") - -- Debug - -- ya.notify { - -- title = "Debug Output", - -- content = result, - -- timeout = 5, - -- } - pipe:close() - local num = tonumber(result) - if num then total = total + num end - end - return total - else - local arg = ya.target_os() == "macos" and "-scA" or "-scb" - local output, err = Command("du"):arg(arg):args(items):output() - if not output then - ya.err("Failed to run du: " .. err) - end - local lines = {} - for line in output.stdout:gmatch("[^\n]+") do - lines[#lines + 1] = line - end - local last_line = lines[#lines] - local size = tonumber(last_line:match("^(%d+)")) - return ya.target_os() == "macos" and size * 512 or size - end -end - --- Function to format file size -local function format_size(size) - local units = { "B", "KB", "MB", "GB", "TB" } - local unit_index = 1 - while size > 1024 and unit_index < #units do - size = size / 1024 - unit_index = unit_index + 1 - end - return string.format("%.2f %s", size, units[unit_index]) -end - -return { - -- as per doc: https://yazi-rs.github.io/docs/plugins/overview#functional-plugin - entry = function(_, job) - -- defaults not to use clipboard, use it only if required by the user - local clipboard = job.args.clipboard == true or job.args[1] == "--clipboard" or job.args[1] == "-c" - local items = get_paths() - - local total_size = get_total_size(items) - local formatted_size = format_size(total_size) - - local notification_content = "Total size: " .. formatted_size - if clipboard then - ya.clipboard(formatted_size) - notification_content = notification_content .. "\nCopied to clipboard." - end - - ya.notify { - title = "What size", - content = notification_content, - timeout = 4, - } - end, -} diff --git a/cli/.config/lazygit/config.yml b/cli/dot-config/lazygit/config.yml similarity index 100% rename from cli/.config/lazygit/config.yml rename to cli/dot-config/lazygit/config.yml diff --git a/cli/.config/weechat/alias.conf b/cli/dot-config/weechat/alias.conf similarity index 100% rename from cli/.config/weechat/alias.conf rename to cli/dot-config/weechat/alias.conf diff --git a/cli/.config/weechat/buflist.conf b/cli/dot-config/weechat/buflist.conf similarity index 100% rename from cli/.config/weechat/buflist.conf rename to cli/dot-config/weechat/buflist.conf diff --git a/cli/.config/weechat/charset.conf b/cli/dot-config/weechat/charset.conf similarity index 100% rename from cli/.config/weechat/charset.conf rename to cli/dot-config/weechat/charset.conf diff --git a/cli/.config/weechat/exec.conf b/cli/dot-config/weechat/exec.conf similarity index 100% rename from cli/.config/weechat/exec.conf rename to cli/dot-config/weechat/exec.conf diff --git a/cli/.config/weechat/fifo.conf b/cli/dot-config/weechat/fifo.conf similarity index 100% rename from cli/.config/weechat/fifo.conf rename to cli/dot-config/weechat/fifo.conf diff --git a/cli/.config/weechat/fset.conf b/cli/dot-config/weechat/fset.conf similarity index 100% rename from cli/.config/weechat/fset.conf rename to cli/dot-config/weechat/fset.conf diff --git a/cli/.config/weechat/guile.conf b/cli/dot-config/weechat/guile.conf similarity index 100% rename from cli/.config/weechat/guile.conf rename to cli/dot-config/weechat/guile.conf diff --git a/cli/.config/weechat/irc.conf b/cli/dot-config/weechat/irc.conf similarity index 100% rename from cli/.config/weechat/irc.conf rename to cli/dot-config/weechat/irc.conf diff --git a/cli/.config/weechat/logger.conf b/cli/dot-config/weechat/logger.conf similarity index 100% rename from cli/.config/weechat/logger.conf rename to cli/dot-config/weechat/logger.conf diff --git a/cli/.config/weechat/lua.conf b/cli/dot-config/weechat/lua.conf similarity index 100% rename from cli/.config/weechat/lua.conf rename to cli/dot-config/weechat/lua.conf diff --git a/cli/.config/weechat/perl.conf b/cli/dot-config/weechat/perl.conf similarity index 100% rename from cli/.config/weechat/perl.conf rename to cli/dot-config/weechat/perl.conf diff --git a/cli/.config/weechat/plugins.conf b/cli/dot-config/weechat/plugins.conf similarity index 100% rename from cli/.config/weechat/plugins.conf rename to cli/dot-config/weechat/plugins.conf diff --git a/cli/.config/weechat/python.conf b/cli/dot-config/weechat/python.conf similarity index 100% rename from cli/.config/weechat/python.conf rename to cli/dot-config/weechat/python.conf diff --git a/cli/.config/weechat/relay.conf b/cli/dot-config/weechat/relay.conf similarity index 100% rename from cli/.config/weechat/relay.conf rename to cli/dot-config/weechat/relay.conf diff --git a/cli/.config/weechat/ruby.conf b/cli/dot-config/weechat/ruby.conf similarity index 100% rename from cli/.config/weechat/ruby.conf rename to cli/dot-config/weechat/ruby.conf diff --git a/cli/.config/weechat/script.conf b/cli/dot-config/weechat/script.conf similarity index 100% rename from cli/.config/weechat/script.conf rename to cli/dot-config/weechat/script.conf diff --git a/cli/.config/weechat/sec.conf b/cli/dot-config/weechat/sec.conf similarity index 100% rename from cli/.config/weechat/sec.conf rename to cli/dot-config/weechat/sec.conf diff --git a/cli/.config/weechat/spell.conf b/cli/dot-config/weechat/spell.conf similarity index 100% rename from cli/.config/weechat/spell.conf rename to cli/dot-config/weechat/spell.conf diff --git a/cli/.config/weechat/tcl.conf b/cli/dot-config/weechat/tcl.conf similarity index 100% rename from cli/.config/weechat/tcl.conf rename to cli/dot-config/weechat/tcl.conf diff --git a/cli/.config/weechat/trigger.conf b/cli/dot-config/weechat/trigger.conf similarity index 100% rename from cli/.config/weechat/trigger.conf rename to cli/dot-config/weechat/trigger.conf diff --git a/cli/.config/weechat/typing.conf b/cli/dot-config/weechat/typing.conf similarity index 100% rename from cli/.config/weechat/typing.conf rename to cli/dot-config/weechat/typing.conf diff --git a/cli/.config/weechat/weechat.conf b/cli/dot-config/weechat/weechat.conf similarity index 100% rename from cli/.config/weechat/weechat.conf rename to cli/dot-config/weechat/weechat.conf diff --git a/cli/.config/weechat/xfer.conf b/cli/dot-config/weechat/xfer.conf similarity index 100% rename from cli/.config/weechat/xfer.conf rename to cli/dot-config/weechat/xfer.conf diff --git a/cli/.config/yazi/keymap.toml b/cli/dot-config/yazi/keymap.toml similarity index 96% rename from cli/.config/yazi/keymap.toml rename to cli/dot-config/yazi/keymap.toml index 7734db5..7ccb1ce 100644 --- a/cli/.config/yazi/keymap.toml +++ b/cli/dot-config/yazi/keymap.toml @@ -34,7 +34,7 @@ append_keymap = [ # Default jumping to stuff { on = [ "g", "s" ], run = "cd ~/synced", desc = "Go to Synced folder" }, { on = [ "g", "u" ], run = "cd ~/projects/university", desc = "Go to University folder" }, - { on = [ "g", "n" ], run = "cd ~/configuration", desc = "Go to config folder" }, + { on = [ "g", "n" ], run = "cd ~/nixos", desc = "Go to nixos folder" }, { on = [ "g", "p" ], run = "cd ~/projects", desc = "Go to projects folder" }, { on = [ "g", "w" ], run = "cd ~/workspace_local", desc = "Go to workspace" }, { on = [ "g", "e" ], run = "cd ~/configuration/dotfiles", desc = "Go to dotfilEs" }, diff --git a/cli/dot-config/yazi/package.toml b/cli/dot-config/yazi/package.toml new file mode 100644 index 0000000..0cb2110 --- /dev/null +++ b/cli/dot-config/yazi/package.toml @@ -0,0 +1,29 @@ +[[plugin.deps]] +use = "Lil-Dank/lazygit" +rev = "8f37dc5" +hash = "ee71543790f0ce3951161045a3787abd" + +[[plugin.deps]] +use = "yazi-rs/plugins:chmod" +rev = "d1c8baa" +hash = "8ad3e90b079190b4905f24a44f4ca06b" + +[[plugin.deps]] +use = "boydaihungst/restore" +rev = "dc40509" +hash = "e7e377f9b1bbaca4a2e5d9ec9709ac4d" + +[[plugin.deps]] +use = "pirafrank/what-size" +rev = "d896656" +hash = "62251f94eb67648d42cdfcfb8be0fad2" + +[[plugin.deps]] +use = "dedukun/bookmarks" +rev = "9ef1254" +hash = "92fbb5483657fa7976cdf4e0104e18e0" + +[[flavor.deps]] +use = "dangooddd/kanagawa" +rev = "a0b1d9d" +hash = "abfb0b2371259b2c8adfc7b617c3d7e5" diff --git a/cli/.config/yazi/theme.toml b/cli/dot-config/yazi/theme.toml similarity index 100% rename from cli/.config/yazi/theme.toml rename to cli/dot-config/yazi/theme.toml diff --git a/cli/.config/yazi/yazi.toml b/cli/dot-config/yazi/yazi.toml similarity index 100% rename from cli/.config/yazi/yazi.toml rename to cli/dot-config/yazi/yazi.toml diff --git a/gui/.config/alacritty.toml b/gui/dot-config/alacritty.toml similarity index 100% rename from gui/.config/alacritty.toml rename to gui/dot-config/alacritty.toml diff --git a/gui/.config/dunst/dunstrc b/gui/dot-config/dunst/dunstrc similarity index 100% rename from gui/.config/dunst/dunstrc rename to gui/dot-config/dunst/dunstrc diff --git a/gui/.config/hypr/hyprland.conf b/gui/dot-config/hypr/hyprland.conf similarity index 99% rename from gui/.config/hypr/hyprland.conf rename to gui/dot-config/hypr/hyprland.conf index 851683f..b0f5d35 100644 --- a/gui/.config/hypr/hyprland.conf +++ b/gui/dot-config/hypr/hyprland.conf @@ -194,6 +194,7 @@ windowrulev2 = float, class:(qt5ct) windowrulev2 = float, title:(Open File) windowrulev2 = float, title:(Open Folder) windowrulev2 = float, title:(Save As) +windowrulev2 = tile, class:(sioyek) windowrulev2 = size 450 450, class:(Gnuplot) windowrulev2 = move 100 203100, class:(Gnuplot) diff --git a/gui/.config/hypr/hyprpaper.conf b/gui/dot-config/hypr/hyprpaper.conf similarity index 81% rename from gui/.config/hypr/hyprpaper.conf rename to gui/dot-config/hypr/hyprpaper.conf index 2c474a9..be7d192 100644 --- a/gui/.config/hypr/hyprpaper.conf +++ b/gui/dot-config/hypr/hyprpaper.conf @@ -1,5 +1,6 @@ preload = /home/jonas/workspace/backg.jpg preload = /home/jonas/workspace/backg3.jpg +wallpaper = ,/home/jonas/workspace/backg.jpg wallpaper = HDMI-A-1,/home/jonas/workspace/backg.jpg wallpaper = HDMI-A-2,/home/jonas/workspace/backg3.jpg diff --git a/gui/.config/kitty/kitty.conf b/gui/dot-config/kitty/kitty.conf similarity index 100% rename from gui/.config/kitty/kitty.conf rename to gui/dot-config/kitty/kitty.conf diff --git a/gui/.config/kitty/theme.conf b/gui/dot-config/kitty/theme.conf similarity index 100% rename from gui/.config/kitty/theme.conf rename to gui/dot-config/kitty/theme.conf diff --git a/gui/.config/sioyek/prefs.config b/gui/dot-config/sioyek/prefs.config similarity index 100% rename from gui/.config/sioyek/prefs.config rename to gui/dot-config/sioyek/prefs.config diff --git a/gui/.config/tofi/config b/gui/dot-config/tofi/config similarity index 100% rename from gui/.config/tofi/config rename to gui/dot-config/tofi/config diff --git a/gui/.config/waybar/config b/gui/dot-config/waybar/config similarity index 100% rename from gui/.config/waybar/config rename to gui/dot-config/waybar/config diff --git a/gui/.config/waybar/style.css b/gui/dot-config/waybar/style.css similarity index 76% rename from gui/.config/waybar/style.css rename to gui/dot-config/waybar/style.css index 052ca36..afe1725 100644 --- a/gui/.config/waybar/style.css +++ b/gui/dot-config/waybar/style.css @@ -1,6 +1,6 @@ * { font-family: 'NotoFont'; - font-size: 10px; + font-size: 9px; font-weight: bold; } @@ -21,13 +21,13 @@ button:hover { } #workspaces { - padding: 1px 2px; - border-radius: 2px; - margin: 2px 2px; + padding: 1px 1px; + border-radius: 1px; + margin: 1px 1px; } #workspaces button { - padding: 0 2px; + padding: 0 1px; background-color: #3e4243; color: #ed817d; margin: 0px 0px; @@ -36,13 +36,13 @@ button:hover { #workspaces button.active { background-color: #9a5263; color: #ebdbb2; - box-shadow: inset 0 -3px #ebdbb2; + box-shadow: inset 0 -2px #ebdbb2; } #workspaces button.urgent { background-color: #d395a7; color: #282828; - box-shadow: inset 0 -3px #ebdbb2; + box-shadow: inset 0 -2px #ebdbb2; } #window { @@ -115,25 +115,13 @@ button:hover { margin: 2px 3px; } -#custom-status, -#custom-webdav { - background-color: #3e3e3e; /* Slightly lighter dark gray */ - font-size: 12px; /* Smaller text */ - border-radius: 4px; /* Rounded corners */ - padding: 4px 10px; /* Padding inside the box */ - margin-left: 10px; /* Move it away from center modules */ - margin: 5px 5px; - color: #ffffff; /* Optional: make sure text is visible */ -} - - #clock { background-color: #282828; color: #d3869b; padding: 0 7px; border-radius: 5px; margin: 2px 13; - box-shadow: inset 0 -3px #d3869b; + box-shadow: inset 0 -2px #d3869b; } #memory { @@ -141,8 +129,8 @@ button:hover { color: #a39bcb; padding: 0 7px; border-radius: 5px; - margin: 2px 3px; - box-shadow: inset 0 -3px #a39bcb; + margin: 2px 2px; + box-shadow: inset 0 -2px #a39bcb; } #cpu { @@ -151,5 +139,5 @@ button:hover { padding: 0 7px; border-radius: 5px; margin: 2px 3px; - box-shadow: inset 0 -3px #ee9c70; + box-shadow: inset 0 -2px #ee9c70; } diff --git a/home/.common_shell b/home/dot-common_shell similarity index 100% rename from home/.common_shell rename to home/dot-common_shell diff --git a/home/.ssh/config b/home/dot-ssh/config similarity index 92% rename from home/.ssh/config rename to home/dot-ssh/config index 4e9964a..2c6c5a9 100644 --- a/home/.ssh/config +++ b/home/dot-ssh/config @@ -11,6 +11,7 @@ Host gitlab.gwdg.de Host strato HostName hahn1.one User root + IdentityFile ~/.ssh/id_strato Host bitzz HostName bitzz.de diff --git a/home/.todo/config b/home/dot-todo/config similarity index 100% rename from home/.todo/config rename to home/dot-todo/config diff --git a/home/.unison/default.prf b/home/dot-unison/default.prf similarity index 100% rename from home/.unison/default.prf rename to home/dot-unison/default.prf diff --git a/resolve.sh b/resolve.sh new file mode 100755 index 0000000..d91f32b --- /dev/null +++ b/resolve.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +set -e + +pkg="$1" + +stow --dotfiles --no "$pkg" 2>&1 | + grep 'cannot stow' | + sed -E 's/.*existing target ([^ ]+).*/\1/' | + while read -r f; do + echo "Removing $HOME/$f with force" + rm -rf -- "$HOME/$f" + done + +stow --dotfiles "$pkg" +echo "Stowed $pkg" diff --git a/stow.sh b/stow.sh new file mode 100755 index 0000000..fd4c770 --- /dev/null +++ b/stow.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +stow -v --dotfiles $1