1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-03-13 02:05:40 +08:00

chore(telescope): update telescope to 0.1.2

This commit is contained in:
wsdjeg 2023-06-15 11:55:36 +08:00
parent 9be79c8e5a
commit a7194fbafa
46 changed files with 934 additions and 928 deletions

View File

@ -10,30 +10,38 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
include: include:
- os: ubuntu-20.04 - os: ubuntu-22.04
url: https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.tar.gz rev: nightly/nvim-linux64.tar.gz
manager: sudo apt-get manager: sudo apt-get
packages: -y ripgrep packages: -y ripgrep
- os: ubuntu-20.04 - os: ubuntu-22.04
url: https://github.com/neovim/neovim/releases/download/v0.7.0/nvim-linux64.tar.gz rev: v0.7.2/nvim-linux64.tar.gz
manager: sudo apt-get manager: sudo apt-get
packages: -y ripgrep packages: -y ripgrep
- os: macos-10.15 - os: ubuntu-22.04
url: https://github.com/neovim/neovim/releases/download/nightly/nvim-macos.tar.gz rev: v0.8.1/nvim-linux64.tar.gz
manager: sudo apt-get
packages: -y ripgrep
- os: macos-12
rev: nightly/nvim-macos.tar.gz
manager: brew manager: brew
packages: ripgrep packages: ripgrep
- os: macos-10.15 - os: macos-12
url: https://github.com/neovim/neovim/releases/download/v0.7.0/nvim-macos.tar.gz rev: v0.7.2/nvim-macos.tar.gz
manager: brew
packages: ripgrep
- os: macos-12
rev: v0.8.1/nvim-macos.tar.gz
manager: brew manager: brew
packages: ripgrep packages: ripgrep
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- run: date +%F > todays-date - run: date +%F > todays-date
- name: Restore from todays cache - name: Restore from todays cache
uses: actions/cache@v2 uses: actions/cache@v3
with: with:
path: _neovim path: _neovim
key: ${{ runner.os }}-${{ matrix.url }}-${{ hashFiles('todays-date') }} key: ${{ runner.os }}-${{ matrix.rev }}-${{ hashFiles('todays-date') }}
- name: Prepare - name: Prepare
run: | run: |
@ -41,11 +49,11 @@ jobs:
${{ matrix.manager }} install ${{ matrix.packages }} ${{ matrix.manager }} install ${{ matrix.packages }}
test -d _neovim || { test -d _neovim || {
mkdir -p _neovim mkdir -p _neovim
curl -sL ${{ matrix.url }} | tar xzf - --strip-components=1 -C "${PWD}/_neovim" curl -sL "https://github.com/neovim/neovim/releases/download/${{ matrix.rev }}" | tar xzf - --strip-components=1 -C "${PWD}/_neovim"
} }
mkdir -p ~/.local/share/nvim/site/pack/vendor/start mkdir -p ~/.local/share/nvim/site/pack/vendor/start
git clone --depth 1 https://github.com/nvim-lua/plenary.nvim ~/.local/share/nvim/site/pack/vendor/start/plenary.nvim git clone --depth 1 https://github.com/nvim-lua/plenary.nvim ~/.local/share/nvim/site/pack/vendor/start/plenary.nvim
git clone --depth 1 https://github.com/kyazdani42/nvim-web-devicons ~/.local/share/nvim/site/pack/vendor/start/nvim-web-devicons git clone --depth 1 https://github.com/nvim-tree/nvim-web-devicons ~/.local/share/nvim/site/pack/vendor/start/nvim-web-devicons
ln -s $(pwd) ~/.local/share/nvim/site/pack/vendor/start ln -s $(pwd) ~/.local/share/nvim/site/pack/vendor/start
- name: Run tests - name: Run tests

View File

@ -13,13 +13,13 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
include: include:
- os: ubuntu-20.04 - os: ubuntu-22.04
url: https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.tar.gz url: https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.tar.gz
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- run: date +%F > todays-date - run: date +%F > todays-date
- name: Restore cache for today's nightly. - name: Restore cache for today's nightly.
uses: actions/cache@v2 uses: actions/cache@v3
with: with:
path: _neovim path: _neovim
key: ${{ runner.os }}-${{ matrix.url }}-${{ hashFiles('todays-date') }} key: ${{ runner.os }}-${{ matrix.url }}-${{ hashFiles('todays-date') }}
@ -32,13 +32,14 @@ jobs:
} }
mkdir -p ~/.local/share/nvim/site/pack/vendor/start mkdir -p ~/.local/share/nvim/site/pack/vendor/start
git clone --depth 1 https://github.com/nvim-lua/plenary.nvim ~/.local/share/nvim/site/pack/vendor/start/plenary.nvim git clone --depth 1 https://github.com/nvim-lua/plenary.nvim ~/.local/share/nvim/site/pack/vendor/start/plenary.nvim
git clone --depth 1 https://github.com/tjdevries/tree-sitter-lua ~/.local/share/nvim/site/pack/vendor/start/tree-sitter-lua git clone https://github.com/tjdevries/tree-sitter-lua ~/.local/share/nvim/site/pack/vendor/start/tree-sitter-lua
ln -s $(pwd) ~/.local/share/nvim/site/pack/vendor/start ln -s $(pwd) ~/.local/share/nvim/site/pack/vendor/start
- name: Build parser - name: Build parser
run: | run: |
# We have to build the parser every single time to keep up with parser changes # We have to build the parser every single time to keep up with parser changes
cd ~/.local/share/nvim/site/pack/vendor/start/tree-sitter-lua cd ~/.local/share/nvim/site/pack/vendor/start/tree-sitter-lua
git checkout 86f74dfb69c570f0749b241f8f5489f8f50adbea
make dist make dist
cd - cd -

View File

@ -7,7 +7,7 @@ jobs:
name: Luacheck name: Luacheck
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Prepare - name: Prepare
run: | run: |
@ -22,9 +22,10 @@ jobs:
name: stylua name: stylua
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- uses: JohnnyMorganz/stylua-action@v1 - uses: JohnnyMorganz/stylua-action@v3
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
version: latest
# CLI arguments # CLI arguments
args: --color always --check lua/ args: --color always --check lua/

View File

@ -0,0 +1,29 @@
name: "release"
on:
push:
tags:
- '*'
jobs:
luarocks-upload:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- name: LuaRocks Upload
uses: nvim-neorocks/luarocks-tag-release@v1.0.2
env:
LUAROCKS_API_KEY: ${{ secrets.LUAROCKS_API_KEY }}
with:
summary: "Find, Filter, Preview, Pick. All lua, all the time."
detailed_description: |
A highly extendable fuzzy finder over lists.
Built on the latest awesome features from neovim core.
Telescope is centered around modularity, allowing for easy customization.
dependencies: |
plenary.nvim
copy_directories: |
doc
ftplugin
plugin
scripts
autoload
data

View File

@ -17,10 +17,17 @@ globals = {
"TelescopeGlobalState", "TelescopeGlobalState",
"_TelescopeConfigurationValues", "_TelescopeConfigurationValues",
"_TelescopeConfigurationPickers", "_TelescopeConfigurationPickers",
"__TelescopeKeymapStore",
} }
-- Global objects defined by the C code -- Global objects defined by the C code
read_globals = { read_globals = {
"vim", "vim",
} }
files = {
["lua/telescope/builtin/init.lua"] = {
ignore = {
"631", -- allow line len > 120
}
},
}

View File

@ -1,6 +1,7 @@
# telescope.nvim # telescope.nvim
[![Gitter](https://badges.gitter.im/nvim-telescope/community.svg)](https://gitter.im/nvim-telescope/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Gitter](https://badges.gitter.im/nvim-telescope/community.svg)](https://gitter.im/nvim-telescope/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
[![LuaRocks](https://img.shields.io/luarocks/v/Conni2461/telescope.nvim?logo=lua&color=purple)](https://luarocks.org/modules/Conni2461/telescope.nvim)
Gaze deeply into unknown regions using the power of the moon. Gaze deeply into unknown regions using the power of the moon.
@ -51,7 +52,7 @@ latest neovim nightly commit is required for `telescope.nvim` to work.
### Suggested dependencies ### Suggested dependencies
- [BurntSushi/ripgrep](https://github.com/BurntSushi/ripgrep) is required for - [BurntSushi/ripgrep](https://github.com/BurntSushi/ripgrep) is required for
`live_grep` and `grep_string` and is the first priority for `find_files`. `live_grep` and `grep_string`
We also suggest you install one native telescope sorter to significantly improve We also suggest you install one native telescope sorter to significantly improve
sorting performance. Take a look at either sorting performance. Take a look at either
@ -67,7 +68,7 @@ wiki.
- [sharkdp/fd](https://github.com/sharkdp/fd) (finder) - [sharkdp/fd](https://github.com/sharkdp/fd) (finder)
- [nvim-treesitter/nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter) (finder/preview) - [nvim-treesitter/nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter) (finder/preview)
- [neovim LSP]( https://neovim.io/doc/user/lsp.html) (picker) - [neovim LSP]( https://neovim.io/doc/user/lsp.html) (picker)
- [devicons](https://github.com/kyazdani42/nvim-web-devicons) (icons) - [devicons](https://github.com/nvim-tree/nvim-web-devicons) (icons)
### Installation ### Installation
@ -82,7 +83,7 @@ Using [vim-plug](https://github.com/junegunn/vim-plug)
```viml ```viml
Plug 'nvim-lua/plenary.nvim' Plug 'nvim-lua/plenary.nvim'
Plug 'nvim-telescope/telescope.nvim', { 'tag': '0.1.0' } Plug 'nvim-telescope/telescope.nvim', { 'tag': '0.1.1' }
" or , { 'branch': '0.1.x' } " or , { 'branch': '0.1.x' }
``` ```
@ -90,19 +91,37 @@ Using [dein](https://github.com/Shougo/dein.vim)
```viml ```viml
call dein#add('nvim-lua/plenary.nvim') call dein#add('nvim-lua/plenary.nvim')
call dein#add('nvim-telescope/telescope.nvim', { 'rev': '0.1.0' }) call dein#add('nvim-telescope/telescope.nvim', { 'rev': '0.1.1' })
" or , { 'rev': '0.1.x' }) " or , { 'rev': '0.1.x' })
``` ```
Using [packer.nvim](https://github.com/wbthomason/packer.nvim) Using [packer.nvim](https://github.com/wbthomason/packer.nvim)
```lua ```lua
use { use {
'nvim-telescope/telescope.nvim', tag = '0.1.0', 'nvim-telescope/telescope.nvim', tag = '0.1.1',
-- or , branch = '0.1.x', -- or , branch = '0.1.x',
requires = { {'nvim-lua/plenary.nvim'} } requires = { {'nvim-lua/plenary.nvim'} }
} }
``` ```
Using [lazy.nvim](https://github.com/folke/lazy.nvim)
```lua
-- init.lua:
{
'nvim-telescope/telescope.nvim', tag = '0.1.1',
-- or , branch = '0.1.1',
dependencies = { 'nvim-lua/plenary.nvim' }
}
-- plugins/telescope.lua:
return {
'nvim-telescope/telescope.nvim', tag = '0.1.1',
-- or , branch = '0.1.1',
dependencies = { 'nvim-lua/plenary.nvim' }
}
```
### checkhealth ### checkhealth
Make sure you call `:checkhealth telescope` after installing telescope to ensure Make sure you call `:checkhealth telescope` after installing telescope to ensure
@ -279,12 +298,12 @@ Built-in functions. Ready to be bound to any key you like.
### File Pickers ### File Pickers
| Functions | Description | | Functions | Description |
|-------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| |-------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `builtin.find_files` | Lists files in your current working directory, respects .gitignore | | `builtin.find_files` | Lists files in your current working directory, respects .gitignore |
| `builtin.git_files` | Fuzzy search through the output of `git ls-files` command, respects .gitignore | | `builtin.git_files` | Fuzzy search through the output of `git ls-files` command, respects .gitignore |
| `builtin.grep_string` | Searches for the string under your cursor in your current working directory | | `builtin.grep_string` | Searches for the string under your cursor in your current working directory |
| `builtin.live_grep` | Search for a string in your current working directory and get results live as you type, respects .gitignore | | `builtin.live_grep` | Search for a string in your current working directory and get results live as you type, respects .gitignore. (Requires [ripgrep](https://github.com/BurntSushi/ripgrep)) |
### Vim Pickers ### Vim Pickers
@ -338,7 +357,7 @@ Built-in functions. Ready to be bound to any key you like.
|-------------------------------------|------------------------------------------------------------------------------------------------------------| |-------------------------------------|------------------------------------------------------------------------------------------------------------|
| `builtin.git_commits` | Lists git commits with diff preview, checkout action `<cr>`, reset mixed `<C-r>m`, reset soft `<C-r>s` and reset hard `<C-r>h` | | `builtin.git_commits` | Lists git commits with diff preview, checkout action `<cr>`, reset mixed `<C-r>m`, reset soft `<C-r>s` and reset hard `<C-r>h` |
| `builtin.git_bcommits` | Lists buffer's git commits with diff preview and checks them out on `<cr>` | | `builtin.git_bcommits` | Lists buffer's git commits with diff preview and checks them out on `<cr>` |
| `builtin.git_branches` | Lists all branches with log preview, checkout action `<cr>`, track action `<C-t>` and rebase action`<C-r>` | | `builtin.git_branches` | Lists all branches with log preview, checkout action `<cr>`, track action `<C-t>`, rebase action`<C-r>`, create action `<C-a>`, switch action `<C-s>`, delete action `<C-d>` and merge action `<C-y>` |
| `builtin.git_status` | Lists current changes per file with diff preview and add action. (Multi-selection still WIP) | | `builtin.git_status` | Lists current changes per file with diff preview and add action. (Multi-selection still WIP) |
| `builtin.git_stash` | Lists stash items in current repository with ability to apply them on `<cr>` | | `builtin.git_stash` | Lists stash items in current repository with ability to apply them on `<cr>` |
@ -524,7 +543,7 @@ Telescope user autocmds:
## Extensions ## Extensions
Telescope provides the capabilities to create & register extensions, which Telescope provides the capabilities to create & register extensions, which
improve telescope in a variety of ways. improves telescope in a variety of ways.
Some extensions provide integration with external tools, outside of the scope of Some extensions provide integration with external tools, outside of the scope of
`builtins`. Others provide performance enhancements by using compiled C and `builtins`. Others provide performance enhancements by using compiled C and

View File

@ -264,7 +264,7 @@ find results and call `entry_maker` for each entry. An example usage would be
`find`. `find`.
```lua ```lua
finder = finders.new_oneshot_job({ "find" }, opts ), finder = finders.new_oneshot_job { "find", opts },
``` ```
### More examples ### More examples

View File

@ -6,9 +6,9 @@ filter, find and pick things in Lua.
Getting started with telescope: Getting started with telescope:
1. Run `:checkhealth telescope` to make sure everything is installed. 1. Run `:checkhealth telescope` to make sure everything is installed.
2. Evaluate it working with `:Telescope find_files` or `:lua 2. Evaluate it is working with `:Telescope find_files` or `:lua
require("telescope.builtin").find_files()` require("telescope.builtin").find_files()`
3. Put a `require("telescope").setup() call somewhere in your neovim config. 3. Put a `require("telescope").setup()` call somewhere in your neovim config.
4. Read |telescope.setup| to check what config keys are available and what 4. Read |telescope.setup| to check what config keys are available and what
you can put inside the setup call you can put inside the setup call
5. Read |telescope.builtin| to check which builtin pickers are offered and 5. Read |telescope.builtin| to check which builtin pickers are offered and
@ -24,14 +24,14 @@ The below flow chart illustrates a simplified telescope architecture:
│ │ ┌───│Manager│────│ Sorter │┐ └───┬───* │ │ │ ┌───│Manager│────│ Sorter │┐ └───┬───* │
│ ▼ ▼ └───────* └────────┘│ │ │ │ ▼ ▼ └───────* └────────┘│ │ │
│ 1────────┐ 2───┴──┐ │ │ │ 1────────┐ 2───┴──┐ │ │
│ ┌─────│ Picker │ │Finder│────┘ │ │ ┌─────│ Picker │ │Finder│────┘ │
│ ▼ └───┬────┘ └──────* │ │ ▼ └───┬────┘ └──────* │
│ ┌────────┐ │ 3────────+ ▲ │ │ ┌────────┐ │ 3────────+ ▲ │
│ │Selected│ └───────│ Prompt │─────────┘ │ │ │Selected│ └───────│ Prompt │─────────┘ │
│ │ Entry │ └───┬────┘ │ │ │ Entry │ └───┬────┘ │
│ └────────* ┌───┴────┐ ┌────────┐ ┌────────┐ │ │ └────────* ┌───┴────┐ ┌────────┐ ┌────────┐ │
│ │ ▲ 4─────────┐│ Prompt │ │(Attach)│ │Actions │ │ │ │ ▲ 4─────────┐│ Prompt │ │(Attach)│ │Actions │ │
│ ▼ └──► │ Results ││ Buffer │◄─┤Mappings│◄─┤User Fn │ │ │ ▼ └──▶ │ Results ││ Buffer │◀─┤Mappings│◀─┤User Fn │ │
│5─────────┐ └─────────┘└────────┘ └────────┘ └────────┘ │ │5─────────┐ └─────────┘└────────┘ └────────┘ └────────┘ │
││Previewer│ │ ││Previewer│ │
│└─────────┘ telescope.nvim architecture │ │└─────────┘ telescope.nvim architecture │
@ -192,13 +192,13 @@ telescope.setup({opts}) *telescope.setup()*
*telescope.defaults.cycle_layout_list* *telescope.defaults.cycle_layout_list*
cycle_layout_list: ~ cycle_layout_list: ~
Determines the layouts to cycle through when using `actions.cycle_layout_next` Determines the layouts to cycle through when using `actions.layout.cycle_layout_next`
and `actions.cycle_layout_prev`. and `actions.layout.cycle_layout_prev`.
Should be a list of "layout setups". Should be a list of "layout setups".
Each "layout setup" can take one of two forms: Each "layout setup" can take one of two forms:
1. string <br> 1. string
This is interpreted as the name of a `layout_strategy` This is interpreted as the name of a `layout_strategy`
2. table <br> 2. table
A table with possible keys `layout_strategy`, `layout_config` and `previewer` A table with possible keys `layout_strategy`, `layout_config` and `previewer`
Default: { "horizontal", "vertical" } Default: { "horizontal", "vertical" }
@ -227,7 +227,6 @@ telescope.setup({opts}) *telescope.setup()*
selection_caret: ~ selection_caret: ~
The character(s) that will be shown in front of the current selection. The character(s) that will be shown in front of the current selection.
Default: '> ' Default: '> '
*telescope.defaults.entry_prefix* *telescope.defaults.entry_prefix*
@ -260,7 +259,7 @@ telescope.setup({opts}) *telescope.setup()*
*telescope.defaults.path_display* *telescope.defaults.path_display*
path_display: ~ path_display: ~
Determines how file paths are displayed Determines how file paths are displayed.
path_display can be set to an array with a combination of: path_display can be set to an array with a combination of:
- "hidden" hide file names - "hidden" hide file names
@ -273,7 +272,7 @@ telescope.setup({opts}) *telescope.setup()*
- "shorten" only display the first character of each directory in - "shorten" only display the first character of each directory in
the path the path
- "truncate" truncates the start of the path when the whole path will - "truncate" truncates the start of the path when the whole path will
not fit. To increase the the gap between the path and the edge. not fit. To increase the gap between the path and the edge,
set truncate to number `truncate = 3` set truncate to number `truncate = 3`
You can also specify the number of characters of each directory name You can also specify the number of characters of each directory name
@ -352,7 +351,7 @@ telescope.setup({opts}) *telescope.setup()*
prompt_title: ~ prompt_title: ~
Defines the default title of the prompt window. A false value Defines the default title of the prompt window. A false value
can be used to hide the title altogether. Most of the times builtins can be used to hide the title altogether. Most of the times builtins
define a prompt_title which will be prefered over this default. define a prompt_title which will be preferred over this default.
Default: "Prompt" Default: "Prompt"
@ -371,6 +370,8 @@ telescope.setup({opts}) *telescope.setup()*
Will allow you to completely remove all of telescope's default maps Will allow you to completely remove all of telescope's default maps
and use your own. and use your own.
Default: nil
*telescope.defaults.history* *telescope.defaults.history*
history: ~ history: ~
@ -388,11 +389,11 @@ telescope.setup({opts}) *telescope.setup()*
Fields: Fields:
- path: The path to the telescope history as string. - path: The path to the telescope history as string.
default: stdpath("data")/telescope_history Default: stdpath("data")/telescope_history
- limit: The amount of entries that will be written in the - limit: The amount of entries that will be written in the
history. history.
Warning: If limit is set to nil it will grow unbound. Warning: If limit is set to nil it will grow unbound.
default: 100 Default: 100
- handler: A lua function that implements the history. - handler: A lua function that implements the history.
This is meant as a developer setting for extensions to This is meant as a developer setting for extensions to
override the history handling, e.g., override the history handling, e.g.,
@ -420,7 +421,8 @@ telescope.setup({opts}) *telescope.setup()*
indices larger than `cache_picker.num_pickers` will indices larger than `cache_picker.num_pickers` will
be cleared. be cleared.
Default: 1 Default: 1
- limit_entries: The amount of entries that will be written in the - limit_entries: The amount of entries that will be saved for each
picker.
Default: 1000 Default: 1000
@ -514,7 +516,7 @@ telescope.setup({opts}) *telescope.setup()*
- msg_bg_fillchar: Character to fill background of unpreviewable buffers with - msg_bg_fillchar: Character to fill background of unpreviewable buffers with
Default: "" Default: ""
- hide_on_startup: Hide previewer when picker starts. Previewer can be toggled - hide_on_startup: Hide previewer when picker starts. Previewer can be toggled
with actions.toggle_preview. with actions.layout.toggle_preview.
Default: false Default: false
@ -565,7 +567,7 @@ telescope.setup({opts}) *telescope.setup()*
file_sorter: ~ file_sorter: ~
A function pointer that specifies the file_sorter. This sorter will A function pointer that specifies the file_sorter. This sorter will
be used for find_files, git_files and similar. be used for find_files, git_files and similar.
Hint: If you load a native sorter, you dont need to change this value, Hint: If you load a native sorter, you don't need to change this value,
the native sorter will override it anyway. the native sorter will override it anyway.
Default: require("telescope.sorters").get_fzy_sorter Default: require("telescope.sorters").get_fzy_sorter
@ -574,7 +576,7 @@ telescope.setup({opts}) *telescope.setup()*
generic_sorter: ~ generic_sorter: ~
A function pointer to the generic sorter. The sorter that should be A function pointer to the generic sorter. The sorter that should be
used for everything that is not a file. used for everything that is not a file.
Hint: If you load a native sorter, you dont need to change this value, Hint: If you load a native sorter, you don't need to change this value,
the native sorter will override it anyway. the native sorter will override it anyway.
Default: require("telescope.sorters").get_fzy_sorter Default: require("telescope.sorters").get_fzy_sorter
@ -583,7 +585,7 @@ telescope.setup({opts}) *telescope.setup()*
prefilter_sorter: ~ prefilter_sorter: ~
This points to a wrapper sorter around the generic_sorter that is able This points to a wrapper sorter around the generic_sorter that is able
to do prefiltering. to do prefiltering.
Its usually used for lsp_*_symbols and lsp_*_diagnostics It's usually used for lsp_*_symbols and lsp_*_diagnostics
Default: require("telescope.sorters").prefilter Default: require("telescope.sorters").prefilter
@ -794,6 +796,8 @@ builtin.live_grep({opts}) *telescope.builtin.live_grep()*
{max_results} (number) define a upper result value {max_results} (number) define a upper result value
{disable_coordinates} (boolean) don't show the line & row {disable_coordinates} (boolean) don't show the line & row
numbers (default: false) numbers (default: false)
{file_encoding} (string) file encoding for the entry &
previewer
builtin.grep_string({opts}) *telescope.builtin.grep_string()* builtin.grep_string({opts}) *telescope.builtin.grep_string()*
@ -828,6 +832,8 @@ builtin.grep_string({opts}) *telescope.builtin.grep_string()*
{only_sort_text} (boolean) only sort the text, not the {only_sort_text} (boolean) only sort the text, not the
file, line or row (default: file, line or row (default:
false) false)
{file_encoding} (string) file encoding for the entry &
previewer
builtin.find_files({opts}) *telescope.builtin.find_files()* builtin.find_files({opts}) *telescope.builtin.find_files()*
@ -857,6 +863,7 @@ builtin.find_files({opts}) *telescope.builtin.find_files()*
{search_dirs} (table) directory/directories/files to {search_dirs} (table) directory/directories/files to
search search
{search_file} (string) specify a filename to search for {search_file} (string) specify a filename to search for
{file_encoding} (string) file encoding for the previewer
builtin.fd() *telescope.builtin.fd()* builtin.fd() *telescope.builtin.fd()*
@ -879,6 +886,7 @@ builtin.treesitter() *telescope.builtin.treesitter()*
current buffer) current buffer)
{symbol_highlights} (table) string -> string. Matches symbol with {symbol_highlights} (table) string -> string. Matches symbol with
hl_group hl_group
{file_encoding} (string) file encoding for the previewer
builtin.current_buffer_fuzzy_find({opts}) *telescope.builtin.current_buffer_fuzzy_find()* builtin.current_buffer_fuzzy_find({opts}) *telescope.builtin.current_buffer_fuzzy_find()*
@ -889,8 +897,9 @@ builtin.current_buffer_fuzzy_find({opts}) *telescope.builtin.current_buffer_fuzz
{opts} (table) options to pass to the picker {opts} (table) options to pass to the picker
Options: ~ Options: ~
{skip_empty_lines} (boolean) if true we dont display empty lines {skip_empty_lines} (boolean) if true we don't display empty lines
(default: false) (default: false)
{file_encoding} (string) file encoding for the previewer
builtin.tags({opts}) *telescope.builtin.tags()* builtin.tags({opts}) *telescope.builtin.tags()*
@ -958,8 +967,9 @@ builtin.git_files({opts}) *telescope.builtin.git_files()*
{recurse_submodules} (boolean) if true, adds the {recurse_submodules} (boolean) if true, adds the
`--recurse-submodules` flag to command `--recurse-submodules` flag to command
(default: false) (default: false)
{git_command} (table) command that will be exectued. {git_command} (table) command that will be executed.
{"git","ls-files","--exclude-standard","--cached"} {"git","ls-files","--exclude-standard","--cached"}
{file_encoding} (string) file encoding for the previewer
builtin.git_commits({opts}) *telescope.builtin.git_commits()* builtin.git_commits({opts}) *telescope.builtin.git_commits()*
@ -978,13 +988,13 @@ builtin.git_commits({opts}) *telescope.builtin.git_commits()*
{cwd} (string) specify the path of the repo {cwd} (string) specify the path of the repo
{use_git_root} (boolean) if we should use git root as cwd or the cwd {use_git_root} (boolean) if we should use git root as cwd or the cwd
(important for submodule) (default: true) (important for submodule) (default: true)
{git_command} (table) command that will be exectued. {git_command} (table) command that will be executed.
{"git","log","--pretty=oneline","--abbrev-commit","--","."} {"git","log","--pretty=oneline","--abbrev-commit","--","."}
builtin.git_bcommits({opts}) *telescope.builtin.git_bcommits()* builtin.git_bcommits({opts}) *telescope.builtin.git_bcommits()*
Lists commits for current buffer with diff preview Lists commits for current buffer with diff preview
- Default keymaps or your overriden `select_` keys: - Default keymaps or your overridden `select_` keys:
- `<cr>`: checks out the currently selected commit - `<cr>`: checks out the currently selected commit
- `<c-v>`: opens a diff in a vertical split - `<c-v>`: opens a diff in a vertical split
- `<c-x>`: opens a diff in a horizontal split - `<c-x>`: opens a diff in a horizontal split
@ -1000,7 +1010,7 @@ builtin.git_bcommits({opts}) *telescope.builtin.git_bcommits()*
(important for submodule) (default: true) (important for submodule) (default: true)
{current_file} (string) specify the current file that should be used {current_file} (string) specify the current file that should be used
for bcommits (default: current buffer) for bcommits (default: current buffer)
{git_command} (table) command that will be exectued. {git_command} (table) command that will be executed.
{"git","log","--pretty=oneline","--abbrev-commit"} {"git","log","--pretty=oneline","--abbrev-commit"}
@ -1115,9 +1125,9 @@ builtin.planets({opts}) *telescope.builtin.planets()*
{opts} (table) options to pass to the picker {opts} (table) options to pass to the picker
Options: ~ Options: ~
{show_pluto} (boolean) we love pluto (default: false, because its a {show_pluto} (boolean) we love Pluto (default: false, because its a
hidden feature) hidden feature)
{show_moon} (boolean) we love the moon (default: false, because its {show_moon} (boolean) we love the Moon (default: false, because its
a hidden feature) a hidden feature)
@ -1199,8 +1209,9 @@ builtin.oldfiles({opts}) *telescope.builtin.oldfiles()*
{opts} (table) options to pass to the picker {opts} (table) options to pass to the picker
Options: ~ Options: ~
{only_cwd} (boolean) show only files in the cwd (default: false) {only_cwd} (boolean) show only files in the cwd (default: false)
{cwd_only} (boolean) alias for only_cwd {cwd_only} (boolean) alias for only_cwd
{file_encoding} (string) file encoding for the previewer
builtin.command_history({opts}) *telescope.builtin.command_history()* builtin.command_history({opts}) *telescope.builtin.command_history()*
@ -1300,6 +1311,7 @@ builtin.buffers({opts}) *telescope.builtin.buffers()*
{bufnr_width} (number) Defines the width of the buffer {bufnr_width} (number) Defines the width of the buffer
numbers in front of the filenames numbers in front of the filenames
(default: dynamic) (default: dynamic)
{file_encoding} (string) file encoding for the previewer
builtin.colorscheme({opts}) *telescope.builtin.colorscheme()* builtin.colorscheme({opts}) *telescope.builtin.colorscheme()*
@ -1320,6 +1332,9 @@ builtin.marks({opts}) *telescope.builtin.marks()*
Parameters: ~ Parameters: ~
{opts} (table) options to pass to the picker {opts} (table) options to pass to the picker
Options: ~
{file_encoding} (string) file encoding for the previewer
builtin.registers({opts}) *telescope.builtin.registers()* builtin.registers({opts}) *telescope.builtin.registers()*
Lists vim registers, pastes the contents of the register on `<cr>` Lists vim registers, pastes the contents of the register on `<cr>`
@ -1424,6 +1439,7 @@ builtin.lsp_references({opts}) *telescope.builtin.lsp_references()*
section (default: 30) section (default: 30)
{show_line} (boolean) show results text (default: true) {show_line} (boolean) show results text (default: true)
{trim_text} (boolean) trim results text (default: false) {trim_text} (boolean) trim results text (default: false)
{file_encoding} (string) file encoding for the previewer
builtin.lsp_incoming_calls({opts}) *telescope.builtin.lsp_incoming_calls()* builtin.lsp_incoming_calls({opts}) *telescope.builtin.lsp_incoming_calls()*
@ -1435,10 +1451,11 @@ builtin.lsp_incoming_calls({opts}) *telescope.builtin.lsp_incoming_calls()*
{opts} (table) options to pass to the picker {opts} (table) options to pass to the picker
Options: ~ Options: ~
{fname_width} (number) defines the width of the filename section {fname_width} (number) defines the width of the filename section
(default: 30) (default: 30)
{show_line} (boolean) show results text (default: true) {show_line} (boolean) show results text (default: true)
{trim_text} (boolean) trim results text (default: false) {trim_text} (boolean) trim results text (default: false)
{file_encoding} (string) file encoding for the previewer
builtin.lsp_outgoing_calls({opts}) *telescope.builtin.lsp_outgoing_calls()* builtin.lsp_outgoing_calls({opts}) *telescope.builtin.lsp_outgoing_calls()*
@ -1450,10 +1467,11 @@ builtin.lsp_outgoing_calls({opts}) *telescope.builtin.lsp_outgoing_calls()*
{opts} (table) options to pass to the picker {opts} (table) options to pass to the picker
Options: ~ Options: ~
{fname_width} (number) defines the width of the filename section {fname_width} (number) defines the width of the filename section
(default: 30) (default: 30)
{show_line} (boolean) show results text (default: true) {show_line} (boolean) show results text (default: true)
{trim_text} (boolean) trim results text (default: false) {trim_text} (boolean) trim results text (default: false)
{file_encoding} (string) file encoding for the previewer
builtin.lsp_definitions({opts}) *telescope.builtin.lsp_definitions()* builtin.lsp_definitions({opts}) *telescope.builtin.lsp_definitions()*
@ -1465,12 +1483,15 @@ builtin.lsp_definitions({opts}) *telescope.builtin.lsp_definitions()*
{opts} (table) options to pass to the picker {opts} (table) options to pass to the picker
Options: ~ Options: ~
{jump_type} (string) how to goto definition if there is only one, {jump_type} (string) how to goto definition if there is only one
values: "tab", "split", "vsplit", "never" and the definition file is different from
{fname_width} (number) defines the width of the filename section the current file, values: "tab", "split",
(default: 30) "vsplit", "never"
{show_line} (boolean) show results text (default: true) {fname_width} (number) defines the width of the filename section
{trim_text} (boolean) trim results text (default: false) (default: 30)
{show_line} (boolean) show results text (default: true)
{trim_text} (boolean) trim results text (default: false)
{file_encoding} (string) file encoding for the previewer
builtin.lsp_type_definitions({opts}) *telescope.builtin.lsp_type_definitions()* builtin.lsp_type_definitions({opts}) *telescope.builtin.lsp_type_definitions()*
@ -1482,12 +1503,15 @@ builtin.lsp_type_definitions({opts}) *telescope.builtin.lsp_type_definitions()*
{opts} (table) options to pass to the picker {opts} (table) options to pass to the picker
Options: ~ Options: ~
{jump_type} (string) how to goto definition if there is only one, {jump_type} (string) how to goto definition if there is only one
values: "tab", "split", "vsplit", "never" and the definition file is different from
{fname_width} (number) defines the width of the filename section the current file, values: "tab", "split",
(default: 30) "vsplit", "never"
{show_line} (boolean) show results text (default: true) {fname_width} (number) defines the width of the filename section
{trim_text} (boolean) trim results text (default: false) (default: 30)
{show_line} (boolean) show results text (default: true)
{trim_text} (boolean) trim results text (default: false)
{file_encoding} (string) file encoding for the previewer
builtin.lsp_implementations({opts}) *telescope.builtin.lsp_implementations()* builtin.lsp_implementations({opts}) *telescope.builtin.lsp_implementations()*
@ -1499,13 +1523,15 @@ builtin.lsp_implementations({opts}) *telescope.builtin.lsp_implementations()*
{opts} (table) options to pass to the picker {opts} (table) options to pass to the picker
Options: ~ Options: ~
{jump_type} (string) how to goto implementation if there is only {jump_type} (string) how to goto implementation if there is only
one, values: "tab", "split", "vsplit", one and the definition file is different
"never" from the current file, values: "tab",
{fname_width} (number) defines the width of the filename section "split", "vsplit", "never"
(default: 30) {fname_width} (number) defines the width of the filename section
{show_line} (boolean) show results text (default: true) (default: 30)
{trim_text} (boolean) trim results text (default: false) {show_line} (boolean) show results text (default: true)
{trim_text} (boolean) trim results text (default: false)
{file_encoding} (string) file encoding for the previewer
builtin.lsp_document_symbols({opts}) *telescope.builtin.lsp_document_symbols()* builtin.lsp_document_symbols({opts}) *telescope.builtin.lsp_document_symbols()*
@ -1521,6 +1547,10 @@ builtin.lsp_document_symbols({opts}) *telescope.builtin.lsp_document_symbols()*
Options: ~ Options: ~
{fname_width} (number) defines the width of the filename {fname_width} (number) defines the width of the filename
section (default: 30) section (default: 30)
{symbol_width} (number) defines the width of the symbol
section (default: 25)
{symbol_type_width} (number) defines the width of the symbol
type section (default: 8)
{show_line} (boolean) if true, shows the content of the {show_line} (boolean) if true, shows the content of the
line the tag is found on (default: line the tag is found on (default:
false) false)
@ -1528,6 +1558,7 @@ builtin.lsp_document_symbols({opts}) *telescope.builtin.lsp_document_symbols()*
{ignore_symbols} (string|table) list of symbols to ignore {ignore_symbols} (string|table) list of symbols to ignore
{symbol_highlights} (table) string -> string. Matches symbol {symbol_highlights} (table) string -> string. Matches symbol
with hl_group with hl_group
{file_encoding} (string) file encoding for the previewer
builtin.lsp_workspace_symbols({opts}) *telescope.builtin.lsp_workspace_symbols()* builtin.lsp_workspace_symbols({opts}) *telescope.builtin.lsp_workspace_symbols()*
@ -1545,6 +1576,10 @@ builtin.lsp_workspace_symbols({opts}) *telescope.builtin.lsp_workspace_symbols()
(default: "") (default: "")
{fname_width} (number) defines the width of the filename {fname_width} (number) defines the width of the filename
section (default: 30) section (default: 30)
{symbol_width} (number) defines the width of the symbol
section (default: 25)
{symbol_type_width} (number) defines the width of the symbol
type section (default: 8)
{show_line} (boolean) if true, shows the content of the {show_line} (boolean) if true, shows the content of the
line the tag is found on (default: line the tag is found on (default:
false) false)
@ -1552,6 +1587,7 @@ builtin.lsp_workspace_symbols({opts}) *telescope.builtin.lsp_workspace_symbols()
{ignore_symbols} (string|table) list of symbols to ignore {ignore_symbols} (string|table) list of symbols to ignore
{symbol_highlights} (table) string -> string. Matches symbol {symbol_highlights} (table) string -> string. Matches symbol
with hl_group with hl_group
{file_encoding} (string) file encoding for the previewer
builtin.lsp_dynamic_workspace_symbols({opts}) *telescope.builtin.lsp_dynamic_workspace_symbols()* builtin.lsp_dynamic_workspace_symbols({opts}) *telescope.builtin.lsp_dynamic_workspace_symbols()*
@ -1574,6 +1610,7 @@ builtin.lsp_dynamic_workspace_symbols({opts}) *telescope.builtin.lsp_dynamic_wor
{ignore_symbols} (string|table) list of symbols to ignore {ignore_symbols} (string|table) list of symbols to ignore
{symbol_highlights} (table) string -> string. Matches symbol {symbol_highlights} (table) string -> string. Matches symbol
with hl_group with hl_group
{file_encoding} (string) file encoding for the previewer
builtin.diagnostics({opts}) *telescope.builtin.diagnostics()* builtin.diagnostics({opts}) *telescope.builtin.diagnostics()*
@ -1628,9 +1665,10 @@ themes.get_dropdown() *telescope.themes.get_dropdown()*
Usage: Usage:
> >
`local builtin = require('telescope.builtin')` local opts = {...} -- picker options
`local themes = require('telescope.themes')` local builtin = require('telescope.builtin')
`builtin.find_files(themes.get_dropdown())` local themes = require('telescope.themes')
builtin.find_files(themes.get_dropdown(opts))
< <
@ -1640,10 +1678,10 @@ themes.get_cursor() *telescope.themes.get_cursor()*
Usage: Usage:
> >
local opts = {...} -- picker options
`local builtin = require('telescope.builtin')` local builtin = require('telescope.builtin')
`local themes = require('telescope.themes')` local themes = require('telescope.themes')
`builtin.lsp_references(themes.get_cursor())` builtin.find_files(themes.get_cursor(opts))
< <
@ -1653,9 +1691,10 @@ themes.get_ivy() *telescope.themes.get_ivy()*
Usage: Usage:
> >
`local builtin = require('telescope.builtin')` local opts = {...} -- picker options
`local themes = require('telescope.themes')` local builtin = require('telescope.builtin')
`builtin.find_files(themes.get_ivy())` local themes = require('telescope.themes')
builtin.find_files(themes.get_ivy(opts))
< <
@ -1665,12 +1704,11 @@ themes.get_ivy() *telescope.themes.get_ivy()*
MAPPINGS *telescope.mappings* MAPPINGS *telescope.mappings*
|telescope.mappings| is used to configure the keybindings within a telescope |telescope.mappings| is used to configure the keybindings within a telescope
picker. These keybinds are only local to the picker window and will be cleared picker. These key binds are only local to the picker window and will be cleared
once you exit the picker. once you exit the picker.
We provide multiple different ways of configuring, as described below, to We provide multiple configuration options to make it easy for you to adjust
provide an easy to use experience for changing the default behavior of telescope's default key bindings and create your own custom key binds.
telescope or extending for your own purposes.
To see many of the builtin actions that you can use as values for this table, To see many of the builtin actions that you can use as values for this table,
see |telescope.actions| see |telescope.actions|
@ -1703,7 +1741,6 @@ For example:
..., ...,
} }
< <
Into your config.
To override behavior of a key, simply set the value to be a function (either by To override behavior of a key, simply set the value to be a function (either by
requiring an action or by writing your own function) requiring an action or by writing your own function)
@ -1716,7 +1753,8 @@ requiring an action or by writing your own function)
< <
If the function you want is part of `telescope.actions`, then you can simply If the function you want is part of `telescope.actions`, then you can simply
give a string. For example, the previous option is equivalent to: supply the function name as a string. For example, the previous option is
equivalent to:
> >
{ {
..., ...,
@ -1775,6 +1813,11 @@ ordered from the lowest priority to the highest priority.
map("i", "asdf", function(_prompt_bufnr) map("i", "asdf", function(_prompt_bufnr)
print "You typed asdf" print "You typed asdf"
end) end)
map({"i", "n"}, "<C-r>", function(_prompt_bufnr)
print "You typed <C-r>"
end)
-- needs to return true if you want to map default_mappings and -- needs to return true if you want to map default_mappings and
-- false if not -- false if not
return true return true
@ -1823,7 +1866,6 @@ All layout strategies are functions with the following signature:
- lines : (number) Lines in the vim window - lines : (number) Lines in the vim window
- layout_config : (table) The configuration values specific to the picker. - layout_config : (table) The configuration values specific to the picker.
This means you can create your own layout strategy if you want! Just be aware This means you can create your own layout strategy if you want! Just be aware
for now that we may change some APIs or interfaces, so they may break if you for now that we may change some APIs or interfaces, so they may break if you
create your own. create your own.
@ -1892,14 +1934,14 @@ layout_strategies.center() *telescope.layout.center()*
┌──────────────────────────────────────────────────┐ ┌──────────────────────────────────────────────────┐
│ ┌────────────────────────────────────────┐ │ │ ┌────────────────────────────────────────┐ │
| Preview | │ Preview │
| Preview | │ Preview │
│ └────────────────────────────────────────┘ │ │ └────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────┐ │ │ ┌────────────────────────────────────────┐ │
| Prompt | │ Prompt │
│ ├────────────────────────────────────────┤ │ │ ├────────────────────────────────────────┤ │
| Result | │ Result │
| Result | │ Result │
│ └────────────────────────────────────────┘ │ │ └────────────────────────────────────────┘ │
│ │ │ │
│ │ │ │
@ -1948,6 +1990,20 @@ layout_strategies.cursor() *telescope.layout.cursor()*
│ │ │ │
└──────────────────────────────────────────────────┘ └──────────────────────────────────────────────────┘
`picker.layout_config` shared options:
- height:
- How tall to make Telescope's entire layout
- See |resolver.resolve_height()|
- scroll_speed: The number of lines to scroll through the previewer
- width:
- How wide to make Telescope's entire layout
- See |resolver.resolve_width()|
`picker.layout_config` unique options:
- preview_cutoff: When columns are less than this value, the preview will be disabled
- preview_width:
- Change the width of Telescope's preview window
- See |resolver.resolve_width()|
layout_strategies.vertical() *telescope.layout.vertical()* layout_strategies.vertical() *telescope.layout.vertical()*
@ -1957,16 +2013,16 @@ layout_strategies.vertical() *telescope.layout.vertical()*
┌──────────────────────────────────────────────────┐ ┌──────────────────────────────────────────────────┐
│ │ │ │
│ ┌────────────────────────────────────────┐ │ │ ┌────────────────────────────────────────┐ │
| Preview | │ Preview │
| Preview | │ Preview │
| Preview | │ Preview │
│ └────────────────────────────────────────┘ │ │ └────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────┐ │ │ ┌────────────────────────────────────────┐ │
| Result | │ Result │
| Result | │ Result │
│ └────────────────────────────────────────┘ │ │ └────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────┐ │ │ ┌────────────────────────────────────────┐ │
| Prompt | │ Prompt │
│ └────────────────────────────────────────┘ │ │ └────────────────────────────────────────┘ │
│ │ │ │
└──────────────────────────────────────────────────┘ └──────────────────────────────────────────────────┘
@ -2103,33 +2159,33 @@ MAKE_ENTRY *telescope.make_entry*
Each picker has a finder made up of two parts, the results which are the data Each picker has a finder made up of two parts, the results which are the data
to be displayed, and the entry_maker. These entry_makers are functions returned to be displayed, and the entry_maker. These entry_makers are functions returned
from make_entry functions. These will be referrd to as entry_makers in the from make_entry functions. These will be referred to as entry_makers in the
following documentation. following documentation.
Every entry maker returns a function which accepts the data to be used for an Every entry maker returns a function that accepts the data to be used for an
entry. This function will return an entry table (or nil, meaning skip this entry. This function will return an entry table (or nil, meaning skip this
entry) which contains of the - following important keys: entry) which contains the following important keys:
- value any: value key can be anything but still required - value any: value key can be anything but still required
- valid bool: is an optional key because it defaults to true but if the key is - valid bool (optional): is an optional key because it defaults to true but if
set to false it will not be displayed by the picker. (optional) the key is set to false it will not be displayed by the picker
- ordinal string: is the text that is used for filtering (required) - ordinal string: is the text that is used for filtering
- display string|function: is either a string of the text that is being - display string|function: is either a string of the text that is being
displayed or a function receiving the entry at a later stage, when the entry displayed or a function receiving the entry at a later stage, when the entry
is actually being displayed. A function can be useful here if complex is actually being displayed. A function can be useful here if a complex
calculation have to be done. `make_entry` can also return a second value a calculation has to be done. `make_entry` can also return a second value - a
highlight array which will then apply to the line. Highlight entry in this highlight array which will then apply to the line. Highlight entry in this
array has the following signature `{ { start_col, end_col }, hl_group }` array has the following signature `{ { start_col, end_col }, hl_group }`
(required). - filename string (optional): will be interpreted by the default `<cr>` action
- filename string: will be interpreted by the default `<cr>` action as open as open this file
this file (optional) - bufnr number (optional): will be interpreted by the default `<cr>` action as
- bufnr number: will be interpreted by the default `<cr>` action as open this open this buffer
buffer (optional) - lnum number (optional): lnum value which will be interpreted by the default
- lnum number: lnum value which will be interpreted by the default `<cr>` `<cr>` action as a jump to this line
action as a jump to this line (optional) - col number (optional): col value which will be interpreted by the default
- col number: col value which will be interpreted by the default `<cr>` action `<cr>` action as a jump to this column
as a jump to this column (optional)
More information on easier displaying, see |telescope.pickers.entry_display| For more information on easier displaying, see
|telescope.pickers.entry_display|
TODO: Document something we call `entry_index` TODO: Document something we call `entry_index`
@ -2148,11 +2204,11 @@ every single entry. So it is suggested to do this outside of `make_display` for
the best performance. the best performance.
The create function will use the column widths passed to it in The create function will use the column widths passed to it in
configaration.items. Each item in that table is the number of characters in the configuration.items. Each item in that table is the number of characters in the
column. It's also possible for the final column to not have a fixed width, this column. It's also possible for the final column to not have a fixed width, this
will be shown in the configuartion as 'remaining = true'. will be shown in the configuration as 'remaining = true'.
An example of this configuration is shown for the buffers picker An example of this configuration is shown for the buffers picker:
> >
local displayer = entry_display.create { local displayer = entry_display.create {
separator = " ", separator = " ",
@ -2166,10 +2222,10 @@ local displayer = entry_display.create {
< <
This shows 4 columns, the first is defined in the opts as the width we'll use This shows 4 columns, the first is defined in the opts as the width we'll use
when display_string the number of the buffer. The second has a fixed width of 4 when display_string is the number of the buffer. The second has a fixed width
and the 3rd column's widht will be decided by the width of the icons we use. of 4 and the third column's width will be decided by the width of the icons we
The fourth column will use the remaining space. Finally we have also defined use. The fourth column will use the remaining space. Finally, we have also
the seperator between each column will be the space " ". defined the separator between each column will be the space " ".
An example of how the display reference will be used is shown, again for the An example of how the display reference will be used is shown, again for the
buffers picker: buffers picker:
@ -2185,11 +2241,12 @@ return displayer {
There are two types of values each column can have. Either a simple String or a There are two types of values each column can have. Either a simple String or a
table containing the String as well as the hl_group. table containing the String as well as the hl_group.
The displayer can return values, string and an optional highlights. String is The displayer can return values, string and an optional highlights. The string
all the text to be displayed for this entry as a single string. If parts of the is all the text to be displayed for this entry as a single string. If parts of
string are to be highlighted they will be described in the highlights table. the string are to be highlighted they will be described in the highlights
table.
For better understanding of how create() and displayer are used it's best to For a better understanding of how create() and displayer are used it's best to
look at the code in make_entry.lua. look at the code in make_entry.lua.
@ -2210,7 +2267,7 @@ utils.transform_path({opts}, {path}) *telescope.utils.transform_path()*
Parameters: ~ Parameters: ~
{opts} (table) The opts the users passed into the picker. Might {opts} (table) The opts the users passed into the picker. Might
contains a path_display key contains a path_display key
{path} (string) The path that should be formated {path} (string) The path that should be formatted
Return: ~ Return: ~
string: The transformed path ready to be displayed string: The transformed path ready to be displayed
@ -2229,9 +2286,9 @@ utils.notify({funname}, {opts}) *telescope.utils.notify()*
================================================================================ ================================================================================
ACTIONS *telescope.actions* ACTIONS *telescope.actions*
Actions functions that are useful for people creating their own mappings. These functions are useful for people creating their own mappings.
Actions can be either normal functions that expect the prompt_bufnr as first Actions can be either normal functions that expect the `prompt_bufnr` as first
argument (1) or they can be a custom telescope type called "action" (2). argument (1) or they can be a custom telescope type called "action" (2).
(1) The `prompt_bufnr` of a normal function denotes the identifier of your (1) The `prompt_bufnr` of a normal function denotes the identifier of your
@ -2272,8 +2329,8 @@ do the following:
action(bufnr) action(bufnr)
< <
Another interesing thing to do is that these actions now have functions you can Another interesting thing to do is that these actions now have functions you
call. These functions include `:replace(f)`, `:replace_if(f, c)`, can call. These functions include `:replace(f)`, `:replace_if(f, c)`,
`replace_map(tbl)` and `enhance(tbl)`. More information on these functions can `replace_map(tbl)` and `enhance(tbl)`. More information on these functions can
be found in the `developers.md` and `lua/tests/automated/action_spec.lua` file. be found in the `developers.md` and `lua/tests/automated/action_spec.lua` file.
@ -2359,8 +2416,8 @@ actions.toggle_selection({prompt_bufnr}) *telescope.actions.toggle_selection()*
actions.select_all({prompt_bufnr}) *telescope.actions.select_all()* actions.select_all({prompt_bufnr}) *telescope.actions.select_all()*
Multi select all entries. Multi select all entries.
- Note: selected entries may include results not visible in the results - Note: selected entries may include results not visible in the results pop
popup. up.
Parameters: ~ Parameters: ~
@ -2377,8 +2434,8 @@ actions.drop_all({prompt_bufnr}) *telescope.actions.drop_all()*
actions.toggle_all({prompt_bufnr}) *telescope.actions.toggle_all()* actions.toggle_all({prompt_bufnr}) *telescope.actions.toggle_all()*
Toggle multi selection for all entries. Toggle multi selection for all entries.
- Note: toggled entries may include results not visible in the results - Note: toggled entries may include results not visible in the results pop
popup. up.
Parameters: ~ Parameters: ~
@ -2470,28 +2527,6 @@ actions.select_tab({prompt_bufnr}) *telescope.actions.select_tab()*
{prompt_bufnr} (number) The prompt bufnr {prompt_bufnr} (number) The prompt bufnr
actions.select_drop({prompt_bufnr}) *telescope.actions.select_drop()*
Perform 'drop' action on selection, usually something like
`:drop <selection>`
i.e. open the selection in a window
Parameters: ~
{prompt_bufnr} (number) The prompt bufnr
actions.select_tab_drop({prompt_bufnr}) *telescope.actions.select_tab_drop()*
Perform 'tab drop' action on selection, usually something like
`:tab drop <selection>`
i.e. open the selection in a new tab
Parameters: ~
{prompt_bufnr} (number) The prompt bufnr
actions.file_edit({prompt_bufnr}) *telescope.actions.file_edit()* actions.file_edit({prompt_bufnr}) *telescope.actions.file_edit()*
Perform file edit on selection, usually something like Perform file edit on selection, usually something like
`:edit <selection>` `:edit <selection>`
@ -2547,7 +2582,7 @@ actions._close({prompt_bufnr}) *telescope.actions._close()*
actions.edit_command_line({prompt_bufnr}) *telescope.actions.edit_command_line()* actions.edit_command_line({prompt_bufnr}) *telescope.actions.edit_command_line()*
Set a value in the command line and dont run it, making it editable. Set a value in the command line and don't run it, making it editable.
Parameters: ~ Parameters: ~
@ -2563,7 +2598,7 @@ actions.set_command_line({prompt_bufnr}) *telescope.actions.set_command_line()*
actions.edit_search_line({prompt_bufnr}) *telescope.actions.edit_search_line()* actions.edit_search_line({prompt_bufnr}) *telescope.actions.edit_search_line()*
Set a value in the search line and dont search for it, making it editable. Set a value in the search line and don't search for it, making it editable.
Parameters: ~ Parameters: ~
@ -3087,7 +3122,7 @@ utils.map_entries({prompt_bufnr}, {f}) *telescope.actions.utils.map_entries()*
Apply `f` to the entries of the current picker. Apply `f` to the entries of the current picker.
- Notes: - Notes:
- Mapped entries include all currently filtered results, not just the - Mapped entries include all currently filtered results, not just the
visible onces. visible ones.
- Indices are 1-indexed, whereas rows are 0-indexed. - Indices are 1-indexed, whereas rows are 0-indexed.
- Warning: `map_entries` has no return value. - Warning: `map_entries` has no return value.
- The below example showcases how to collect results - The below example showcases how to collect results
@ -3100,7 +3135,7 @@ utils.map_entries({prompt_bufnr}, {f}) *telescope.actions.utils.map_entries()*
local prompt_bufnr = vim.api.nvim_get_current_buf() local prompt_bufnr = vim.api.nvim_get_current_buf()
local current_picker = action_state.get_current_picker(prompt_bufnr) local current_picker = action_state.get_current_picker(prompt_bufnr)
local results = {} local results = {}
action_utils.map_entries(prompt_bufnr, function(entry, index, row) action_utils.map_entries(prompt_bufnr, function(entry, index, row)
results[row] = entry.value results[row] = entry.value
end) end)
return results return results
@ -3119,7 +3154,8 @@ utils.map_selections({prompt_bufnr}, {f}) *telescope.actions.utils.map_selection
Apply `f` to the multi selections of the current picker and return a table Apply `f` to the multi selections of the current picker and return a table
of mapped selections. of mapped selections.
- Notes: - Notes:
- Mapped selections may include results not visible in the results popup. - Mapped selections may include results not visible in the results pop
up.
- Selected entries are returned in order of their selection. - Selected entries are returned in order of their selection.
- Warning: `map_selections` has no return value. - Warning: `map_selections` has no return value.
- The below example showcases how to collect results - The below example showcases how to collect results
@ -3132,7 +3168,7 @@ utils.map_selections({prompt_bufnr}, {f}) *telescope.actions.utils.map_selection
local prompt_bufnr = vim.api.nvim_get_current_buf() local prompt_bufnr = vim.api.nvim_get_current_buf()
local current_picker = action_state.get_current_picker(prompt_bufnr) local current_picker = action_state.get_current_picker(prompt_bufnr)
local results = {} local results = {}
action_utils.map_selections(prompt_bufnr, function(entry, index) action_utils.map_selections(prompt_bufnr, function(entry, index)
results[index] = entry.value results[index] = entry.value
end) end)
return results return results
@ -3239,7 +3275,7 @@ PREVIEWERS *telescope.previewers*
Provides a Previewer table that has to be implemented by each previewer. To Provides a Previewer table that has to be implemented by each previewer. To
achieve this, this module also provides two wrappers that abstract most of the achieve this, this module also provides two wrappers that abstract most of the
work and make it really easy create new previewers. work and make it really easy to create new previewers.
- `previewers.new_termopen_previewer` - `previewers.new_termopen_previewer`
- `previewers.new_buffer_previewer` - `previewers.new_buffer_previewer`
@ -3268,7 +3304,7 @@ previewers.Previewer() *telescope.previewers.Previewer()*
What `:new` expects is listed below What `:new` expects is listed below
The interface provides following set of functions. All of them, besides The interface provides the following set of functions. All of them, besides
`new`, will be handled by telescope pickers. `new`, will be handled by telescope pickers.
- `:new(opts)` - `:new(opts)`
- `:preview(entry, status)` - `:preview(entry, status)`
@ -3279,7 +3315,7 @@ previewers.Previewer() *telescope.previewers.Previewer()*
`Previewer:new()` expects a table as input with following keys: `Previewer:new()` expects a table as input with following keys:
- `setup` function(self): Will be called the first time preview will be - `setup` function(self): Will be called the first time preview will be
called. called.
- `teardown` function(self): Will be called on cleanup. - `teardown` function(self): Will be called on clean up.
- `preview_fn` function(self, entry, status): Will be called each time a - `preview_fn` function(self, entry, status): Will be called each time a
new entry was selected. new entry was selected.
- `title` function(self): Will return the static title of the previewer. - `title` function(self): Will return the static title of the previewer.
@ -3389,9 +3425,9 @@ previewers.new_buffer_previewer() *telescope.previewers.new_buffer_previewer()*
table of vars that will be available in `self.state` in each table of vars that will be available in `self.state` in each
`define_preview` call. `define_preview` call.
- `teardown = function(self)` (optional) Will be called at the end, when - `teardown = function(self)` (optional) Will be called at the end, when
the picker is being closed and is meant to cleanup everything that was the picker is being closed and is meant to clean up everything that was
allocated by the previewer. The `buffer_previewer` will automatically allocated by the previewer. The `buffer_previewer` will automatically
cleanup all created buffers. So you only need to handle things that clean up all created buffers. So you only need to handle things that
were introduced by you. were introduced by you.
- `keep_last_buf = true` (optional) Will not delete the last selected - `keep_last_buf = true` (optional) Will not delete the last selected
buffer. This would allow you to reuse that buffer in the select action. buffer. This would allow you to reuse that buffer in the select action.
@ -3399,7 +3435,7 @@ previewers.new_buffer_previewer() *telescope.previewers.new_buffer_previewer()*
recreating that buffer in an action. To access the last buffer number: recreating that buffer in an action. To access the last buffer number:
`require('telescope.state').get_global_key("last_preview_bufnr")` `require('telescope.state').get_global_key("last_preview_bufnr")`
- `get_buffer_by_name = function(self, entry)` Allows you to set a unique - `get_buffer_by_name = function(self, entry)` Allows you to set a unique
name for each buffer. This is used for caching purpose. name for each buffer. This is used for caching purposes.
`self.state.bufname` will be nil if the entry was never loaded or the `self.state.bufname` will be nil if the entry was never loaded or the
unique name when it was loaded once. For example, useful if you have unique name when it was loaded once. For example, useful if you have
one file but multiple entries. This happens for grep and lsp builtins. one file but multiple entries. This happens for grep and lsp builtins.
@ -3450,8 +3486,8 @@ previewers.new_buffer_previewer() *telescope.previewers.new_buffer_previewer()*
vim.api.nvim_buf_call(bufnr, function() vim.api.nvim_buf_call(bufnr, function()
-- for example `search` and `matchadd` -- for example `search` and `matchadd`
end) end)
to achieve that.
< <
to achieve that.
- If you want to read a file into the buffer it's best to use - If you want to read a file into the buffer it's best to use
`buffer_previewer_maker`. But access this function with `buffer_previewer_maker`. But access this function with
`require('telescope.config').values.buffer_previewer_maker` because it `require('telescope.config').values.buffer_previewer_maker` because it
@ -3495,7 +3531,7 @@ previewers.vim_buffer_vimgrep() *telescope.previewers.vim_buffer_vimgrep()*
previewers.vim_buffer_qflist() *telescope.previewers.vim_buffer_qflist()* previewers.vim_buffer_qflist() *telescope.previewers.vim_buffer_qflist()*
Is the same as `vim_buffer_vimgrep` and only exist for consistency with Is the same as `vim_buffer_vimgrep` and only exists for consistency with
`term_previewers`. `term_previewers`.
The preferred way of using this previewer is like this The preferred way of using this previewer is like this
@ -3566,7 +3602,7 @@ HISTORY *telescope.actions.history*
A base implementation of a prompt history that provides a simple history and A base implementation of a prompt history that provides a simple history and
can be replaced with a custom implementation. can be replaced with a custom implementation.
For example: We provide a extension for a smart history that uses sql.nvim to For example: We provide an extension for a smart history that uses sql.nvim to
map histories to metadata, like the calling picker or cwd. map histories to metadata, like the calling picker or cwd.
So you have a history for: So you have a history for:

View File

@ -21,7 +21,7 @@ function AsyncJob.new(opts)
self.stderr = opts.stderr or M.NullPipe() self.stderr = opts.stderr or M.NullPipe()
if opts.cwd and opts.cwd ~= "" then if opts.cwd and opts.cwd ~= "" then
self.uv_opts.cwd = vim.fn.expand(opts.cwd) self.uv_opts.cwd = vim.fn.expand(vim.fn.escape(opts.cwd, "$"))
-- this is a "illegal" hack for windows. E.g. If the git command returns `/` rather than `\` as delimiter, -- this is a "illegal" hack for windows. E.g. If the git command returns `/` rather than `\` as delimiter,
-- vim.fn.expand might just end up returning an empty string. Weird -- vim.fn.expand might just end up returning an empty string. Weird
-- Because empty string is not allowed in libuv the job will not spawn. Solution is we just set it to opts.cwd -- Because empty string is not allowed in libuv the job will not spawn. Solution is we just set it to opts.cwd

View File

@ -62,7 +62,7 @@ action_generate.refine = function(prompt_bufnr, opts)
opts = opts or {} opts = opts or {}
opts.prompt_to_prefix = vim.F.if_nil(opts.prompt_to_prefix, false) opts.prompt_to_prefix = vim.F.if_nil(opts.prompt_to_prefix, false)
opts.prefix_hl_group = vim.F.if_nil(opts.prompt_hl_group, "TelescopePromptPrefix") opts.prefix_hl_group = vim.F.if_nil(opts.prompt_hl_group, "TelescopePromptPrefix")
opts.prompt_prefix = vim.F.if_nil(opts.promt_prefix, config.values.prompt_prefix) opts.prompt_prefix = vim.F.if_nil(opts.prompt_prefix, config.values.prompt_prefix)
opts.reset_multi_selection = vim.F.if_nil(opts.reset_multi_selection, false) opts.reset_multi_selection = vim.F.if_nil(opts.reset_multi_selection, false)
opts.reset_prompt = vim.F.if_nil(opts.reset_prompt, true) opts.reset_prompt = vim.F.if_nil(opts.reset_prompt, true)
opts.sorter = vim.F.if_nil(opts.sorter, config.values.generic_sorter {}) opts.sorter = vim.F.if_nil(opts.sorter, config.values.generic_sorter {})
@ -75,11 +75,11 @@ action_generate.refine = function(prompt_bufnr, opts)
end end
-- title -- title
if opts.prompt_title then if opts.prompt_title and current_picker.prompt_border then
current_picker.prompt_border:change_title(opts.prompt_title) current_picker.prompt_border:change_title(opts.prompt_title)
end end
if opts.results_title then if opts.results_title and current_picker.results_border then
current_picker.results_border:change_title(opts.results_title) current_picker.results_border:change_title(opts.results_title)
end end

View File

@ -11,7 +11,7 @@ local uv = vim.loop
--- A base implementation of a prompt history that provides a simple history --- A base implementation of a prompt history that provides a simple history
--- and can be replaced with a custom implementation. --- and can be replaced with a custom implementation.
--- ---
--- For example: We provide a extension for a smart history that uses sql.nvim --- For example: We provide an extension for a smart history that uses sql.nvim
--- to map histories to metadata, like the calling picker or cwd. --- to map histories to metadata, like the calling picker or cwd.
--- ---
--- So you have a history for: --- So you have a history for:

View File

@ -2,9 +2,9 @@
---@config { ["module"] = "telescope.actions" } ---@config { ["module"] = "telescope.actions" }
---@brief [[ ---@brief [[
--- Actions functions that are useful for people creating their own mappings. --- These functions are useful for people creating their own mappings.
--- ---
--- Actions can be either normal functions that expect the prompt_bufnr as --- Actions can be either normal functions that expect the `prompt_bufnr` as
--- first argument (1) or they can be a custom telescope type called "action" (2). --- first argument (1) or they can be a custom telescope type called "action" (2).
--- ---
--- (1) The `prompt_bufnr` of a normal function denotes the identifier of your --- (1) The `prompt_bufnr` of a normal function denotes the identifier of your
@ -45,7 +45,7 @@
--- action(bufnr) --- action(bufnr)
--- </code> --- </code>
--- ---
--- Another interesing thing to do is that these actions now have functions you --- Another interesting thing to do is that these actions now have functions you
--- can call. These functions include `:replace(f)`, `:replace_if(f, c)`, --- can call. These functions include `:replace(f)`, `:replace_if(f, c)`,
--- `replace_map(tbl)` and `enhance(tbl)`. More information on these functions --- `replace_map(tbl)` and `enhance(tbl)`. More information on these functions
--- can be found in the `developers.md` and `lua/tests/automated/action_spec.lua` --- can be found in the `developers.md` and `lua/tests/automated/action_spec.lua`
@ -75,6 +75,12 @@ local actions = setmetatable({}, {
end, end,
}) })
local append_to_history = function(prompt_bufnr)
action_state
.get_current_history()
:append(action_state.get_current_line(), action_state.get_current_picker(prompt_bufnr))
end
--- Move the selection to the next entry --- Move the selection to the next entry
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.move_selection_next = function(prompt_bufnr) actions.move_selection_next = function(prompt_bufnr)
@ -150,7 +156,7 @@ actions.toggle_selection = function(prompt_bufnr)
end end
--- Multi select all entries. --- Multi select all entries.
--- - Note: selected entries may include results not visible in the results popup. --- - Note: selected entries may include results not visible in the results pop up.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.select_all = function(prompt_bufnr) actions.select_all = function(prompt_bufnr)
local current_picker = action_state.get_current_picker(prompt_bufnr) local current_picker = action_state.get_current_picker(prompt_bufnr)
@ -187,7 +193,7 @@ actions.drop_all = function(prompt_bufnr)
end end
--- Toggle multi selection for all entries. --- Toggle multi selection for all entries.
--- - Note: toggled entries may include results not visible in the results popup. --- - Note: toggled entries may include results not visible in the results pop up.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.toggle_all = function(prompt_bufnr) actions.toggle_all = function(prompt_bufnr)
local current_picker = action_state.get_current_picker(prompt_bufnr) local current_picker = action_state.get_current_picker(prompt_bufnr)
@ -241,11 +247,7 @@ end
--- i.e. open the selection in the current buffer --- i.e. open the selection in the current buffer
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.select_default = { actions.select_default = {
pre = function(prompt_bufnr) pre = append_to_history,
action_state
.get_current_history()
:append(action_state.get_current_line(), action_state.get_current_picker(prompt_bufnr))
end,
action = function(prompt_bufnr) action = function(prompt_bufnr)
return action_set.select(prompt_bufnr, "default") return action_set.select(prompt_bufnr, "default")
end, end,
@ -257,11 +259,7 @@ actions.select_default = {
--- i.e. open the selection in a new horizontal split --- i.e. open the selection in a new horizontal split
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.select_horizontal = { actions.select_horizontal = {
pre = function(prompt_bufnr) pre = append_to_history,
action_state
.get_current_history()
:append(action_state.get_current_line(), action_state.get_current_picker(prompt_bufnr))
end,
action = function(prompt_bufnr) action = function(prompt_bufnr)
return action_set.select(prompt_bufnr, "horizontal") return action_set.select(prompt_bufnr, "horizontal")
end, end,
@ -273,11 +271,7 @@ actions.select_horizontal = {
--- i.e. open the selection in a new vertical split --- i.e. open the selection in a new vertical split
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.select_vertical = { actions.select_vertical = {
pre = function(prompt_bufnr) pre = append_to_history,
action_state
.get_current_history()
:append(action_state.get_current_line(), action_state.get_current_picker(prompt_bufnr))
end,
action = function(prompt_bufnr) action = function(prompt_bufnr)
return action_set.select(prompt_bufnr, "vertical") return action_set.select(prompt_bufnr, "vertical")
end, end,
@ -289,48 +283,12 @@ actions.select_vertical = {
--- i.e. open the selection in a new tab --- i.e. open the selection in a new tab
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.select_tab = { actions.select_tab = {
pre = function(prompt_bufnr) pre = append_to_history,
action_state
.get_current_history()
:append(action_state.get_current_line(), action_state.get_current_picker(prompt_bufnr))
end,
action = function(prompt_bufnr) action = function(prompt_bufnr)
return action_set.select(prompt_bufnr, "tab") return action_set.select(prompt_bufnr, "tab")
end, end,
} }
--- Perform 'drop' action on selection, usually something like<br>
---`:drop <selection>`
---
--- i.e. open the selection in a window
---@param prompt_bufnr number: The prompt bufnr
actions.select_drop = {
pre = function(prompt_bufnr)
action_state
.get_current_history()
:append(action_state.get_current_line(), action_state.get_current_picker(prompt_bufnr))
end,
action = function(prompt_bufnr)
return action_set.select(prompt_bufnr, "drop")
end,
}
--- Perform 'tab drop' action on selection, usually something like<br>
---`:tab drop <selection>`
---
--- i.e. open the selection in a new tab
---@param prompt_bufnr number: The prompt bufnr
actions.select_tab_drop = {
pre = function(prompt_bufnr)
action_state
.get_current_history()
:append(action_state.get_current_line(), action_state.get_current_picker(prompt_bufnr))
end,
action = function(prompt_bufnr)
return action_set.select(prompt_bufnr, "tab drop")
end,
}
-- TODO: consider adding float! -- TODO: consider adding float!
-- https://github.com/nvim-telescope/telescope.nvim/issues/365 -- https://github.com/nvim-telescope/telescope.nvim/issues/365
@ -394,16 +352,17 @@ end
local set_edit_line = function(prompt_bufnr, fname, prefix, postfix) local set_edit_line = function(prompt_bufnr, fname, prefix, postfix)
postfix = vim.F.if_nil(postfix, "") postfix = vim.F.if_nil(postfix, "")
postfix = a.nvim_replace_termcodes(postfix, true, false, true)
local selection = action_state.get_selected_entry() local selection = action_state.get_selected_entry()
if selection == nil then if selection == nil then
utils.__warn_no_selection(fname) utils.__warn_no_selection(fname)
return return
end end
actions.close(prompt_bufnr) actions.close(prompt_bufnr)
a.nvim_feedkeys(a.nvim_replace_termcodes(prefix .. selection.value .. postfix, true, false, true), "t", true) a.nvim_feedkeys(prefix .. selection.value .. postfix, "n", true)
end end
--- Set a value in the command line and dont run it, making it editable. --- Set a value in the command line and don't run it, making it editable.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.edit_command_line = function(prompt_bufnr) actions.edit_command_line = function(prompt_bufnr)
set_edit_line(prompt_bufnr, "actions.edit_command_line", ":") set_edit_line(prompt_bufnr, "actions.edit_command_line", ":")
@ -422,7 +381,7 @@ actions.set_command_line = function(prompt_bufnr)
vim.cmd(selection.value) vim.cmd(selection.value)
end end
--- Set a value in the search line and dont search for it, making it editable. --- Set a value in the search line and don't search for it, making it editable.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.edit_search_line = function(prompt_bufnr) actions.edit_search_line = function(prompt_bufnr)
set_edit_line(prompt_bufnr, "actions.edit_search_line", "/") set_edit_line(prompt_bufnr, "actions.edit_search_line", "/")
@ -781,7 +740,7 @@ actions.git_checkout_current_buffer = function(prompt_bufnr)
return return
end end
actions.close(prompt_bufnr) actions.close(prompt_bufnr)
utils.get_os_command_output({ "git", "checkout", selection.value, "--", selection.file }, cwd) utils.get_os_command_output({ "git", "checkout", selection.value, "--", selection.current_file }, cwd)
vim.cmd "checktime" vim.cmd "checktime"
end end
@ -864,51 +823,68 @@ end
--- Sends the selected entries to the quickfix list, replacing the previous entries. --- Sends the selected entries to the quickfix list, replacing the previous entries.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.send_selected_to_qflist = function(prompt_bufnr) actions.send_selected_to_qflist = {
send_selected_to_qf(prompt_bufnr, " ") pre = append_to_history,
end action = function(prompt_bufnr)
send_selected_to_qf(prompt_bufnr, " ")
end,
}
--- Adds the selected entries to the quickfix list, keeping the previous entries. --- Adds the selected entries to the quickfix list, keeping the previous entries.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.add_selected_to_qflist = function(prompt_bufnr) actions.add_selected_to_qflist = {
send_selected_to_qf(prompt_bufnr, "a") pre = append_to_history,
end action = function(prompt_bufnr)
send_selected_to_qf(prompt_bufnr, "a")
end,
}
--- Sends all entries to the quickfix list, replacing the previous entries. --- Sends all entries to the quickfix list, replacing the previous entries.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.send_to_qflist = function(prompt_bufnr) actions.send_to_qflist = {
send_all_to_qf(prompt_bufnr, " ") pre = append_to_history,
end action = function(prompt_bufnr)
send_all_to_qf(prompt_bufnr, " ")
end,
}
--- Adds all entries to the quickfix list, keeping the previous entries. --- Adds all entries to the quickfix list, keeping the previous entries.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.add_to_qflist = function(prompt_bufnr) actions.add_to_qflist = {
send_all_to_qf(prompt_bufnr, "a") pre = append_to_history,
end action = function(prompt_bufnr)
send_all_to_qf(prompt_bufnr, "a")
end,
}
--- Sends the selected entries to the location list, replacing the previous entries. --- Sends the selected entries to the location list, replacing the previous entries.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.send_selected_to_loclist = function(prompt_bufnr) actions.send_selected_to_loclist = {
send_selected_to_qf(prompt_bufnr, " ", "loclist") pre = append_to_history,
end action = function(prompt_bufnr)
send_selected_to_qf(prompt_bufnr, " ", "loclist")
end,
}
--- Adds the selected entries to the location list, keeping the previous entries. --- Adds the selected entries to the location list, keeping the previous entries.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.add_selected_to_loclist = function(prompt_bufnr) actions.add_selected_to_loclist = {
send_selected_to_qf(prompt_bufnr, "a", "loclist") pre = append_to_history,
end action = function(prompt_bufnr)
send_selected_to_qf(prompt_bufnr, "a", "loclist")
end,
}
--- Sends all entries to the location list, replacing the previous entries. --- Sends all entries to the location list, replacing the previous entries.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.send_to_loclist = function(prompt_bufnr) actions.send_to_loclist = {
send_all_to_qf(prompt_bufnr, " ", "loclist") pre = append_to_history,
end action = function(prompt_bufnr)
send_all_to_qf(prompt_bufnr, " ", "loclist")
end,
}
--- Adds all entries to the location list, keeping the previous entries. --- Adds all entries to the location list, keeping the previous entries.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.add_to_loclist = function(prompt_bufnr) actions.add_to_loclist = {
send_all_to_qf(prompt_bufnr, "a", "loclist") pre = append_to_history,
end action = function(prompt_bufnr)
send_all_to_qf(prompt_bufnr, "a", "loclist")
end,
}
local smart_send = function(prompt_bufnr, mode, target) local smart_send = function(prompt_bufnr, mode, target)
local picker = action_state.get_current_picker(prompt_bufnr) local picker = action_state.get_current_picker(prompt_bufnr)
@ -922,31 +898,39 @@ end
--- Sends the selected entries to the quickfix list, replacing the previous entries. --- Sends the selected entries to the quickfix list, replacing the previous entries.
--- If no entry was selected, sends all entries. --- If no entry was selected, sends all entries.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.smart_send_to_qflist = function(prompt_bufnr) actions.smart_send_to_qflist = {
smart_send(prompt_bufnr, " ") pre = append_to_history,
end action = function(prompt_bufnr)
smart_send(prompt_bufnr, " ")
end,
}
--- Adds the selected entries to the quickfix list, keeping the previous entries. --- Adds the selected entries to the quickfix list, keeping the previous entries.
--- If no entry was selected, adds all entries. --- If no entry was selected, adds all entries.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.smart_add_to_qflist = function(prompt_bufnr) actions.smart_add_to_qflist = {
smart_send(prompt_bufnr, "a") pre = append_to_history,
end action = function(prompt_bufnr)
smart_send(prompt_bufnr, "a")
end,
}
--- Sends the selected entries to the location list, replacing the previous entries. --- Sends the selected entries to the location list, replacing the previous entries.
--- If no entry was selected, sends all entries. --- If no entry was selected, sends all entries.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.smart_send_to_loclist = function(prompt_bufnr) actions.smart_send_to_loclist = {
smart_send(prompt_bufnr, " ", "loclist") pre = append_to_history,
end action = function(prompt_bufnr)
smart_send(prompt_bufnr, " ", "loclist")
end,
}
--- Adds the selected entries to the location list, keeping the previous entries. --- Adds the selected entries to the location list, keeping the previous entries.
--- If no entry was selected, adds all entries. --- If no entry was selected, adds all entries.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.smart_add_to_loclist = function(prompt_bufnr) actions.smart_add_to_loclist = {
smart_send(prompt_bufnr, "a", "loclist") pre = append_to_history,
end action = function(prompt_bufnr)
smart_send(prompt_bufnr, "a", "loclist")
end,
}
--- Open completion menu containing the tags which can be used to filter the results in a faster way --- Open completion menu containing the tags which can be used to filter the results in a faster way
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.complete_tag = function(prompt_bufnr) actions.complete_tag = function(prompt_bufnr)
@ -1037,7 +1021,7 @@ end
--- `actions.smart_send_to_qflist + actions.open_qflist` --- `actions.smart_send_to_qflist + actions.open_qflist`
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
actions.open_qflist = function(prompt_bufnr) actions.open_qflist = function(prompt_bufnr)
vim.cmd [[copen]] vim.cmd [[botright copen]]
end end
--- Open the location list. It makes sense to use this in combination with one of the send_to_loclist actions --- Open the location list. It makes sense to use this in combination with one of the send_to_loclist actions
@ -1154,26 +1138,10 @@ actions.which_key = function(prompt_bufnr, opts)
local mappings = {} local mappings = {}
local mode = a.nvim_get_mode().mode local mode = a.nvim_get_mode().mode
for _, v in pairs(action_utils.get_registered_mappings(prompt_bufnr)) do for _, v in pairs(action_utils.get_registered_mappings(prompt_bufnr)) do
-- holds true for registered keymaps if v.desc and v.desc ~= "which_key" and v.desc ~= "nop" then
if type(v.func) == "table" then
local name = ""
for _, action in ipairs(v.func) do
if type(action) == "string" then
name = name == "" and action or name .. " + " .. action
end
end
if name and name ~= "which_key" and name ~= "nop" then
if not opts.only_show_current_mode or mode == v.mode then
table.insert(mappings, { mode = v.mode, keybind = v.keybind, name = name })
end
end
elseif type(v.func) == "function" then
if not opts.only_show_current_mode or mode == v.mode then if not opts.only_show_current_mode or mode == v.mode then
local fname = action_utils._get_anon_function_name(v.func) table.insert(mappings, { mode = v.mode, keybind = v.keybind, name = v.desc })
-- telescope.setup mappings might result in function names that reflect the keys if v.desc == "<anonymous>" then
fname = fname:lower() == v.keybind:lower() and "<anonymous>" or fname
table.insert(mappings, { mode = v.mode, keybind = v.keybind, name = fname })
if fname == "<anonymous>" then
utils.notify("actions.which_key", { utils.notify("actions.which_key", {
msg = "No name available for anonymous functions.", msg = "No name available for anonymous functions.",
level = "INFO", level = "INFO",

View File

@ -67,8 +67,6 @@ end
local edit_buffer local edit_buffer
do do
local map = { local map = {
drop = "drop",
["tab drop"] = "tab drop",
edit = "buffer", edit = "buffer",
new = "sbuffer", new = "sbuffer",
vnew = "vert sbuffer", vnew = "vert sbuffer",
@ -80,11 +78,7 @@ do
if command == nil then if command == nil then
error "There was no associated buffer command" error "There was no associated buffer command"
end end
if command ~= "drop" and command ~= "tab drop" then vim.cmd(string.format("%s %d", command, bufnr))
vim.cmd(string.format("%s %d", command, bufnr))
else
vim.cmd(string.format("%s %s", command, vim.api.nvim_buf_get_name(bufnr)))
end
end end
end end
@ -110,7 +104,7 @@ action_set.edit = function(prompt_bufnr, command)
-- TODO: Check for off-by-one -- TODO: Check for off-by-one
row = entry.row or entry.lnum row = entry.row or entry.lnum
col = vim.F.if_nil(entry.col, 1) col = entry.col
elseif not entry.bufnr then elseif not entry.bufnr then
-- TODO: Might want to remove this and force people -- TODO: Might want to remove this and force people
-- to put stuff into `filename` -- to put stuff into `filename`
@ -164,8 +158,19 @@ action_set.edit = function(prompt_bufnr, command)
-- check if we didn't pick a different buffer -- check if we didn't pick a different buffer
-- prevents restarting lsp server -- prevents restarting lsp server
if vim.api.nvim_buf_get_name(0) ~= filename or command ~= "edit" then if vim.api.nvim_buf_get_name(0) ~= filename or command ~= "edit" then
filename = Path:new(vim.fn.fnameescape(filename)):normalize(vim.loop.cwd()) filename = Path:new(filename):normalize(vim.loop.cwd())
pcall(vim.cmd, string.format("%s %s", command, filename)) pcall(vim.cmd, string.format("%s %s", command, vim.fn.fnameescape(filename)))
end
end
local pos = vim.api.nvim_win_get_cursor(0)
if col == nil then
if row == pos[1] then
col = pos[2] + 1
elseif row == nil then
row, col = pos[1], pos[2] + 1
else
col = 1
end end
end end

View File

@ -33,8 +33,6 @@ local select_to_edit_map = {
horizontal = "new", horizontal = "new",
vertical = "vnew", vertical = "vnew",
tab = "tabedit", tab = "tabedit",
drop = "drop",
["tab drop"] = "tab drop",
} }
function action_state.select_key_to_edit_key(type) function action_state.select_key_to_edit_key(type)
return select_to_edit_map[type] return select_to_edit_map[type]

View File

@ -13,7 +13,7 @@ local utils = {}
--- Apply `f` to the entries of the current picker. --- Apply `f` to the entries of the current picker.
--- - Notes: --- - Notes:
--- - Mapped entries include all currently filtered results, not just the visible onces. --- - Mapped entries include all currently filtered results, not just the visible ones.
--- - Indices are 1-indexed, whereas rows are 0-indexed. --- - Indices are 1-indexed, whereas rows are 0-indexed.
--- - Warning: `map_entries` has no return value. --- - Warning: `map_entries` has no return value.
--- - The below example showcases how to collect results --- - The below example showcases how to collect results
@ -26,7 +26,7 @@ local utils = {}
--- local prompt_bufnr = vim.api.nvim_get_current_buf() --- local prompt_bufnr = vim.api.nvim_get_current_buf()
--- local current_picker = action_state.get_current_picker(prompt_bufnr) --- local current_picker = action_state.get_current_picker(prompt_bufnr)
--- local results = {} --- local results = {}
--- action_utils.map_entries(prompt_bufnr, function(entry, index, row) --- action_utils.map_entries(prompt_bufnr, function(entry, index, row)
--- results[row] = entry.value --- results[row] = entry.value
--- end) --- end)
--- return results --- return results
@ -50,7 +50,7 @@ end
--- Apply `f` to the multi selections of the current picker and return a table of mapped selections. --- Apply `f` to the multi selections of the current picker and return a table of mapped selections.
--- - Notes: --- - Notes:
--- - Mapped selections may include results not visible in the results popup. --- - Mapped selections may include results not visible in the results pop up.
--- - Selected entries are returned in order of their selection. --- - Selected entries are returned in order of their selection.
--- - Warning: `map_selections` has no return value. --- - Warning: `map_selections` has no return value.
--- - The below example showcases how to collect results --- - The below example showcases how to collect results
@ -63,7 +63,7 @@ end
--- local prompt_bufnr = vim.api.nvim_get_current_buf() --- local prompt_bufnr = vim.api.nvim_get_current_buf()
--- local current_picker = action_state.get_current_picker(prompt_bufnr) --- local current_picker = action_state.get_current_picker(prompt_bufnr)
--- local results = {} --- local results = {}
--- action_utils.map_selections(prompt_bufnr, function(entry, index) --- action_utils.map_selections(prompt_bufnr, function(entry, index)
--- results[index] = entry.value --- results[index] = entry.value
--- end) --- end)
--- return results --- return results
@ -81,25 +81,25 @@ function utils.map_selections(prompt_bufnr, f)
end end
end end
local findnth = function(str, nth)
local array = {}
for i in string.gmatch(str, "%d+") do
table.insert(array, tonumber(i))
end
return array[nth]
end
--- Utility to collect mappings of prompt buffer in array of `{mode, keybind, name}`. --- Utility to collect mappings of prompt buffer in array of `{mode, keybind, name}`.
---@param prompt_bufnr number: The prompt bufnr ---@param prompt_bufnr number: The prompt bufnr
function utils.get_registered_mappings(prompt_bufnr) function utils.get_registered_mappings(prompt_bufnr)
local ret = {} local ret = {}
for _, mode in ipairs { "n", "i" } do for _, mode in ipairs { "n", "i" } do
local mode_mappings = vim.api.nvim_buf_get_keymap(prompt_bufnr, mode) for _, mapping in ipairs(vim.api.nvim_buf_get_keymap(prompt_bufnr, mode)) do
for _, mapping in ipairs(mode_mappings) do
-- ensure only telescope mappings -- ensure only telescope mappings
if mapping.rhs and string.find(mapping.rhs, [[require%('telescope.mappings'%).execute_keymap]]) then if mapping.desc then
local funcid = findnth(mapping.rhs, 2) if mapping.desc:sub(1, 10) == "telescope|" then
table.insert(ret, { mode = mode, keybind = mapping.lhs, func = __TelescopeKeymapStore[prompt_bufnr][funcid] }) table.insert(ret, { mode = mode, keybind = mapping.lhs, desc = mapping.desc:sub(11) })
elseif mapping.desc:sub(1, 11) == "telescopej|" then
local fname = utils._get_anon_function_name(vim.json.decode(mapping.desc:sub(12)))
fname = fname:lower() == mapping.lhs:lower() and "<anonymous>" or fname
table.insert(ret, {
mode = mode,
keybind = mapping.lhs,
desc = fname,
})
end
end end
end end
end end
@ -107,9 +107,8 @@ function utils.get_registered_mappings(prompt_bufnr)
end end
-- Best effort to infer function names for actions.which_key -- Best effort to infer function names for actions.which_key
function utils._get_anon_function_name(func_ref) function utils._get_anon_function_name(info)
local Path = require "plenary.path" local Path = require "plenary.path"
local info = debug.getinfo(func_ref)
local fname local fname
-- if fn defined in string (ie loadstring) source is string -- if fn defined in string (ie loadstring) source is string
-- if fn defined in file, source is file name prefixed with a `@´ -- if fn defined in file, source is file name prefixed with a `@´

View File

@ -59,6 +59,36 @@ local get_open_filelist = function(grep_open_files, cwd)
return filelist return filelist
end end
local opts_contain_invert = function(args)
local invert = false
local files_with_matches = false
for _, v in ipairs(args) do
if v == "--invert-match" then
invert = true
elseif v == "--files-with-matches" or v == "--files-without-match" then
files_with_matches = true
end
if #v >= 2 and v:sub(1, 1) == "-" and v:sub(2, 2) ~= "-" then
local non_option = false
for i = 2, #v do
local vi = v:sub(i, i)
if vi == "=" then -- ignore option -g=xxx
break
elseif vi == "g" or vi == "f" or vi == "m" or vi == "e" or vi == "r" or vi == "t" or vi == "T" then
non_option = true
elseif non_option == false and vi == "v" then
invert = true
elseif non_option == false and vi == "l" then
files_with_matches = true
end
end
end
end
return invert, files_with_matches
end
-- Special keys: -- Special keys:
-- opts.search_dirs -- list of directory to search in -- opts.search_dirs -- list of directory to search in
-- opts.grep_open_files -- boolean to restrict search to open files -- opts.grep_open_files -- boolean to restrict search to open files
@ -96,9 +126,10 @@ files.live_grep = function(opts)
end end
end end
local live_grepper = finders.new_job(function(prompt) local args = flatten { vimgrep_arguments, additional_args }
-- TODO: Probably could add some options for smart case and whatever else rg offers. opts.__inverted, opts.__matches = opts_contain_invert(args)
local live_grepper = finders.new_job(function(prompt)
if not prompt or prompt == "" then if not prompt or prompt == "" then
return nil return nil
end end
@ -111,7 +142,7 @@ files.live_grep = function(opts)
search_list = search_dirs search_list = search_dirs
end end
return flatten { vimgrep_arguments, additional_args, "--", prompt, search_list } return flatten { args, "--", prompt, search_list }
end, opts.entry_maker or make_entry.gen_from_vimgrep(opts), opts.max_results, opts.cwd) end, opts.entry_maker or make_entry.gen_from_vimgrep(opts), opts.max_results, opts.cwd)
pickers pickers
@ -148,7 +179,6 @@ files.grep_string = function(opts)
if search == "" then if search == "" then
search = { "-v", "--", "^[[:space:]]*$" } search = { "-v", "--", "^[[:space:]]*$" }
opts.__inverted = true
else else
search = { "--", search } search = { "--", search }
end end
@ -159,6 +189,7 @@ files.grep_string = function(opts)
opts.word_match, opts.word_match,
search, search,
} }
opts.__inverted, opts.__matches = opts_contain_invert(args)
if opts.grep_open_files then if opts.grep_open_files then
for _, file in ipairs(get_open_filelist(opts.grep_open_files, opts.cwd)) do for _, file in ipairs(get_open_filelist(opts.grep_open_files, opts.cwd)) do
@ -401,13 +432,11 @@ files.current_buffer_fuzzy_find = function(opts)
local _, ts_configs = pcall(require, "nvim-treesitter.configs") local _, ts_configs = pcall(require, "nvim-treesitter.configs")
local parser_ok, parser = pcall(vim.treesitter.get_parser, opts.bufnr, filetype) local parser_ok, parser = pcall(vim.treesitter.get_parser, opts.bufnr, filetype)
local query_ok, query = pcall(vim.treesitter.get_query, filetype, "highlights") local get_query = vim.treesitter.query.get or vim.treesitter.get_query
local query_ok, query = pcall(get_query, filetype, "highlights")
if parser_ok and query_ok and ts_ok and ts_configs.is_enabled("highlight", filetype, opts.bufnr) then if parser_ok and query_ok and ts_ok and ts_configs.is_enabled("highlight", filetype, opts.bufnr) then
local root = parser:parse()[1]:root() local root = parser:parse()[1]:root()
local highlighter = vim.treesitter.highlighter.new(parser)
local highlighter_query = highlighter:get_query(filetype)
local line_highlights = setmetatable({}, { local line_highlights = setmetatable({}, {
__index = function(t, k) __index = function(t, k)
local obj = {} local obj = {}
@ -418,9 +447,23 @@ files.current_buffer_fuzzy_find = function(opts)
-- update to changes on Neovim master, see https://github.com/neovim/neovim/pull/19931 -- update to changes on Neovim master, see https://github.com/neovim/neovim/pull/19931
-- TODO(clason): remove when dropping support for Neovim 0.7 -- TODO(clason): remove when dropping support for Neovim 0.7
local on_nvim_master = vim.fn.has "nvim-0.8" == 1 local get_hl_from_capture = (function()
if vim.fn.has "nvim-0.8" == 1 then
return function(q, id)
return "@" .. q.captures[id]
end
else
local highlighter = vim.treesitter.highlighter.new(parser)
local highlighter_query = highlighter:get_query(filetype)
return function(_, id)
return highlighter_query:_get_hl_from_capture(id)
end
end
end)()
for id, node in query:iter_captures(root, opts.bufnr, 0, -1) do for id, node in query:iter_captures(root, opts.bufnr, 0, -1) do
local hl = on_nvim_master and query.captures[id] or highlighter_query:_get_hl_from_capture(id) local hl = get_hl_from_capture(query, id)
if hl and type(hl) ~= "number" then if hl and type(hl) ~= "number" then
local row1, col1, row2, col2 = node:range() local row1, col1, row2, col2 = node:range()
@ -469,6 +512,7 @@ files.current_buffer_fuzzy_find = function(opts)
return true return true
end, end,
push_cursor_on_edit = true,
}) })
:find() :find()
end end

View File

@ -71,12 +71,9 @@ git.commits = function(opts)
sorter = conf.file_sorter(opts), sorter = conf.file_sorter(opts),
attach_mappings = function(_, map) attach_mappings = function(_, map)
actions.select_default:replace(actions.git_checkout) actions.select_default:replace(actions.git_checkout)
map("i", "<c-r>m", actions.git_reset_mixed) map({ "i", "n" }, "<c-r>m", actions.git_reset_mixed)
map("n", "<c-r>m", actions.git_reset_mixed) map({ "i", "n" }, "<c-r>s", actions.git_reset_soft)
map("i", "<c-r>s", actions.git_reset_soft) map({ "i", "n" }, "<c-r>h", actions.git_reset_hard)
map("n", "<c-r>s", actions.git_reset_soft)
map("i", "<c-r>h", actions.git_reset_hard)
map("n", "<c-r>h", actions.git_reset_hard)
return true return true
end, end,
}) })
@ -293,23 +290,12 @@ git.branches = function(opts)
sorter = conf.file_sorter(opts), sorter = conf.file_sorter(opts),
attach_mappings = function(_, map) attach_mappings = function(_, map)
actions.select_default:replace(actions.git_checkout) actions.select_default:replace(actions.git_checkout)
map("i", "<c-t>", actions.git_track_branch) map({ "i", "n" }, "<c-t>", actions.git_track_branch)
map("n", "<c-t>", actions.git_track_branch) map({ "i", "n" }, "<c-r>", actions.git_rebase_branch)
map({ "i", "n" }, "<c-a>", actions.git_create_branch)
map("i", "<c-r>", actions.git_rebase_branch) map({ "i", "n" }, "<c-s>", actions.git_switch_branch)
map("n", "<c-r>", actions.git_rebase_branch) map({ "i", "n" }, "<c-d>", actions.git_delete_branch)
map({ "i", "n" }, "<c-y>", actions.git_merge_branch)
map("i", "<c-a>", actions.git_create_branch)
map("n", "<c-a>", actions.git_create_branch)
map("i", "<c-s>", actions.git_switch_branch)
map("n", "<c-s>", actions.git_switch_branch)
map("i", "<c-d>", actions.git_delete_branch)
map("n", "<c-d>", actions.git_delete_branch)
map("i", "<c-y>", actions.git_merge_branch)
map("n", "<c-y>", actions.git_merge_branch)
return true return true
end, end,
}) })
@ -327,7 +313,7 @@ git.status = function(opts)
local gen_new_finder = function() local gen_new_finder = function()
local expand_dir = vim.F.if_nil(opts.expand_dir, true) local expand_dir = vim.F.if_nil(opts.expand_dir, true)
local git_cmd = { "git", "status", "-s", "--", "." } local git_cmd = { "git", "status", "-z", "--", "." }
if expand_dir then if expand_dir then
table.insert(git_cmd, #git_cmd - 1, "-u") table.insert(git_cmd, #git_cmd - 1, "-u")
@ -345,7 +331,7 @@ git.status = function(opts)
end end
return finders.new_table { return finders.new_table {
results = output, results = vim.split(output[1], "", { trimempty = true }),
entry_maker = vim.F.if_nil(opts.entry_maker, make_entry.gen_from_git_status(opts)), entry_maker = vim.F.if_nil(opts.entry_maker, make_entry.gen_from_git_status(opts)),
} }
end end
@ -368,8 +354,7 @@ git.status = function(opts)
end, end,
} }
map("i", "<tab>", actions.git_staging_toggle) map({ "i", "n" }, "<tab>", actions.git_staging_toggle)
map("n", "<tab>", actions.git_staging_toggle)
return true return true
end, end,
}) })
@ -392,11 +377,7 @@ local set_opts_cwd = function(opts)
local in_bare = utils.get_os_command_output({ "git", "rev-parse", "--is-bare-repository" }, opts.cwd) local in_bare = utils.get_os_command_output({ "git", "rev-parse", "--is-bare-repository" }, opts.cwd)
if in_worktree[1] ~= "true" and in_bare[1] ~= "true" then if in_worktree[1] ~= "true" and in_bare[1] ~= "true" then
utils.notify("builtin.git", { error(opts.cwd .. " is not a git directory")
msg = opts.cwd .. " is not a git directory",
level = "ERROR",
})
return false
elseif in_worktree[1] ~= "true" and in_bare[1] == "true" then elseif in_worktree[1] ~= "true" and in_bare[1] == "true" then
opts.is_bare = true opts.is_bare = true
end end
@ -405,8 +386,6 @@ local set_opts_cwd = function(opts)
opts.cwd = git_root[1] opts.cwd = git_root[1]
end end
end end
return true
end end
local function apply_checks(mod) local function apply_checks(mod)
@ -414,10 +393,8 @@ local function apply_checks(mod)
mod[k] = function(opts) mod[k] = function(opts)
opts = vim.F.if_nil(opts, {}) opts = vim.F.if_nil(opts, {})
local ok = set_opts_cwd(opts) set_opts_cwd(opts)
if ok then v(opts)
v(opts)
end
end end
end end

View File

@ -62,6 +62,10 @@ internal.builtin = function(opts)
end end
end end
table.sort(objs, function(a, b)
return a.text < b.text
end)
opts.bufnr = vim.api.nvim_get_current_buf() opts.bufnr = vim.api.nvim_get_current_buf()
opts.winnr = vim.api.nvim_get_current_win() opts.winnr = vim.api.nvim_get_current_win()
pickers pickers
@ -198,8 +202,7 @@ internal.pickers = function(opts)
opts["initial_mode"] = cached_pickers[selection_index].initial_mode opts["initial_mode"] = cached_pickers[selection_index].initial_mode
internal.resume(opts) internal.resume(opts)
end) end)
map("i", "<C-x>", actions.remove_selected_picker) map({ "i", "n" }, "<C-x>", actions.remove_selected_picker)
map("n", "<C-x>", actions.remove_selected_picker)
return true return true
end, end,
}) })
@ -368,6 +371,7 @@ internal.commands = function(opts)
if val.nargs == "0" then if val.nargs == "0" then
vim.cmd(cmd) vim.cmd(cmd)
vim.fn.histadd("cmd", val.name)
else else
vim.cmd [[stopinsert]] vim.cmd [[stopinsert]]
vim.fn.feedkeys(cmd, "n") vim.fn.feedkeys(cmd, "n")
@ -512,13 +516,14 @@ internal.oldfiles = function(opts)
end end
for _, file in ipairs(vim.v.oldfiles) do for _, file in ipairs(vim.v.oldfiles) do
if vim.loop.fs_stat(file) and not vim.tbl_contains(results, file) and file ~= current_file then local file_stat = vim.loop.fs_stat(file)
if file_stat and file_stat.type == "file" and not vim.tbl_contains(results, file) and file ~= current_file then
table.insert(results, file) table.insert(results, file)
end end
end end
if opts.cwd_only then if opts.cwd_only then
local cwd = vim.loop.cwd() local cwd = vim.loop.cwd() .. utils.get_separator()
cwd = cwd:gsub([[\]], [[\\]]) cwd = cwd:gsub([[\]], [[\\]])
results = vim.tbl_filter(function(file) results = vim.tbl_filter(function(file)
return vim.fn.matchstrpos(file, cwd)[2] ~= -1 return vim.fn.matchstrpos(file, cwd)[2] ~= -1
@ -556,10 +561,8 @@ internal.command_history = function(opts)
sorter = conf.generic_sorter(opts), sorter = conf.generic_sorter(opts),
attach_mappings = function(_, map) attach_mappings = function(_, map)
map("i", "<CR>", actions.set_command_line) actions.select_default:replace(actions.set_command_line)
map("n", "<CR>", actions.set_command_line) map({ "i", "n" }, "<C-e>", actions.edit_command_line)
map("n", "<C-e>", actions.edit_command_line)
map("i", "<C-e>", actions.edit_command_line)
-- TODO: Find a way to insert the text... it seems hard. -- TODO: Find a way to insert the text... it seems hard.
-- map('i', '<C-i>', actions.insert_value, { expr = true }) -- map('i', '<C-i>', actions.insert_value, { expr = true })
@ -588,10 +591,8 @@ internal.search_history = function(opts)
sorter = conf.generic_sorter(opts), sorter = conf.generic_sorter(opts),
attach_mappings = function(_, map) attach_mappings = function(_, map)
map("i", "<CR>", actions.set_search_line) actions.select_default:replace(actions.set_search_line)
map("n", "<CR>", actions.set_search_line) map({ "i", "n" }, "<C-e>", actions.edit_search_line)
map("n", "<C-e>", actions.edit_search_line)
map("i", "<C-e>", actions.edit_search_line)
-- TODO: Find a way to insert the text... it seems hard. -- TODO: Find a way to insert the text... it seems hard.
-- map('i', '<C-i>', actions.insert_value, { expr = true }) -- map('i', '<C-i>', actions.insert_value, { expr = true })
@ -755,8 +756,16 @@ internal.man_pages = function(opts)
opts.sections = vim.F.if_nil(opts.sections, { "1" }) opts.sections = vim.F.if_nil(opts.sections, { "1" })
assert(vim.tbl_islist(opts.sections), "sections should be a list") assert(vim.tbl_islist(opts.sections), "sections should be a list")
opts.man_cmd = utils.get_lazy_default(opts.man_cmd, function() opts.man_cmd = utils.get_lazy_default(opts.man_cmd, function()
local is_darwin = vim.loop.os_uname().sysname == "Darwin" local uname = vim.loop.os_uname()
return is_darwin and { "apropos", " " } or { "apropos", "" } local sysname = string.lower(uname.sysname)
if sysname == "darwin" then
local major_version = tonumber(vim.fn.matchlist(uname.release, [[^\(\d\+\)\..*]])[2]) or 0
return major_version >= 22 and { "apropos", "." } or { "apropos", " " }
elseif sysname == "freebsd" then
return { "apropos", "." }
else
return { "apropos", "" }
end
end) end)
opts.entry_maker = opts.entry_maker or make_entry.gen_from_apropos(opts) opts.entry_maker = opts.entry_maker or make_entry.gen_from_apropos(opts)
opts.env = { PATH = vim.env.PATH, MANPATH = vim.env.MANPATH } opts.env = { PATH = vim.env.PATH, MANPATH = vim.env.MANPATH }
@ -1069,7 +1078,7 @@ internal.marks = function(opts)
end end
internal.registers = function(opts) internal.registers = function(opts)
local registers_table = { '"', "_", "#", "=", "_", "/", "*", "+", ":", ".", "%" } local registers_table = { '"', "-", "#", "=", "/", "*", "+", ":", ".", "%" }
-- named -- named
for i = 0, 9 do for i = 0, 9 do
@ -1091,7 +1100,7 @@ internal.registers = function(opts)
sorter = conf.generic_sorter(opts), sorter = conf.generic_sorter(opts),
attach_mappings = function(_, map) attach_mappings = function(_, map)
actions.select_default:replace(actions.paste_register) actions.select_default:replace(actions.paste_register)
map("i", "<C-e>", actions.edit_register) map({ "i", "n" }, "<C-e>", actions.edit_register)
return true return true
end, end,
@ -1335,7 +1344,7 @@ internal.jumplist = function(opts)
local sorted_jumplist = {} local sorted_jumplist = {}
for i = #jumplist, 1, -1 do for i = #jumplist, 1, -1 do
if vim.api.nvim_buf_is_valid(jumplist[i].bufnr) then if vim.api.nvim_buf_is_valid(jumplist[i].bufnr) then
jumplist[i].text = vim.api.nvim_buf_get_lines(jumplist[i].bufnr, jumplist[i].lnum, jumplist[i].lnum + 1, false)[1] jumplist[i].text = vim.api.nvim_buf_get_lines(jumplist[i].bufnr, jumplist[i].lnum - 1, jumplist[i].lnum, false)[1]
or "" or ""
table.insert(sorted_jumplist, jumplist[i]) table.insert(sorted_jumplist, jumplist[i])
end end

View File

@ -25,7 +25,7 @@ lsp.references = function(opts)
local locations = {} local locations = {}
if result then if result then
local results = vim.lsp.util.locations_to_items(result, vim.lsp.get_client_by_id(ctx.client_id).offset_encoding) local results = vim.lsp.util.locations_to_items(result, vim.lsp.get_client_by_id(ctx.client_id).offset_encoding)
if not include_current_line then if include_current_line then
locations = vim.tbl_filter(function(v) locations = vim.tbl_filter(function(v)
-- Remove current line from result -- Remove current line from result
return not (v.filename == filepath and v.lnum == lnum) return not (v.filename == filepath and v.lnum == lnum)
@ -165,12 +165,15 @@ local function list_or_jump(action, title, opts)
if #flattened_results == 0 then if #flattened_results == 0 then
return return
elseif #flattened_results == 1 and opts.jump_type ~= "never" then elseif #flattened_results == 1 and opts.jump_type ~= "never" then
if opts.jump_type == "tab" then local uri = params.textDocument.uri
vim.cmd "tabedit" if uri ~= flattened_results[1].uri and uri ~= flattened_results[1].targetUri then
elseif opts.jump_type == "split" then if opts.jump_type == "tab" then
vim.cmd "new" vim.cmd "tabedit"
elseif opts.jump_type == "vsplit" then elseif opts.jump_type == "split" then
vim.cmd "vnew" vim.cmd "new"
elseif opts.jump_type == "vsplit" then
vim.cmd "vnew"
end
end end
vim.lsp.util.jump_to_location(flattened_results[1], offset_encoding) vim.lsp.util.jump_to_location(flattened_results[1], offset_encoding)
else else

View File

@ -55,6 +55,7 @@ end
---@field additional_args function|table: additional arguments to be passed on. Can be fn(opts) -> tbl ---@field additional_args function|table: additional arguments to be passed on. Can be fn(opts) -> tbl
---@field max_results number: define a upper result value ---@field max_results number: define a upper result value
---@field disable_coordinates boolean: don't show the line & row numbers (default: false) ---@field disable_coordinates boolean: don't show the line & row numbers (default: false)
---@field file_encoding string: file encoding for the entry & previewer
builtin.live_grep = require_on_exported_call("telescope.builtin.__files").live_grep builtin.live_grep = require_on_exported_call("telescope.builtin.__files").live_grep
--- Searches for the string under your cursor in your current working directory --- Searches for the string under your cursor in your current working directory
@ -68,6 +69,7 @@ builtin.live_grep = require_on_exported_call("telescope.builtin.__files").live_g
---@field additional_args function|table: additional arguments to be passed on. Can be fn(opts) -> tbl ---@field additional_args function|table: additional arguments to be passed on. Can be fn(opts) -> tbl
---@field disable_coordinates boolean: don't show the line and row numbers (default: false) ---@field disable_coordinates boolean: don't show the line and row numbers (default: false)
---@field only_sort_text boolean: only sort the text, not the file, line or row (default: false) ---@field only_sort_text boolean: only sort the text, not the file, line or row (default: false)
---@field file_encoding string: file encoding for the entry & previewer
builtin.grep_string = require_on_exported_call("telescope.builtin.__files").grep_string builtin.grep_string = require_on_exported_call("telescope.builtin.__files").grep_string
--- Search for files (respecting .gitignore) --- Search for files (respecting .gitignore)
@ -80,6 +82,7 @@ builtin.grep_string = require_on_exported_call("telescope.builtin.__files").grep
---@field no_ignore_parent boolean: show files ignored by .gitignore, .ignore, etc. in parent dirs. (default: false) ---@field no_ignore_parent boolean: show files ignored by .gitignore, .ignore, etc. in parent dirs. (default: false)
---@field search_dirs table: directory/directories/files to search ---@field search_dirs table: directory/directories/files to search
---@field search_file string: specify a filename to search for ---@field search_file string: specify a filename to search for
---@field file_encoding string: file encoding for the previewer
builtin.find_files = require_on_exported_call("telescope.builtin.__files").find_files builtin.find_files = require_on_exported_call("telescope.builtin.__files").find_files
--- This is an alias for the `find_files` picker --- This is an alias for the `find_files` picker
@ -91,11 +94,13 @@ builtin.fd = builtin.find_files
---@field show_line boolean: if true, shows the row:column that the result is found at (default: true) ---@field show_line boolean: if true, shows the row:column that the result is found at (default: true)
---@field bufnr number: specify the buffer number where treesitter should run. (default: current buffer) ---@field bufnr number: specify the buffer number where treesitter should run. (default: current buffer)
---@field symbol_highlights table: string -> string. Matches symbol with hl_group ---@field symbol_highlights table: string -> string. Matches symbol with hl_group
---@field file_encoding string: file encoding for the previewer
builtin.treesitter = require_on_exported_call("telescope.builtin.__files").treesitter builtin.treesitter = require_on_exported_call("telescope.builtin.__files").treesitter
--- Live fuzzy search inside of the currently open buffer --- Live fuzzy search inside of the currently open buffer
---@param opts table: options to pass to the picker ---@param opts table: options to pass to the picker
---@field skip_empty_lines boolean: if true we dont display empty lines (default: false) ---@field skip_empty_lines boolean: if true we don't display empty lines (default: false)
---@field file_encoding string: file encoding for the previewer
builtin.current_buffer_fuzzy_find = require_on_exported_call("telescope.builtin.__files").current_buffer_fuzzy_find builtin.current_buffer_fuzzy_find = require_on_exported_call("telescope.builtin.__files").current_buffer_fuzzy_find
--- Lists tags in current directory with tag location file preview (users are required to run ctags -R to generate tags --- Lists tags in current directory with tag location file preview (users are required to run ctags -R to generate tags
@ -132,7 +137,8 @@ builtin.current_buffer_tags = require_on_exported_call("telescope.builtin.__file
---@field use_git_root boolean: if we should use git root as cwd or the cwd (important for submodule) (default: true) ---@field use_git_root boolean: if we should use git root as cwd or the cwd (important for submodule) (default: true)
---@field show_untracked boolean: if true, adds `--others` flag to command and shows untracked files (default: false) ---@field show_untracked boolean: if true, adds `--others` flag to command and shows untracked files (default: false)
---@field recurse_submodules boolean: if true, adds the `--recurse-submodules` flag to command (default: false) ---@field recurse_submodules boolean: if true, adds the `--recurse-submodules` flag to command (default: false)
---@field git_command table: command that will be exectued. {"git","ls-files","--exclude-standard","--cached"} ---@field git_command table: command that will be executed. {"git","ls-files","--exclude-standard","--cached"}
---@field file_encoding string: file encoding for the previewer
builtin.git_files = require_on_exported_call("telescope.builtin.__git").files builtin.git_files = require_on_exported_call("telescope.builtin.__git").files
--- Lists commits for current directory with diff preview --- Lists commits for current directory with diff preview
@ -144,11 +150,11 @@ builtin.git_files = require_on_exported_call("telescope.builtin.__git").files
---@param opts table: options to pass to the picker ---@param opts table: options to pass to the picker
---@field cwd string: specify the path of the repo ---@field cwd string: specify the path of the repo
---@field use_git_root boolean: if we should use git root as cwd or the cwd (important for submodule) (default: true) ---@field use_git_root boolean: if we should use git root as cwd or the cwd (important for submodule) (default: true)
---@field git_command table: command that will be exectued. {"git","log","--pretty=oneline","--abbrev-commit","--","."} ---@field git_command table: command that will be executed. {"git","log","--pretty=oneline","--abbrev-commit","--","."}
builtin.git_commits = require_on_exported_call("telescope.builtin.__git").commits builtin.git_commits = require_on_exported_call("telescope.builtin.__git").commits
--- Lists commits for current buffer with diff preview --- Lists commits for current buffer with diff preview
--- - Default keymaps or your overriden `select_` keys: --- - Default keymaps or your overridden `select_` keys:
--- - `<cr>`: checks out the currently selected commit --- - `<cr>`: checks out the currently selected commit
--- - `<c-v>`: opens a diff in a vertical split --- - `<c-v>`: opens a diff in a vertical split
--- - `<c-x>`: opens a diff in a horizontal split --- - `<c-x>`: opens a diff in a horizontal split
@ -157,7 +163,7 @@ builtin.git_commits = require_on_exported_call("telescope.builtin.__git").commit
---@field cwd string: specify the path of the repo ---@field cwd string: specify the path of the repo
---@field use_git_root boolean: if we should use git root as cwd or the cwd (important for submodule) (default: true) ---@field use_git_root boolean: if we should use git root as cwd or the cwd (important for submodule) (default: true)
---@field current_file string: specify the current file that should be used for bcommits (default: current buffer) ---@field current_file string: specify the current file that should be used for bcommits (default: current buffer)
---@field git_command table: command that will be exectued. {"git","log","--pretty=oneline","--abbrev-commit"} ---@field git_command table: command that will be executed. {"git","log","--pretty=oneline","--abbrev-commit"}
builtin.git_bcommits = require_on_exported_call("telescope.builtin.__git").bcommits builtin.git_bcommits = require_on_exported_call("telescope.builtin.__git").bcommits
--- List branches for current directory, with output from `git log --oneline` shown in the preview window --- List branches for current directory, with output from `git log --oneline` shown in the preview window
@ -222,8 +228,8 @@ builtin.pickers = require_on_exported_call("telescope.builtin.__internal").picke
--- Use the telescope... --- Use the telescope...
---@param opts table: options to pass to the picker ---@param opts table: options to pass to the picker
---@field show_pluto boolean: we love pluto (default: false, because its a hidden feature) ---@field show_pluto boolean: we love Pluto (default: false, because its a hidden feature)
---@field show_moon boolean: we love the moon (default: false, because its a hidden feature) ---@field show_moon boolean: we love the Moon (default: false, because its a hidden feature)
builtin.planets = require_on_exported_call("telescope.builtin.__internal").planets builtin.planets = require_on_exported_call("telescope.builtin.__internal").planets
--- Lists symbols inside of `data/telescope-sources/*.json` found in your runtime path --- Lists symbols inside of `data/telescope-sources/*.json` found in your runtime path
@ -265,6 +271,7 @@ builtin.loclist = require_on_exported_call("telescope.builtin.__internal").locli
---@param opts table: options to pass to the picker ---@param opts table: options to pass to the picker
---@field only_cwd boolean: show only files in the cwd (default: false) ---@field only_cwd boolean: show only files in the cwd (default: false)
---@field cwd_only boolean: alias for only_cwd ---@field cwd_only boolean: alias for only_cwd
---@field file_encoding string: file encoding for the previewer
builtin.oldfiles = require_on_exported_call("telescope.builtin.__internal").oldfiles builtin.oldfiles = require_on_exported_call("telescope.builtin.__internal").oldfiles
--- Lists commands that were executed recently, and reruns them on `<cr>` --- Lists commands that were executed recently, and reruns them on `<cr>`
@ -309,6 +316,7 @@ builtin.reloader = require_on_exported_call("telescope.builtin.__internal").relo
---@field sort_lastused boolean: Sorts current and last buffer to the top and selects the lastused (default: false) ---@field sort_lastused boolean: Sorts current and last buffer to the top and selects the lastused (default: false)
---@field sort_mru boolean: Sorts all buffers after most recent used. Not just the current and last one (default: false) ---@field sort_mru boolean: Sorts all buffers after most recent used. Not just the current and last one (default: false)
---@field bufnr_width number: Defines the width of the buffer numbers in front of the filenames (default: dynamic) ---@field bufnr_width number: Defines the width of the buffer numbers in front of the filenames (default: dynamic)
---@field file_encoding string: file encoding for the previewer
builtin.buffers = require_on_exported_call("telescope.builtin.__internal").buffers builtin.buffers = require_on_exported_call("telescope.builtin.__internal").buffers
--- Lists available colorschemes and applies them on `<cr>` --- Lists available colorschemes and applies them on `<cr>`
@ -318,6 +326,7 @@ builtin.colorscheme = require_on_exported_call("telescope.builtin.__internal").c
--- Lists vim marks and their value, jumps to the mark on `<cr>` --- Lists vim marks and their value, jumps to the mark on `<cr>`
---@param opts table: options to pass to the picker ---@param opts table: options to pass to the picker
---@field file_encoding string: file encoding for the previewer
builtin.marks = require_on_exported_call("telescope.builtin.__internal").marks builtin.marks = require_on_exported_call("telescope.builtin.__internal").marks
--- Lists vim registers, pastes the contents of the register on `<cr>` --- Lists vim registers, pastes the contents of the register on `<cr>`
@ -375,6 +384,7 @@ builtin.jumplist = require_on_exported_call("telescope.builtin.__internal").jump
---@field fname_width number: defines the width of the filename section (default: 30) ---@field fname_width number: defines the width of the filename section (default: 30)
---@field show_line boolean: show results text (default: true) ---@field show_line boolean: show results text (default: true)
---@field trim_text boolean: trim results text (default: false) ---@field trim_text boolean: trim results text (default: false)
---@field file_encoding string: file encoding for the previewer
builtin.lsp_references = require_on_exported_call("telescope.builtin.__lsp").references builtin.lsp_references = require_on_exported_call("telescope.builtin.__lsp").references
--- Lists LSP incoming calls for word under the cursor, jumps to reference on `<cr>` --- Lists LSP incoming calls for word under the cursor, jumps to reference on `<cr>`
@ -382,6 +392,7 @@ builtin.lsp_references = require_on_exported_call("telescope.builtin.__lsp").ref
---@field fname_width number: defines the width of the filename section (default: 30) ---@field fname_width number: defines the width of the filename section (default: 30)
---@field show_line boolean: show results text (default: true) ---@field show_line boolean: show results text (default: true)
---@field trim_text boolean: trim results text (default: false) ---@field trim_text boolean: trim results text (default: false)
---@field file_encoding string: file encoding for the previewer
builtin.lsp_incoming_calls = require_on_exported_call("telescope.builtin.__lsp").incoming_calls builtin.lsp_incoming_calls = require_on_exported_call("telescope.builtin.__lsp").incoming_calls
--- Lists LSP outgoing calls for word under the cursor, jumps to reference on `<cr>` --- Lists LSP outgoing calls for word under the cursor, jumps to reference on `<cr>`
@ -389,31 +400,35 @@ builtin.lsp_incoming_calls = require_on_exported_call("telescope.builtin.__lsp")
---@field fname_width number: defines the width of the filename section (default: 30) ---@field fname_width number: defines the width of the filename section (default: 30)
---@field show_line boolean: show results text (default: true) ---@field show_line boolean: show results text (default: true)
---@field trim_text boolean: trim results text (default: false) ---@field trim_text boolean: trim results text (default: false)
---@field file_encoding string: file encoding for the previewer
builtin.lsp_outgoing_calls = require_on_exported_call("telescope.builtin.__lsp").outgoing_calls builtin.lsp_outgoing_calls = require_on_exported_call("telescope.builtin.__lsp").outgoing_calls
--- Goto the definition of the word under the cursor, if there's only one, otherwise show all options in Telescope --- Goto the definition of the word under the cursor, if there's only one, otherwise show all options in Telescope
---@param opts table: options to pass to the picker ---@param opts table: options to pass to the picker
---@field jump_type string: how to goto definition if there is only one, values: "tab", "split", "vsplit", "never" ---@field jump_type string: how to goto definition if there is only one and the definition file is different from the current file, values: "tab", "split", "vsplit", "never"
---@field fname_width number: defines the width of the filename section (default: 30) ---@field fname_width number: defines the width of the filename section (default: 30)
---@field show_line boolean: show results text (default: true) ---@field show_line boolean: show results text (default: true)
---@field trim_text boolean: trim results text (default: false) ---@field trim_text boolean: trim results text (default: false)
---@field file_encoding string: file encoding for the previewer
builtin.lsp_definitions = require_on_exported_call("telescope.builtin.__lsp").definitions builtin.lsp_definitions = require_on_exported_call("telescope.builtin.__lsp").definitions
--- Goto the definition of the type of the word under the cursor, if there's only one, --- Goto the definition of the type of the word under the cursor, if there's only one,
--- otherwise show all options in Telescope --- otherwise show all options in Telescope
---@param opts table: options to pass to the picker ---@param opts table: options to pass to the picker
---@field jump_type string: how to goto definition if there is only one, values: "tab", "split", "vsplit", "never" ---@field jump_type string: how to goto definition if there is only one and the definition file is different from the current file, values: "tab", "split", "vsplit", "never"
---@field fname_width number: defines the width of the filename section (default: 30) ---@field fname_width number: defines the width of the filename section (default: 30)
---@field show_line boolean: show results text (default: true) ---@field show_line boolean: show results text (default: true)
---@field trim_text boolean: trim results text (default: false) ---@field trim_text boolean: trim results text (default: false)
---@field file_encoding string: file encoding for the previewer
builtin.lsp_type_definitions = require("telescope.builtin.__lsp").type_definitions builtin.lsp_type_definitions = require("telescope.builtin.__lsp").type_definitions
--- Goto the implementation of the word under the cursor if there's only one, otherwise show all options in Telescope --- Goto the implementation of the word under the cursor if there's only one, otherwise show all options in Telescope
---@param opts table: options to pass to the picker ---@param opts table: options to pass to the picker
---@field jump_type string: how to goto implementation if there is only one, values: "tab", "split", "vsplit", "never" ---@field jump_type string: how to goto implementation if there is only one and the definition file is different from the current file, values: "tab", "split", "vsplit", "never"
---@field fname_width number: defines the width of the filename section (default: 30) ---@field fname_width number: defines the width of the filename section (default: 30)
---@field show_line boolean: show results text (default: true) ---@field show_line boolean: show results text (default: true)
---@field trim_text boolean: trim results text (default: false) ---@field trim_text boolean: trim results text (default: false)
---@field file_encoding string: file encoding for the previewer
builtin.lsp_implementations = require_on_exported_call("telescope.builtin.__lsp").implementations builtin.lsp_implementations = require_on_exported_call("telescope.builtin.__lsp").implementations
--- Lists LSP document symbols in the current buffer --- Lists LSP document symbols in the current buffer
@ -421,10 +436,13 @@ builtin.lsp_implementations = require_on_exported_call("telescope.builtin.__lsp"
--- - `<C-l>`: show autocompletion menu to prefilter your query by type of symbol you want to see (i.e. `:variable:`) --- - `<C-l>`: show autocompletion menu to prefilter your query by type of symbol you want to see (i.e. `:variable:`)
---@param opts table: options to pass to the picker ---@param opts table: options to pass to the picker
---@field fname_width number: defines the width of the filename section (default: 30) ---@field fname_width number: defines the width of the filename section (default: 30)
---@field symbol_width number: defines the width of the symbol section (default: 25)
---@field symbol_type_width number: defines the width of the symbol type section (default: 8)
---@field show_line boolean: if true, shows the content of the line the tag is found on (default: false) ---@field show_line boolean: if true, shows the content of the line the tag is found on (default: false)
---@field symbols string|table: filter results by symbol kind(s) ---@field symbols string|table: filter results by symbol kind(s)
---@field ignore_symbols string|table: list of symbols to ignore ---@field ignore_symbols string|table: list of symbols to ignore
---@field symbol_highlights table: string -> string. Matches symbol with hl_group ---@field symbol_highlights table: string -> string. Matches symbol with hl_group
---@field file_encoding string: file encoding for the previewer
builtin.lsp_document_symbols = require_on_exported_call("telescope.builtin.__lsp").document_symbols builtin.lsp_document_symbols = require_on_exported_call("telescope.builtin.__lsp").document_symbols
--- Lists LSP document symbols in the current workspace --- Lists LSP document symbols in the current workspace
@ -433,10 +451,13 @@ builtin.lsp_document_symbols = require_on_exported_call("telescope.builtin.__lsp
---@param opts table: options to pass to the picker ---@param opts table: options to pass to the picker
---@field query string: for what to query the workspace (default: "") ---@field query string: for what to query the workspace (default: "")
---@field fname_width number: defines the width of the filename section (default: 30) ---@field fname_width number: defines the width of the filename section (default: 30)
---@field symbol_width number: defines the width of the symbol section (default: 25)
---@field symbol_type_width number: defines the width of the symbol type section (default: 8)
---@field show_line boolean: if true, shows the content of the line the tag is found on (default: false) ---@field show_line boolean: if true, shows the content of the line the tag is found on (default: false)
---@field symbols string|table: filter results by symbol kind(s) ---@field symbols string|table: filter results by symbol kind(s)
---@field ignore_symbols string|table: list of symbols to ignore ---@field ignore_symbols string|table: list of symbols to ignore
---@field symbol_highlights table: string -> string. Matches symbol with hl_group ---@field symbol_highlights table: string -> string. Matches symbol with hl_group
---@field file_encoding string: file encoding for the previewer
builtin.lsp_workspace_symbols = require_on_exported_call("telescope.builtin.__lsp").workspace_symbols builtin.lsp_workspace_symbols = require_on_exported_call("telescope.builtin.__lsp").workspace_symbols
--- Dynamically lists LSP for all workspace symbols --- Dynamically lists LSP for all workspace symbols
@ -448,6 +469,7 @@ builtin.lsp_workspace_symbols = require_on_exported_call("telescope.builtin.__ls
---@field symbols string|table: filter results by symbol kind(s) ---@field symbols string|table: filter results by symbol kind(s)
---@field ignore_symbols string|table: list of symbols to ignore ---@field ignore_symbols string|table: list of symbols to ignore
---@field symbol_highlights table: string -> string. Matches symbol with hl_group ---@field symbol_highlights table: string -> string. Matches symbol with hl_group
---@field file_encoding string: file encoding for the previewer
builtin.lsp_dynamic_workspace_symbols = require_on_exported_call("telescope.builtin.__lsp").dynamic_workspace_symbols builtin.lsp_dynamic_workspace_symbols = require_on_exported_call("telescope.builtin.__lsp").dynamic_workspace_symbols
-- --
@ -474,9 +496,10 @@ builtin.lsp_dynamic_workspace_symbols = require_on_exported_call("telescope.buil
builtin.diagnostics = require_on_exported_call("telescope.builtin.__diagnostics").get builtin.diagnostics = require_on_exported_call("telescope.builtin.__diagnostics").get
local apply_config = function(mod) local apply_config = function(mod)
local pickers_conf = require("telescope.config").pickers
for k, v in pairs(mod) do for k, v in pairs(mod) do
mod[k] = function(opts) mod[k] = function(opts)
local pickers_conf = require("telescope.config").pickers
opts = opts or {} opts = opts or {}
opts.bufnr = opts.bufnr or vim.api.nvim_get_current_buf() opts.bufnr = opts.bufnr or vim.api.nvim_get_current_buf()
opts.winnr = opts.winnr or vim.api.nvim_get_current_win() opts.winnr = opts.winnr or vim.api.nvim_get_current_win()

View File

@ -194,13 +194,13 @@ append(
"cycle_layout_list", "cycle_layout_list",
{ "horizontal", "vertical" }, { "horizontal", "vertical" },
[[ [[
Determines the layouts to cycle through when using `actions.cycle_layout_next` Determines the layouts to cycle through when using `actions.layout.cycle_layout_next`
and `actions.cycle_layout_prev`. and `actions.layout.cycle_layout_prev`.
Should be a list of "layout setups". Should be a list of "layout setups".
Each "layout setup" can take one of two forms: Each "layout setup" can take one of two forms:
1. string <br> 1. string
This is interpreted as the name of a `layout_strategy` This is interpreted as the name of a `layout_strategy`
2. table <br> 2. table
A table with possible keys `layout_strategy`, `layout_config` and `previewer` A table with possible keys `layout_strategy`, `layout_config` and `previewer`
Default: { "horizontal", "vertical" } Default: { "horizontal", "vertical" }
@ -241,7 +241,6 @@ append(
[[ [[
The character(s) that will be shown in front of the current selection. The character(s) that will be shown in front of the current selection.
Default: '> ']] Default: '> ']]
) )
@ -289,7 +288,7 @@ append(
"path_display", "path_display",
{}, {},
[[ [[
Determines how file paths are displayed Determines how file paths are displayed.
path_display can be set to an array with a combination of: path_display can be set to an array with a combination of:
- "hidden" hide file names - "hidden" hide file names
@ -302,7 +301,7 @@ append(
- "shorten" only display the first character of each directory in - "shorten" only display the first character of each directory in
the path the path
- "truncate" truncates the start of the path when the whole path will - "truncate" truncates the start of the path when the whole path will
not fit. To increase the the gap between the path and the edge. not fit. To increase the gap between the path and the edge,
set truncate to number `truncate = 3` set truncate to number `truncate = 3`
You can also specify the number of characters of each directory name You can also specify the number of characters of each directory name
@ -418,7 +417,7 @@ append(
[[ [[
Defines the default title of the prompt window. A false value Defines the default title of the prompt window. A false value
can be used to hide the title altogether. Most of the times builtins can be used to hide the title altogether. Most of the times builtins
define a prompt_title which will be prefered over this default. define a prompt_title which will be preferred over this default.
Default: "Prompt"]] Default: "Prompt"]]
) )
@ -442,6 +441,8 @@ append(
Will allow you to completely remove all of telescope's default maps Will allow you to completely remove all of telescope's default maps
and use your own. and use your own.
Default: nil
]] ]]
) )
@ -469,11 +470,11 @@ append(
Fields: Fields:
- path: The path to the telescope history as string. - path: The path to the telescope history as string.
default: stdpath("data")/telescope_history Default: stdpath("data")/telescope_history
- limit: The amount of entries that will be written in the - limit: The amount of entries that will be written in the
history. history.
Warning: If limit is set to nil it will grow unbound. Warning: If limit is set to nil it will grow unbound.
default: 100 Default: 100
- handler: A lua function that implements the history. - handler: A lua function that implements the history.
This is meant as a developer setting for extensions to This is meant as a developer setting for extensions to
override the history handling, e.g., override the history handling, e.g.,
@ -507,7 +508,8 @@ append(
indices larger than `cache_picker.num_pickers` will indices larger than `cache_picker.num_pickers` will
be cleared. be cleared.
Default: 1 Default: 1
- limit_entries: The amount of entries that will be written in the - limit_entries: The amount of entries that will be saved for each
picker.
Default: 1000 Default: 1000
]] ]]
) )
@ -611,7 +613,7 @@ append(
- msg_bg_fillchar: Character to fill background of unpreviewable buffers with - msg_bg_fillchar: Character to fill background of unpreviewable buffers with
Default: "" Default: ""
- hide_on_startup: Hide previewer when picker starts. Previewer can be toggled - hide_on_startup: Hide previewer when picker starts. Previewer can be toggled
with actions.toggle_preview. with actions.layout.toggle_preview.
Default: false Default: false
]] ]]
) )
@ -677,7 +679,7 @@ append(
[[ [[
A function pointer that specifies the file_sorter. This sorter will A function pointer that specifies the file_sorter. This sorter will
be used for find_files, git_files and similar. be used for find_files, git_files and similar.
Hint: If you load a native sorter, you dont need to change this value, Hint: If you load a native sorter, you don't need to change this value,
the native sorter will override it anyway. the native sorter will override it anyway.
Default: require("telescope.sorters").get_fzy_sorter]] Default: require("telescope.sorters").get_fzy_sorter]]
@ -689,7 +691,7 @@ append(
[[ [[
A function pointer to the generic sorter. The sorter that should be A function pointer to the generic sorter. The sorter that should be
used for everything that is not a file. used for everything that is not a file.
Hint: If you load a native sorter, you dont need to change this value, Hint: If you load a native sorter, you don't need to change this value,
the native sorter will override it anyway. the native sorter will override it anyway.
Default: require("telescope.sorters").get_fzy_sorter]] Default: require("telescope.sorters").get_fzy_sorter]]
@ -702,7 +704,7 @@ append(
[[ [[
This points to a wrapper sorter around the generic_sorter that is able This points to a wrapper sorter around the generic_sorter that is able
to do prefiltering. to do prefiltering.
Its usually used for lsp_*_symbols and lsp_*_diagnostics It's usually used for lsp_*_symbols and lsp_*_diagnostics
Default: require("telescope.sorters").prefilter]] Default: require("telescope.sorters").prefilter]]
) )

View File

@ -140,23 +140,27 @@ end
_resolve_map[function(val) _resolve_map[function(val)
return type(val) == "table" and val["max"] ~= nil and val[1] ~= nil and val[1] >= 0 and val[1] < 1 return type(val) == "table" and val["max"] ~= nil and val[1] ~= nil and val[1] >= 0 and val[1] < 1
end] = end] = function(
function(selector, val) selector,
return function(...) val
local selected = select(selector, ...) )
return math.min(math.floor(val[1] * selected), val["max"]) return function(...)
end local selected = select(selector, ...)
return math.min(math.floor(val[1] * selected), val["max"])
end end
end
_resolve_map[function(val) _resolve_map[function(val)
return type(val) == "table" and val["min"] ~= nil and val[1] ~= nil and val[1] >= 0 and val[1] < 1 return type(val) == "table" and val["min"] ~= nil and val[1] ~= nil and val[1] >= 0 and val[1] < 1
end] = end] = function(
function(selector, val) selector,
return function(...) val
local selected = select(selector, ...) )
return math.max(math.floor(val[1] * selected), val["min"]) return function(...)
end local selected = select(selector, ...)
return math.max(math.floor(val[1] * selected), val["min"])
end end
end
-- Add padding option -- Add padding option
_resolve_map[function(val) _resolve_map[function(val)

View File

@ -65,16 +65,24 @@ function JobFinder:_find(prompt, process_result, process_complete)
self.job:shutdown() self.job:shutdown()
end end
local line_num = 0
local on_output = function(_, line, _) local on_output = function(_, line, _)
line_num = line_num + 1
if not line or line == "" then if not line or line == "" then
return return
end end
local entry
if self.entry_maker then if self.entry_maker then
line = self.entry_maker(line) entry = self.entry_maker(line)
if entry then
entry.index = line_num
end
else
entry = line
end end
process_result(line) process_result(entry)
end end
local opts = self:fn_command(prompt) local opts = self:fn_command(prompt)
@ -131,8 +139,14 @@ end
function DynamicFinder:_find(prompt, process_result, process_complete) function DynamicFinder:_find(prompt, process_result, process_complete)
local results = self.fn(prompt) local results = self.fn(prompt)
local result_num = 0
for _, result in ipairs(results) do for _, result in ipairs(results) do
if process_result(self.entry_maker(result)) then result_num = result_num + 1
local entry = self.entry_maker(result)
if entry then
entry.index = result_num
end
if process_result(entry) then
return return
end end
end end
@ -204,8 +218,13 @@ finders.new_table = function(t)
return async_static_finder(t) return async_static_finder(t)
end end
finders.new_dynamic = function(t) --- Used to create a finder from a function.
return DynamicFinder:new(t) --
---@param opts table: stuff
-- @key fn function() => list[string]
-- @key entry_maker function Optional: function(line: string) => table
finders.new_dynamic = function(opts)
return DynamicFinder:new(opts)
end end
return finders return finders

View File

@ -56,8 +56,14 @@ return function(opts)
stdout = stdout, stdout = stdout,
} }
local line_num = 0
for line in stdout:iter(true) do for line in stdout:iter(true) do
if process_result(entry_maker(line)) then line_num = line_num + 1
local entry = entry_maker(line)
if entry then
entry.index = line_num
end
if process_result(entry) then
return return
end end
end end

View File

@ -70,9 +70,12 @@ return function(opts)
async.util.scheduler() async.util.scheduler()
end end
local v = entry_maker(line) local entry = entry_maker(line)
results[num_results] = v if entry then
process_result(v) entry.index = num_results
end
results[num_results] = entry
process_result(entry)
end end
process_complete() process_complete()

View File

@ -30,7 +30,7 @@ function from_entry.path(entry, validate, escape)
-- TODO(conni2461): we are not going to return the expanded path because -- TODO(conni2461): we are not going to return the expanded path because
-- this would lead to cache misses in the perviewer. -- this would lead to cache misses in the perviewer.
-- Requires overall refactoring in previewer interface -- Requires overall refactoring in previewer interface
local expanded = vim.fn.expand(path) local expanded = vim.fn.expand(vim.fn.escape(path, "$?*[]"))
if (vim.fn.filereadable(expanded) + vim.fn.isdirectory(expanded)) == 0 then if (vim.fn.filereadable(expanded) + vim.fn.isdirectory(expanded)) == 0 then
return return
end end

View File

@ -1,4 +1,10 @@
local health = vim.health or require "health" local health = vim.health or require "health"
local start = health.start or health.report_start
local ok = health.ok or health.report_ok
local warn = health.warn or health.report_warn
local error = health.error or health.report_error
local info = health.info or health.report_info
local extension_module = require "telescope._extensions" local extension_module = require "telescope._extensions"
local extension_info = require("telescope").extensions local extension_info = require("telescope").extensions
local is_win = vim.api.nvim_call_function("has", { "win32" }) == 1 local is_win = vim.api.nvim_call_function("has", { "win32" }) == 1
@ -60,23 +66,23 @@ local M = {}
M.check = function() M.check = function()
-- Required lua libs -- Required lua libs
health.report_start "Checking for required plugins" start "Checking for required plugins"
for _, plugin in ipairs(required_plugins) do for _, plugin in ipairs(required_plugins) do
if lualib_installed(plugin.lib) then if lualib_installed(plugin.lib) then
health.report_ok(plugin.lib .. " installed.") ok(plugin.lib .. " installed.")
else else
local lib_not_installed = plugin.lib .. " not found." local lib_not_installed = plugin.lib .. " not found."
if plugin.optional then if plugin.optional then
health.report_warn(("%s %s"):format(lib_not_installed, plugin.info)) warn(("%s %s"):format(lib_not_installed, plugin.info))
else else
health.report_error(lib_not_installed) error(lib_not_installed)
end end
end end
end end
-- external dependencies -- external dependencies
-- TODO: only perform checks if user has enabled dependency in their config -- TODO: only perform checks if user has enabled dependency in their config
health.report_start "Checking external dependencies" start "Checking external dependencies"
for _, opt_dep in pairs(optional_dependencies) do for _, opt_dep in pairs(optional_dependencies) do
for _, package in ipairs(opt_dep.package) do for _, package in ipairs(opt_dep.package) do
@ -84,9 +90,9 @@ M.check = function()
if not installed then if not installed then
local err_msg = ("%s: not found."):format(package.name) local err_msg = ("%s: not found."):format(package.name)
if package.optional then if package.optional then
health.report_warn(("%s %s"):format(err_msg, ("Install %s for extended capabilities"):format(package.url))) warn(("%s %s"):format(err_msg, ("Install %s for extended capabilities"):format(package.url)))
else else
health.report_error( error(
("%s %s"):format( ("%s %s"):format(
err_msg, err_msg,
("`%s` finder will not function without %s installed."):format(opt_dep.finder_name, package.url) ("`%s` finder will not function without %s installed."):format(opt_dep.finder_name, package.url)
@ -95,13 +101,13 @@ M.check = function()
end end
else else
local eol = version:find "\n" local eol = version:find "\n"
health.report_ok(("%s: found %s"):format(package.name, version:sub(0, eol - 1) or "(unknown version)")) ok(("%s: found %s"):format(package.name, version:sub(0, eol - 1) or "(unknown version)"))
end end
end end
end end
-- Extensions -- Extensions
health.report_start "===== Installed extensions =====" start "===== Installed extensions ====="
local installed = {} local installed = {}
for extension_name, _ in pairs(extension_info) do for extension_name, _ in pairs(extension_info) do
@ -112,11 +118,11 @@ M.check = function()
for _, installed_ext in ipairs(installed) do for _, installed_ext in ipairs(installed) do
local extension_healthcheck = extension_module._health[installed_ext] local extension_healthcheck = extension_module._health[installed_ext]
health.report_start(string.format("Telescope Extension: `%s`", installed_ext)) start(string.format("Telescope Extension: `%s`", installed_ext))
if extension_healthcheck then if extension_healthcheck then
extension_healthcheck() extension_healthcheck()
else else
health.report_info "No healthcheck provided" info "No healthcheck provided"
end end
end end
end end

View File

@ -13,10 +13,10 @@ local telescope = {}
--- ---
--- Getting started with telescope: --- Getting started with telescope:
--- 1. Run `:checkhealth telescope` to make sure everything is installed. --- 1. Run `:checkhealth telescope` to make sure everything is installed.
--- 2. Evaluate it working with --- 2. Evaluate it is working with
--- `:Telescope find_files` or --- `:Telescope find_files` or
--- `:lua require("telescope.builtin").find_files()` --- `:lua require("telescope.builtin").find_files()`
--- 3. Put a `require("telescope").setup() call somewhere in your neovim config. --- 3. Put a `require("telescope").setup()` call somewhere in your neovim config.
--- 4. Read |telescope.setup| to check what config keys are available and what you can put inside the setup call --- 4. Read |telescope.setup| to check what config keys are available and what you can put inside the setup call
--- 5. Read |telescope.builtin| to check which builtin pickers are offered and what options these implement --- 5. Read |telescope.builtin| to check which builtin pickers are offered and what options these implement
--- 6. Profit --- 6. Profit
@ -31,14 +31,14 @@ local telescope = {}
--- │ │ ┌───│Manager│────│ Sorter │┐ └───┬───* │ --- │ │ ┌───│Manager│────│ Sorter │┐ └───┬───* │
--- │ ▼ ▼ └───────* └────────┘│ │ │ --- │ ▼ ▼ └───────* └────────┘│ │ │
--- │ 1────────┐ 2───┴──┐ │ │ --- │ 1────────┐ 2───┴──┐ │ │
--- │ ┌─────│ Picker │ │Finder│────┘ │ --- │ ┌─────│ Picker │ │Finder│────┘ │
--- │ ▼ └───┬────┘ └──────* │ --- │ ▼ └───┬────┘ └──────* │
--- │ ┌────────┐ │ 3────────+ ▲ │ --- │ ┌────────┐ │ 3────────+ ▲ │
--- │ │Selected│ └───────│ Prompt │─────────┘ │ --- │ │Selected│ └───────│ Prompt │─────────┘ │
--- │ │ Entry │ └───┬────┘ │ --- │ │ Entry │ └───┬────┘ │
--- │ └────────* ┌───┴────┐ ┌────────┐ ┌────────┐ │ --- │ └────────* ┌───┴────┐ ┌────────┐ ┌────────┐ │
--- │ │ ▲ 4─────────┐│ Prompt │ │(Attach)│ │Actions │ │ --- │ │ ▲ 4─────────┐│ Prompt │ │(Attach)│ │Actions │ │
--- │ ▼ └──► │ Results ││ Buffer │◄─┤Mappings│◄─┤User Fn │ │ --- │ ▼ └──▶ │ Results ││ Buffer │◀─┤Mappings│◀─┤User Fn │ │
--- │5─────────┐ └─────────┘└────────┘ └────────┘ └────────┘ │ --- │5─────────┐ └─────────┘└────────┘ └────────┘ └────────┘ │
--- ││Previewer│ │ --- ││Previewer│ │
--- │└─────────┘ telescope.nvim architecture │ --- │└─────────┘ telescope.nvim architecture │

View File

@ -4,33 +4,32 @@
--- ---
--- Each picker has a finder made up of two parts, the results which are the --- Each picker has a finder made up of two parts, the results which are the
--- data to be displayed, and the entry_maker. These entry_makers are functions --- data to be displayed, and the entry_maker. These entry_makers are functions
--- returned from make_entry functions. These will be referrd to as --- returned from make_entry functions. These will be referred to as
--- entry_makers in the following documentation. --- entry_makers in the following documentation.
--- ---
--- Every entry maker returns a function which accepts the data to be used for --- Every entry maker returns a function that accepts the data to be used for
--- an entry. This function will return an entry table (or nil, meaning skip --- an entry. This function will return an entry table (or nil, meaning skip
--- this entry) which contains of the - following important keys: --- this entry) which contains the following important keys:
--- - value any: value key can be anything but still required --- - value any: value key can be anything but still required
--- - valid bool: is an optional key because it defaults to true but if the key --- - valid bool (optional): is an optional key because it defaults to true but if the key
--- is set to false it will not be displayed by the picker. (optional) --- is set to false it will not be displayed by the picker
--- - ordinal string: is the text that is used for filtering (required) --- - ordinal string: is the text that is used for filtering
--- - display string|function: is either a string of the text that is being --- - display string|function: is either a string of the text that is being
--- displayed or a function receiving the entry at a later stage, when the entry --- displayed or a function receiving the entry at a later stage, when the entry
--- is actually being displayed. A function can be useful here if complex --- is actually being displayed. A function can be useful here if a complex
--- calculation have to be done. `make_entry` can also return a second value --- calculation has to be done. `make_entry` can also return a second value -
--- a highlight array which will then apply to the line. Highlight entry in --- a highlight array which will then apply to the line. Highlight entry in
--- this array has the following signature `{ { start_col, end_col }, hl_group }` --- this array has the following signature `{ { start_col, end_col }, hl_group }`
--- (required). --- - filename string (optional): will be interpreted by the default `<cr>` action as
--- - filename string: will be interpreted by the default `<cr>` action as --- open this file
--- open this file (optional) --- - bufnr number (optional): will be interpreted by the default `<cr>` action as open
--- - bufnr number: will be interpreted by the default `<cr>` action as open --- this buffer
--- this buffer (optional) --- - lnum number (optional): lnum value which will be interpreted by the default `<cr>`
--- - lnum number: lnum value which will be interpreted by the default `<cr>` --- action as a jump to this line
--- action as a jump to this line (optional) --- - col number (optional): col value which will be interpreted by the default `<cr>`
--- - col number: col value which will be interpreted by the default `<cr>` --- action as a jump to this column
--- action as a jump to this column (optional)
--- ---
--- More information on easier displaying, see |telescope.pickers.entry_display| --- For more information on easier displaying, see |telescope.pickers.entry_display|
--- ---
--- TODO: Document something we call `entry_index` --- TODO: Document something we call `entry_index`
---@brief ]] ---@brief ]]
@ -158,13 +157,13 @@ do
mt_file_entry.cwd = cwd mt_file_entry.cwd = cwd
mt_file_entry.display = function(entry) mt_file_entry.display = function(entry)
local hl_group local hl_group, icon
local display = utils.transform_path(opts, entry.value) local display = utils.transform_path(opts, entry.value)
display, hl_group = utils.transform_devicons(entry.value, display, disable_devicons) display, hl_group, icon = utils.transform_devicons(entry.value, display, disable_devicons)
if hl_group then if hl_group then
return display, { { { 1, 3 }, hl_group } } return display, { { { 0, #icon }, hl_group } }
else else
return display return display
end end
@ -244,12 +243,23 @@ do
return { filename, lnum, nil, text } return { filename, lnum, nil, text }
end end
local parse_only_filename = function(t)
t.filename = t.value
t.lnum = nil
t.col = nil
t.text = ""
return { t.filename, nil, nil, "" }
end
function make_entry.gen_from_vimgrep(opts) function make_entry.gen_from_vimgrep(opts)
opts = opts or {} opts = opts or {}
local mt_vimgrep_entry local mt_vimgrep_entry
local parse = parse_with_col local parse = parse_with_col
if opts.__inverted == true then if opts.__matches == true then
parse = parse_only_filename
elseif opts.__inverted == true then
parse = parse_without_col parse = parse_without_col
end end
@ -290,7 +300,7 @@ do
end end
end end
local display_string = "%s:%s%s" local display_string = "%s%s%s"
mt_vimgrep_entry = { mt_vimgrep_entry = {
cwd = vim.fn.expand(opts.cwd or vim.loop.cwd()), cwd = vim.fn.expand(opts.cwd or vim.loop.cwd()),
@ -298,23 +308,26 @@ do
display = function(entry) display = function(entry)
local display_filename = utils.transform_path(opts, entry.filename) local display_filename = utils.transform_path(opts, entry.filename)
local coordinates = "" local coordinates = ":"
if not disable_coordinates then if not disable_coordinates then
if entry.col then if entry.lnum then
coordinates = string.format("%s:%s:", entry.lnum, entry.col) if entry.col then
else coordinates = string.format(":%s:%s:", entry.lnum, entry.col)
coordinates = string.format("%s:", entry.lnum) else
coordinates = string.format(":%s:", entry.lnum)
end
end end
end end
local display, hl_group = utils.transform_devicons( local text = opts.file_encoding and vim.iconv(entry.text, opts.file_encoding, "utf8") or entry.text
local display, hl_group, icon = utils.transform_devicons(
entry.filename, entry.filename,
string.format(display_string, display_filename, coordinates, entry.text), string.format(display_string, display_filename, coordinates, text),
disable_devicons disable_devicons
) )
if hl_group then if hl_group then
return display, { { { 1, 3 }, hl_group } } return display, { { { 0, #icon }, hl_group } }
else else
return display return display
end end
@ -611,7 +624,18 @@ function make_entry.gen_from_buffer(opts)
local readonly = vim.api.nvim_buf_get_option(entry.bufnr, "readonly") and "=" or " " local readonly = vim.api.nvim_buf_get_option(entry.bufnr, "readonly") and "=" or " "
local changed = entry.info.changed == 1 and "+" or " " local changed = entry.info.changed == 1 and "+" or " "
local indicator = entry.flag .. hidden .. readonly .. changed local indicator = entry.flag .. hidden .. readonly .. changed
local line_count = vim.api.nvim_buf_line_count(entry.bufnr) local lnum = 1
-- account for potentially stale lnum as getbufinfo might not be updated or from resuming buffers picker
if entry.info.lnum ~= 0 then
-- but make sure the buffer is loaded, otherwise line_count is 0
if vim.api.nvim_buf_is_loaded(entry.bufnr) then
local line_count = vim.api.nvim_buf_line_count(entry.bufnr)
lnum = math.max(math.min(entry.info.lnum, line_count), 1)
else
lnum = entry.info.lnum
end
end
return make_entry.set_default_entry_mt({ return make_entry.set_default_entry_mt({
value = bufname, value = bufname,
@ -620,8 +644,7 @@ function make_entry.gen_from_buffer(opts)
bufnr = entry.bufnr, bufnr = entry.bufnr,
filename = bufname, filename = bufname,
-- account for potentially stale lnum as getbufinfo might not be updated or from resuming buffers picker lnum = lnum,
lnum = entry.info.lnum ~= 0 and math.max(math.min(entry.info.lnum, line_count), 1) or 1,
indicator = indicator, indicator = indicator,
}, opts) }, opts)
end end
@ -667,8 +690,7 @@ function make_entry.gen_from_treesitter(opts)
local get_filename = get_filename_fn() local get_filename = get_filename_fn()
return function(entry) return function(entry)
local ts_utils = require "nvim-treesitter.ts_utils" local start_row, start_col, end_row, _ = vim.treesitter.get_node_range(entry.node)
local start_row, start_col, end_row, _ = ts_utils.get_node_range(entry.node)
local node_text = vim.treesitter.get_node_text(entry.node, bufnr) local node_text = vim.treesitter.get_node_text(entry.node, bufnr)
return make_entry.set_default_entry_mt({ return make_entry.set_default_entry_mt({
value = entry.node, value = entry.node,
@ -792,7 +814,7 @@ function make_entry.gen_from_registers(opts)
end end
return function(entry) return function(entry)
local contents = vim.fn.getreg(entry) local contents = vim.fn.getreg(entry, 1)
return make_entry.set_default_entry_mt({ return make_entry.set_default_entry_mt({
value = entry, value = entry,
ordinal = string.format("%s %s", entry, contents), ordinal = string.format("%s %s", entry, contents),
@ -805,7 +827,7 @@ end
function make_entry.gen_from_keymaps(opts) function make_entry.gen_from_keymaps(opts)
local function get_desc(entry) local function get_desc(entry)
if entry.callback and not entry.desc then if entry.callback and not entry.desc then
return require("telescope.actions.utils")._get_anon_function_name(entry.callback) return require("telescope.actions.utils")._get_anon_function_name(debug.getinfo(entry.callback))
end end
return vim.F.if_nil(entry.desc, entry.rhs) return vim.F.if_nil(entry.desc, entry.rhs)
end end
@ -1227,7 +1249,7 @@ function make_entry.gen_from_commands(opts)
attrs, attrs,
entry.nargs, entry.nargs,
entry.complete or "", entry.complete or "",
entry.definition, entry.definition:gsub("\n", " "),
} }
end end
@ -1299,7 +1321,13 @@ function make_entry.gen_from_git_status(opts)
if entry == "" then if entry == "" then
return nil return nil
end end
local mod, file = string.match(entry, "(..).*%s[->%s]?(.+)")
local mod, file = entry:match "^(..) (.+)$"
-- Ignore entries that are the PATH in XY ORIG_PATH PATH
-- (renamed or copied files)
if not mod then
return nil
end
return setmetatable({ return setmetatable({
value = file, value = file,

View File

@ -2,12 +2,11 @@
---@brief [[ ---@brief [[
--- |telescope.mappings| is used to configure the keybindings within --- |telescope.mappings| is used to configure the keybindings within
--- a telescope picker. These keybinds are only local to the picker window --- a telescope picker. These key binds are only local to the picker window
--- and will be cleared once you exit the picker. --- and will be cleared once you exit the picker.
--- ---
--- We provide multiple different ways of configuring, as described below, --- We provide multiple configuration options to make it easy for you to adjust
--- to provide an easy to use experience for changing the default behavior --- telescope's default key bindings and create your own custom key binds.
--- of telescope or extending for your own purposes.
--- ---
--- To see many of the builtin actions that you can use as values for this --- To see many of the builtin actions that you can use as values for this
--- table, see |telescope.actions| --- table, see |telescope.actions|
@ -39,7 +38,6 @@
--- ..., --- ...,
--- } --- }
--- </code> --- </code>
--- Into your config.
--- ---
--- To override behavior of a key, simply set the value --- To override behavior of a key, simply set the value
--- to be a function (either by requiring an action or by writing --- to be a function (either by requiring an action or by writing
@ -53,7 +51,7 @@
--- </code> --- </code>
--- ---
--- If the function you want is part of `telescope.actions`, then you can --- If the function you want is part of `telescope.actions`, then you can
--- simply give a string. --- simply supply the function name as a string.
--- For example, the previous option is equivalent to: --- For example, the previous option is equivalent to:
--- <code> --- <code>
--- { --- {
@ -112,6 +110,11 @@
--- map("i", "asdf", function(_prompt_bufnr) --- map("i", "asdf", function(_prompt_bufnr)
--- print "You typed asdf" --- print "You typed asdf"
--- end) --- end)
---
--- map({"i", "n"}, "<C-r>", function(_prompt_bufnr)
--- print "You typed <C-r>"
--- end)
---
--- -- needs to return true if you want to map default_mappings and --- -- needs to return true if you want to map default_mappings and
--- -- false if not --- -- false if not
--- return true --- return true
@ -196,28 +199,21 @@ mappings.default_mappings = config.values.default_mappings
}, },
} }
__TelescopeKeymapStore = __TelescopeKeymapStore -- normal names are prefixed with telescope|
or setmetatable({}, { -- encoded objects are prefixed with telescopej|
__index = function(t, k) local get_desc_for_keyfunc = function(v)
rawset(t, k, {}) if type(v) == "table" then
local name = ""
return rawget(t, k) for _, action in ipairs(v) do
end, if type(action) == "string" then
}) name = name == "" and action or name .. " + " .. action
local keymap_store = __TelescopeKeymapStore end
end
local _mapping_key_id = 0 return "telescope|" .. name
local get_next_id = function() elseif type(v) == "function" then
_mapping_key_id = _mapping_key_id + 1 local info = debug.getinfo(v)
return _mapping_key_id return "telescopej|" .. vim.json.encode { source = info.source, linedefined = info.linedefined }
end end
local assign_function = function(prompt_bufnr, func)
local func_id = get_next_id()
keymap_store[prompt_bufnr][func_id] = func
return func_id
end end
local telescope_map = function(prompt_bufnr, mode, key_bind, key_func, opts) local telescope_map = function(prompt_bufnr, mode, key_bind, key_func, opts)
@ -237,9 +233,14 @@ local telescope_map = function(prompt_bufnr, mode, key_bind, key_func, opts)
key_func = actions[key_func] key_func = actions[key_func]
elseif type(key_func) == "table" then elseif type(key_func) == "table" then
if key_func.type == "command" then if key_func.type == "command" then
a.nvim_buf_set_keymap(prompt_bufnr, mode, key_bind, key_func[1], opts or { vim.keymap.set(
silent = true, mode,
}) key_bind,
key_func[1],
vim.tbl_extend("force", opts or {
silent = true,
}, { buffer = prompt_bufnr })
)
return return
elseif key_func.type == "action_key" then elseif key_func.type == "action_key" then
key_func = actions[key_func[1]] key_func = actions[key_func[1]]
@ -248,27 +249,11 @@ local telescope_map = function(prompt_bufnr, mode, key_bind, key_func, opts)
end end
end end
local key_id = assign_function(prompt_bufnr, key_func) vim.keymap.set(mode, key_bind, function()
local prefix local ret = key_func(prompt_bufnr)
vim.api.nvim_exec_autocmds("User", { pattern = "TelescopeKeymap" })
local map_string return ret
if opts.expr then end, vim.tbl_extend("force", opts, { buffer = prompt_bufnr, desc = get_desc_for_keyfunc(key_func) }))
map_string =
string.format([[luaeval("require('telescope.mappings').execute_keymap(%s, %s)")]], prompt_bufnr, key_id)
else
if mode == "i" and not opts.expr then
prefix = "<cmd>"
elseif mode == "n" then
prefix = ":<C-U>"
else
prefix = ":"
end
map_string =
string.format("%slua require('telescope.mappings').execute_keymap(%s, %s)<CR>", prefix, prompt_bufnr, key_id)
end
a.nvim_buf_set_keymap(prompt_bufnr, mode, key_bind, map_string, opts)
end end
local extract_keymap_opts = function(key_func) local extract_keymap_opts = function(key_func)
@ -284,12 +269,18 @@ end
mappings.apply_keymap = function(prompt_bufnr, attach_mappings, buffer_keymap) mappings.apply_keymap = function(prompt_bufnr, attach_mappings, buffer_keymap)
local applied_mappings = { n = {}, i = {} } local applied_mappings = { n = {}, i = {} }
local map = function(mode, key_bind, key_func, opts) local map = function(modes, key_bind, key_func, opts)
mode = string.lower(mode) if type(modes) == "string" then
local key_bind_internal = a.nvim_replace_termcodes(key_bind, true, true, true) modes = { modes }
applied_mappings[mode][key_bind_internal] = true end
telescope_map(prompt_bufnr, mode, key_bind, key_func, opts) for _, mode in pairs(modes) do
mode = string.lower(mode)
local key_bind_internal = a.nvim_replace_termcodes(key_bind, true, true, true)
applied_mappings[mode][key_bind_internal] = true
telescope_map(prompt_bufnr, mode, key_bind, key_func, opts)
end
end end
if attach_mappings then if attach_mappings then
@ -333,17 +324,4 @@ mappings.apply_keymap = function(prompt_bufnr, attach_mappings, buffer_keymap)
end end
end end
mappings.execute_keymap = function(prompt_bufnr, keymap_identifier)
local key_func = keymap_store[prompt_bufnr][keymap_identifier]
assert(key_func, string.format("Unsure of how we got this failure: %s %s", prompt_bufnr, keymap_identifier))
key_func(prompt_bufnr)
vim.api.nvim_exec_autocmds("User TelescopeKeymap", {})
end
mappings.clear = function(prompt_bufnr)
keymap_store[prompt_bufnr] = nil
end
return mappings return mappings

View File

@ -90,7 +90,7 @@ function Picker:new(opts)
sorter = opts.sorter or require("telescope.sorters").empty(), sorter = opts.sorter or require("telescope.sorters").empty(),
all_previewers = opts.previewer, all_previewers = opts.previewer,
current_previewer_index = 1, current_previewer_index = opts.current_previewer_index or 1,
default_selection_index = opts.default_selection_index, default_selection_index = opts.default_selection_index,
@ -147,8 +147,8 @@ function Picker:new(opts)
if obj.all_previewers[1] == nil then if obj.all_previewers[1] == nil then
obj.all_previewers = { obj.all_previewers } obj.all_previewers = { obj.all_previewers }
end end
obj.previewer = obj.all_previewers[1] obj.previewer = obj.all_previewers[obj.current_previewer_index]
if obj.preview_title == nil then if obj.preview_title == nil or #obj.all_previewers > 1 then
obj.preview_title = obj.previewer:title(nil, config.values.dynamic_preview_title) obj.preview_title = obj.previewer:title(nil, config.values.dynamic_preview_title)
else else
obj.fix_preview_title = true obj.fix_preview_title = true
@ -344,7 +344,7 @@ function Picker:find()
self.original_win_id = a.nvim_get_current_win() self.original_win_id = a.nvim_get_current_win()
-- User autocmd run it before create Telescope window -- User autocmd run it before create Telescope window
vim.api.nvim_exec_autocmds("User TelescopeFindPre", {}) vim.api.nvim_exec_autocmds("User", { pattern = "TelescopeFindPre" })
-- Create three windows: -- Create three windows:
-- 1. Prompt window -- 1. Prompt window
@ -749,7 +749,9 @@ function Picker.close_windows(status)
utils.win_delete("preview_border_win", status.preview_border_win, true, true) utils.win_delete("preview_border_win", status.preview_border_win, true, true)
-- we cant use win_delete. We first need to close and then delete the buffer -- we cant use win_delete. We first need to close and then delete the buffer
vim.api.nvim_win_close(status.prompt_win, true) if vim.api.nvim_win_is_valid(status.prompt_win) then
vim.api.nvim_win_close(status.prompt_win, true)
end
utils.buf_delete(status.prompt_bufnr) utils.buf_delete(status.prompt_bufnr)
state.clear_status(status.prompt_bufnr) state.clear_status(status.prompt_bufnr)
@ -853,7 +855,7 @@ end
function Picker:_reset_prefix_color(hl_group) function Picker:_reset_prefix_color(hl_group)
self._current_prefix_hl_group = hl_group or nil self._current_prefix_hl_group = hl_group or nil
if self.prompt_prefix ~= "" then if self.prompt_prefix ~= "" and a.nvim_buf_is_valid(self.prompt_bufnr) then
vim.api.nvim_buf_add_highlight( vim.api.nvim_buf_add_highlight(
self.prompt_bufnr, self.prompt_bufnr,
ns_telescope_prompt_prefix, ns_telescope_prompt_prefix,
@ -1327,6 +1329,11 @@ function Picker:get_result_completor(results_bufnr, find_id, prompt, status_upda
self:clear_extra_rows(results_bufnr) self:clear_extra_rows(results_bufnr)
self.sorter:_finish(prompt) self.sorter:_finish(prompt)
if self.wrap_results and self.sorting_strategy == "descending" then
local visible_result_rows = vim.api.nvim_win_get_height(self.results_win)
vim.api.nvim_win_set_cursor(self.results_win, { self.max_results - visible_result_rows, 1 })
vim.api.nvim_win_set_cursor(self.results_win, { self.max_results, 1 })
end
self:_on_complete() self:_on_complete()
end) end)
end end
@ -1415,6 +1422,8 @@ pickers.new = function(opts, defaults)
if result["previewer"] == false then if result["previewer"] == false then
result["previewer"] = defaults["previewer"] result["previewer"] = defaults["previewer"]
result["__hide_previewer"] = true result["__hide_previewer"] = true
elseif result["previewer"] == true then
result["previewer"] = defaults["previewer"]
elseif type(opts["preview"]) == "table" and opts["preview"]["hide_on_startup"] then elseif type(opts["preview"]) == "table" and opts["preview"]["hide_on_startup"] then
result["__hide_previewer"] = true result["__hide_previewer"] = true
end end
@ -1485,7 +1494,6 @@ function pickers.on_close_prompt(prompt_bufnr)
buffer = prompt_bufnr, buffer = prompt_bufnr,
} }
picker.close_windows(status) picker.close_windows(status)
mappings.clear(prompt_bufnr)
end end
function pickers.on_resize_window(prompt_bufnr) function pickers.on_resize_window(prompt_bufnr)

View File

@ -1,244 +0,0 @@
local assert = require "luassert"
local builtin = require "telescope.builtin"
local log = require "telescope.log"
local Job = require "plenary.job"
local Path = require "plenary.path"
local tester = {}
tester.debug = false
local replace_terms = function(input)
return vim.api.nvim_replace_termcodes(input, true, false, true)
end
local nvim_feed = function(text, feed_opts)
feed_opts = feed_opts or "m"
vim.api.nvim_feedkeys(text, feed_opts, true)
end
local writer = function(val)
if type(val) == "table" then
val = vim.json.encode(val) .. "\n"
end
if tester.debug then
print(val)
else
io.stderr:write(val)
end
end
local execute_test_case = function(location, key, spec)
local ok, actual = pcall(spec[2])
if not ok then
writer {
location = "Error: " .. location,
case = key,
expected = "To succeed and return: " .. tostring(spec[1]),
actual = actual,
_type = spec._type,
}
else
writer {
location = location,
case = key,
expected = spec[1],
actual = actual,
_type = spec._type,
}
end
end
local end_test_cases = function()
vim.cmd [[qa!]]
end
local invalid_test_case = function(k)
writer { case = k, expected = "<a valid key>", actual = k }
end_test_cases()
end
tester.picker_feed = function(input, test_cases)
input = replace_terms(input)
return coroutine.wrap(function()
for i = 1, #input do
local char = input:sub(i, i)
nvim_feed(char, "")
-- TODO: I'm not 100% sure this is a hack or not...
-- it's possible these characters could still have an on_complete... but i'm not sure.
if string.match(char, "%g") then
coroutine.yield()
end
if tester.debug then
vim.wait(200)
end
end
vim.wait(10)
if tester.debug then
coroutine.yield()
end
vim.defer_fn(function()
if test_cases.post_typed then
for k, v in ipairs(test_cases.post_typed) do
execute_test_case("post_typed", k, v)
end
end
nvim_feed(replace_terms "<CR>", "")
end, 20)
vim.defer_fn(function()
if test_cases.post_close then
for k, v in ipairs(test_cases.post_close) do
execute_test_case("post_close", k, v)
end
end
if tester.debug then
return
end
vim.defer_fn(end_test_cases, 20)
end, 40)
coroutine.yield()
end)
end
local _VALID_KEYS = {
post_typed = true,
post_close = true,
}
tester.builtin_picker = function(builtin_key, input, test_cases, opts)
opts = opts or {}
tester.debug = opts.debug or false
for k, _ in pairs(test_cases) do
if not _VALID_KEYS[k] then
return invalid_test_case(k)
end
end
opts.on_complete = {
tester.picker_feed(input, test_cases),
}
builtin[builtin_key](opts)
end
local get_results_from_file = function(file)
local j = Job:new {
command = "nvim",
args = {
"--noplugin",
"-u",
"scripts/minimal_init.vim",
"-c",
string.format([[lua require("telescope.pickers._test")._execute("%s")]], file),
},
}
j:sync(10000)
local results = j:stderr_result()
local result_table = {}
for _, v in ipairs(results) do
table.insert(result_table, vim.json.decode(v))
end
return result_table
end
local asserters = {
_default = assert.are.same,
are = assert.are.same,
are_not = assert.are_not.same,
}
local check_results = function(results)
-- TODO: We should get all the test cases here that fail, not just the first one.
for _, v in ipairs(results) do
local assertion = asserters[v._type or "default"]
assertion(v.expected, v.actual, string.format("Test Case: %s // %s", v.location, v.case))
end
end
tester.run_string = function(contents)
local tempname = vim.fn.tempname()
contents = [[
local tester = require('telescope.pickers._test')
local helper = require('telescope.pickers._test_helpers')
helper.make_globals()
]] .. contents
vim.fn.writefile(vim.split(contents, "\n"), tempname)
local result_table = get_results_from_file(tempname)
vim.fn.delete(tempname)
check_results(result_table)
end
tester.run_file = function(filename)
local file = "./lua/tests/pickers/" .. filename .. ".lua"
if not Path:new(file):exists() then
assert.are.same("<An existing file>", file)
end
local result_table = get_results_from_file(file)
check_results(result_table)
end
tester.not_ = function(val)
val._type = "are_not"
return val
end
tester._execute = function(filename)
-- Important so that the outputs don't get mixed
log.use_console = false
vim.cmd(string.format("luafile %s", filename))
local f = loadfile(filename)
if not f then
writer {
location = "Error: " .. filename,
case = filename,
expected = "To succeed",
actual = nil,
}
end
local ok, msg = pcall(f)
if not ok then
writer {
location = "Error: " .. msg,
case = msg,
expected = msg,
}
end
end_test_cases()
end
return tester

View File

@ -12,11 +12,11 @@
--- for the best performance. --- for the best performance.
--- ---
--- The create function will use the column widths passed to it in --- The create function will use the column widths passed to it in
--- configaration.items. Each item in that table is the number of characters in --- configuration.items. Each item in that table is the number of characters in
--- the column. It's also possible for the final column to not have a fixed --- the column. It's also possible for the final column to not have a fixed
--- width, this will be shown in the configuartion as 'remaining = true'. --- width, this will be shown in the configuration as 'remaining = true'.
--- ---
--- An example of this configuration is shown for the buffers picker --- An example of this configuration is shown for the buffers picker:
--- <code> --- <code>
--- local displayer = entry_display.create { --- local displayer = entry_display.create {
--- separator = " ", --- separator = " ",
@ -30,10 +30,10 @@
--- </code> --- </code>
--- ---
--- This shows 4 columns, the first is defined in the opts as the width we'll --- This shows 4 columns, the first is defined in the opts as the width we'll
--- use when display_string the number of the buffer. The second has a fixed --- use when display_string is the number of the buffer. The second has a fixed
--- width of 4 and the 3rd column's widht will be decided by the width of the --- width of 4 and the third column's width will be decided by the width of the
--- icons we use. The fourth column will use the remaining space. Finally we --- icons we use. The fourth column will use the remaining space. Finally, we
--- have also defined the seperator between each column will be the space " ". --- have also defined the separator between each column will be the space " ".
--- ---
--- An example of how the display reference will be used is shown, again for --- An example of how the display reference will be used is shown, again for
--- the buffers picker: --- the buffers picker:
@ -49,12 +49,12 @@
--- There are two types of values each column can have. Either a simple String --- There are two types of values each column can have. Either a simple String
--- or a table containing the String as well as the hl_group. --- or a table containing the String as well as the hl_group.
--- ---
--- The displayer can return values, string and an optional highlights. --- The displayer can return values, string and an optional highlights. The string
--- String is all the text to be displayed for this entry as a single string. If --- is all the text to be displayed for this entry as a single string. If parts of
--- parts of the string are to be highlighted they will be described in the --- the string are to be highlighted they will be described in the highlights
--- highlights table. --- table.
--- ---
--- For better understanding of how create() and displayer are used it's best to look --- For a better understanding of how create() and displayer are used it's best to look
--- at the code in make_entry.lua. --- at the code in make_entry.lua.
---@brief ]] ---@brief ]]

View File

@ -38,7 +38,6 @@
--- - columns : (number) Columns in the vim window --- - columns : (number) Columns in the vim window
--- - lines : (number) Lines in the vim window --- - lines : (number) Lines in the vim window
--- - layout_config : (table) The configuration values specific to the picker. --- - layout_config : (table) The configuration values specific to the picker.
---
--- </pre> --- </pre>
--- ---
--- This means you can create your own layout strategy if you want! Just be aware --- This means you can create your own layout strategy if you want! Just be aware
@ -411,14 +410,14 @@ layout_strategies.horizontal = make_documented_layout(
--- <pre> --- <pre>
--- ┌──────────────────────────────────────────────────┐ --- ┌──────────────────────────────────────────────────┐
--- │ ┌────────────────────────────────────────┐ │ --- │ ┌────────────────────────────────────────┐ │
--- │ | Preview | --- │ │ Preview │
--- │ | Preview | --- │ │ Preview │
--- │ └────────────────────────────────────────┘ │ --- │ └────────────────────────────────────────┘ │
--- │ ┌────────────────────────────────────────┐ │ --- │ ┌────────────────────────────────────────┐ │
--- │ | Prompt | --- │ │ Prompt │
--- │ ├────────────────────────────────────────┤ │ --- │ ├────────────────────────────────────────┤ │
--- │ | Result | --- │ │ Result │
--- │ | Result | --- │ │ Result │
--- │ └────────────────────────────────────────┘ │ --- │ └────────────────────────────────────────┘ │
--- │ │ --- │ │
--- │ │ --- │ │
@ -550,6 +549,7 @@ layout_strategies.center = make_documented_layout(
--- │ │ --- │ │
--- └──────────────────────────────────────────────────┘ --- └──────────────────────────────────────────────────┘
--- </pre> --- </pre>
---@eval { ["description"] = require("telescope.pickers.layout_strategies")._format("cursor") }
layout_strategies.cursor = make_documented_layout( layout_strategies.cursor = make_documented_layout(
"cursor", "cursor",
vim.tbl_extend("error", { vim.tbl_extend("error", {
@ -647,16 +647,16 @@ layout_strategies.cursor = make_documented_layout(
--- ┌──────────────────────────────────────────────────┐ --- ┌──────────────────────────────────────────────────┐
--- │ │ --- │ │
--- │ ┌────────────────────────────────────────┐ │ --- │ ┌────────────────────────────────────────┐ │
--- │ | Preview | --- │ │ Preview │
--- │ | Preview | --- │ │ Preview │
--- │ | Preview | --- │ │ Preview │
--- │ └────────────────────────────────────────┘ │ --- │ └────────────────────────────────────────┘ │
--- │ ┌────────────────────────────────────────┐ │ --- │ ┌────────────────────────────────────────┐ │
--- │ | Result | --- │ │ Result │
--- │ | Result | --- │ │ Result │
--- │ └────────────────────────────────────────┘ │ --- │ └────────────────────────────────────────┘ │
--- │ ┌────────────────────────────────────────┐ │ --- │ ┌────────────────────────────────────────┐ │
--- │ | Prompt | --- │ │ Prompt │
--- │ └────────────────────────────────────────┘ │ --- │ └────────────────────────────────────────┘ │
--- │ │ --- │ │
--- └──────────────────────────────────────────────────┘ --- └──────────────────────────────────────────────────┘
@ -775,9 +775,13 @@ layout_strategies.flex = make_documented_layout(
if max_columns < flip_columns and max_lines > flip_lines then if max_columns < flip_columns and max_lines > flip_lines then
self.__flex_strategy = "vertical" self.__flex_strategy = "vertical"
self.layout_config.flip_columns = nil
self.layout_config.flip_lines = nil
return layout_strategies.vertical(self, max_columns, max_lines, layout_config.vertical) return layout_strategies.vertical(self, max_columns, max_lines, layout_config.vertical)
else else
self.__flex_strategy = "horizontal" self.__flex_strategy = "horizontal"
self.layout_config.flip_columns = nil
self.layout_config.flip_lines = nil
return layout_strategies.horizontal(self, max_columns, max_lines, layout_config.horizontal) return layout_strategies.horizontal(self, max_columns, max_lines, layout_config.horizontal)
end end
end end
@ -898,6 +902,9 @@ layout_strategies.bottom_pane = make_documented_layout(
if type(results.title) == "string" then if type(results.title) == "string" then
results.title = { { pos = "S", text = results.title } } results.title = { { pos = "S", text = results.title } }
end end
if type(preview.title) == "string" then
preview.title = { { pos = "S", text = preview.title } }
end
elseif layout_config.prompt_position == "bottom" then elseif layout_config.prompt_position == "bottom" then
results.line = max_lines - results.height - (1 + bs) + 1 results.line = max_lines - results.height - (1 + bs) + 1
preview.line = results.line preview.line = results.line

View File

@ -60,7 +60,8 @@ local function split(s, sep, plain, opts)
opts = opts or {} opts = opts or {}
local t = {} local t = {}
for c in vim.gsplit(s, sep, plain) do for c in vim.gsplit(s, sep, plain) do
table.insert(t, c) local line = opts.file_encoding and vim.iconv(c, opts.file_encoding, "utf8") or c
table.insert(t, line)
if opts.preview.timeout then if opts.preview.timeout then
local diff_time = (vim.loop.hrtime() - opts.start_time) / 1e6 local diff_time = (vim.loop.hrtime() - opts.start_time) / 1e6
if diff_time > opts.preview.timeout then if diff_time > opts.preview.timeout then
@ -192,8 +193,8 @@ previewers.file_maker = function(filepath, bufnr, opts)
if opts.preview.check_mime_type == true and has_file and opts.ft == "" then if opts.preview.check_mime_type == true and has_file and opts.ft == "" then
-- avoid SIGABRT in buffer previewer happening with utils.get_os_command_output -- avoid SIGABRT in buffer previewer happening with utils.get_os_command_output
local output = capture(string.format([[file --mime-type -b "%s"]], filepath)) local output = capture(string.format([[file --mime-type -b "%s"]], filepath))
local mime_type = vim.split(output, "/")[1] local mime_type = vim.split(output, "/")
if mime_type ~= "text" and mime_type ~= "inode" then if mime_type[1] ~= "text" and mime_type[1] ~= "inode" and mime_type[2] ~= "json" then
if type(opts.preview.mime_hook) == "function" then if type(opts.preview.mime_hook) == "function" then
vim.schedule_wrap(opts.preview.mime_hook)(filepath, bufnr, opts) vim.schedule_wrap(opts.preview.mime_hook)(filepath, bufnr, opts)
else else
@ -206,6 +207,9 @@ previewers.file_maker = function(filepath, bufnr, opts)
end end
return return
end end
if mime_type[2] == "json" then
opts.ft = "json"
end
end end
if opts.preview.filesize_limit then if opts.preview.filesize_limit then
@ -433,6 +437,7 @@ previewers.cat = defaulter(function(opts)
bufname = self.state.bufname, bufname = self.state.bufname,
winid = self.state.winid, winid = self.state.winid,
preview = opts.preview, preview = opts.preview,
file_encoding = opts.file_encoding,
}) })
end, end,
} }
@ -487,6 +492,7 @@ previewers.vimgrep = defaulter(function(opts)
callback = function(bufnr) callback = function(bufnr)
jump_to_line(self, bufnr, entry.lnum) jump_to_line(self, bufnr, entry.lnum)
end, end,
file_encoding = opts.file_encoding,
}) })
end end
end, end,
@ -881,7 +887,7 @@ previewers.git_file_diff = defaulter(function(opts)
winid = self.state.winid, winid = self.state.winid,
}) })
else else
putils.job_maker({ "git", "--no-pager", "diff", entry.value }, self.state.bufnr, { putils.job_maker({ "git", "--no-pager", "diff", "HEAD", "--", entry.value }, self.state.bufnr, {
value = entry.value, value = entry.value,
bufname = self.state.bufname, bufname = self.state.bufname,
cwd = opts.cwd, cwd = opts.cwd,

View File

@ -4,7 +4,7 @@
---@brief [[ ---@brief [[
--- Provides a Previewer table that has to be implemented by each previewer. --- Provides a Previewer table that has to be implemented by each previewer.
--- To achieve this, this module also provides two wrappers that abstract most --- To achieve this, this module also provides two wrappers that abstract most
--- of the work and make it really easy create new previewers. --- of the work and make it really easy to create new previewers.
--- - `previewers.new_termopen_previewer` --- - `previewers.new_termopen_previewer`
--- - `previewers.new_buffer_previewer` --- - `previewers.new_buffer_previewer`
--- ---
@ -40,7 +40,7 @@ local previewers = {}
--- ---
--- What `:new` expects is listed below --- What `:new` expects is listed below
--- ---
--- The interface provides following set of functions. All of them, besides --- The interface provides the following set of functions. All of them, besides
--- `new`, will be handled by telescope pickers. --- `new`, will be handled by telescope pickers.
--- - `:new(opts)` --- - `:new(opts)`
--- - `:preview(entry, status)` --- - `:preview(entry, status)`
@ -51,7 +51,7 @@ local previewers = {}
--- `Previewer:new()` expects a table as input with following keys: --- `Previewer:new()` expects a table as input with following keys:
--- - `setup` function(self): Will be called the first time preview will be --- - `setup` function(self): Will be called the first time preview will be
--- called. --- called.
--- - `teardown` function(self): Will be called on cleanup. --- - `teardown` function(self): Will be called on clean up.
--- - `preview_fn` function(self, entry, status): Will be called each time --- - `preview_fn` function(self, entry, status): Will be called each time
--- a new entry was selected. --- a new entry was selected.
--- - `title` function(self): Will return the static title of the previewer. --- - `title` function(self): Will return the static title of the previewer.
@ -156,8 +156,8 @@ previewers.qflist = term_previewer.qflist
--- available in `self.state` in each `define_preview` call. --- available in `self.state` in each `define_preview` call.
--- - `teardown = function(self)` (optional) --- - `teardown = function(self)` (optional)
--- Will be called at the end, when the picker is being closed and is --- Will be called at the end, when the picker is being closed and is
--- meant to cleanup everything that was allocated by the previewer. --- meant to clean up everything that was allocated by the previewer.
--- The `buffer_previewer` will automatically cleanup all created buffers. --- The `buffer_previewer` will automatically clean up all created buffers.
--- So you only need to handle things that were introduced by you. --- So you only need to handle things that were introduced by you.
--- - `keep_last_buf = true` (optional) --- - `keep_last_buf = true` (optional)
--- Will not delete the last selected buffer. This would allow you to --- Will not delete the last selected buffer. This would allow you to
@ -167,7 +167,7 @@ previewers.qflist = term_previewer.qflist
--- `require('telescope.state').get_global_key("last_preview_bufnr")` --- `require('telescope.state').get_global_key("last_preview_bufnr")`
--- - `get_buffer_by_name = function(self, entry)` --- - `get_buffer_by_name = function(self, entry)`
--- Allows you to set a unique name for each buffer. This is used for --- Allows you to set a unique name for each buffer. This is used for
--- caching purpose. `self.state.bufname` will be nil if the entry was --- caching purposes. `self.state.bufname` will be nil if the entry was
--- never loaded or the unique name when it was loaded once. For example, --- never loaded or the unique name when it was loaded once. For example,
--- useful if you have one file but multiple entries. This happens for grep --- useful if you have one file but multiple entries. This happens for grep
--- and lsp builtins. So to make the cache work only load content if --- and lsp builtins. So to make the cache work only load content if
@ -221,8 +221,8 @@ previewers.qflist = term_previewer.qflist
--- vim.api.nvim_buf_call(bufnr, function() --- vim.api.nvim_buf_call(bufnr, function()
--- -- for example `search` and `matchadd` --- -- for example `search` and `matchadd`
--- end) --- end)
--- to achieve that.
--- </code> --- </code>
--- to achieve that.
--- - If you want to read a file into the buffer it's best to use --- - If you want to read a file into the buffer it's best to use
--- `buffer_previewer_maker`. But access this function with --- `buffer_previewer_maker`. But access this function with
--- `require('telescope.config').values.buffer_previewer_maker` --- `require('telescope.config').values.buffer_previewer_maker`
@ -258,7 +258,7 @@ previewers.vim_buffer_cat = buffer_previewer.cat
--- case it's configured that way. --- case it's configured that way.
previewers.vim_buffer_vimgrep = buffer_previewer.vimgrep previewers.vim_buffer_vimgrep = buffer_previewer.vimgrep
--- Is the same as `vim_buffer_vimgrep` and only exist for consistency with --- Is the same as `vim_buffer_vimgrep` and only exists for consistency with
--- `term_previewers`. --- `term_previewers`.
--- ---
--- The preferred way of using this previewer is like this --- The preferred way of using this previewer is like this

View File

@ -126,8 +126,7 @@ end
--- Attach regex highlighter --- Attach regex highlighter
utils.regex_highlighter = function(bufnr, ft) utils.regex_highlighter = function(bufnr, ft)
if has_filetype(ft) then if has_filetype(ft) then
vim.api.nvim_buf_set_option(bufnr, "syntax", ft) return pcall(vim.api.nvim_buf_set_option, bufnr, "syntax", ft)
return true
end end
return false return false
end end

View File

@ -19,9 +19,10 @@ local themes = {}
--- ---
--- Usage: --- Usage:
--- <code> --- <code>
--- `local builtin = require('telescope.builtin')` --- local opts = {...} -- picker options
--- `local themes = require('telescope.themes')` --- local builtin = require('telescope.builtin')
--- `builtin.find_files(themes.get_dropdown())` --- local themes = require('telescope.themes')
--- builtin.find_files(themes.get_dropdown(opts))
--- </code> --- </code>
function themes.get_dropdown(opts) function themes.get_dropdown(opts)
opts = opts or {} opts = opts or {}
@ -67,10 +68,10 @@ end
--- ---
--- Usage: --- Usage:
--- <code> --- <code>
--- --- local opts = {...} -- picker options
--- `local builtin = require('telescope.builtin')` --- local builtin = require('telescope.builtin')
--- `local themes = require('telescope.themes')` --- local themes = require('telescope.themes')
--- `builtin.lsp_references(themes.get_cursor())` --- builtin.find_files(themes.get_cursor(opts))
--- </code> --- </code>
function themes.get_cursor(opts) function themes.get_cursor(opts)
opts = opts or {} opts = opts or {}
@ -99,9 +100,10 @@ end
--- ---
--- Usage: --- Usage:
--- <code> --- <code>
--- `local builtin = require('telescope.builtin')` --- local opts = {...} -- picker options
--- `local themes = require('telescope.themes')` --- local builtin = require('telescope.builtin')
--- `builtin.find_files(themes.get_ivy())` --- local themes = require('telescope.themes')
--- builtin.find_files(themes.get_ivy(opts))
--- </code> --- </code>
function themes.get_ivy(opts) function themes.get_ivy(opts)
opts = opts or {} opts = opts or {}

View File

@ -211,7 +211,7 @@ end
--- this function outside of telescope might yield to undefined behavior and will --- this function outside of telescope might yield to undefined behavior and will
--- not be addressed by us --- not be addressed by us
---@param opts table: The opts the users passed into the picker. Might contains a path_display key ---@param opts table: The opts the users passed into the picker. Might contains a path_display key
---@param path string: The path that should be formated ---@param path string: The path that should be formatted
---@return string: The transformed path ready to be displayed ---@return string: The transformed path ready to be displayed
utils.transform_path = function(opts, path) utils.transform_path = function(opts, path)
if path == nil then if path == nil then
@ -432,6 +432,16 @@ local load_once = function(f)
end end
end end
utils.file_extension = function(filename)
local parts = vim.split(filename, "%.")
-- this check enables us to get multi-part extensions, like *.test.js for example
if #parts > 2 then
return table.concat(vim.list_slice(parts, #parts - 1), ".")
else
return table.concat(vim.list_slice(parts, #parts), ".")
end
end
utils.transform_devicons = load_once(function() utils.transform_devicons = load_once(function()
local has_devicons, devicons = pcall(require, "nvim-web-devicons") local has_devicons, devicons = pcall(require, "nvim-web-devicons")
@ -446,13 +456,18 @@ utils.transform_devicons = load_once(function()
return display return display
end end
local icon, icon_highlight = devicons.get_icon(utils.path_tail(filename), nil, { default = true }) local basename = utils.path_tail(filename)
local icon_display = (icon or " ") .. " " .. (display or "") local icon, icon_highlight = devicons.get_icon(basename, utils.file_extension(basename), { default = false })
if not icon then
icon, icon_highlight = devicons.get_icon(basename, nil, { default = true })
icon = icon or " "
end
local icon_display = icon .. " " .. (display or "")
if conf.color_devicons then if conf.color_devicons then
return icon_display, icon_highlight return icon_display, icon_highlight, icon
else else
return icon_display, nil return icon_display, nil, icon
end end
end end
else else
@ -476,7 +491,11 @@ utils.get_devicons = load_once(function()
return "" return ""
end end
local icon, icon_highlight = devicons.get_icon(utils.path_tail(filename), nil, { default = true }) local basename = utils.path_tail(filename)
local icon, icon_highlight = devicons.get_icon(basename, utils.file_extension(basename), { default = false })
if not icon then
icon, icon_highlight = devicons.get_icon(basename, nil, { default = true })
end
if conf.color_devicons then if conf.color_devicons then
return icon, icon_highlight return icon, icon_highlight
else else

View File

@ -1,4 +1,3 @@
-- local tester = require('telescope.pickers._test')
local config = require "telescope.config" local config = require "telescope.config"
local resolve = require "telescope.config.resolve" local resolve = require "telescope.config.resolve"
local layout_strats = require "telescope.pickers.layout_strategies" local layout_strats = require "telescope.pickers.layout_strategies"

View File

@ -14,6 +14,10 @@ describe("builtin.find_files", function()
tester.run_file "find_files__readme" tester.run_file "find_files__readme"
end) end)
it("should handle cycling for full list", function()
tester.run_file "find_files__scrolling_descending_cycle"
end)
for _, configuration in ipairs { for _, configuration in ipairs {
{ sorting_strategy = "descending" }, { sorting_strategy = "descending" },
{ sorting_strategy = "ascending" }, { sorting_strategy = "ascending" },
@ -107,12 +111,12 @@ describe("builtin.find_files", function()
it("should be able to c-n the items", function() it("should be able to c-n the items", function()
tester.run_string [[ tester.run_string [[
runner.picker('find_files', 'fixtures/file<c-n>', { runner.picker('find_files', 'fixtures/find_files/file<c-n>', {
post_typed = { post_typed = {
{ {
{ {
" lua/tests/fixtures/file_a.txt", " lua/tests/fixtures/find_files/file_a.txt",
"> lua/tests/fixtures/file_abc.txt", "> lua/tests/fixtures/find_files/file_abc.txt",
}, GetResults }, GetResults
}, },
}, },
@ -129,9 +133,9 @@ describe("builtin.find_files", function()
it("should be able to get the current selection", function() it("should be able to get the current selection", function()
tester.run_string [[ tester.run_string [[
runner.picker('find_files', 'fixtures/file_abc', { runner.picker('find_files', 'fixtures/find_files/file_abc', {
post_typed = { post_typed = {
{ 'lua/tests/fixtures/file_abc.txt', GetSelectionValue }, { 'lua/tests/fixtures/find_files/file_abc.txt', GetSelectionValue },
} }
}) })
]] ]]

View File

@ -1,12 +0,0 @@
require("plenary.reload").reload_module "telescope"
local tester = require "telescope.pickers._test"
local log = require "telescope.log"
log.use_console = false
describe("scrolling strategies", function()
it("should handle cycling for full list", function()
tester.run_file [[find_files__scrolling_descending_cycle]]
end)
end)

View File

@ -116,9 +116,12 @@ end, {
local n = #l - 2 local n = #l - 2
if n == 0 then if n == 0 then
local commands = vim.tbl_flatten { builtin_list, extensions_list }
table.sort(commands)
return vim.tbl_filter(function(val) return vim.tbl_filter(function(val)
return vim.startswith(val, l[2]) return vim.startswith(val, l[2])
end, vim.tbl_extend("force", builtin_list, extensions_list)) end, commands)
end end
if n == 1 then if n == 1 then
@ -128,13 +131,18 @@ end, {
if #is_extension > 0 then if #is_extension > 0 then
local extensions_subcommand_dict = require("telescope.command").get_extensions_subcommand() local extensions_subcommand_dict = require("telescope.command").get_extensions_subcommand()
local commands = extensions_subcommand_dict[l[2]]
table.sort(commands)
return vim.tbl_filter(function(val) return vim.tbl_filter(function(val)
return vim.startswith(val, l[3]) return vim.startswith(val, l[3])
end, extensions_subcommand_dict[l[2]]) end, commands)
end end
end end
local options_list = vim.tbl_keys(require("telescope.config").values) local options_list = vim.tbl_keys(require("telescope.config").values)
table.sort(options_list)
return vim.tbl_filter(function(val) return vim.tbl_filter(function(val)
return vim.startswith(val, l[#l]) return vim.startswith(val, l[#l])
end, options_list) end, options_list)

View File

@ -0,0 +1,37 @@
local MODREV, SPECREV = 'scm', '-1'
rockspec_format = '3.0'
package = 'telescope.nvim'
version = MODREV .. SPECREV
description = {
summary = 'Find, Filter, Preview, Pick. All lua, all the time.',
detailed = [[
A highly extendable fuzzy finder over lists.
Built on the latest awesome features from neovim core.
Telescope is centered around modularity, allowing for easy customization.
]],
labels = { 'neovim', 'plugin', },
homepage = 'https://github.com/nvim-telescope/telescope.nvim',
license = 'MIT',
}
dependencies = {
'lua == 5.1',
'plenary.nvim',
}
source = {
url = 'git://github.com/nvim-telescope/telescope.nvim',
}
build = {
type = 'builtin',
copy_directories = {
'doc',
'ftplugin',
'plugin',
'scripts',
'autoload',
'data',
}
}