doc: clearly indicate that neovim 0.7 is a minimum version
chore: add a target to generate tags
feat: detect bat on a wider variety of systems
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:
$HOME
directory. You then want to jump into your code as quickly as possible and this plugin can help!.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
s donât fit neatly into these constraint, with their .git
files.[^1]: SCM: Source-Control Management
telescope-repo.nvim
is based on telescope-ghq.nvim
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['rooter_cd_cmd'] = 'lcd'
For instance, with Packer.nvim:
use 'cljoly/telescope-repo.nvim'
use {
'nvim-telescope/telescope.nvim',
requires = { {'nvim-lua/plenary.nvim'} }
}
fd
to find the repositories on the filesystem with list
plocate
, lolcate-rs
or locate
to find the repositories on the filesystem with cached_list
glow
to preview markdown files, will fall back to bat
if not present (and uses cat
if neither are present)You can change the default argument given to subcommands (like list
or cached_list
) 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.git_files for git, falls back to builtin.find_files 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 |
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()
fd_opts
This is a relatively advanced option that you should use with caution. There is no guarantee that a particular set of options would work the same across multiple versions
This passes additional options to the command fd
that generates the repository list. It is inserted like so:
fd [set of default options] [fd_opts] --exec [some default command] [pattern] âŠ
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.
search_dirs
This limits the search to a particular directory or set of directories.
: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
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.
Note: at this point, the plugin does not manage index update. Updating the index often requires to run a command like updatedb
as root.
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
# https://egeek.me/2020/04/18/enabling-locate-on-osx/
if which glocate > /dev/null; then
alias locate="glocate -d $HOME/locatedb"
# Using cache_list requires `LOCATE_PATH` environment var to exist in session.
# trouble shoot: `echo $LOCATE_PATH` needs to return db path.
[[ -f "$HOME/locatedb" ]] && export LOCATE_PATH="$HOME/locatedb"
fi
alias 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.cached_list{locate_opts={"-d", vim.env.HOME .. "/locatedb"}}
Note: Installation and use of the plugin on systems other than GNU/Linux is community-maintained. Don't hesitate to open a discussion or a pull-request if something is not working!
Provide instructions on how to setup periodic update of the locate database.
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.
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
:
fd_opts
, as we donât use fd
with cached_list
,search_dirs
, as locate
does not accept a directory to search in.Chances are you will get results from folders you donât care about like .cache
or .cargo
. In that case, you can use the file_ignore_patterns
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.cached_list{file_ignore_patterns={"/%.cache/", "/%.cargo/"}}
locate
command, 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.%.
in Lua regex is an escaped .
as .
matches any characters./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.cached_list{file_ignore_patterns={"^".. vim.env.HOME .. "/%.cache/", "^".. vim.env.HOME .. "/%.cargo/"}}
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$]]} |
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/git_rst, /home/cj/qmk_firmware...
This may take a few seconds to run
The output of this command may point to missing dependencies.
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]]}
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.
Plenary.nvim 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.
StyLua is used for code formatting. It is run like so:
make fmt
To run the linter:
make lint
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
lolcate-rs
as a cached_list
provider:Telescope repo
does not errorsearch_dirs
argument is not mandatorycheckhealth
locate
, thus taking profit of a system-wide index.fd
git
repository