{"id":23776199,"url":"https://github.com/dhth/shfl","last_synced_at":"2025-07-05T18:32:58.266Z","repository":{"id":268955571,"uuid":"905010248","full_name":"dhth/shfl","owner":"dhth","description":"rearrange lines in a file with simple keymaps","archived":false,"fork":false,"pushed_at":"2025-06-26T15:51:17.000Z","size":77,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-05T18:32:34.926Z","etag":null,"topics":["ratatui","tui"],"latest_commit_sha":null,"homepage":"https://tools.dhruvs.space/shfl","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dhth.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-12-18T01:29:40.000Z","updated_at":"2025-06-26T15:51:21.000Z","dependencies_parsed_at":"2025-06-15T16:23:00.364Z","dependency_job_id":"2a946836-bb35-444f-b475-5c6b26562955","html_url":"https://github.com/dhth/shfl","commit_stats":null,"previous_names":["dhth/shfl"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/dhth/shfl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fshfl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fshfl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fshfl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fshfl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dhth","download_url":"https://codeload.github.com/dhth/shfl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhth%2Fshfl/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263784840,"owners_count":23510984,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ratatui","tui"],"created_at":"2025-01-01T07:13:45.338Z","updated_at":"2025-07-05T18:32:58.253Z","avatar_url":"https://github.com/dhth.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003eshfl\u003c/h1\u003e\n  \u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/dhth/shfl/actions/workflows/main.yml\"\u003e\u003cimg alt=\"Build status\" src=\"https://img.shields.io/github/actions/workflow/status/dhth/shfl/main.yml?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/dhth/shfl/releases/latest\"\u003e\u003cimg alt=\"Latest Release\" src=\"https://img.shields.io/github/release/dhth/shfl.svg?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/dhth/shfl/releases\"\u003e\u003cimg alt=\"Commits Since Latest Release\" src=\"https://img.shields.io/github/commits-since/dhth/shfl/latest?style=flat-square\"\u003e\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n`shfl` (short for \"shuffle\") lets you easily rearrange lines in a file with\nsimple keymaps.\n\n![demo](https://github.com/user-attachments/assets/07bd4b71-f78b-4b82-8080-3b973258bf55)\n\n🤔 Motivation\n---\n\nI like switching my tmux sessions quickly (using `tmux switch-client -t\n\"$session\"`, triggered via a shortcut). The session names are stored in a local\nfile, and I map a key to a session on a specific line number. To easily change\nwhich session is assigned to which line number, I needed a tool that would start\nup quickly and have easy keymaps to reorder lines in a file.\n\nhttps://github.com/user-attachments/assets/58585b04-6474-4172-b6f8-40c75b486113\n\n💾 Installation\n---\n\n**homebrew**:\n\n```sh\nbrew install dhth/tap/shfl\n```\n\n**cargo**:\n\n```sh\ncargo install --git https://github.com/dhth/shfl.git\n```\n\nOr get the binaries directly from a [release][2]. Read more about verifying the\nauthenticity of released artifacts [here](#-verifying-release-artifacts).\n\n⌨️ Keymaps\n---\n\n```\nK                    move item one position above\nEnter                move item/selection to the start of the list\nj / Down             go down\nk / Up               go up\n[1-9]                move current item to index in list\ng                    go to the start of the list\nG                    go to the end of the list\nw                    write to file\nspace / s            select/unselect item\n?                    show/hide help view\nEsc / q              go back/reset selection/exit\n```\n\n🔐 Verifying release artifacts\n---\n\nIn case you get the `shfl` binary directly from a [release][2], you may want to\nverify its authenticity. Checksums are applied to all released artifacts, and\nthe resulting checksum file is signed using\n[cosign](https://docs.sigstore.dev/cosign/installation/).\n\nSteps to verify (replace `A.B.C` in the cshflands listed below with the version\nyou want):\n\n1. Download the following files from the release:\n\n   ```text\n   - shfl_A.B.C_checksums.txt\n   - shfl_A.B.C_checksums.txt.pem\n   - shfl_A.B.C_checksums.txt.sig\n   ```\n\n2. Verify the signature:\n\n   ```shell\n   cosign verify-blob shfl_A.B.C_checksums.txt \\\n       --certificate shfl_A.B.C_checksums.txt.pem \\\n       --signature shfl_A.B.C_checksums.txt.sig \\\n       --certificate-identity-regexp 'https://github\\.com/dhth/shfl/\\.github/workflows/.+' \\\n       --certificate-oidc-issuer \"https://token.actions.githubusercontent.com\"\n   ```\n\n3. Download the compressed archive you want, and validate its checksum:\n\n   ```shell\n   curl -sSLO https://github.com/dhth/shfl/releases/download/vA.B.C/shfl_A.B.C_linux_amd64.tar.gz\n   sha256sum --ignore-missing -c shfl_A.B.C_checksums.txt\n   ```\n\n3. If checksum validation goes through, uncompress the archive:\n\n   ```shell\n   tar -xzf shfl_A.B.C_linux_amd64.tar.gz\n   ./shfl\n   ```\n\nAcknowledgements\n---\n\n`shfl` is built using [ratatui][1].\n\n[1]: https://github.com/ratatui/ratatui\n[2]: https://github.com/dhth/shfl/releases\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdhth%2Fshfl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdhth%2Fshfl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdhth%2Fshfl/lists"}