{"id":19525434,"url":"https://github.com/bulletmark/cdhist","last_synced_at":"2025-04-05T16:04:22.300Z","repository":{"id":832527,"uuid":"550632","full_name":"bulletmark/cdhist","owner":"bulletmark","description":"Linux shell cd history.","archived":false,"fork":false,"pushed_at":"2025-03-04T21:51:22.000Z","size":147,"stargazers_count":69,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-29T15:11:15.369Z","etag":null,"topics":["bash","bashrc","fzf","git","history","linux","shell","worktree","zsh"],"latest_commit_sha":null,"homepage":"","language":"Python","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/bulletmark.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}},"created_at":"2010-03-07T06:31:42.000Z","updated_at":"2025-03-04T21:51:26.000Z","dependencies_parsed_at":"2025-03-29T15:10:58.609Z","dependency_job_id":"9a9d1f6e-f099-499f-bca8-37745bc5a6ad","html_url":"https://github.com/bulletmark/cdhist","commit_stats":{"total_commits":108,"total_committers":2,"mean_commits":54.0,"dds":0.0092592592592593,"last_synced_commit":"934ce8ec031f6d6575033b484817cedbba410316"},"previous_names":[],"tags_count":43,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fcdhist","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fcdhist/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fcdhist/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fcdhist/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bulletmark","download_url":"https://codeload.github.com/bulletmark/cdhist/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247361615,"owners_count":20926642,"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":["bash","bashrc","fzf","git","history","linux","shell","worktree","zsh"],"created_at":"2024-11-11T01:04:27.196Z","updated_at":"2025-04-05T16:04:22.279Z","avatar_url":"https://github.com/bulletmark.png","language":"Python","readme":"## CDHIST - Linux Directory History\n[![PyPi](https://img.shields.io/pypi/v/cdhist)](https://pypi.org/project/cdhist/)\n[![AUR](https://img.shields.io/aur/version/cdhist)](https://aur.archlinux.org/packages/cdhist/)\n\n[cdhist](http://github.com/bulletmark/cdhist) is a utility which provides a\nLinux shell **cd history** directory stack. A shell `cd` wrapper function calls\ncdhist to intercept your typed `cd` command and maintain an ordered stack of\nall directories you have previously visited which can be listed and quickly\nnavigated to.\n\n[cdhist](http://github.com/bulletmark/cdhist) can also be used with a fuzzy\nfinder (such as [`fzf`][fzf]) to fuzzy search and select on previously visited\ndirectories, and can be used to easily `cd` between [`git\nworktree`](https://git-scm.com/docs/git-worktree) directories. See the sections\nbelow about [Fuzzy Finder Integration](#fuzzy-finder-integration) and [Git\nWorktree Integration](#git-worktree-integration).\n\nThe latest version and documentation is available at\nhttp://github.com/bulletmark/cdhist.\n\n## Example Usage\n\nUse the `cd` command to change directory as normal:\n\n```sh\n$ cd /tmp\n$ cd /etc\n$ cd /usr/share/doc\n$ cd /boot/loader\n$ cd ~/etc\n$ cd\n```\n\nAt any point you can use the `cd --` command to list all your previously\nvisited directories and be prompted for one to select and `cd` to:\n\n```\n$ cd --\n  6 ...\n  5 /tmp\n  4 /etc\n  3 /usr/share/doc\n  2 /boot/loader\n  1 ~/etc\n  0 ~\nSelect index [or \u003center\u003e to quit]: 3\n$ pwd\n/usr/share/doc\n```\n\nThat's it! The above is all you really need to know. Instead of having to type\nthe directory name you merely enter it's index. The directories are displayed\nmost recently visited last, without duplicates. Index 0 is the current\ndirectory, index 1 is the previous, index 2 is the second previous, up to a\nuser configurable number (default 200).\n\nIf you prefer a more modern approach you can use a fuzzy finder such as\n[`fzf`][fzf], [`sk`][skim], [`tv`][television], or [`fzy`][fzy]\nto show and select from the list, instead of a simple index prompt. See the\nsection on [Fuzzy Finder Integration](#fuzzy-finder-integration) below.\n\nOther available commands and options are:\n\nList the current stack and its indices (without prompting):\n\n```sh\n$ cd -l\n```\n\nChange immediately to directory corresponding to stack index 4:\n\n```sh\n$ cd -4\n```\n\nNote that `cd -1` is equivalent to the native `cd -` for the previous\ndirectory, `cd -2` is the directory before that, etc.\n\nSearch back through stack for directory containing \"string\" in it's name and\n`cd` there:\n\n```sh\n$ cd -/string\n```\n\nNote, you can also type the text `string` at the `cd --` prompt to search, although for\nfrequent searching it is probably better to use an [integrated fuzzy\nfinder](#fuzzy-finder-integration).\n\nShow help/usage:\n\n```sh\n$ cd -h\n```\n\n## Installation\n\nArch users can install [cdhist from the\nAUR](https://aur.archlinux.org/packages/cdhist/) and skip to the next section.\n\nPython 3.8 or later is required. Note [cdhist is on\nPyPI](https://pypi.org/project/cdhist/) so the easiest way to install it is to\nuse [`uv tool`][uvtool] (or [`pipx`][pipx] or [`pipxu`][pipxu]).\n\n```sh\n$ uv tool install cdhist\n```\n\nTo upgrade:\n\n```sh\n$ uv tool upgrade cdhist\n```\n\nTo uninstall:\n\n```sh\n$ uv tool uninstall cdhist\n```\n\n## Setup\n\nA user who wants to use the cdhist facility should add the following line to\ntheir `~/.bashrc` or `~/.zshrc` file. Ensure it is added after where your PATH\nis set up so that the command `cdhist` can be found. This creates the `cd`\nwrapper command in your interactive shell session as a tiny function.\n\n```sh\nsource \u003c(cdhist -i)\n```\n\nThen log out and back in again to activate the new `cd` function. Note assuming\na normal `.bashrc` environment, this will alias your `cd` command in your\ninteractive terminal session only. The remapped `cd` will not be invoked by any\nprograms or scripts you run, or for other users etc.\n\n### Alternative Command Name\n\nSome people may prefer not to alias their real `cd` command to this utility and\njust use an alternative unique command name. To do this, simply add your\ndesired command name as the first argument to the `cdhist -i` option in your\nshell initialization code. E.g, to use the command name `xd` rather than `cd`,\nuse the following in your `~/.bashrc` or `~/.zshrc` file:\n\n```sh\nsource \u003c(cdhist -i xd)\n```\n\nThen log out/in, and then use `xd /tmp` to change dir, `xd --` to see and\nselect directories, etc.\n\n### Default Options\n\nYou can set default cdhist options by appending options in the shell\ninitialization code, e.g:\n\n```sh\nsource \u003c(cdhist -i \"cd -arm 100\")\n```\n\nThe above sets `-a (--purge-always)`, '' `-r (--git-relative)`, and `-m\n(--size) 100` options as defaults for your `cd` command.\n\nNote you can use multiple source lines to define multiple commands. E.g. define\none alias for your `cd` command, and another alias for your git worktree\ncommand (e.g. `wt`). Both can have different cdhist options.\n\nThe following options are sensible candidates to set as default options:\n`-m/--size`, `-a/--purge-always`, `-g/--git`, `-r/--git-relative`,\n`-u/--no-user`, `-F/--fuzzy`, `-G/--no-fuzzy-git`.\n\nNote if you set `-r/--git-relative` or `-u/--no-user` options as default then\noptions `-R/--no-git-relative` and `-U/--user` exist to allow you to\ntemporarily override those defaults via the command line.\n\n### Fuzzy Finder Integration\n\nAny of the popular command line fuzzy search finders such as\n[`fzf`][fzf], [`sk`][skim], [`tv`][television], or [`fzy`][fzy]\ncan be used with `cdhist`.\n\nE.g. to use [`fzf`][fzf]:\n\n```sh\nsource \u003c(cdhist -i \"cd -F fzf\")\n```\n\nOr, to use [`television`][television] with [`exa`][exa] to show a preview of\ndirectory contents:\n\n```sh\nsource \u003c(cdhist -i \"cd -uF \\\"tv --preview 'exa --color=always -l@F=always {}'\\\"\")\n```\n\nNow when you type `cd --` you will be prompted with a list of directories via\nyour fuzzy finder so you can search for a directory to select by fuzzy text\nmatching.\n\nNote if you use [`television`][television] then it is suggested to set the\n`television` option `input_bar_position = bottom` in the `ui` section of your\n[`~/.config/television/config.toml`](https://github.com/alexpasmantier/television/blob/main/.config/config.toml)\nfile so that the input bar is at the bottom of the screen and close where your\nterminal prompt usually is.\n\nIn the following description, [`fzf`][fzf] will be used as it is by far the\nmost popular fuzzy finder and the one used by the author. When you set up `fzf`\n[shell integration](https://junegunn.github.io/fzf/shell-integration/) then you\ncan use the following terminal key bindings for `fzf`:\n\n- `CTRL+t` to select files,\n- `CTRL+r` to select commands,\n- `ATL+c` to select directories.\n\nHowever, I never use the last `ATL+c` function because it lists directories\nonly under the current directory whereas I am much more interested in listing\nall directories I have previously visited, i.e. those maintained by cdhist. So\nI disable that function in `fzf` by setting the `FZF_ALT_C_COMMAND` to an empty\nstring before I source `fzf` in my `.bashrc` when [setting `fzf` up](https://junegunn.github.io/fzf/shell-integration/#setting-up-shell-integration).\n\nThen I set the following shell key binding in my `~/.inputrc` file (need to\nrestart your login shell/terminal to activate):\n\n```sh\n\"\\ec\": \"cd --\\n\"\n```\n\nNow pressing `ALT+c` invokes cdhist to bring up the `fzf` list of my previously\nvisited directories. Alternately, use `ALT+d` for cdhist and keep `ALT+c` for\nthe default `fzf` search behavior.\n\nYou also have the choice of keeping the standard `cd --` command to work with\nsimple index selection, and map a different cdhist command name to use with\n`ALT+c` only for the fuzzy finder. To do this, add the following 2 lines to your\n`~/.bashrc` or `~/.zshrc` file:\n\n```sh\nsource \u003c(cdhist -i)\nsource \u003c(cdhist -i \"cdfuzzy -F fzf\")\n```\n\nAnd then in your `~/.inputrc`:\n\n```\n\"\\ec\": \"cdfuzzy --\\n\"\n```\n\nNote all the above assumes you have the fuzzy finder somewhere in your PATH. If\nyou don't then just specify the full path, e.g:\n\n```sh\nsource \u003c(cdhist -i \"cd -F /path-to/fzf\")\n```\n\n### Yazi Integration\n\n[`cdhist.yazi`][cdhist.yazi] is a [Yazi][yazi] plugin that provides cdhist\nfunctionality within the [Yazi][yazi] terminal file manager.\n\n### GIT Worktree Integration\n\n[cdhist](http://github.com/bulletmark/cdhist) can be used to easily `cd`\nbetween [git worktree](https://git-scm.com/docs/git-worktree)\ndirectories. You use the `cd -g` command to list all your worktrees and\nbe prompted for one to select, and then you will be switched to the\nassociated directory, and it will be added to your `cd` history.\n\n```sh\n# Current directory:\n$ pwd\n/home/mark/src/myprog\n\n# List worktrees using standard git command:\n$ git worktree list\n/home/mark/src/myprog       f76b8e0 [main]\n/home/mark/src/development  9796714 [development]\n/home/mark/src/milestone1   bc921b8 [milestone1]\n/home/mark/src/test         e6d965a [test]\n\n# Alternately, use cdhist to list worktrees and choose one to navigate to:\n$ cd -g\n  3 ~/src/development 9796714 [development]\n  2 ~/src/milestone1  bc921b8 [milestone1]\n  1 ~/src/test        e6d965a [test]\n  0 ~/src/myprog      f76b8e0 [main]\nSelect index [or \u003center\u003e to quit]: 2\n\n$ pwd\n/home/mark/src/milestone1\n\n# Or, use cdhist to navigate to worktree dir for given branch name or\n# commit:\n$ cd -g main\n$ pwd\n/home/mark/src/myprog\n```\n\nInstead of having to type the full git repository directory name you merely are\nprompted with a list and enter it's index. Or just directly enter the branch\nname (or commit hash). The directories are displayed in the same order as the\noutput of the `git worktree list` command, except that the git directory\ncorresponding to the current working directory is shown first (index 0)\nconsistent with how the current directory is shown at index 0 for normal cd\nhistory and thus conveniently showing you which git worktree you are currently\nin which `git worktree list` unfortunately does not show.\n\nIn you enter text instead of an index, you only need to enter as much of the\nbranch name, or commit hash, as needed to be unique. Note that `cd -g` nicely\npresents paths based from your HOME directory with a tilde (`~`) unlike the\nlonger full path displayed by `git worktree list` (although you can disable\nthat with the `-u/--no-user` option, likely set as a [default\noption](#default-options)).\n\nNote if you have `-F/--fuzzy` enabled but you don't want to also use that for\ngit worktree selection then you can disable it with the `-G/--no-fuzzy-git`\noption.\n\n#### Relative Git Worktree Directories\n\nThe `git worktree list` command displays absolute directory paths, and cdhist\ndoes also by default, but many users prefer them displayed as shorter relative\npaths. The Git worktree command does not provide this but you can enable it in\ncdhist by adding the `-r/--git-relative` option, e.g:\n\n```sh\n$ cd -gr\n  3 ../development 9796714 [development]\n  2 ../milestone1  bc921b8 [milestone1]\n  1 ../test        e6d965a [test]\n  0 .              f76b8e0 [main]\nSelect index [or \u003center\u003e to quit]:\n```\n\nMost likely you will want to set this as your default so do that by adding\n`-r/--git-relative` as a [default option](#default-options).\n\n#### Git Worktree Functionality Alone\n\nSome users may want the git worktree functionality provided by cdhist but are\nnot interested in the standard `cd` history functionality, or alternately, want\nto use a completely separate command for the git worktree functionality. To do\nthis, simply add your desired command name and the git option the first\nargument to the `cdhist` command in your shell initialization code. E.g, to use\nthe command name `wt` for git worktree functionality (only), add the following\nin your `~/.bashrc` or `~/.zshrc` file:\n\n```sh\nsource \u003c(cdhist -i \"wt -g\")\n```\n\nThen log out/in. Type `wt` to list the git worktrees and be prompted to select\nthe directory etc. Of course, you can define this `wt` command in parallel to\nusing cdhist for your `cd` command if you want.\n\n## Command Line Usage\n\nType `cdhist -h` to view the usage summary:\n\n```\nusage: cdhist [-h] [-i] [-l] [-m SIZE] [-n NUM_LINES] [-p] [-a] [-g] [-r]\n                   [-R] [-u] [-U] [-F FUZZY] [-G] [-L] [-P] [-V]\n                   [directory]\n\nA Linux shell directory stack \"cd history\" function.\n\npositional arguments:\n  directory             directory (or branch for git worktree) to cd to, or\n                        \"--\" to list history and prompt, or \"-n\" for n'th\n                        entry in list or \"-/\u003cstring\u003e\" to match for \"string\" in\n                        dir\n\noptions:\n  -h, --help            show help/usage\n  -i, --init            output shell initialization code. Optionally specify\n                        alternative command name as argument, default=\"cd\"\n  -l, --list            just list directory history\n  -m, --size SIZE       maximum size of directory history (default=200)\n  -n, --num-lines NUM_LINES\n                        limit output to specified number of lines\n  -p, --purge           just purge non-existent directories from history\n  -a, --purge-always    always purge non-existent directories every write\n  -g, --git             show git worktree directories instead\n  -r, --git-relative    show relative git worktree paths instead of absolute\n  -R, --no-git-relative\n                        do not show relative git worktree paths (default)\n  -u, --no-user         do not substitute \"~\" for home directory\n  -U, --user            do substitute \"~\" for home directory (default)\n  -F, --fuzzy FUZZY     use specified fuzzy finder program to select directory\n                        from list\n  -G, --no-fuzzy-git    do not use fuzzy finder for git worktree selection\n  -L, --follow-links    follow symbolic links (default=true)\n  -P, --follow-physical\n                        follow links to physical directory\n  -V, --version         just output cdhist version\n```\n\n## Limitations\n\nRegular `cd`, e.g. as provided by the bash builtin, offers some esoteric\ncommand line options such as `-e` and `-@`, and shell options such as `autocd`,\n`cdspell`, `cdable_vars`. These rarely used options are not supported by\ncdhist.\n\n## License\n\nCopyright (C) 2010 Mark Blakeney. This program is distributed under the\nterms of the GNU General Public License.\nThis program is free software: you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation, either version 3 of the License, or any later\nversion.\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License at \u003chttp://www.gnu.org/licenses/\u003e for more details.\n\n[pipx]: https://github.com/pypa/pipx\n[pipxu]: https://github.com/bulletmark/pipxu\n[uvtool]: https://docs.astral.sh/uv/guides/tools/#installing-tools\n[fzf]: https://github.com/junegunn/fzf\n[fzy]: https://github.com/jhawthorn/fzy\n[skim]: https://github.com/skim-rs/skim\n[television]: https://github.com/alexpasmantier/television\n[cdhist.yazi]: https://github.com/bulletmark/cdhist.yazi\n[yazi]: https://yazi-rs.github.io/\n[exa]: https://github.com/ogham/exa\n","funding_links":[],"categories":["Plugins"],"sub_categories":["Jumping"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbulletmark%2Fcdhist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbulletmark%2Fcdhist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbulletmark%2Fcdhist/lists"}