🦘 Jump into the repositories (git, mercurial…) of your filesystem with telescope.nvim, without any setup
🦘 telescope-repo.nvim: jump around the repositories in your filesystem, without any setup
telescope-repo is an extension for [telescope.nvim][] that searches the filesystem for git (or other SCM[^1], like Pijul, Mercurial…) repositories. It does not require any setup: the list of repositories is built on the fly over your whole $HOME, you don’t need to manually add projects or open some folders to populate this list, as opposed to telescope-project.nvim or project.nvim.
Use cases include:
- If you don’t start vim from the shell (from a GUI or as the start command of a terminal), you are most likely in your
$HOMEdirectory. You then want to jump into your code as quickly as possible and this plugin can help! - Sometimes, you have the definition of a function and use of it in different repositories (e.g. a library you wrote and a program using this library). This plugin helps to open the two, for instance in two splits.
.git file that is also a directory, all inside directory X”. Less popular SCMs like [Pijul][] have a different folder name, and even [git worktree][worktree]s don’t fit neatly into these constraint, with their .git files*.
[plenary]: https://github.com/nvim-lua/plenary.nvim [telescope.nvim]: https://github.com/nvim-telescope/telescope.nvim [Pijul]: https://pijul.org/ [worktree]: https://git-scm.com/docs/git-worktree [^1]: SCM: Source-Control Management
telescope-repo.nvim is based on telescope-ghq.nvim
Installation
You need to add these in your plugin management system[^2]:
'nvim-lua/plenary.nvim' 'nvim-telescope/telescope.nvim' 'cljoly/telescope-repo.nvim' And optionally, to load the extension: require'telescope'.load_extension'repo'
A handy companion plugin is vim-rooter, as it’ll change the current directory according to the current file’s detected project (often, the root of the git repository). To get it to change each buffer’s directory, instead of the whole editor by default, add the following Lua to your configuration:
g['rootercdcmd'] = 'lcd'
Packer
For instance, with Packer.nvim:
use 'cljoly/telescope-repo.nvim' use { 'nvim-telescope/telescope.nvim', requires = { {'nvim-lua/plenary.nvim'} } }
External Dependencies
Required
- [
fd][] to find the repositories on the filesystem withlist - [
plocate][], [lolcate-rs][] or [locate][] to find the repositories on the filesystem withcached_list
fd]: https://github.com/sharkdp/fd
[locate]: https://man.archlinux.org/man/locate.1
[plocate]: https://man.archlinux.org/man/plocate.1
[lolcate-rs]: https://github.com/ngirard/lolcate-rs
Optional
- [
glow][] to preview markdown files, will fall back to [bat][] if not present (and usescatif neither are present)
glow]: https://github.com/charmbracelet/glow
[bat]: https://github.com/sharkdp/bat
Usage
Global Configuration
You can change the default argument given to subcommands (like list or cachedlist) using the telescope setup function with a table like this:
{
extensions = {
repo = {
<subcommand> = {
<argument> = {
"new",
"default",
"value",
},
},
settings = {
auto_lcd = true,
}
},
},
}
for instance, you could do:
require("telescope").setup {
extensions = {
repo = {
list = {
fd_opts = {
"--no-ignore-vcs",
},
search_dirs = {
"~/my_projects",
},
},
},
},
}
require("telescope").load_extension "repo"
Note: make sure to have require("telescope").load_extension "repo" after the call to require("telescope").setup {…}, otherwise the global configuration won’t be taken into account.
list
:Telescope repo list or lua require'telescope'.extensions.repo.list{}
Running repo list and list repositories' paths.
| key | action | |------------------|----------------------| | <CR> (edit) | builtin.gitfiles for git, falls back to builtin.findfiles for other SCMs | | <C-v> (vertical) | builtin.live_grep in the selected project | | <C-t> (tab) | Same as <CR> but opens a new tab. Also, does a cd into the project’s directory for this tab only |
Options
bin
Filepath for the binary fd.
" path can be expanded
:Telescope repo list bin=~/fd
pattern
Pattern of the SCM database folder.
Default value: [[^\.git$]]
cwd
Transform the result paths into relative ones with this value as the base dir.
Default value: vim.fn.getcwd()
fdopts & findexec_opts
These are relatively advanced options that you should use with caution. There is no guarantee that a particular set of options would work the same across multiple versions of the plugin
This passes additional exec options to the command fd that generates the repository list. It is inserted like so:
fd [set of default options] [fdopts] --exec [findexec_opts] [pattern] …
fd_opts Example
Let’s say you have a git repository S inside another git repository M (for instance because of #5), but S is in a directory that’s ignored in the .gitignore in M. S wouldn’t appear in the Telescope list of this extension by default, because it is ignored (.gitignore are taken into account by default).
To avoid taking into account the .gitignore, we need to pass --no-ignore-vcs to fd, like so (in NeoVim):
:lua require'telescope'.extensions.repo.list{fd_opts={'--no-ignore-vcs'}}
This will list M and S in the Telescope output. The downside is that listing repositories will be a little longer, as we don’t skip the git-ignored files anymore.
fdexecopts Example
This is mainly to accommodate different OS shells like PowerShell on Windows.
Note By default, windows should be automatically detected and you shouldn’t need to do this.
Let’s say you try to use telescope repo in windows powershell, then the command could be something like this to make it work
fd --exec powershell /C "echo {//}" ; ^\.git$
To use an equivalent command with the plugin, run:
:lua require'telescope'.extensions.repo.list{fdexecopts={'powershell /C "echo {//}"'}}
search_dirs
This limits the search to a particular directory or set of directories.
Example
:lua require'telescope'.extensions.repo.list{search_dirs = {"~/ghq/github.com", "~/ghq/git.sr.ht"}}
:lua require'telescope'.extensions.repo.list{search_dirs = {"~/.local/share/nvim/site/pack"}}
tail_path
Show only basename of the path.
Default value: false
shorten_path
Call pathshorten() for each path. This will for instance transform /home/me/code/project to /h/m/c/project.
Default value: false
Examples
Here is how you can use this plugin with various SCM:
| SCM | Command | |--------|----------------------------------------------------------------------------| | git | :Telescope repo list or lua require'telescope'.extensions.repo.list{} | | pijul | lua require'telescope'.extensions.repo.list{pattern=[[^\.pijul$]]} | | hg | lua require'telescope'.extensions.repo.list{pattern=[[^\.hg$]]} | | fossil | lua require'telescope'.extensions.repo.list{pattern=[[^\.fslckout$]]} |
Is your favorite SCM missing? It should be straightforward to support it by changing the pattern parameter. If you want it to be considered for addition here, open a PR!
cached_list
:Telescope repo cached_list
This relies on a locate command to find repositories. This should be much faster than the list command, as it relies on a pre-built index but results may be stalled.
General Notes for updatedb
At this point, the plugin does not manage index update.
Updating the index often requires to run a command like updatedb as root. If the cachedlist command does not return anything, it might be due to the configuration of the updatedb command. You can run sudo updatedb -v --debug-pruning to see if the directories you expect are indexed. You should see lines like the following if a repository named "rusqliemigration" is indexed:
/home/cjoly/worktree/rusqlite/rusqlite_migration/Cargo.toml
/home/cjoly/worktree/rusqlite/rusqlite_migration/README.md
/home/cjoly/worktree/rusqlite/rusqlite_migration/.git
You might need to tweak the settings in the file /etc/updatedb.conf. The corresponding manpage may be useful as well.
Notes for MacOS
glocate command used for caching on MacOS comes with gnu findutils which can be installed with
brew install findutils With glocate installed use, add the following to your .bashrc/.zshrc
bashenvironment var to exist in session. # trouble shoot:https://egeek.me/2020/04/18/enabling-locate-on-osx/
if which glocate > /dev/null; then alias locate="glocate -d $HOME/locatedb"# Using cachelist requires
LOCATEPATHecho $LOCATE_PATHneeds to return db path. [[ -f "$HOME/locatedb" ]] && export LOCATE_PATH="$HOME/locatedb" fialias loaddb="gupdatedb --localpaths=$HOME --prunepaths=/Volumes --output=$HOME/locatedb"
After you have run loaddb the first time you need to reload the shell to make sure that it exports the LOCATE_PATH variable. Then the following command should work:
lua require'telescope'.extensions.repo.cached_list()
If nothing is shown, even after a little while, try this:
lua require'telescope'.extensions.repo.cachedlist{locateopts={"-d", vim.env.HOME .. "/locatedb"}}
[!WARNING]
Installation and use of the plugin on systems other than GNU/Linux is community-maintained. Don't hesitate to open [a discussion][discuss-qa] or [a pull-request][pr] if something is not working!
[discuss-qa]: https://github.com/cljoly/telescope-repo.nvim/discussions/categories/q-a [pr]: https://github.com/cljoly/telescope-repo.nvim/pulls
Troubleshooting
You should try to run:
sudo updatedb if you encounter any problems. If it’s not the case by default, you should automate such index update with for instance cron or systemd-timers. See https://wiki.archlinux.org/title/Locate and this discussion for various ways to automate this.
Options
Options are the similar to repo list, bearing in mind that we use locate instead of fd. Note that the following list options are not supported in cached_list:
fdoptsandfdexecopts, as we don’t usefdwithcachedlist,search_dirs, aslocatedoes not accept a directory to search in.
Examples
Exclude Irrelevant Results
Chances are you will get results from folders you don’t care about like .cache or .cargo. In that case, you can use the fileignorepatterns option of Telescope, like so (these are Lua regexes).
Hide all git repositories that may be in .cache or .cargo:
:lua require'telescope'.extensions.repo.cachedlist{fileignore_patterns={"/%.cache/", "/%.cargo/"}} Notes
- These patterns are used to filter the output of the
locatecommand, so they don’t speed up the search in any way. You should use them mainly to exclude git repositories you won’t want to jump into, not in the hope to enhance performance. - The
%.in Lua regex is an escaped.as.matches any characters. - These patterns are applied against whole paths like
/home/myuser/.cache/some/dir, so if you want to exclude only/home/myuser/.cache, you need a more complicated pattern like so:
:lua require'telescope'.extensions.repo.cachedlist{fileignore_patterns={"^".. vim.env.HOME .. "/%.cache/", "^".. vim.env.HOME .. "/%.cargo/"}}
Use With Other SCMs
Here is how you can use this plugin with various SCM (we match on the whole path with locate, so patterns differ slightly from repo list: notice the ^ that becomes a /):
| SCM | Command | |--------|----------------------------------------------------------------------------| | git | :Telescope repo list or lua require'telescope'.extensions.repo.list{} | | pijul | lua require'telescope'.extensions.repo.list{pattern=[[/\.pijul$]]} | | hg | lua require'telescope'.extensions.repo.list{pattern=[[/\.hg$]]} | | fossil | lua require'telescope'.extensions.repo.list{pattern=[[/\.fslckout$]]} |
FAQ
No repositories are found
Make sure that :checkhealth telescope shows something like:
## Telescope Extension: repo - OK: Will use glow to preview markdown READMEs - OK: Will use bat to preview non-markdown READMEs - OK: locate: found plocate plocate 1.1.13 Copyright 2020 Steinar H. Gunderson License GPLv2+: GNU GPL version 2 or later <https://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. - INFO: Repos found for :Telescope repo cached_list: /home/cj/.cache/yay/android-sdk/.git, /home/cj/.cache/yay/android-sdk-platform-tools/.git... - OK: fd: found fd fd 8.3.0 - INFO: Repos found for :Telescope repo list: /home/cj/tmp/gitrst, /home/cj/qmkfirmware... This may take a few seconds to run
The output of this command may point to missing dependencies.
Getting the repository list is slow
If :Telescope repo list is slow, you can use your .fdignore to exclude some folders from your filesystem. You can even use a custom ignore file with the --ignore-file option, like so:
lua require'telescope'.extensions.repo.list{fd_opts=[[--ignore-file=myignorefile]]}
Contribute
Contributions are welcome, see this document!
The telescope developers documentation is very useful to understand how plugins work and you may find these tips useful as well.
Running tests
[Plenary.nvim][plenary] integration tests are executed as a part of the CI checks. However, they are very basic for now and you might be better off just testing the two commands locally.
Code Formatting & Linting
StyLua is used for code formatting. It is run like so:
make fmt
To run the linter:
make lint
Acknowledgement
I would like to thank all the contributors to this plugin, as well as the developers of neovim and Telescope. Without them, none of this would be possible.
Thanks to Code Smell for demoing the plugin in 5 Terrific Neovim Telescope Extensions for 2022 🔭.
Furthermore, thanks to Migadu for offering a discounted service to support this project. It is not an endorsement by Migadu though.
Stability
We understand that you need a reliable plugin that never breaks. To this end, code changes are first tested on our machines in a separate dev branch and once we are reasonably confident that changes don’t have unintended side-effects, they get merged to the master branch, where a wider user-base will get the changes. We also often tag releases, holding a more mature, coherent set of changes. If you are especially sensitive to changes, instruct your package manager to install the version pointed by a particular tag and watch for new releases on GitHub or via RSS. Conversely, if you wish to live on the bleeding-edge, instruct your package manager to use the dev branch.
[^2]: See also Stability
Changelog
0.4.0
- Require nvim 0.10+
- Allow storing settings in telescope global table
- Add a feature to switch to the project directory. This is experimental, gated behind the
auto_lcdsetting (see the global configuration section for an example) - Add support for
vim.healthreporting - Expand unit tests
- Add .editorconfig
- Misc. fixes, see full commit history
0.3.0
- Add support for
lolcate-rsas acached_listprovider - Add an option to restrict the search to some directories
- Add fallback command so that
:Telescope repodoes not error - Fixes:
search_dirs argument is not mandatory
- Dev: add tests, CI, formatting with stylua
- Documentation: update with new features, installation instructions, code formatting reference and other fixes
0.2.0
- Add support for
checkhealth - Add picker that builds the list of repositories from
locate, thus taking profit of a system-wide index. - Add mappings leading to various actions
- Preview non-markdown Readme file
0.1.0
- Basic feature, generate a dynamic project list with
fd - Falls back to file listing if we are not in a
gitrepository