From ac74bffee59d470eacc1567be3be45a190136e12 Mon Sep 17 00:00:00 2001 From: Wang Shidong Date: Tue, 25 Oct 2022 18:35:51 +0800 Subject: [PATCH] feat(zettelkasten): improve zettelkasten layer --- autoload/SpaceVim/layers/zettelkasten.vim | 5 + bundle/telescope.nvim/.github/FUNDING.yml | 2 +- .../.github/ISSUE_TEMPLATE/bug_report.yml | 6 + .../.github/PULL_REQUEST_TEMPLATE.md | 33 + .../telescope.nvim/.github/workflows/ci.yml | 8 +- .../telescope.nvim/.github/workflows/lint.yml | 2 +- bundle/telescope.nvim/README.md | 42 +- .../telescope.nvim/data/options/options.lua | 3257 ----------------- bundle/telescope.nvim/developers.md | 56 +- bundle/telescope.nvim/doc/telescope.txt | 737 ++-- .../doc/telescope_changelog.txt | 59 + .../lua/telescope/actions/generate.lua | 62 +- .../lua/telescope/actions/init.lua | 143 +- .../lua/telescope/actions/layout.lua | 2 +- .../lua/telescope/actions/set.lua | 32 +- .../lua/telescope/actions/state.lua | 4 +- .../lua/telescope/actions/utils.lua | 11 +- .../{diagnostics.lua => __diagnostics.lua} | 26 +- .../builtin/{files.lua => __files.lua} | 354 +- .../lua/telescope/builtin/__git.lua | 427 +++ .../lua/telescope/builtin/__internal.lua | 1369 +++++++ .../telescope/builtin/{lsp.lua => __lsp.lua} | 225 +- .../lua/telescope/builtin/git.lua | 409 --- .../lua/telescope/builtin/init.lua | 175 +- .../lua/telescope/builtin/internal.lua | 1348 ------- .../telescope.nvim/lua/telescope/config.lua | 204 +- .../lua/telescope/config/resolve.lua | 45 +- .../telescope.nvim/lua/telescope/finders.lua | 6 +- .../telescope/finders/async_job_finder.lua | 2 +- .../finders/async_oneshot_finder.lua | 3 +- .../telescope/finders/async_static_finder.lua | 3 +- .../lua/telescope/from_entry.lua | 24 +- .../telescope.nvim/lua/telescope/health.lua | 2 +- bundle/telescope.nvim/lua/telescope/init.lua | 15 +- .../lua/telescope/make_entry.lua | 569 +-- .../telescope.nvim/lua/telescope/mappings.lua | 161 +- .../telescope.nvim/lua/telescope/pickers.lua | 106 +- .../lua/telescope/pickers/entry_display.lua | 60 + .../telescope/pickers/layout_strategies.lua | 28 +- .../telescope/previewers/buffer_previewer.lua | 88 +- .../lua/telescope/previewers/previewer.lua | 19 +- .../telescope/previewers/term_previewer.lua | 16 +- .../lua/telescope/previewers/utils.lua | 88 +- .../telescope.nvim/lua/telescope/sorters.lua | 25 +- .../helpers.lua} | 0 .../lua/telescope/testharness/init.lua | 112 + .../lua/telescope/testharness/runner.lua | 156 + bundle/telescope.nvim/lua/telescope/utils.lua | 83 +- .../lua/tests/automated/action_spec.lua | 2 +- .../automated/pickers/find_files_spec.lua | 78 +- .../lua/tests/automated/resolver_spec.lua | 8 + .../lua/tests/pickers/find_files__readme.lua | 6 +- ...find_files__scrolling_descending_cycle.lua | 10 +- .../tests/pickers/find_files__with_ctrl_n.lua | 8 - bundle/telescope.nvim/media/demo_script.lua | 47 - bundle/telescope.nvim/media/demo_script_2.lua | 30 - .../media/simple_rg_example.hnt | 34 - bundle/telescope.nvim/media/worflow.txt | 26 - bundle/telescope.nvim/plugin/telescope.lua | 1 - .../scratch/batched_finder_and_sorter.lua | 55 - .../telescope.nvim/scratch/piped_to_fzf.lua | 33 - bundle/telescope.nvim/scratch/slow_proc.sh | 11 - bundle/telescope.nvim/scripts/gendocs.lua | 4 + .../telescope.nvim/scripts/minimal_init.vim | 3 + .../vim-zettelkasten/ftplugin/zkbrowser.lua | 81 +- bundle/vim-zettelkasten/lua/zettelkasten.lua | 479 +-- .../lua/zettelkasten/browser.lua | 306 +- .../lua/zettelkasten/config.lua | 19 +- .../lua/zettelkasten/formatter.lua | 79 +- .../vim-zettelkasten/plugin/zettelkasten.lua | 26 +- bundle/vim-zettelkasten/stylua.toml | 6 +- config/plugins/telescope.vim | 1 + docs/layers/zettelkasten.md | 24 +- .../_extensions/zettelkasten_template.lua | 53 + 74 files changed, 5053 insertions(+), 6986 deletions(-) create mode 100644 bundle/telescope.nvim/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 bundle/telescope.nvim/data/options/options.lua rename bundle/telescope.nvim/lua/telescope/builtin/{diagnostics.lua => __diagnostics.lua} (89%) rename bundle/telescope.nvim/lua/telescope/builtin/{files.lua => __files.lua} (57%) create mode 100644 bundle/telescope.nvim/lua/telescope/builtin/__git.lua create mode 100644 bundle/telescope.nvim/lua/telescope/builtin/__internal.lua rename bundle/telescope.nvim/lua/telescope/builtin/{lsp.lua => __lsp.lua} (60%) delete mode 100644 bundle/telescope.nvim/lua/telescope/builtin/git.lua delete mode 100644 bundle/telescope.nvim/lua/telescope/builtin/internal.lua rename bundle/telescope.nvim/lua/telescope/{pickers/_test_helpers.lua => testharness/helpers.lua} (100%) create mode 100644 bundle/telescope.nvim/lua/telescope/testharness/init.lua create mode 100644 bundle/telescope.nvim/lua/telescope/testharness/runner.lua delete mode 100644 bundle/telescope.nvim/lua/tests/pickers/find_files__with_ctrl_n.lua delete mode 100644 bundle/telescope.nvim/media/demo_script.lua delete mode 100644 bundle/telescope.nvim/media/demo_script_2.lua delete mode 100644 bundle/telescope.nvim/media/simple_rg_example.hnt delete mode 100644 bundle/telescope.nvim/media/worflow.txt delete mode 100644 bundle/telescope.nvim/scratch/batched_finder_and_sorter.lua delete mode 100644 bundle/telescope.nvim/scratch/piped_to_fzf.lua delete mode 100644 bundle/telescope.nvim/scratch/slow_proc.sh create mode 100644 lua/telescope/_extensions/zettelkasten_template.lua diff --git a/autoload/SpaceVim/layers/zettelkasten.vim b/autoload/SpaceVim/layers/zettelkasten.vim index f6cace398..cf11b1acf 100644 --- a/autoload/SpaceVim/layers/zettelkasten.vim +++ b/autoload/SpaceVim/layers/zettelkasten.vim @@ -29,12 +29,17 @@ endfunction function! SpaceVim#layers#zettelkasten#config() abort let g:_spacevim_mappings_space.m.z = {'name' : '+zettelkasten'} call SpaceVim#mapping#space#def('nnoremap', ['m', 'z', 'n'], 'ZkNew', 'create-new-zettel-note', 1) + call SpaceVim#mapping#space#def('nnoremap', ['m', 'z', 't'], 'Telescope zettelkasten_template', 'zettel-template', 1) + call SpaceVim#mapping#space#def('nnoremap', ['m', 'z', 'b'], 'ZkBrowse', 'open-zettelkasten-browse', 1) endfunction function! SpaceVim#layers#zettelkasten#set_variable(var) abort let g:zettelkasten_directory = get(a:var, \ 'zettel_dir', \ '') + let g:zettelkasten_template_directory = get(a:var, + \ 'zettel_template_dir', + \ '') endfunction function! SpaceVim#layers#zettelkasten#get_options() abort diff --git a/bundle/telescope.nvim/.github/FUNDING.yml b/bundle/telescope.nvim/.github/FUNDING.yml index 3ad2f2999..0cf6be30e 100644 --- a/bundle/telescope.nvim/.github/FUNDING.yml +++ b/bundle/telescope.nvim/.github/FUNDING.yml @@ -1 +1 @@ -github: [tjdevries, Conni2461] +github: [tjdevries, Conni2461, fdschmidt93] diff --git a/bundle/telescope.nvim/.github/ISSUE_TEMPLATE/bug_report.yml b/bundle/telescope.nvim/.github/ISSUE_TEMPLATE/bug_report.yml index 812845374..5a6437dd0 100644 --- a/bundle/telescope.nvim/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/bundle/telescope.nvim/.github/ISSUE_TEMPLATE/bug_report.yml @@ -29,6 +29,12 @@ body: placeholder: "macOS 11.5" validations: required: true + - type: input + attributes: + label: "Telescope version / branch / rev" + placeholder: "telescope 0.1.0" + validations: + required: true - type: textarea attributes: label: "checkhealth telescope" diff --git a/bundle/telescope.nvim/.github/PULL_REQUEST_TEMPLATE.md b/bundle/telescope.nvim/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..780091e0f --- /dev/null +++ b/bundle/telescope.nvim/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,33 @@ +# Description + +Please include a summary of the change and which issue is fixed. Please also +include relevant motivation and context + +Fixes # (issue) + +## Type of change + +Please delete options that are not relevant. + +- Bug fix (non-breaking change which fixes an issue) +- New feature (non-breaking change which adds functionality) +- Breaking change (fix or feature that would cause existing functionality to not work as expected) +- This change requires a documentation update + +# How Has This Been Tested? + +Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list relevant details about your configuration + +- [ ] Test A +- [ ] Test B + +**Configuration**: +* Neovim version (nvim --version): +* Operating system and version: + +# Checklist: + +- [ ] My code follows the style guidelines of this project (stylua) +- [ ] I have performed a self-review of my own code +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation (lua annotations) diff --git a/bundle/telescope.nvim/.github/workflows/ci.yml b/bundle/telescope.nvim/.github/workflows/ci.yml index e26ae9bcd..1e05c35bb 100644 --- a/bundle/telescope.nvim/.github/workflows/ci.yml +++ b/bundle/telescope.nvim/.github/workflows/ci.yml @@ -13,19 +13,19 @@ jobs: - os: ubuntu-20.04 url: https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.tar.gz manager: sudo apt-get - packages: -y fd-find + packages: -y ripgrep - os: ubuntu-20.04 url: https://github.com/neovim/neovim/releases/download/v0.7.0/nvim-linux64.tar.gz manager: sudo apt-get - packages: -y fd-find + packages: -y ripgrep - os: macos-10.15 url: https://github.com/neovim/neovim/releases/download/nightly/nvim-macos.tar.gz manager: brew - packages: fd + packages: ripgrep - os: macos-10.15 url: https://github.com/neovim/neovim/releases/download/v0.7.0/nvim-macos.tar.gz manager: brew - packages: fd + packages: ripgrep steps: - uses: actions/checkout@v2 - run: date +%F > todays-date diff --git a/bundle/telescope.nvim/.github/workflows/lint.yml b/bundle/telescope.nvim/.github/workflows/lint.yml index 885b4cc1f..a97eaad8e 100644 --- a/bundle/telescope.nvim/.github/workflows/lint.yml +++ b/bundle/telescope.nvim/.github/workflows/lint.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - - uses: JohnnyMorganz/stylua-action@1.0.0 + - uses: JohnnyMorganz/stylua-action@v1 with: token: ${{ secrets.GITHUB_TOKEN }} # CLI arguments diff --git a/bundle/telescope.nvim/README.md b/bundle/telescope.nvim/README.md index 168fb3563..6a5796570 100644 --- a/bundle/telescope.nvim/README.md +++ b/bundle/telescope.nvim/README.md @@ -51,7 +51,7 @@ latest neovim nightly commit is required for `telescope.nvim` to work. ### Suggested dependencies - [BurntSushi/ripgrep](https://github.com/BurntSushi/ripgrep) is required for - `live_grep` and `grep_string` + `live_grep` and `grep_string` and is the first priority for `find_files`. We also suggest you install one native telescope sorter to significantly improve sorting performance. Take a look at either @@ -71,24 +71,34 @@ wiki. ### Installation +It is suggested to either use the latest release +[tag](https://github.com/nvim-telescope/telescope.nvim/tags) or our release +branch (which will get consistent updates) +[0.1.x](https://github.com/nvim-telescope/telescope.nvim/tree/0.1.x). + +It is not suggested to run latest master. + Using [vim-plug](https://github.com/junegunn/vim-plug) ```viml Plug 'nvim-lua/plenary.nvim' -Plug 'nvim-telescope/telescope.nvim' +Plug 'nvim-telescope/telescope.nvim', { 'tag': '0.1.0' } +" or , { 'branch': '0.1.x' } ``` Using [dein](https://github.com/Shougo/dein.vim) ```viml call dein#add('nvim-lua/plenary.nvim') -call dein#add('nvim-telescope/telescope.nvim') +call dein#add('nvim-telescope/telescope.nvim', { 'rev': '0.1.0' }) +" or , { 'rev': '0.1.x' }) ``` Using [packer.nvim](https://github.com/wbthomason/packer.nvim) ```lua use { - 'nvim-telescope/telescope.nvim', + 'nvim-telescope/telescope.nvim', tag = '0.1.0', +-- or , branch = '0.1.x', requires = { {'nvim-lua/plenary.nvim'} } } ``` @@ -96,7 +106,7 @@ use { ### checkhealth Make sure you call `:checkhealth telescope` after installing telescope to ensure -everything is setup correctly. +everything is set up correctly. After this setup you can continue reading here or switch to `:help telescope` to get an understanding of how to use Telescope and how to configure it. @@ -106,6 +116,8 @@ to get an understanding of how to use Telescope and how to configure it. Try the command `:Telescope find_files` to see if `telescope.nvim` is installed correctly. +Using VimL: + ```viml " Find files using Telescope command-line sugar. nnoremap ff Telescope find_files @@ -120,6 +132,16 @@ nnoremap fb lua require('telescope.builtin').buffers() nnoremap fh lua require('telescope.builtin').help_tags() ``` +Using Lua: + +```lua +local builtin = require('telescope.builtin') +vim.keymap.set('n', 'ff', builtin.find_files, {}) +vim.keymap.set('n', 'fg', builtin.live_grep, {}) +vim.keymap.set('n', 'fb', builtin.buffers, {}) +vim.keymap.set('n', 'fh', builtin.help_tags, {}) +``` + See [builtin pickers](#pickers) for a list of all builtin functions. ## Customization @@ -192,7 +214,7 @@ EOF ## Default Mappings Mappings are fully customizable. -Many familiar mapping patterns are setup as defaults. +Many familiar mapping patterns are set up as defaults. | Mappings | Action | |----------------|------------------------------------------------------| @@ -200,7 +222,7 @@ Many familiar mapping patterns are setup as defaults. | `/` | Previous item | | `j/k` | Next/previous (in normal mode) | | `H/M/L` | Select High/Middle/Low (in normal mode) | -| 'gg/G' | Select the first/last item (in normal mode) | +| `gg/G` | Select the first/last item (in normal mode) | | `` | Confirm selection | | `` | Go to file selection as a split | | `` | Go to file selection as a vsplit | @@ -260,9 +282,9 @@ Built-in functions. Ready to be bound to any key you like. | Functions | Description | |-------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| | `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, optionally ignores untracked files | +| `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.live_grep` | Search for a string in your current working directory and get results live as you type (respecting .gitignore) | +| `builtin.live_grep` | Search for a string in your current working directory and get results live as you type, respects .gitignore | ### Vim Pickers @@ -299,6 +321,8 @@ Built-in functions. Ready to be bound to any key you like. | Functions | Description | |---------------------------------------------|---------------------------------------------------------------------------------------------------------------------------| | `builtin.lsp_references` | Lists LSP references for word under the cursor | +| `builtin.lsp_incoming_calls` | Lists LSP incoming calls for word under the cursor | +| `builtin.lsp_outgoing_calls` | Lists LSP outgoing calls for word under the cursor | | `builtin.lsp_document_symbols` | Lists LSP document symbols in the current buffer | | `builtin.lsp_workspace_symbols` | Lists LSP document symbols in the current workspace | | `builtin.lsp_dynamic_workspace_symbols` | Dynamically Lists LSP for all workspace symbols | diff --git a/bundle/telescope.nvim/data/options/options.lua b/bundle/telescope.nvim/data/options/options.lua deleted file mode 100644 index 95861ccc1..000000000 --- a/bundle/telescope.nvim/data/options/options.lua +++ /dev/null @@ -1,3257 +0,0 @@ --- { --- { --- full_name='aleph', abbreviation='al', --- short_desc="ASCII code of the letter Aleph (Hebrew)", --- varname='p_aleph', pv_name=nil, --- type='number', list=nil, scope={'global'}, --- deny_duplicates=nil, --- enable_if=nil, --- defaults={condition=nil, if_true={vi=224, vim=0}, if_false=nil}, --- secure=nil, gettext=nil, noglob=nil, normal_fname_chars=nil, --- pri_mkrc=nil, deny_in_modelines=nil, normal_dname_chars=nil, --- modelineexpr=nil, --- expand=nil, nodefault=nil, no_mkrc=nil, vi_def=true, vim=true, --- alloced=nil, --- save_pv_indir=nil, --- redraw={'curswant'}, --- } --- } --- types: bool, number, string --- lists: (nil), comma, onecomma, flags, flagscomma --- scopes: global, buffer, window --- redraw options: statuslines, current_window, curent_window_only, --- current_buffer, all_windows, everything, curswant --- default: {vi=…[, vim=…]} --- defaults: {condition=#if condition, if_true=default, if_false=default} --- #if condition: --- string: #ifdef string --- !string: #ifndef string --- {string, string}: #if defined(string) && defined(string) --- {!string, !string}: #if !defined(string) && !defined(string) -local cstr = function(s) - return '"' .. s:gsub('["\\]', '\\%0'):gsub('\t', '\\t') .. '"' -end -local macros=function(s) - return function() - return s - end -end -local imacros=function(s) - return function() - return '(intptr_t)' .. s - end -end -N_=function(s) -- luacheck: ignore 211 (currently unused) - return function() - return 'N_(' .. cstr(s) .. ')' - end -end --- used for 'cinkeys' and 'indentkeys' -local indentkeys_default = '0{,0},0),0],:,0#,!^F,o,O,e'; -return { - cstr=cstr, - options={ - { - full_name='aleph', abbreviation='al', - short_desc=N_("ASCII code of the letter Aleph (Hebrew)"), - type='number', scope={'global'}, - vi_def=true, - redraw={'curswant'}, - varname='p_aleph', - defaults={if_true={vi=224}} - }, - { - full_name='arabic', abbreviation='arab', - short_desc=N_("Arabic as a default second language"), - type='bool', scope={'window'}, - vi_def=true, - vim=true, - redraw={'curswant'}, - defaults={if_true={vi=false}} - }, - { - full_name='arabicshape', abbreviation='arshape', - short_desc=N_("do shaping for Arabic characters"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - redraw={'all_windows', 'ui_option'}, - - varname='p_arshape', - defaults={if_true={vi=true}} - }, - { - full_name='allowrevins', abbreviation='ari', - short_desc=N_("allow CTRL-_ in Insert and Command-line mode"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_ari', - defaults={if_true={vi=false}} - }, - { - full_name='ambiwidth', abbreviation='ambw', - short_desc=N_("what to do with Unicode chars of ambiguous width"), - type='string', scope={'global'}, - vi_def=true, - redraw={'all_windows', 'ui_option'}, - varname='p_ambw', - defaults={if_true={vi="single"}} - }, - { - full_name='autochdir', abbreviation='acd', - short_desc=N_("change directory to the file in the current window"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_acd', - defaults={if_true={vi=false}} - }, - { - full_name='autoindent', abbreviation='ai', - short_desc=N_("take indent for new line from previous line"), - type='bool', scope={'buffer'}, - varname='p_ai', - defaults={if_true={vi=false, vim=true}} - }, - { - full_name='autoread', abbreviation='ar', - short_desc=N_("autom. read file when changed outside of Vim"), - type='bool', scope={'global', 'buffer'}, - varname='p_ar', - defaults={if_true={vi=false, vim=true}} - }, - { - full_name='autowrite', abbreviation='aw', - short_desc=N_("automatically write file if changed"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_aw', - defaults={if_true={vi=false}} - }, - { - full_name='autowriteall', abbreviation='awa', - short_desc=N_("as 'autowrite', but works with more commands"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_awa', - defaults={if_true={vi=false}} - }, - { - full_name='background', abbreviation='bg', - short_desc=N_("\"dark\" or \"light\", used for highlight colors"), - type='string', scope={'global'}, - vim=true, - redraw={'all_windows'}, - varname='p_bg', - defaults={if_true={vi="light",vim="dark"}} - }, - { - full_name='backspace', abbreviation='bs', - short_desc=N_("how backspace works at start of line"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vim=true, - varname='p_bs', - defaults={if_true={vi="", vim="indent,eol,start"}} - }, - { - full_name='backup', abbreviation='bk', - short_desc=N_("keep backup file after overwriting a file"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_bk', - defaults={if_true={vi=false}} - }, - { - full_name='backupcopy', abbreviation='bkc', - short_desc=N_("make backup as a copy, don't rename the file"), - type='string', list='onecomma', scope={'global', 'buffer'}, - deny_duplicates=true, - vim=true, - varname='p_bkc', - defaults={ - condition='UNIX', - if_true={vi="yes", vim="auto"}, - if_false={vi="auto", vim="auto"} - }, - }, - { - full_name='backupdir', abbreviation='bdir', - short_desc=N_("list of directories for the backup file"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - secure=true, - vi_def=true, - expand='nodefault', - varname='p_bdir', - defaults={if_true={vi=''}} - }, - { - full_name='backupext', abbreviation='bex', - short_desc=N_("extension used for the backup file"), - type='string', scope={'global'}, - normal_fname_chars=true, - vi_def=true, - varname='p_bex', - defaults={if_true={vi="~"}} - }, - { - full_name='backupskip', abbreviation='bsk', - short_desc=N_("no backup for files that match these patterns"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_bsk', - defaults={if_true={vi=""}} - }, - { - full_name='belloff', abbreviation='bo', - short_desc=N_("do not ring the bell for these reasons"), - type='string', list='comma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_bo', - defaults={if_true={vi="all"}} - }, - { - full_name='binary', abbreviation='bin', - short_desc=N_("read/write/edit file in binary mode"), - type='bool', scope={'buffer'}, - vi_def=true, - redraw={'statuslines'}, - varname='p_bin', - defaults={if_true={vi=false}} - }, - { - full_name='bomb', - short_desc=N_("a Byte Order Mark to the file"), - type='bool', scope={'buffer'}, - no_mkrc=true, - vi_def=true, - redraw={'statuslines'}, - varname='p_bomb', - defaults={if_true={vi=false}} - }, - { - full_name='breakat', abbreviation='brk', - short_desc=N_("characters that may cause a line break"), - type='string', list='flags', scope={'global'}, - vi_def=true, - redraw={'all_windows'}, - varname='p_breakat', - defaults={if_true={vi=" \t!@*-+;:,./?"}} - }, - { - full_name='breakindent', abbreviation='bri', - short_desc=N_("wrapped line repeats indent"), - type='bool', scope={'window'}, - vi_def=true, - vim=true, - redraw={'current_window'}, - defaults={if_true={vi=false}} - }, - { - full_name='breakindentopt', abbreviation='briopt', - short_desc=N_("settings for 'breakindent'"), - type='string', list='onecomma', scope={'window'}, - deny_duplicates=true, - vi_def=true, - alloced=true, - redraw={'current_buffer'}, - defaults={if_true={vi=""}}, - }, - { - full_name='browsedir', abbreviation='bsdir', - short_desc=N_("which directory to start browsing in"), - type='string', scope={'global'}, - vi_def=true, - enable_if=false, - }, - { - full_name='bufhidden', abbreviation='bh', - short_desc=N_("what to do when buffer is no longer in window"), - type='string', scope={'buffer'}, - noglob=true, - vi_def=true, - alloced=true, - varname='p_bh', - defaults={if_true={vi=""}} - }, - { - full_name='buflisted', abbreviation='bl', - short_desc=N_("whether the buffer shows up in the buffer list"), - type='bool', scope={'buffer'}, - noglob=true, - vi_def=true, - varname='p_bl', - defaults={if_true={vi=1}} - }, - { - full_name='buftype', abbreviation='bt', - short_desc=N_("special type of buffer"), - type='string', scope={'buffer'}, - noglob=true, - vi_def=true, - alloced=true, - varname='p_bt', - defaults={if_true={vi=""}} - }, - { - full_name='casemap', abbreviation='cmp', - short_desc=N_("specifies how case of letters is changed"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_cmp', - defaults={if_true={vi="internal,keepascii"}} - }, - { - full_name='cdpath', abbreviation='cd', - short_desc=N_("list of directories searched with \":cd\""), - type='string', list='comma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - expand=true, - secure=true, - varname='p_cdpath', - defaults={if_true={vi=",,"}} - }, - { - full_name='cedit', - short_desc=N_("used to open the command-line window"), - type='string', scope={'global'}, - varname='p_cedit', - defaults={if_true={vi="", vim=macros('CTRL_F_STR')}} - }, - { - full_name='channel', - short_desc=N_("Channel connected to the buffer"), - type='number', scope={'buffer'}, - no_mkrc=true, - nodefault=true, - varname='p_channel', - defaults={if_true={vi=0}} - }, - { - full_name='charconvert', abbreviation='ccv', - short_desc=N_("expression for character encoding conversion"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - varname='p_ccv', - defaults={if_true={vi=""}} - }, - { - full_name='cindent', abbreviation='cin', - short_desc=N_("do C program indenting"), - type='bool', scope={'buffer'}, - vi_def=true, - vim=true, - varname='p_cin', - defaults={if_true={vi=false}} - }, - { - full_name='cinkeys', abbreviation='cink', - short_desc=N_("keys that trigger indent when 'cindent' is set"), - type='string', list='onecomma', scope={'buffer'}, - deny_duplicates=true, - vi_def=true, - alloced=true, - varname='p_cink', - defaults={if_true={vi=indentkeys_default}} - }, - { - full_name='cinoptions', abbreviation='cino', - short_desc=N_("how to do indenting when 'cindent' is set"), - type='string', list='onecomma', scope={'buffer'}, - deny_duplicates=true, - vi_def=true, - alloced=true, - varname='p_cino', - defaults={if_true={vi=""}} - }, - { - full_name='cinwords', abbreviation='cinw', - short_desc=N_("words where 'si' and 'cin' add an indent"), - type='string', list='onecomma', scope={'buffer'}, - deny_duplicates=true, - vi_def=true, - alloced=true, - varname='p_cinw', - defaults={if_true={vi="if,else,while,do,for,switch"}} - }, - { - full_name='clipboard', abbreviation='cb', - short_desc=N_("use the clipboard as the unnamed register"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_cb', - defaults={if_true={vi=""}} - }, - { - full_name='cmdheight', abbreviation='ch', - short_desc=N_("number of lines to use for the command-line"), - type='number', scope={'global'}, - vi_def=true, - redraw={'all_windows'}, - varname='p_ch', - defaults={if_true={vi=1}} - }, - { - full_name='cmdwinheight', abbreviation='cwh', - short_desc=N_("height of the command-line window"), - type='number', scope={'global'}, - vi_def=true, - varname='p_cwh', - defaults={if_true={vi=7}} - }, - { - full_name='colorcolumn', abbreviation='cc', - short_desc=N_("columns to highlight"), - type='string', list='onecomma', scope={'window'}, - deny_duplicates=true, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=""}} - }, - { - full_name='columns', abbreviation='co', - short_desc=N_("number of columns in the display"), - type='number', scope={'global'}, - no_mkrc=true, - vi_def=true, - redraw={'everything'}, - varname='p_columns', - defaults={if_true={vi=macros('DFLT_COLS')}} - }, - { - full_name='comments', abbreviation='com', - short_desc=N_("patterns that can start a comment line"), - type='string', list='onecomma', scope={'buffer'}, - deny_duplicates=true, - vi_def=true, - alloced=true, - redraw={'curswant'}, - varname='p_com', - defaults={if_true={vi="s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-"}} - }, - { - full_name='commentstring', abbreviation='cms', - short_desc=N_("template for comments; used for fold marker"), - type='string', scope={'buffer'}, - vi_def=true, - alloced=true, - redraw={'curswant'}, - varname='p_cms', - defaults={if_true={vi="/*%s*/"}} - }, - { - full_name='compatible', abbreviation='cp', - short_desc=N_("No description"), - type='bool', scope={'global'}, - redraw={'all_windows'}, - varname='p_force_off', - -- pri_mkrc isn't needed here, optval_default() - -- always returns TRUE for 'compatible' - defaults={if_true={vi=true, vim=false}} - }, - { - full_name='complete', abbreviation='cpt', - short_desc=N_("specify how Insert mode completion works"), - type='string', list='onecomma', scope={'buffer'}, - deny_duplicates=true, - alloced=true, - varname='p_cpt', - defaults={if_true={vi=".,w,b,u,t,i", vim=".,w,b,u,t"}} - }, - { - full_name='concealcursor', abbreviation='cocu', - short_desc=N_("whether concealable text is hidden in cursor line"), - type='string', scope={'window'}, - vi_def=true, - alloced=true, - redraw={'current_window'}, - defaults={if_true={vi=""}} - }, - { - full_name='conceallevel', abbreviation='cole', - short_desc=N_("whether concealable text is shown or hidden"), - type='number', scope={'window'}, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=0}} - }, - { - full_name='completefunc', abbreviation='cfu', - short_desc=N_("function to be used for Insert mode completion"), - type='string', scope={'buffer'}, - secure=true, - vi_def=true, - alloced=true, - varname='p_cfu', - defaults={if_true={vi=""}} - }, - { - full_name='completeopt', abbreviation='cot', - short_desc=N_("options for Insert mode completion"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_cot', - defaults={if_true={vi="menu,preview"}} - }, - { - full_name='confirm', abbreviation='cf', - short_desc=N_("ask what to do about unsaved/read-only files"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_confirm', - defaults={if_true={vi=false}} - }, - { - full_name='copyindent', abbreviation='ci', - short_desc=N_("make 'autoindent' use existing indent structure"), - type='bool', scope={'buffer'}, - vi_def=true, - vim=true, - varname='p_ci', - defaults={if_true={vi=false}} - }, - { - full_name='cpoptions', abbreviation='cpo', - short_desc=N_("flags for Vi-compatible behavior"), - type='string', list='flags', scope={'global'}, - vim=true, - redraw={'all_windows'}, - varname='p_cpo', - defaults={if_true={vi=macros('CPO_VI'), vim=macros('CPO_VIM')}} - }, - { - full_name='cscopepathcomp', abbreviation='cspc', - short_desc=N_("how many components of the path to show"), - type='number', scope={'global'}, - vi_def=true, - vim=true, - varname='p_cspc', - defaults={if_true={vi=0}} - }, - { - full_name='cscopeprg', abbreviation='csprg', - short_desc=N_("command to execute cscope"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - expand=true, - varname='p_csprg', - defaults={if_true={vi="cscope"}} - }, - { - full_name='cscopequickfix', abbreviation='csqf', - short_desc=N_("use quickfix window for cscope results"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_csqf', - defaults={if_true={vi=""}} - }, - { - full_name='cscoperelative', abbreviation='csre', - short_desc=N_("Use cscope.out path basename as prefix"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_csre', - defaults={if_true={vi=0}} - }, - { - full_name='cscopetag', abbreviation='cst', - short_desc=N_("use cscope for tag commands"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_cst', - defaults={if_true={vi=0}} - }, - { - full_name='cscopetagorder', abbreviation='csto', - short_desc=N_("determines \":cstag\" search order"), - type='number', scope={'global'}, - vi_def=true, - vim=true, - varname='p_csto', - defaults={if_true={vi=0}} - }, - { - full_name='cscopeverbose', abbreviation='csverb', - short_desc=N_("give messages when adding a cscope database"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_csverbose', - defaults={if_true={vi=1}} - }, - { - full_name='cursorbind', abbreviation='crb', - short_desc=N_("move cursor in window as it moves in other windows"), - type='bool', scope={'window'}, - vi_def=true, - pv_name='p_crbind', - defaults={if_true={vi=false}} - }, - { - full_name='cursorcolumn', abbreviation='cuc', - short_desc=N_("highlight the screen column of the cursor"), - type='bool', scope={'window'}, - vi_def=true, - redraw={'current_window_only'}, - defaults={if_true={vi=false}} - }, - { - full_name='cursorline', abbreviation='cul', - short_desc=N_("highlight the screen line of the cursor"), - type='bool', scope={'window'}, - vi_def=true, - redraw={'current_window_only'}, - defaults={if_true={vi=false}} - }, - { - full_name='debug', - short_desc=N_("to \"msg\" to see all error messages"), - type='string', scope={'global'}, - vi_def=true, - varname='p_debug', - defaults={if_true={vi=""}} - }, - { - full_name='define', abbreviation='def', - short_desc=N_("pattern to be used to find a macro definition"), - type='string', scope={'global', 'buffer'}, - vi_def=true, - alloced=true, - redraw={'curswant'}, - varname='p_def', - defaults={if_true={vi="^\\s*#\\s*define"}} - }, - { - full_name='delcombine', abbreviation='deco', - short_desc=N_("delete combining characters on their own"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_deco', - defaults={if_true={vi=false}} - }, - { - full_name='dictionary', abbreviation='dict', - short_desc=N_("list of file names used for keyword completion"), - type='string', list='onecomma', scope={'global', 'buffer'}, - deny_duplicates=true, - normal_dname_chars=true, - vi_def=true, - expand=true, - varname='p_dict', - defaults={if_true={vi=""}} - }, - { - full_name='diff', - short_desc=N_("diff mode for the current window"), - type='bool', scope={'window'}, - noglob=true, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=false}} - }, - { - full_name='diffexpr', abbreviation='dex', - short_desc=N_("expression used to obtain a diff file"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - redraw={'curswant'}, - varname='p_dex', - defaults={if_true={vi=""}} - }, - { - full_name='diffopt', abbreviation='dip', - short_desc=N_("options for using diff mode"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - alloced=true, - redraw={'current_window'}, - varname='p_dip', - defaults={if_true={vi="internal,filler,closeoff"}} - }, - { - full_name='digraph', abbreviation='dg', - short_desc=N_("enable the entering of digraphs in Insert mode"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_dg', - defaults={if_true={vi=false}} - }, - { - full_name='directory', abbreviation='dir', - short_desc=N_("list of directory names for the swap file"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - secure=true, - vi_def=true, - expand='nodefault', - varname='p_dir', - defaults={if_true={vi=''}} - }, - { - full_name='display', abbreviation='dy', - short_desc=N_("list of flags for how to display text"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vim=true, - redraw={'all_windows'}, - varname='p_dy', - defaults={if_true={vi="", vim="lastline,msgsep"}} - }, - { - full_name='eadirection', abbreviation='ead', - short_desc=N_("in which direction 'equalalways' works"), - type='string', scope={'global'}, - vi_def=true, - varname='p_ead', - defaults={if_true={vi="both"}} - }, - { - full_name='edcompatible', abbreviation='ed', - short_desc=N_("No description"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_force_off', - defaults={if_true={vi=false}} - }, - { - full_name='emoji', abbreviation='emo', - short_desc=N_("No description"), - type='bool', scope={'global'}, - vi_def=true, - redraw={'all_windows', 'ui_option'}, - varname='p_emoji', - defaults={if_true={vi=true}} - }, - { - full_name='encoding', abbreviation='enc', - short_desc=N_("encoding used internally"), - type='string', scope={'global'}, - deny_in_modelines=true, - vi_def=true, - varname='p_enc', - defaults={if_true={vi=macros('ENC_DFLT')}} - }, - { - full_name='endofline', abbreviation='eol', - short_desc=N_("write for last line in file"), - type='bool', scope={'buffer'}, - no_mkrc=true, - vi_def=true, - redraw={'statuslines'}, - varname='p_eol', - defaults={if_true={vi=true}} - }, - { - full_name='equalalways', abbreviation='ea', - short_desc=N_("windows are automatically made the same size"), - type='bool', scope={'global'}, - vi_def=true, - redraw={'all_windows'}, - varname='p_ea', - defaults={if_true={vi=true}} - }, - { - full_name='equalprg', abbreviation='ep', - short_desc=N_("external program to use for \"=\" command"), - type='string', scope={'global', 'buffer'}, - secure=true, - vi_def=true, - expand=true, - varname='p_ep', - defaults={if_true={vi=""}} - }, - { - full_name='errorbells', abbreviation='eb', - short_desc=N_("ring the bell for error messages"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_eb', - defaults={if_true={vi=false}} - }, - { - full_name='errorfile', abbreviation='ef', - short_desc=N_("name of the errorfile for the QuickFix mode"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - expand=true, - varname='p_ef', - defaults={if_true={vi=macros('DFLT_ERRORFILE')}} - }, - { - full_name='errorformat', abbreviation='efm', - short_desc=N_("description of the lines in the error file"), - type='string', list='onecomma', scope={'global', 'buffer'}, - deny_duplicates=true, - vi_def=true, - varname='p_efm', - defaults={if_true={vi=macros('DFLT_EFM')}} - }, - { - full_name='eventignore', abbreviation='ei', - short_desc=N_("autocommand events that are ignored"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_ei', - defaults={if_true={vi=""}} - }, - { - full_name='expandtab', abbreviation='et', - short_desc=N_("use spaces when is inserted"), - type='bool', scope={'buffer'}, - vi_def=true, - vim=true, - varname='p_et', - defaults={if_true={vi=false}} - }, - { - full_name='exrc', abbreviation='ex', - short_desc=N_("read .nvimrc and .exrc in the current directory"), - type='bool', scope={'global'}, - secure=true, - vi_def=true, - varname='p_exrc', - defaults={if_true={vi=false}} - }, - { - full_name='fileencoding', abbreviation='fenc', - short_desc=N_("file encoding for multi-byte text"), - type='string', scope={'buffer'}, - no_mkrc=true, - vi_def=true, - alloced=true, - redraw={'statuslines', 'current_buffer'}, - varname='p_fenc', - defaults={if_true={vi=""}} - }, - { - full_name='fileencodings', abbreviation='fencs', - short_desc=N_("automatically detected character encodings"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_fencs', - defaults={if_true={vi="ucs-bom,utf-8,default,latin1"}} - }, - { - full_name='fileformat', abbreviation='ff', - short_desc=N_("file format used for file I/O"), - type='string', scope={'buffer'}, - no_mkrc=true, - vi_def=true, - alloced=true, - redraw={'curswant', 'statuslines'}, - varname='p_ff', - defaults={if_true={vi=macros('DFLT_FF')}} - }, - { - full_name='fileformats', abbreviation='ffs', - short_desc=N_("automatically detected values for 'fileformat'"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vim=true, - varname='p_ffs', - defaults={if_true={vi=macros('DFLT_FFS_VI'), vim=macros('DFLT_FFS_VIM')}} - }, - { - full_name='fileignorecase', abbreviation='fic', - short_desc=N_("ignore case when using file names"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_fic', - defaults={ - condition='CASE_INSENSITIVE_FILENAME', - if_true={vi=true}, - if_false={vi=false}, - } - }, - { - full_name='filetype', abbreviation='ft', - short_desc=N_("type of file, used for autocommands"), - type='string', scope={'buffer'}, - noglob=true, - normal_fname_chars=true, - vi_def=true, - alloced=true, - varname='p_ft', - defaults={if_true={vi=""}} - }, - { - full_name='fillchars', abbreviation='fcs', - short_desc=N_("characters to use for displaying special items"), - type='string', list='onecomma', scope={'global', 'window'}, - deny_duplicates=true, - vi_def=true, - alloced=true, - redraw={'current_window'}, - varname='p_fcs', - defaults={if_true={vi=''}} - }, - { - full_name='fixendofline', abbreviation='fixeol', - short_desc=N_("make sure last line in file has "), - type='bool', scope={'buffer'}, - vi_def=true, - redraw={'statuslines'}, - varname='p_fixeol', - defaults={if_true={vi=true}} - }, - { - full_name='foldclose', abbreviation='fcl', - short_desc=N_("close a fold when the cursor leaves it"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - redraw={'current_window'}, - varname='p_fcl', - defaults={if_true={vi=""}} - }, - { - full_name='foldcolumn', abbreviation='fdc', - short_desc=N_("width of the column used to indicate folds"), - type='string', scope={'window'}, - vi_def=true, - alloced=true, - redraw={'current_window'}, - defaults={if_true={vi="0"}} - }, - { - full_name='foldenable', abbreviation='fen', - short_desc=N_("set to display all folds open"), - type='bool', scope={'window'}, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=true}} - }, - { - full_name='foldexpr', abbreviation='fde', - short_desc=N_("expression used when 'foldmethod' is \"expr\""), - type='string', scope={'window'}, - vi_def=true, - vim=true, - modelineexpr=true, - alloced=true, - redraw={'current_window'}, - defaults={if_true={vi="0"}} - }, - { - full_name='foldignore', abbreviation='fdi', - short_desc=N_("ignore lines when 'foldmethod' is \"indent\""), - type='string', scope={'window'}, - vi_def=true, - vim=true, - alloced=true, - redraw={'current_window'}, - defaults={if_true={vi="#"}} - }, - { - full_name='foldlevel', abbreviation='fdl', - short_desc=N_("close folds with a level higher than this"), - type='number', scope={'window'}, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=0}} - }, - { - full_name='foldlevelstart', abbreviation='fdls', - short_desc=N_("'foldlevel' when starting to edit a file"), - type='number', scope={'global'}, - vi_def=true, - redraw={'curswant'}, - varname='p_fdls', - defaults={if_true={vi=-1}} - }, - { - full_name='foldmarker', abbreviation='fmr', - short_desc=N_("markers used when 'foldmethod' is \"marker\""), - type='string', list='onecomma', scope={'window'}, - deny_duplicates=true, - vi_def=true, - vim=true, - alloced=true, - redraw={'current_window'}, - defaults={if_true={vi="{{{,}}}"}} - }, - { - full_name='foldmethod', abbreviation='fdm', - short_desc=N_("folding type"), - type='string', scope={'window'}, - vi_def=true, - vim=true, - alloced=true, - redraw={'current_window'}, - defaults={if_true={vi="manual"}} - }, - { - full_name='foldminlines', abbreviation='fml', - short_desc=N_("minimum number of lines for a fold to be closed"), - type='number', scope={'window'}, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=1}} - }, - { - full_name='foldnestmax', abbreviation='fdn', - short_desc=N_("maximum fold depth"), - type='number', scope={'window'}, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=20}} - }, - { - full_name='foldopen', abbreviation='fdo', - short_desc=N_("for which commands a fold will be opened"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - redraw={'curswant'}, - varname='p_fdo', - defaults={if_true={vi="block,hor,mark,percent,quickfix,search,tag,undo"}} - }, - { - full_name='foldtext', abbreviation='fdt', - short_desc=N_("expression used to display for a closed fold"), - type='string', scope={'window'}, - vi_def=true, - vim=true, - modelineexpr=true, - alloced=true, - redraw={'current_window'}, - defaults={if_true={vi="foldtext()"}} - }, - { - full_name='formatexpr', abbreviation='fex', - short_desc=N_("expression used with \"gq\" command"), - type='string', scope={'buffer'}, - vi_def=true, - vim=true, - modelineexpr=true, - alloced=true, - varname='p_fex', - defaults={if_true={vi=""}} - }, - { - full_name='formatoptions', abbreviation='fo', - short_desc=N_("how automatic formatting is to be done"), - type='string', list='flags', scope={'buffer'}, - vim=true, - alloced=true, - varname='p_fo', - defaults={if_true={vi=macros('DFLT_FO_VI'), vim=macros('DFLT_FO_VIM')}} - }, - { - full_name='formatlistpat', abbreviation='flp', - short_desc=N_("pattern used to recognize a list header"), - type='string', scope={'buffer'}, - vi_def=true, - alloced=true, - varname='p_flp', - defaults={if_true={vi="^\\s*\\d\\+[\\]:.)}\\t ]\\s*"}} - }, - { - full_name='formatprg', abbreviation='fp', - short_desc=N_("name of external program used with \"gq\" command"), - type='string', scope={'global', 'buffer'}, - secure=true, - vi_def=true, - expand=true, - varname='p_fp', - defaults={if_true={vi=""}} - }, - { - full_name='fsync', abbreviation='fs', - short_desc=N_("whether to invoke fsync() after file write"), - type='bool', scope={'global'}, - secure=true, - vi_def=true, - varname='p_fs', - defaults={if_true={vi=false}} - }, - { - full_name='gdefault', abbreviation='gd', - short_desc=N_("the \":substitute\" flag 'g' is default on"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_gd', - defaults={if_true={vi=false}} - }, - { - full_name='grepformat', abbreviation='gfm', - short_desc=N_("format of 'grepprg' output"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_gefm', - defaults={if_true={vi=macros('DFLT_GREPFORMAT')}} - }, - { - full_name='grepprg', abbreviation='gp', - short_desc=N_("program to use for \":grep\""), - type='string', scope={'global', 'buffer'}, - secure=true, - vi_def=true, - expand=true, - varname='p_gp', - defaults={ - condition='WIN32', - -- Add an extra file name so that grep will always - -- insert a file name in the match line. */ - if_true={vi="findstr /n $* nul"}, - if_false={vi="grep -n $* /dev/null"} - } - }, - { - full_name='guicursor', abbreviation='gcr', - short_desc=N_("GUI: settings for cursor shape and blinking"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_guicursor', - defaults={if_true={vi="n-v-c-sm:block,i-ci-ve:ver25,r-cr-o:hor20"}} - }, - { - full_name='guifont', abbreviation='gfn', - short_desc=N_("GUI: Name(s) of font(s) to be used"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_guifont', - redraw={'ui_option'}, - defaults={if_true={vi=""}} - }, - { - full_name='guifontset', abbreviation='gfs', - short_desc=N_("GUI: Names of multi-byte fonts to be used"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_guifontset', - redraw={'ui_option'}, - defaults={if_true={vi=""}} - }, - { - full_name='guifontwide', abbreviation='gfw', - short_desc=N_("list of font names for double-wide characters"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - redraw={'ui_option'}, - varname='p_guifontwide', - defaults={if_true={vi=""}} - }, - { - full_name='guioptions', abbreviation='go', - short_desc=N_("GUI: Which components and options are used"), - type='string', list='flags', scope={'global'}, - vi_def=true, - redraw={'all_windows'}, - enable_if=false, - }, - { - full_name='guitablabel', abbreviation='gtl', - short_desc=N_("GUI: custom label for a tab page"), - type='string', scope={'global'}, - vi_def=true, - modelineexpr=true, - redraw={'current_window'}, - enable_if=false, - }, - { - full_name='guitabtooltip', abbreviation='gtt', - short_desc=N_("GUI: custom tooltip for a tab page"), - type='string', scope={'global'}, - vi_def=true, - redraw={'current_window'}, - enable_if=false, - }, - { - full_name='helpfile', abbreviation='hf', - short_desc=N_("full path name of the main help file"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - expand=true, - varname='p_hf', - defaults={if_true={vi=macros('DFLT_HELPFILE')}} - }, - { - full_name='helpheight', abbreviation='hh', - short_desc=N_("minimum height of a new help window"), - type='number', scope={'global'}, - vi_def=true, - varname='p_hh', - defaults={if_true={vi=20}} - }, - { - full_name='helplang', abbreviation='hlg', - short_desc=N_("preferred help languages"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_hlg', - defaults={if_true={vi=""}} - }, - { - full_name='hidden', abbreviation='hid', - short_desc=N_("don't unload buffer when it is |abandon|ed"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_hid', - defaults={if_true={vi=false}} - }, - { - full_name='highlight', abbreviation='hl', - short_desc=N_("sets highlighting mode for various occasions"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_hl', - defaults={if_true={vi=macros('HIGHLIGHT_INIT')}} - }, - { - full_name='history', abbreviation='hi', - short_desc=N_("number of command-lines that are remembered"), - type='number', scope={'global'}, - vim=true, - varname='p_hi', - defaults={if_true={vi=0, vim=10000}} - }, - { - full_name='hkmap', abbreviation='hk', - short_desc=N_("Hebrew keyboard mapping"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_hkmap', - defaults={if_true={vi=false}} - }, - { - full_name='hkmapp', abbreviation='hkp', - short_desc=N_("phonetic Hebrew keyboard mapping"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_hkmapp', - defaults={if_true={vi=false}} - }, - { - full_name='hlsearch', abbreviation='hls', - short_desc=N_("highlight matches with last search pattern"), - type='bool', scope={'global'}, - vim=true, - redraw={'all_windows'}, - varname='p_hls', - defaults={if_true={vi=false, vim=true}} - }, - { - full_name='icon', - short_desc=N_("Vim set the text of the window icon"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_icon', - defaults={if_true={vi=false}} - }, - { - full_name='iconstring', - short_desc=N_("to use for the Vim icon text"), - type='string', scope={'global'}, - vi_def=true, - modelineexpr=true, - varname='p_iconstring', - defaults={if_true={vi=""}} - }, - { - full_name='ignorecase', abbreviation='ic', - short_desc=N_("ignore case in search patterns"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_ic', - defaults={if_true={vi=false}} - }, - { - full_name='imcmdline', abbreviation='imc', - short_desc=N_("use IM when starting to edit a command line"), - type='bool', scope={'global'}, - vi_def=true, - enable_if=false, - defaults={if_true={vi=false}} - }, - { - full_name='imdisable', abbreviation='imd', - short_desc=N_("do not use the IM in any mode"), - type='bool', scope={'global'}, - vi_def=true, - enable_if=false, - defaults={if_true={vi=false}} - }, - { - full_name='iminsert', abbreviation='imi', - short_desc=N_("use :lmap or IM in Insert mode"), - type='number', scope={'buffer'}, - vi_def=true, - varname='p_iminsert', pv_name='p_imi', - defaults={ - if_true={vi=macros('B_IMODE_NONE')}, - } - }, - { - full_name='imsearch', abbreviation='ims', - short_desc=N_("use :lmap or IM when typing a search pattern"), - type='number', scope={'buffer'}, - vi_def=true, - varname='p_imsearch', pv_name='p_ims', - defaults={ - if_true={vi=macros('B_IMODE_USE_INSERT')}, - } - }, - { - full_name='inccommand', abbreviation='icm', - short_desc=N_("Live preview of substitution"), - type='string', scope={'global'}, - vi_def=true, - redraw={'all_windows'}, - varname='p_icm', - defaults={if_true={vi=""}} - }, - { - full_name='include', abbreviation='inc', - short_desc=N_("pattern to be used to find an include file"), - type='string', scope={'global', 'buffer'}, - vi_def=true, - alloced=true, - varname='p_inc', - defaults={if_true={vi="^\\s*#\\s*include"}} - }, - { - full_name='includeexpr', abbreviation='inex', - short_desc=N_("expression used to process an include line"), - type='string', scope={'buffer'}, - vi_def=true, - modelineexpr=true, - alloced=true, - varname='p_inex', - defaults={if_true={vi=""}} - }, - { - full_name='incsearch', abbreviation='is', - short_desc=N_("highlight match while typing search pattern"), - type='bool', scope={'global'}, - vim=true, - varname='p_is', - defaults={if_true={vi=false, vim=true}} - }, - { - full_name='indentexpr', abbreviation='inde', - short_desc=N_("expression used to obtain the indent of a line"), - type='string', scope={'buffer'}, - vi_def=true, - vim=true, - modelineexpr=true, - alloced=true, - varname='p_inde', - defaults={if_true={vi=""}} - }, - { - full_name='indentkeys', abbreviation='indk', - short_desc=N_("keys that trigger indenting with 'indentexpr'"), - type='string', list='onecomma', scope={'buffer'}, - deny_duplicates=true, - vi_def=true, - alloced=true, - varname='p_indk', - defaults={if_true={vi=indentkeys_default}} - }, - { - full_name='infercase', abbreviation='inf', - short_desc=N_("adjust case of match for keyword completion"), - type='bool', scope={'buffer'}, - vi_def=true, - varname='p_inf', - defaults={if_true={vi=false}} - }, - { - full_name='insertmode', abbreviation='im', - short_desc=N_("start the edit of a file in Insert mode"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_im', - defaults={if_true={vi=false}} - }, - { - full_name='isfname', abbreviation='isf', - short_desc=N_("characters included in file names and pathnames"), - type='string', list='comma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_isf', - defaults={ - condition='BACKSLASH_IN_FILENAME', - -- Excluded are: & and ^ are special in cmd.exe - -- ( and ) are used in text separating fnames */ - if_true={vi="@,48-57,/,\\,.,-,_,+,,,#,$,%,{,},[,],:,@-@,!,~,="}, - if_false={vi="@,48-57,/,.,-,_,+,,,#,$,%,~,="} - } - }, - { - full_name='isident', abbreviation='isi', - short_desc=N_("characters included in identifiers"), - type='string', list='comma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_isi', - defaults={if_true={vi="@,48-57,_,192-255"}} - }, - { - full_name='iskeyword', abbreviation='isk', - short_desc=N_("characters included in keywords"), - type='string', list='comma', scope={'buffer'}, - deny_duplicates=true, - vim=true, - alloced=true, - varname='p_isk', - defaults={if_true={vi="@,48-57,_", vim="@,48-57,_,192-255"}} - }, - { - full_name='isprint', abbreviation='isp', - short_desc=N_("printable characters"), - type='string', list='comma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - redraw={'all_windows'}, - varname='p_isp', - defaults={if_true={vi="@,161-255"} - } - }, - { - full_name='joinspaces', abbreviation='js', - short_desc=N_("two spaces after a period with a join command"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_js', - defaults={if_true={vi=true}} - }, - { - full_name='jumpoptions', abbreviation='jop', - short_desc=N_("Controls the behavior of the jumplist"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - varname='p_jop', - vim=true, - defaults={if_true={vim=''}} - }, - { - full_name='keymap', abbreviation='kmp', - short_desc=N_("name of a keyboard mapping"), - type='string', scope={'buffer'}, - normal_fname_chars=true, - pri_mkrc=true, - vi_def=true, - alloced=true, - redraw={'statuslines', 'current_buffer'}, - varname='p_keymap', pv_name='p_kmap', - defaults={if_true={vi=""}} - }, - { - full_name='keymodel', abbreviation='km', - short_desc=N_("enable starting/stopping selection with keys"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_km', - defaults={if_true={vi=""}} - }, - { - full_name='keywordprg', abbreviation='kp', - short_desc=N_("program to use for the \"K\" command"), - type='string', scope={'global', 'buffer'}, - secure=true, - vi_def=true, - expand=true, - varname='p_kp', - defaults={ - if_true={vi=":Man"}, - } - }, - { - full_name='langmap', abbreviation='lmap', - short_desc=N_("alphabetic characters for other language mode"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - secure=true, - vi_def=true, - varname='p_langmap', - defaults={if_true={vi=""}} - }, - { - full_name='langmenu', abbreviation='lm', - short_desc=N_("language to be used for the menus"), - type='string', scope={'global'}, - normal_fname_chars=true, - vi_def=true, - varname='p_lm', - defaults={if_true={vi=""}} - }, - { - full_name='langnoremap', abbreviation='lnr', - short_desc=N_("do not apply 'langmap' to mapped characters"), - type='bool', scope={'global'}, - varname='p_lnr', - defaults={if_true={vi=false, vim=true}} - }, - { - full_name='langremap', abbreviation='lrm', - short_desc=N_('No description'), - type='bool', scope={'global'}, - varname='p_lrm', - defaults={if_true={vi=true, vim=false}} - }, - { - full_name='laststatus', abbreviation='ls', - short_desc=N_("tells when last window has status lines"), - type='number', scope={'global'}, - vim=true, - redraw={'all_windows'}, - varname='p_ls', - defaults={if_true={vi=1,vim=2}} - }, - { - full_name='lazyredraw', abbreviation='lz', - short_desc=N_("don't redraw while executing macros"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_lz', - defaults={if_true={vi=false}} - }, - { - full_name='linebreak', abbreviation='lbr', - short_desc=N_("wrap long lines at a blank"), - type='bool', scope={'window'}, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=false}} - }, - { - full_name='lines', - short_desc=N_("of lines in the display"), - type='number', scope={'global'}, - no_mkrc=true, - vi_def=true, - redraw={'everything'}, - varname='p_lines', - defaults={if_true={vi=macros('DFLT_ROWS')}} - }, - { - full_name='linespace', abbreviation='lsp', - short_desc=N_("number of pixel lines to use between characters"), - type='number', scope={'global'}, - vi_def=true, - redraw={'ui_option'}, - varname='p_linespace', - defaults={if_true={vi=0}} - }, - { - full_name='lisp', - short_desc=N_("indenting for Lisp"), - type='bool', scope={'buffer'}, - vi_def=true, - varname='p_lisp', - defaults={if_true={vi=false}} - }, - { - full_name='lispwords', abbreviation='lw', - short_desc=N_("words that change how lisp indenting works"), - type='string', list='onecomma', scope={'global', 'buffer'}, - deny_duplicates=true, - vi_def=true, - varname='p_lispwords', pv_name='p_lw', - defaults={if_true={vi=macros('LISPWORD_VALUE')}} - }, - { - full_name='list', - short_desc=N_(" and "), - type='bool', scope={'window'}, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=false}} - }, - { - full_name='listchars', abbreviation='lcs', - short_desc=N_("characters for displaying in list mode"), - type='string', list='onecomma', scope={'global', 'window'}, - deny_duplicates=true, - vim=true, - alloced=true, - redraw={'current_window'}, - varname='p_lcs', - defaults={if_true={vi="eol:$", vim="tab:> ,trail:-,nbsp:+"}} - }, - { - full_name='loadplugins', abbreviation='lpl', - short_desc=N_("load plugin scripts when starting up"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_lpl', - defaults={if_true={vi=true}} - }, - { - full_name='magic', - short_desc=N_("special characters in search patterns"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_magic', - defaults={if_true={vi=true}} - }, - { - full_name='makeef', abbreviation='mef', - short_desc=N_("name of the errorfile for \":make\""), - type='string', scope={'global'}, - secure=true, - vi_def=true, - expand=true, - varname='p_mef', - defaults={if_true={vi=""}} - }, - { - full_name='makeencoding', abbreviation='menc', - short_desc=N_("Converts the output of external commands"), - type='string', scope={'global', 'buffer'}, - vi_def=true, - varname='p_menc', - defaults={if_true={vi=""}} - }, - { - full_name='makeprg', abbreviation='mp', - short_desc=N_("program to use for the \":make\" command"), - type='string', scope={'global', 'buffer'}, - secure=true, - vi_def=true, - expand=true, - varname='p_mp', - defaults={if_true={vi="make"}} - }, - { - full_name='matchpairs', abbreviation='mps', - short_desc=N_("pairs of characters that \"%\" can match"), - type='string', list='onecomma', scope={'buffer'}, - deny_duplicates=true, - vi_def=true, - alloced=true, - varname='p_mps', - defaults={if_true={vi="(:),{:},[:]"}} - }, - { - full_name='matchtime', abbreviation='mat', - short_desc=N_("tenths of a second to show matching paren"), - type='number', scope={'global'}, - vi_def=true, - varname='p_mat', - defaults={if_true={vi=5}} - }, - { - full_name='maxcombine', abbreviation='mco', - short_desc=N_("maximum nr of combining characters displayed"), - type='number', scope={'global'}, - vi_def=true, - varname='p_mco', - defaults={if_true={vi=6}} - }, - { - full_name='maxfuncdepth', abbreviation='mfd', - short_desc=N_("maximum recursive depth for user functions"), - type='number', scope={'global'}, - vi_def=true, - varname='p_mfd', - defaults={if_true={vi=100}} - }, - { - full_name='maxmapdepth', abbreviation='mmd', - short_desc=N_("maximum recursive depth for mapping"), - type='number', scope={'global'}, - vi_def=true, - varname='p_mmd', - defaults={if_true={vi=1000}} - }, - { - full_name='maxmempattern', abbreviation='mmp', - short_desc=N_("maximum memory (in Kbyte) used for pattern search"), - type='number', scope={'global'}, - vi_def=true, - varname='p_mmp', - defaults={if_true={vi=1000}} - }, - { - full_name='menuitems', abbreviation='mis', - short_desc=N_("maximum number of items in a menu"), - type='number', scope={'global'}, - vi_def=true, - varname='p_mis', - defaults={if_true={vi=25}} - }, - { - full_name='mkspellmem', abbreviation='msm', - short_desc=N_("memory used before |:mkspell| compresses the tree"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - expand=true, - varname='p_msm', - defaults={if_true={vi="460000,2000,500"}} - }, - { - full_name='modeline', abbreviation='ml', - short_desc=N_("recognize modelines at start or end of file"), - type='bool', scope={'buffer'}, - vim=true, - varname='p_ml', - defaults={if_true={vi=false, vim=true}} - }, - { - full_name='modelineexpr', abbreviation='mle', - short_desc=N_("allow some options to be set in modeline"), - type='bool', scope={'global'}, - vi_def=true, - secure=true, - varname='p_mle', - defaults={if_true={vi=false}} - }, - { - full_name='modelines', abbreviation='mls', - short_desc=N_("number of lines checked for modelines"), - type='number', scope={'global'}, - vi_def=true, - varname='p_mls', - defaults={if_true={vi=5}} - }, - { - full_name='modifiable', abbreviation='ma', - short_desc=N_("changes to the text are not possible"), - type='bool', scope={'buffer'}, - noglob=true, - vi_def=true, - varname='p_ma', - defaults={if_true={vi=true}} - }, - { - full_name='modified', abbreviation='mod', - short_desc=N_("buffer has been modified"), - type='bool', scope={'buffer'}, - no_mkrc=true, - vi_def=true, - redraw={'statuslines'}, - varname='p_mod', - defaults={if_true={vi=false}} - }, - { - full_name='more', - short_desc=N_("listings when the whole screen is filled"), - type='bool', scope={'global'}, - vim=true, - varname='p_more', - defaults={if_true={vi=false, vim=true}} - }, - { - full_name='mouse', - short_desc=N_("the use of mouse clicks"), - type='string', list='flags', scope={'global'}, - varname='p_mouse', - defaults={if_true={vi="", vim=""}} - }, - { - full_name='mousefocus', abbreviation='mousef', - short_desc=N_("keyboard focus follows the mouse"), - type='bool', scope={'global'}, - vi_def=true, - enable_if=false, - defaults={if_true={vi=false}} - }, - { - full_name='mousehide', abbreviation='mh', - short_desc=N_("hide mouse pointer while typing"), - type='bool', scope={'global'}, - vi_def=true, - enable_if=false, - defaults={if_true={vi=true}} - }, - { - full_name='mousemodel', abbreviation='mousem', - short_desc=N_("changes meaning of mouse buttons"), - type='string', scope={'global'}, - vi_def=true, - varname='p_mousem', - defaults={if_true={vi="extend"}} - }, - { - full_name='mouseshape', abbreviation='mouses', - short_desc=N_("shape of the mouse pointer in different modes"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - enable_if=false, - }, - { - full_name='mousetime', abbreviation='mouset', - short_desc=N_("max time between mouse double-click"), - type='number', scope={'global'}, - vi_def=true, - varname='p_mouset', - defaults={if_true={vi=500}} - }, - { - full_name='nrformats', abbreviation='nf', - short_desc=N_("number formats recognized for CTRL-A command"), - type='string', list='onecomma', scope={'buffer'}, - deny_duplicates=true, - alloced=true, - varname='p_nf', - defaults={if_true={vi="bin,octal,hex", vim="bin,hex"}} - }, - { - full_name='number', abbreviation='nu', - short_desc=N_("print the line number in front of each line"), - type='bool', scope={'window'}, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=false}} - }, - { - full_name='numberwidth', abbreviation='nuw', - short_desc=N_("number of columns used for the line number"), - type='number', scope={'window'}, - vim=true, - redraw={'current_window'}, - defaults={if_true={vi=8, vim=4}} - }, - { - full_name='omnifunc', abbreviation='ofu', - short_desc=N_("function for filetype-specific completion"), - type='string', scope={'buffer'}, - secure=true, - vi_def=true, - alloced=true, - varname='p_ofu', - defaults={if_true={vi=""}} - }, - { - full_name='opendevice', abbreviation='odev', - short_desc=N_("allow reading/writing devices on MS-Windows"), - type='bool', scope={'global'}, - vi_def=true, - enable_if=false, - defaults={if_true={vi=false, vim=false}} - }, - { - full_name='operatorfunc', abbreviation='opfunc', - short_desc=N_("function to be called for |g@| operator"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - varname='p_opfunc', - defaults={if_true={vi=""}} - }, - { - full_name='packpath', abbreviation='pp', - short_desc=N_("list of directories used for packages"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - secure=true, - vi_def=true, - expand=true, - varname='p_pp', - defaults={if_true={vi=''}} - }, - { - full_name='paragraphs', abbreviation='para', - short_desc=N_("nroff macros that separate paragraphs"), - type='string', scope={'global'}, - vi_def=true, - varname='p_para', - defaults={if_true={vi="IPLPPPQPP TPHPLIPpLpItpplpipbp"}} - }, - { - full_name='paste', - short_desc=N_("pasting text"), - type='bool', scope={'global'}, - pri_mkrc=true, - vi_def=true, - varname='p_paste', - defaults={if_true={vi=false}} - }, - { - full_name='pastetoggle', abbreviation='pt', - short_desc=N_("key code that causes 'paste' to toggle"), - type='string', scope={'global'}, - vi_def=true, - varname='p_pt', - defaults={if_true={vi=""}} - }, - { - full_name='patchexpr', abbreviation='pex', - short_desc=N_("expression used to patch a file"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - varname='p_pex', - defaults={if_true={vi=""}} - }, - { - full_name='patchmode', abbreviation='pm', - short_desc=N_("keep the oldest version of a file"), - type='string', scope={'global'}, - normal_fname_chars=true, - vi_def=true, - varname='p_pm', - defaults={if_true={vi=""}} - }, - { - full_name='path', abbreviation='pa', - short_desc=N_("list of directories searched with \"gf\" et.al."), - type='string', list='comma', scope={'global', 'buffer'}, - deny_duplicates=true, - vi_def=true, - expand=true, - varname='p_path', - defaults={if_true={vi=".,/usr/include,,"}} - }, - { - full_name='preserveindent', abbreviation='pi', - short_desc=N_("preserve the indent structure when reindenting"), - type='bool', scope={'buffer'}, - vi_def=true, - vim=true, - varname='p_pi', - defaults={if_true={vi=false}} - }, - { - full_name='previewheight', abbreviation='pvh', - short_desc=N_("height of the preview window"), - type='number', scope={'global'}, - vi_def=true, - varname='p_pvh', - defaults={if_true={vi=12}} - }, - { - full_name='previewwindow', abbreviation='pvw', - short_desc=N_("identifies the preview window"), - type='bool', scope={'window'}, - noglob=true, - vi_def=true, - redraw={'statuslines'}, - defaults={if_true={vi=false}} - }, - { - full_name='printdevice', abbreviation='pdev', - short_desc=N_("name of the printer to be used for :hardcopy"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - varname='p_pdev', - defaults={if_true={vi=""}} - }, - { - full_name='printencoding', abbreviation='penc', - short_desc=N_("encoding to be used for printing"), - type='string', scope={'global'}, - vi_def=true, - varname='p_penc', - defaults={if_true={vi=""}} - }, - { - full_name='printexpr', abbreviation='pexpr', - short_desc=N_("expression used to print PostScript for :hardcopy"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - varname='p_pexpr', - defaults={if_true={vi=""}} - }, - { - full_name='printfont', abbreviation='pfn', - short_desc=N_("name of the font to be used for :hardcopy"), - type='string', scope={'global'}, - vi_def=true, - varname='p_pfn', - defaults={if_true={vi="courier"}} - }, - { - full_name='printheader', abbreviation='pheader', - short_desc=N_("format of the header used for :hardcopy"), - type='string', scope={'global'}, - vi_def=true, - varname='p_header', - defaults={if_true={vi="%<%f%h%m%=Page %N"}} - }, - { - full_name='printmbcharset', abbreviation='pmbcs', - short_desc=N_("CJK character set to be used for :hardcopy"), - type='string', scope={'global'}, - vi_def=true, - varname='p_pmcs', - defaults={if_true={vi=""}} - }, - { - full_name='printmbfont', abbreviation='pmbfn', - short_desc=N_("font names to be used for CJK output of :hardcopy"), - type='string', scope={'global'}, - vi_def=true, - varname='p_pmfn', - defaults={if_true={vi=""}} - }, - { - full_name='printoptions', abbreviation='popt', - short_desc=N_("controls the format of :hardcopy output"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_popt', - defaults={if_true={vi=""}} - }, - { - full_name='prompt', - short_desc=N_("enable prompt in Ex mode"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_prompt', - defaults={if_true={vi=true}} - }, - { - full_name='pumblend', abbreviation='pb', - short_desc=N_("Controls transparency level of popup menu"), - type='number', scope={'global'}, - vi_def=true, - redraw={'ui_option'}, - varname='p_pb', - defaults={if_true={vi=0}} - }, - { - full_name='pumheight', abbreviation='ph', - short_desc=N_("maximum height of the popup menu"), - type='number', scope={'global'}, - vi_def=true, - varname='p_ph', - defaults={if_true={vi=0}} - }, - { - full_name='pumwidth', abbreviation='pw', - short_desc=N_("minimum width of the popup menu"), - type='number', scope={'global'}, - vi_def=true, - varname='p_pw', - defaults={if_true={vi=15}} - }, - { - full_name='pyxversion', abbreviation='pyx', - short_desc=N_("selects default python version to use"), - type='number', scope={'global'}, - secure=true, - vi_def=true, - varname='p_pyx', - defaults={if_true={vi=0}} - }, - { - full_name='quoteescape', abbreviation='qe', - short_desc=N_("escape characters used in a string"), - type='string', scope={'buffer'}, - vi_def=true, - alloced=true, - varname='p_qe', - defaults={if_true={vi="\\"}} - }, - { - full_name='readonly', abbreviation='ro', - short_desc=N_("disallow writing the buffer"), - type='bool', scope={'buffer'}, - noglob=true, - vi_def=true, - redraw={'statuslines'}, - varname='p_ro', - defaults={if_true={vi=false}} - }, - { - full_name='redrawdebug', abbreviation='rdb', - short_desc=N_("Changes the way redrawing works (debug)"), - type='string', list='onecomma', scope={'global'}, - vi_def=true, - varname='p_rdb', - defaults={if_true={vi=''}} - }, - { - full_name='redrawtime', abbreviation='rdt', - short_desc=N_("timeout for 'hlsearch' and |:match| highlighting"), - type='number', scope={'global'}, - vi_def=true, - varname='p_rdt', - defaults={if_true={vi=2000}} - }, - { - full_name='regexpengine', abbreviation='re', - short_desc=N_("default regexp engine to use"), - type='number', scope={'global'}, - vi_def=true, - varname='p_re', - defaults={if_true={vi=0}} - }, - { - full_name='relativenumber', abbreviation='rnu', - short_desc=N_("show relative line number in front of each line"), - type='bool', scope={'window'}, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=false}} - }, - { - full_name='remap', - short_desc=N_("mappings to work recursively"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_remap', - defaults={if_true={vi=true}} - }, - { - full_name='report', - short_desc=N_("for reporting nr. of lines changed"), - type='number', scope={'global'}, - vi_def=true, - varname='p_report', - defaults={if_true={vi=2}} - }, - { - full_name='revins', abbreviation='ri', - short_desc=N_("inserting characters will work backwards"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_ri', - defaults={if_true={vi=false}} - }, - { - full_name='rightleft', abbreviation='rl', - short_desc=N_("window is right-to-left oriented"), - type='bool', scope={'window'}, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=false}} - }, - { - full_name='rightleftcmd', abbreviation='rlc', - short_desc=N_("commands for which editing works right-to-left"), - type='string', scope={'window'}, - vi_def=true, - alloced=true, - redraw={'current_window'}, - defaults={if_true={vi="search"}} - }, - { - full_name='ruler', abbreviation='ru', - short_desc=N_("show cursor line and column in the status line"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - redraw={'statuslines'}, - varname='p_ru', - defaults={if_true={vi=true}} - }, - { - full_name='rulerformat', abbreviation='ruf', - short_desc=N_("custom format for the ruler"), - type='string', scope={'global'}, - vi_def=true, - alloced=true, - modelineexpr=true, - redraw={'statuslines'}, - varname='p_ruf', - defaults={if_true={vi=""}} - }, - { - full_name='runtimepath', abbreviation='rtp', - short_desc=N_("list of directories used for runtime files"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - secure=true, - vi_def=true, - expand='nodefault', - varname='p_rtp', - defaults={if_true={vi=''}} - }, - { - full_name='scroll', abbreviation='scr', - short_desc=N_("lines to scroll with CTRL-U and CTRL-D"), - type='number', scope={'window'}, - no_mkrc=true, - vi_def=true, - pv_name='p_scroll', - defaults={if_true={vi=0}} - }, - { - full_name='scrollback', abbreviation='scbk', - short_desc=N_("lines to scroll with CTRL-U and CTRL-D"), - type='number', scope={'buffer'}, - vi_def=true, - varname='p_scbk', - redraw={'current_buffer'}, - defaults={if_true={vi=-1}} - }, - { - full_name='scrollbind', abbreviation='scb', - short_desc=N_("scroll in window as other windows scroll"), - type='bool', scope={'window'}, - vi_def=true, - pv_name='p_scbind', - defaults={if_true={vi=false}} - }, - { - full_name='scrolljump', abbreviation='sj', - short_desc=N_("minimum number of lines to scroll"), - type='number', scope={'global'}, - vi_def=true, - vim=true, - varname='p_sj', - defaults={if_true={vi=1}} - }, - { - full_name='scrolloff', abbreviation='so', - short_desc=N_("minimum nr. of lines above and below cursor"), - type='number', scope={'global', 'window'}, - vi_def=true, - vim=true, - redraw={'all_windows'}, - varname='p_so', - defaults={if_true={vi=0}} - }, - { - full_name='scrollopt', abbreviation='sbo', - short_desc=N_("how 'scrollbind' should behave"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_sbo', - defaults={if_true={vi="ver,jump"}} - }, - { - full_name='sections', abbreviation='sect', - short_desc=N_("nroff macros that separate sections"), - type='string', scope={'global'}, - vi_def=true, - varname='p_sections', - defaults={if_true={vi="SHNHH HUnhsh"}} - }, - { - full_name='secure', - short_desc=N_("mode for reading .vimrc in current dir"), - type='bool', scope={'global'}, - secure=true, - vi_def=true, - varname='p_secure', - defaults={if_true={vi=false}} - }, - { - full_name='selection', abbreviation='sel', - short_desc=N_("what type of selection to use"), - type='string', scope={'global'}, - vi_def=true, - varname='p_sel', - defaults={if_true={vi="inclusive"}} - }, - { - full_name='selectmode', abbreviation='slm', - short_desc=N_("when to use Select mode instead of Visual mode"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_slm', - defaults={if_true={vi=""}} - }, - { - full_name='sessionoptions', abbreviation='ssop', - short_desc=N_("options for |:mksession|"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vim=true, - varname='p_ssop', - defaults={if_true={ - vi="blank,buffers,curdir,folds,help,options,tabpages,winsize", - vim="blank,buffers,curdir,folds,help,tabpages,winsize" - }} - }, - { - full_name='shada', abbreviation='sd', - short_desc=N_("use .shada file upon startup and exiting"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - secure=true, - varname='p_shada', - defaults={if_true={vi="", vim="!,'100,<50,s10,h"}} - }, - { - full_name='shadafile', abbreviation='sdf', - short_desc=N_("overrides the filename used for shada"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - secure=true, - varname='p_shadafile', - defaults={if_true={vi=""}} - }, - { - full_name='shell', abbreviation='sh', - short_desc=N_("name of shell to use for external commands"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - expand=true, - varname='p_sh', - defaults={ - condition='WIN32', - if_true={vi="cmd.exe"}, - if_false={vi="sh"} - } - }, - { - full_name='shellcmdflag', abbreviation='shcf', - short_desc=N_("flag to shell to execute one command"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - varname='p_shcf', - defaults={ - condition='WIN32', - if_true={vi="/s /c"}, - if_false={vi="-c"} - } - }, - { - full_name='shellpipe', abbreviation='sp', - short_desc=N_("string to put output of \":make\" in error file"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - varname='p_sp', - defaults={ - condition='WIN32', - if_true={vi=">%s 2>&1"}, - if_false={vi="| tee"}, - } - }, - { - full_name='shellquote', abbreviation='shq', - short_desc=N_("quote character(s) for around shell command"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - varname='p_shq', - defaults={if_true={vi=""}} - }, - { - full_name='shellredir', abbreviation='srr', - short_desc=N_("string to put output of filter in a temp file"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - varname='p_srr', - defaults={ - condition='WIN32', - if_true={vi=">%s 2>&1"}, - if_false={vi=">"} - } - }, - { - full_name='shellslash', abbreviation='ssl', - short_desc=N_("use forward slash for shell file names"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_ssl', - enable_if='BACKSLASH_IN_FILENAME', - defaults={if_true={vi=false}} - }, - { - full_name='shelltemp', abbreviation='stmp', - short_desc=N_("whether to use a temp file for shell commands"), - type='bool', scope={'global'}, - varname='p_stmp', - defaults={if_true={vi=false, vim=true}} - }, - { - full_name='shellxquote', abbreviation='sxq', - short_desc=N_("like 'shellquote', but include redirection"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - varname='p_sxq', - defaults={ - condition='WIN32', - if_true={vi="\""}, - if_false={vi=""}, - } - }, - { - full_name='shellxescape', abbreviation='sxe', - short_desc=N_("characters to escape when 'shellxquote' is ("), - type='string', scope={'global'}, - secure=true, - vi_def=true, - varname='p_sxe', - defaults={if_true={vi=""}} - }, - { - full_name='shiftround', abbreviation='sr', - short_desc=N_("round indent to multiple of shiftwidth"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_sr', - defaults={if_true={vi=false}} - }, - { - full_name='shiftwidth', abbreviation='sw', - short_desc=N_("number of spaces to use for (auto)indent step"), - type='number', scope={'buffer'}, - vi_def=true, - varname='p_sw', - defaults={if_true={vi=8}} - }, - { - full_name='shortmess', abbreviation='shm', - short_desc=N_("list of flags, reduce length of messages"), - type='string', list='flags', scope={'global'}, - vim=true, - varname='p_shm', - defaults={if_true={vi="S", vim="filnxtToOF"}} - }, - { - full_name='showbreak', abbreviation='sbr', - short_desc=N_("string to use at the start of wrapped lines"), - type='string', scope={'global'}, - vi_def=true, - redraw={'all_windows'}, - varname='p_sbr', - defaults={if_true={vi=""}} - }, - { - full_name='showcmd', abbreviation='sc', - short_desc=N_("show (partial) command in status line"), - type='bool', scope={'global'}, - vim=true, - varname='p_sc', - defaults={if_true={vi=false, vim=true}} - }, - { - full_name='showfulltag', abbreviation='sft', - short_desc=N_("show full tag pattern when completing tag"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_sft', - defaults={if_true={vi=false}} - }, - { - full_name='showmatch', abbreviation='sm', - short_desc=N_("briefly jump to matching bracket if insert one"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_sm', - defaults={if_true={vi=false}} - }, - { - full_name='showmode', abbreviation='smd', - short_desc=N_("message on status line to show current mode"), - type='bool', scope={'global'}, - vim=true, - varname='p_smd', - defaults={if_true={vi=false, vim=true}} - }, - { - full_name='showtabline', abbreviation='stal', - short_desc=N_("tells when the tab pages line is displayed"), - type='number', scope={'global'}, - vi_def=true, - redraw={'all_windows', 'ui_option'}, - varname='p_stal', - defaults={if_true={vi=1}} - }, - { - full_name='sidescroll', abbreviation='ss', - short_desc=N_("minimum number of columns to scroll horizontal"), - type='number', scope={'global'}, - vi_def=true, - varname='p_ss', - defaults={if_true={vi=1}} - }, - { - full_name='sidescrolloff', abbreviation='siso', - short_desc=N_("min. nr. of columns to left and right of cursor"), - type='number', scope={'global', 'window'}, - vi_def=true, - vim=true, - redraw={'all_windows'}, - varname='p_siso', - defaults={if_true={vi=0}} - }, - { - full_name='signcolumn', abbreviation='scl', - short_desc=N_("when to display the sign column"), - type='string', scope={'window'}, - vi_def=true, - alloced=true, - redraw={'current_window'}, - defaults={if_true={vi="auto"}} - }, - { - full_name='smartcase', abbreviation='scs', - short_desc=N_("no ignore case when pattern has uppercase"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_scs', - defaults={if_true={vi=false}} - }, - { - full_name='smartindent', abbreviation='si', - short_desc=N_("smart autoindenting for C programs"), - type='bool', scope={'buffer'}, - vi_def=true, - vim=true, - varname='p_si', - defaults={if_true={vi=false}} - }, - { - full_name='smarttab', abbreviation='sta', - short_desc=N_("use 'shiftwidth' when inserting "), - type='bool', scope={'global'}, - vim=true, - varname='p_sta', - defaults={if_true={vi=false, vim=true}} - }, - { - full_name='softtabstop', abbreviation='sts', - short_desc=N_("number of spaces that uses while editing"), - type='number', scope={'buffer'}, - vi_def=true, - vim=true, - varname='p_sts', - defaults={if_true={vi=0}} - }, - { - full_name='spell', - short_desc=N_("spell checking"), - type='bool', scope={'window'}, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=false}} - }, - { - full_name='spellcapcheck', abbreviation='spc', - short_desc=N_("pattern to locate end of a sentence"), - type='string', scope={'buffer'}, - vi_def=true, - alloced=true, - redraw={'current_buffer'}, - varname='p_spc', - defaults={if_true={vi="[.?!]\\_[\\])'\" ]\\+"}} - }, - { - full_name='spellfile', abbreviation='spf', - short_desc=N_("files where |zg| and |zw| store words"), - type='string', list='onecomma', scope={'buffer'}, - deny_duplicates=true, - secure=true, - vi_def=true, - alloced=true, - expand=true, - varname='p_spf', - defaults={if_true={vi=""}} - }, - { - full_name='spelllang', abbreviation='spl', - short_desc=N_("language(s) to do spell checking for"), - type='string', list='onecomma', scope={'buffer'}, - deny_duplicates=true, - vi_def=true, - alloced=true, - expand=true, - redraw={'current_buffer'}, - varname='p_spl', - defaults={if_true={vi="en"}} - }, - { - full_name='spellsuggest', abbreviation='sps', - short_desc=N_("method(s) used to suggest spelling corrections"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - secure=true, - vi_def=true, - expand=true, - varname='p_sps', - defaults={if_true={vi="best"}} - }, - { - full_name='splitbelow', abbreviation='sb', - short_desc=N_("new window from split is below the current one"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_sb', - defaults={if_true={vi=false}} - }, - { - full_name='splitright', abbreviation='spr', - short_desc=N_("new window is put right of the current one"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_spr', - defaults={if_true={vi=false}} - }, - { - full_name='startofline', abbreviation='sol', - short_desc=N_("commands move cursor to first non-blank in line"), - type='bool', scope={'global'}, - vi_def=true, - vim=false, - varname='p_sol', - defaults={if_true={vi=false}} - }, - { - full_name='statusline', abbreviation='stl', - short_desc=N_("custom format for the status line"), - type='string', scope={'global', 'window'}, - vi_def=true, - alloced=true, - modelineexpr=true, - redraw={'statuslines'}, - varname='p_stl', - defaults={if_true={vi=""}} - }, - { - full_name='suffixes', abbreviation='su', - short_desc=N_("suffixes that are ignored with multiple match"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_su', - defaults={if_true={vi=".bak,~,.o,.h,.info,.swp,.obj"}} - }, - { - full_name='suffixesadd', abbreviation='sua', - short_desc=N_("suffixes added when searching for a file"), - type='string', list='onecomma', scope={'buffer'}, - deny_duplicates=true, - vi_def=true, - alloced=true, - varname='p_sua', - defaults={if_true={vi=""}} - }, - { - full_name='swapfile', abbreviation='swf', - short_desc=N_("whether to use a swapfile for a buffer"), - type='bool', scope={'buffer'}, - vi_def=true, - redraw={'statuslines'}, - varname='p_swf', - defaults={if_true={vi=true}} - }, - { - full_name='switchbuf', abbreviation='swb', - short_desc=N_("sets behavior when switching to another buffer"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_swb', - defaults={if_true={vi=""}} - }, - { - full_name='synmaxcol', abbreviation='smc', - short_desc=N_("maximum column to find syntax items"), - type='number', scope={'buffer'}, - vi_def=true, - redraw={'current_buffer'}, - varname='p_smc', - defaults={if_true={vi=3000}} - }, - { - full_name='syntax', abbreviation='syn', - short_desc=N_("syntax to be loaded for current buffer"), - type='string', scope={'buffer'}, - noglob=true, - normal_fname_chars=true, - vi_def=true, - alloced=true, - varname='p_syn', - defaults={if_true={vi=""}} - }, - { - full_name='tagfunc', abbreviation='tfu', - short_desc=N_("function used to perform tag searches"), - type='string', scope={'buffer'}, - vim=true, - vi_def=true, - varname='p_tfu', - defaults={if_true={vi=""}} - }, - { - full_name='tabline', abbreviation='tal', - short_desc=N_("custom format for the console tab pages line"), - type='string', scope={'global'}, - vi_def=true, - modelineexpr=true, - redraw={'all_windows'}, - varname='p_tal', - defaults={if_true={vi=""}} - }, - { - full_name='tabpagemax', abbreviation='tpm', - short_desc=N_("maximum number of tab pages for |-p| and \"tab all\""), - type='number', scope={'global'}, - vim=true, - varname='p_tpm', - defaults={if_true={vi=10, vim=50}} - }, - { - full_name='tabstop', abbreviation='ts', - short_desc=N_("number of spaces that in file uses"), - type='number', scope={'buffer'}, - vi_def=true, - redraw={'current_buffer'}, - varname='p_ts', - defaults={if_true={vi=8}} - }, - { - full_name='tagbsearch', abbreviation='tbs', - short_desc=N_("use binary searching in tags files"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_tbs', - defaults={if_true={vi=true}} - }, - { - full_name='tagcase', abbreviation='tc', - short_desc=N_("how to handle case when searching in tags files"), - type='string', scope={'global', 'buffer'}, - vim=true, - varname='p_tc', - defaults={if_true={vi="followic", vim="followic"}} - }, - { - full_name='taglength', abbreviation='tl', - short_desc=N_("number of significant characters for a tag"), - type='number', scope={'global'}, - vi_def=true, - varname='p_tl', - defaults={if_true={vi=0}} - }, - { - full_name='tagrelative', abbreviation='tr', - short_desc=N_("file names in tag file are relative"), - type='bool', scope={'global'}, - vim=true, - varname='p_tr', - defaults={if_true={vi=false, vim=true}} - }, - { - full_name='tags', abbreviation='tag', - short_desc=N_("list of file names used by the tag command"), - type='string', list='onecomma', scope={'global', 'buffer'}, - deny_duplicates=true, - vi_def=true, - expand=true, - varname='p_tags', - defaults={if_true={vi="./tags;,tags"}} - }, - { - full_name='tagstack', abbreviation='tgst', - short_desc=N_("push tags onto the tag stack"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_tgst', - defaults={if_true={vi=true}} - }, - { - full_name='termbidi', abbreviation='tbidi', - short_desc=N_("terminal takes care of bi-directionality"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_tbidi', - defaults={if_true={vi=false}} - }, - { - full_name='termencoding', abbreviation='tenc', - short_desc=N_("Terminal encodig"), - type='string', scope={'global'}, - vi_def=true, - defaults={if_true={vi=""}} - }, - { - full_name='termguicolors', abbreviation='tgc', - short_desc=N_("Terminal true color support"), - type='bool', scope={'global'}, - vi_def=false, - redraw={'ui_option'}, - varname='p_tgc', - defaults={if_true={vi=false}} - }, - { - full_name='terse', - short_desc=N_("hides notification of search wrap"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_terse', - defaults={if_true={vi=false}} - }, - { - full_name='textwidth', abbreviation='tw', - short_desc=N_("maximum width of text that is being inserted"), - type='number', scope={'buffer'}, - vi_def=true, - vim=true, - redraw={'current_buffer'}, - varname='p_tw', - defaults={if_true={vi=0}} - }, - { - full_name='thesaurus', abbreviation='tsr', - short_desc=N_("list of thesaurus files for keyword completion"), - type='string', list='onecomma', scope={'global', 'buffer'}, - deny_duplicates=true, - normal_dname_chars=true, - vi_def=true, - expand=true, - varname='p_tsr', - defaults={if_true={vi=""}} - }, - { - full_name='tildeop', abbreviation='top', - short_desc=N_("tilde command \"~\" behaves like an operator"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_to', - defaults={if_true={vi=false}} - }, - { - full_name='timeout', abbreviation='to', - short_desc=N_("time out on mappings and key codes"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_timeout', - defaults={if_true={vi=true}} - }, - { - full_name='timeoutlen', abbreviation='tm', - short_desc=N_("time out time in milliseconds"), - type='number', scope={'global'}, - vi_def=true, - varname='p_tm', - defaults={if_true={vi=1000}} - }, - { - full_name='title', - short_desc=N_("Vim set the title of the window"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_title', - defaults={if_true={vi=false}} - }, - { - full_name='titlelen', - short_desc=N_("of 'columns' used for window title"), - type='number', scope={'global'}, - vi_def=true, - varname='p_titlelen', - defaults={if_true={vi=85}} - }, - { - full_name='titleold', - short_desc=N_("title, restored when exiting"), - type='string', scope={'global'}, - secure=true, - no_mkrc=true, - vi_def=true, - varname='p_titleold', - defaults={if_true={vi=""}} - }, - { - full_name='titlestring', - short_desc=N_("to use for the Vim window title"), - type='string', scope={'global'}, - vi_def=true, - modelineexpr=true, - varname='p_titlestring', - defaults={if_true={vi=""}} - }, - { - full_name='ttimeout', - short_desc=N_("out on mappings"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_ttimeout', - defaults={if_true={vi=true}} - }, - { - full_name='ttimeoutlen', abbreviation='ttm', - short_desc=N_("time out time for key codes in milliseconds"), - type='number', scope={'global'}, - vi_def=true, - varname='p_ttm', - defaults={if_true={vi=50}} - }, - { - full_name='ttyfast', abbreviation='tf', - short_desc=N_("No description"), - type='bool', scope={'global'}, - no_mkrc=true, - vi_def=true, - varname='p_force_on', - defaults={if_true={vi=true}} - }, - { - full_name='undodir', abbreviation='udir', - short_desc=N_("where to store undo files"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - secure=true, - vi_def=true, - expand='nodefault', - varname='p_udir', - defaults={if_true={vi=''}} - }, - { - full_name='undofile', abbreviation='udf', - short_desc=N_("save undo information in a file"), - type='bool', scope={'buffer'}, - vi_def=true, - vim=true, - varname='p_udf', - defaults={if_true={vi=false}} - }, - { - full_name='undolevels', abbreviation='ul', - short_desc=N_("maximum number of changes that can be undone"), - type='number', scope={'global', 'buffer'}, - vi_def=true, - varname='p_ul', - defaults={if_true={vi=1000}} - }, - { - full_name='undoreload', abbreviation='ur', - short_desc=N_("max nr of lines to save for undo on a buffer reload"), - type='number', scope={'global'}, - vi_def=true, - varname='p_ur', - defaults={if_true={vi=10000}} - }, - { - full_name='updatecount', abbreviation='uc', - short_desc=N_("after this many characters flush swap file"), - type='number', scope={'global'}, - vi_def=true, - varname='p_uc', - defaults={if_true={vi=200}} - }, - { - full_name='updatetime', abbreviation='ut', - short_desc=N_("after this many milliseconds flush swap file"), - type='number', scope={'global'}, - vi_def=true, - varname='p_ut', - defaults={if_true={vi=4000}} - }, - { - full_name='verbose', abbreviation='vbs', - short_desc=N_("give informative messages"), - type='number', scope={'global'}, - vi_def=true, - varname='p_verbose', - defaults={if_true={vi=0}} - }, - { - full_name='verbosefile', abbreviation='vfile', - short_desc=N_("file to write messages in"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - expand=true, - varname='p_vfile', - defaults={if_true={vi=""}} - }, - { - full_name='viewdir', abbreviation='vdir', - short_desc=N_("directory where to store files with :mkview"), - type='string', scope={'global'}, - secure=true, - vi_def=true, - expand='nodefault', - varname='p_vdir', - defaults={if_true={vi=''}} - }, - { - full_name='viewoptions', abbreviation='vop', - short_desc=N_("specifies what to save for :mkview"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_vop', - defaults={if_true={vi="folds,options,cursor,curdir"}} - }, - { - -- Alias for "shada". - full_name='viminfo', abbreviation='vi', - short_desc=N_("Alias for shada"), - type='string', scope={'global'}, nodefault=true, - }, - { - -- Alias for "shadafile". - full_name='viminfofile', abbreviation='vif', - short_desc=N_("Alias for shadafile instead"), - type='string', scope={'global'}, nodefault=true, - }, - { - full_name='virtualedit', abbreviation='ve', - short_desc=N_("when to use virtual editing"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - vim=true, - redraw={'curswant'}, - varname='p_ve', - defaults={if_true={vi="", vim=""}} - }, - { - full_name='visualbell', abbreviation='vb', - short_desc=N_("use visual bell instead of beeping"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_vb', - defaults={if_true={vi=false}} - }, - { - full_name='warn', - short_desc=N_("for shell command when buffer was changed"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_warn', - defaults={if_true={vi=true}} - }, - { - full_name='whichwrap', abbreviation='ww', - short_desc=N_("allow specified keys to cross line boundaries"), - type='string', list='flagscomma', scope={'global'}, - vim=true, - varname='p_ww', - defaults={if_true={vi="", vim="b,s"}} - }, - { - full_name='wildchar', abbreviation='wc', - short_desc=N_("command-line character for wildcard expansion"), - type='number', scope={'global'}, - vim=true, - varname='p_wc', - defaults={if_true={vi=imacros('Ctrl_E'), vim=imacros('TAB')}} - }, - { - full_name='wildcharm', abbreviation='wcm', - short_desc=N_("like 'wildchar' but also works when mapped"), - type='number', scope={'global'}, - vi_def=true, - varname='p_wcm', - defaults={if_true={vi=0}} - }, - { - full_name='wildignore', abbreviation='wig', - short_desc=N_("files matching these patterns are not completed"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vi_def=true, - varname='p_wig', - defaults={if_true={vi=""}} - }, - { - full_name='wildignorecase', abbreviation='wic', - short_desc=N_("ignore case when completing file names"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_wic', - defaults={if_true={vi=false}} - }, - { - full_name='wildmenu', abbreviation='wmnu', - short_desc=N_("use menu for command line completion"), - type='bool', scope={'global'}, - vim=true, - varname='p_wmnu', - defaults={if_true={vi=false, vim=true}} - }, - { - full_name='wildmode', abbreviation='wim', - short_desc=N_("mode for 'wildchar' command-line expansion"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vim=true, - varname='p_wim', - defaults={if_true={vi="", vim="full"}} - }, - { - full_name='wildoptions', abbreviation='wop', - short_desc=N_("specifies how command line completion is done"), - type='string', list='onecomma', scope={'global'}, - deny_duplicates=true, - vim=true, - varname='p_wop', - defaults={if_true={vi='', vim='pum,tagfile'}} - }, - { - full_name='winaltkeys', abbreviation='wak', - short_desc=N_("when the windows system handles ALT keys"), - type='string', scope={'global'}, - vi_def=true, - varname='p_wak', - defaults={if_true={vi="menu"}} - }, - { - full_name='winblend', abbreviation='winbl', - short_desc=N_("Controls transparency level for floating windows"), - type='number', scope={'window'}, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=0}} - }, - { - full_name='winhighlight', abbreviation='winhl', - short_desc=N_("Setup window-local highlights"); - type='string', scope={'window'}, - vi_def=true, - alloced=true, - redraw={'current_window'}, - defaults={if_true={vi=""}} - }, - { - full_name='window', abbreviation='wi', - short_desc=N_("nr of lines to scroll for CTRL-F and CTRL-B"), - type='number', scope={'global'}, - vi_def=true, - varname='p_window', - defaults={if_true={vi=0}} - }, - { - full_name='winheight', abbreviation='wh', - short_desc=N_("minimum number of lines for the current window"), - type='number', scope={'global'}, - vi_def=true, - varname='p_wh', - defaults={if_true={vi=1}} - }, - { - full_name='winfixheight', abbreviation='wfh', - short_desc=N_("keep window height when opening/closing windows"), - type='bool', scope={'window'}, - vi_def=true, - redraw={'statuslines'}, - defaults={if_true={vi=false}} - }, - { - full_name='winfixwidth', abbreviation='wfw', - short_desc=N_("keep window width when opening/closing windows"), - type='bool', scope={'window'}, - vi_def=true, - redraw={'statuslines'}, - defaults={if_true={vi=false}} - }, - { - full_name='winminheight', abbreviation='wmh', - short_desc=N_("minimum number of lines for any window"), - type='number', scope={'global'}, - vi_def=true, - varname='p_wmh', - defaults={if_true={vi=1}} - }, - { - full_name='winminwidth', abbreviation='wmw', - short_desc=N_("minimal number of columns for any window"), - type='number', scope={'global'}, - vi_def=true, - varname='p_wmw', - defaults={if_true={vi=1}} - }, - { - full_name='winwidth', abbreviation='wiw', - short_desc=N_("minimal number of columns for current window"), - type='number', scope={'global'}, - vi_def=true, - varname='p_wiw', - defaults={if_true={vi=20}} - }, - { - full_name='wrap', - short_desc=N_("lines wrap and continue on the next line"), - type='bool', scope={'window'}, - vi_def=true, - redraw={'current_window'}, - defaults={if_true={vi=true}} - }, - { - full_name='wrapmargin', abbreviation='wm', - short_desc=N_("chars from the right where wrapping starts"), - type='number', scope={'buffer'}, - vi_def=true, - varname='p_wm', - defaults={if_true={vi=0}} - }, - { - full_name='wrapscan', abbreviation='ws', - short_desc=N_("searches wrap around the end of the file"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_ws', - defaults={if_true={vi=true}} - }, - { - full_name='write', - short_desc=N_("to a file is allowed"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_write', - defaults={if_true={vi=true}} - }, - { - full_name='writeany', abbreviation='wa', - short_desc=N_("write to file with no need for \"!\" override"), - type='bool', scope={'global'}, - vi_def=true, - varname='p_wa', - defaults={if_true={vi=false}} - }, - { - full_name='writebackup', abbreviation='wb', - short_desc=N_("make a backup before overwriting a file"), - type='bool', scope={'global'}, - vi_def=true, - vim=true, - varname='p_wb', - defaults={if_true={vi=true}} - }, - { - full_name='writedelay', abbreviation='wd', - short_desc=N_("delay this many msec for each char (for debug)"), - type='number', scope={'global'}, - vi_def=true, - varname='p_wd', - defaults={if_true={vi=0}} - }, - } -} diff --git a/bundle/telescope.nvim/developers.md b/bundle/telescope.nvim/developers.md index 26e2b3004..9edb6f5a6 100644 --- a/bundle/telescope.nvim/developers.md +++ b/bundle/telescope.nvim/developers.md @@ -9,6 +9,7 @@ - [Oneshot job](#oneshot-job) - [Previewer](#previewer) - [More examples](#more-examples) + - [Bundling as Extension](#bundling-as-extension) - [Technical](#technical) - [picker](#picker) - [finders](#finders) @@ -163,7 +164,7 @@ needs to return either `true` or `false`. If it returns false it means that only the actions defined in the function should be attached. In this case it would remove the default actions to move the selected item in the picker, `move_selection_{next,previous}`. So in most cases you'll want to return `true`. -If the function does not return anything then an error is thrown. +If the function does not return anything then an error is thrown. The `attach_mappings` function has two parameters, `prompt_bufnr` is the buffer number of the prompt buffer, which we can use to get the pickers object and `map` is a function @@ -228,7 +229,7 @@ where `tbl` is the table returned by `entry_maker`. So in this example `tbl` wou give our `display` function access to `value` and `ordinal`. If our picker will have a lot of values it's suggested to use a function for `display`, -especially if you are modifying the text to display. This way the function will only be executed +especially if you are modifying the text to display. This way the function will only be executed for the entries being displayed. For an example of an entry maker take a look at `lua/telescope/make_entry.lua`. @@ -238,7 +239,7 @@ function `gen_from_git_commits` in `make_entry.lua`. The `ordinal` is also required, which is used for sorting. As already mentioned this allows us to have different display and sorting values. This allows `display` -to be more complex with icons and special indicators but `ordinal` could be a simpler +to be more complex with icons and special indicators but `ordinal` could be a simpler sorting key. There are other important keys which can be set, but do not make sense in the @@ -250,7 +251,7 @@ current context as we are not dealing with files: ### Previewer -We will not write a previewer for this picker because it isn't required for +We will not write a previewer for this picker because it isn't required for basic colors and is a more advanced topic. It's already well documented in `:help telescope.previewers` so you can read this section if you want to write your own `previewer`. If you want a file previewer without columns you should @@ -263,7 +264,7 @@ find results and call `entry_maker` for each entry. An example usage would be `find`. ```lua -finder = finders.new_oneshot_job { "find", opts }, +finder = finders.new_oneshot_job({ "find" }, opts ), ``` ### More examples @@ -278,6 +279,51 @@ more information on [gitter](https://gitter.im/nvim-telescope/community?utm_sour and we will happily answer your questions and hopefully allow us to improve this guide. You can also help us to improve this guide by sending a PR. +### Bundling as extension + +If you now want to bundle your picker as extension, so it is available as +picker via the `:Telescope` command, the following has to be done. + +Structure your plugin as follows, so it can be found by telescope: + +``` +. +└── lua + ├── plugin_name # Your actual plugin code + │ ├── init.lua + │ └── some_file.lua + └── telescope + └── _extensions # The underscore is significant + └─ plugin_name.lua # Init and register your extension +``` + +The `lua/telescope/_extensions/plugin_name.lua` file needs to return the +following: (see `:help telescope.register_extension`) + +```lua +return require("telescope").register_extension { + setup = function(ext_config, config) + -- access extension config and user config + end, + exports = { + stuff = require("plugin_name").stuff + }, +} +``` + +The setup function can be used to access the extension config and setup +extension specific global configuration. You also have access to the user +telescope default config, so you can override specific internal function. For +example sorters if you have an extension that provides a replacement sorter, +like +[telescope-fzf-native](https://github.com/nvim-telescope/telescope-fzf-native.nvim). + +The exports table declares the exported pickers that can then be accessed via +`Telescope plugin_name stuff`. If you only provide one export it is suggested +that you name the key like the plugin, so you can access it with `Telescope +plugin_name`. + + ## Technical ### Picker diff --git a/bundle/telescope.nvim/doc/telescope.txt b/bundle/telescope.nvim/doc/telescope.txt index 2a6b31c52..b573d65a6 100644 --- a/bundle/telescope.nvim/doc/telescope.txt +++ b/bundle/telescope.nvim/doc/telescope.txt @@ -1,12 +1,12 @@ ================================================================================ - *telescope.nvim* +INTRODUCTION *telescope.nvim* Telescope.nvim is a plugin for fuzzy finding and neovim. It helps you search, filter, find and pick things in Lua. Getting started with telescope: 1. Run `:checkhealth telescope` to make sure everything is installed. - 2. Evalulate it working with `:Telescope find_files` or `:lua + 2. Evaluate it working with `:Telescope find_files` or `:lua require("telescope.builtin").find_files()` 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 @@ -119,20 +119,6 @@ telescope.setup({opts}) *telescope.setup()* - "descending" (default) - "ascending" - *telescope.defaults.tiebreak* - tiebreak: ~ - A function that determines how to break a tie when two entries have - the same score. - Having a function that always returns false would keep the entries in - the order they are found, so existing_entry before current_entry. - Vice versa always returning true would place the current_entry - before the existing_entry. - - Signature: function(current_entry, existing_entry, prompt) -> boolean - - Default: function that breaks the tie based on the length of the - entry's ordinal - *telescope.defaults.selection_strategy* selection_strategy: ~ Determines how the cursor acts after each sort iteration. @@ -142,6 +128,7 @@ telescope.setup({opts}) *telescope.setup()* - "follow" - "row" - "closest" + - "none" *telescope.defaults.scroll_strategy* scroll_strategy: ~ @@ -369,6 +356,22 @@ telescope.setup({opts}) *telescope.setup()* Default: "Prompt" + *telescope.defaults.mappings* + mappings: ~ + Your mappings to override telescope's default mappings. + + See: ~ + |telescope.mappings| + + + *telescope.defaults.default_mappings* + default_mappings: ~ + Not recommended to use except for advanced users. + + Will allow you to completely remove all of telescope's default maps + and use your own. + + *telescope.defaults.history* history: ~ This field handles the configuration for prompt history. @@ -496,8 +499,17 @@ telescope.setup({opts}) *telescope.setup()* highlighting, which falls back to regex-based highlighting. `true`: treesitter highlighting for all available filetypes `false`: regex-based highlighting for all filetypes - `table`: table of filetypes for which to attach treesitter - highlighting + `table`: following nvim-treesitters highlighting options: + It contains two keys: + - enable boolean|table: if boolean, enable all ts + highlighing with that flag, + disable still considered. + Containing a list of filetypes, + that are enabled, disabled + ignored because it doesnt make + any sense in this case. + - disable table: containing a list of filetypes + that are disabled Default: true - msg_bg_fillchar: Character to fill background of unpreviewable buffers with Default: "╱" @@ -544,84 +556,11 @@ telescope.setup({opts}) *telescope.setup()* *telescope.defaults.color_devicons* color_devicons: ~ Boolean if devicons should be enabled or not. If set to false, the - "TelescopeResultsFileIcon" highlight group is used. + text highlight group is used. Hint: Coloring only works if |termguicolors| is enabled. Default: true - *telescope.defaults.mappings* - mappings: ~ - Your mappings to override telescope's default mappings. - - Format is: - { - mode = { ..keys } - } - - where {mode} is the one character letter for a mode - ('i' for insert, 'n' for normal). - - For example: - - mappings = { - i = { - [""] = require('telescope.actions').close, - }, - } - - - To disable a keymap, put [map] = false - So, to not map "", just put - - ..., - [""] = false, - ..., - - Into your config. - - - otherwise, just set the mapping to the function that you want it to - be. - - ..., - [""] = require('telescope.actions').select_default, - ..., - - 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: - - ..., - [""] = "select_default", - ..., - - You can also add other mappings using tables with `type = "command"`. - For example: - - ..., - ["jj"] = { "", type = "command" }, - ["kk"] = { "echo \"Hello, World!\"", type = "command" },) - ..., - - You can also add additional options for mappings of any type - ("action" and "command"). For example: - - ..., - [""] = { - action = actions.move_selection_next, - opts = { nowait = true, silent = true } - }, - ..., - - - *telescope.defaults.default_mappings* - default_mappings: ~ - Not recommended to use except for advanced users. - - Will allow you to completely remove all of telescope's default maps - and use your own. - - *telescope.defaults.file_sorter* file_sorter: ~ A function pointer that specifies the file_sorter. This sorter will @@ -648,6 +587,20 @@ telescope.setup({opts}) *telescope.setup()* Default: require("telescope.sorters").prefilter + *telescope.defaults.tiebreak* + tiebreak: ~ + A function that determines how to break a tie when two entries have + the same score. + Having a function that always returns false would keep the entries in + the order they are found, so existing_entry before current_entry. + Vice versa always returning true would place the current_entry + before the existing_entry. + + Signature: function(current_entry, existing_entry, prompt) -> boolean + + Default: function that breaks the tie based on the length of the + entry's ordinal + *telescope.defaults.file_ignore_patterns* file_ignore_patterns: ~ A table of lua regex that define the files that should be ignored. @@ -655,9 +608,29 @@ telescope.setup({opts}) *telescope.setup()* Example: { "%.npz" } -- ignore all npz files See: https://www.lua.org/manual/5.1/manual.html#5.4.1 for more information about lua regex + Note: `file_ignore_patterns` will be used in all pickers that have a + file associated. This might lead to the problem that lsp_ pickers + aren't displaying results because they might be ignored by + `file_ignore_patterns`. For example, setting up node_modules as ignored + will never show node_modules in any results, even if you are + interested in lsp_ results. + + If you only want `file_ignore_patterns` for `find_files` and + `grep_string`/`live_grep` it is suggested that you setup `gitignore` + and have fd and or ripgrep installed because both tools will not show + `gitignore`d files on default. Default: nil + *telescope.defaults.get_selection_window* + get_selection_window: ~ + Function that takes function(picker, entry) and returns a window id. + The window ID will be used to decide what window the chosen file will + be opened in and the cursor placed in upon leaving the picker. + + Default: `function() return 0 end` + + *telescope.defaults.file_previewer* file_previewer: ~ Function pointer to the default file_previewer. It is mostly used @@ -702,14 +675,6 @@ telescope.setup({opts}) *telescope.setup()* extensions -telescope.register_extension({mod}) *telescope.register_extension()* - Register an extension. To be used by plugin authors. - - - Parameters: ~ - {mod} (table) Module - - telescope.load_extension({name}) *telescope.load_extension()* Load an extension. - Notes: @@ -720,6 +685,14 @@ telescope.load_extension({name}) *telescope.load_extension()* {name} (string) Name of the extension +telescope.register_extension({mod}) *telescope.register_extension()* + Register an extension. To be used by plugin authors. + + + Parameters: ~ + {mod} (table) Module + + telescope.extensions() *telescope.extensions()* Use telescope.extensions to reference any extensions within your configuration. @@ -730,7 +703,7 @@ telescope.extensions() *telescope.extensions()* ================================================================================ - *telescope.command* +COMMAND *telescope.command* Telescope commands can be called through two apis, the lua api and the viml api. @@ -765,7 +738,7 @@ as there are spaces in the option. ================================================================================ - *telescope.builtin* +BUILTIN *telescope.builtin* Telescope Builtins is a collection of community maintained pickers to support common workflows. It can be used as reference when writing PRs, Telescope @@ -792,34 +765,35 @@ options you want to use. Here's an example with the live_grep picker: < builtin.live_grep({opts}) *telescope.builtin.live_grep()* - Search for a string and get results live as you type (respecting - .gitignore) + Search for a string and get results live as you type, respects .gitignore Parameters: ~ {opts} (table) options to pass to the picker Options: ~ - {cwd} (string) root dir to search from (default: - cwd, use utils.buffer_dir() to - search relative to open buffer) - {grep_open_files} (boolean) if true, restrict search to open - files only, mutually exclusive with - `search_dirs` - {search_dirs} (table) directory/directories to search in, - mutually exclusive with - `grep_open_files` - {glob_pattern} (string) argument to be used with `--glob`, - e.g. "*.toml", can use the opposite - "!*.toml" - {type_filter} (string) argument to be used with `--type`, - e.g. "rust", see `rg --type-list` - {additional_args} (function) function(opts) which returns a table - of additional arguments to be passed - on - {max_results} (number) define a upper result value - {disable_coordinates} (boolean) don't show the line & row numbers - (default: false) + {cwd} (string) root dir to search from + (default: cwd, use + utils.buffer_dir() to search + relative to open buffer) + {grep_open_files} (boolean) if true, restrict search to + open files only, mutually + exclusive with `search_dirs` + {search_dirs} (table) directory/directories/files to + search, mutually exclusive + with `grep_open_files` + {glob_pattern} (string|table) argument to be used with + `--glob`, e.g. "*.toml", can + use the opposite "!*.toml" + {type_filter} (string) argument to be used with + `--type`, e.g. "rust", see `rg + --type-list` + {additional_args} (function|table) additional arguments to be + passed on. Can be fn(opts) -> + tbl + {max_results} (number) define a upper result value + {disable_coordinates} (boolean) don't show the line & row + numbers (default: false) builtin.grep_string({opts}) *telescope.builtin.grep_string()* @@ -830,23 +804,30 @@ builtin.grep_string({opts}) *telescope.builtin.grep_string()* {opts} (table) options to pass to the picker Options: ~ - {cwd} (string) root dir to search from (default: - cwd, use utils.buffer_dir() to - search relative to open buffer) - {search} (string) the query to search - {search_dirs} (table) directory/directories to search in - {use_regex} (boolean) if true, special characters won't be - escaped, allows for using regex - (default: false) - {word_match} (string) can be set to `-w` to enable exact - word matches - {additional_args} (function) function(opts) which returns a table - of additional arguments to be passed - on - {disable_coordinates} (boolean) don't show the line and row numbers - (default: false) - {sort_only_text} (boolean) only sort the text, not the file, - line or row (default: false) + {cwd} (string) root dir to search from + (default: cwd, use + utils.buffer_dir() to search + relative to open buffer) + {search} (string) the query to search + {grep_open_files} (boolean) if true, restrict search to + open files only, mutually + exclusive with `search_dirs` + {search_dirs} (table) directory/directories/files to + search, mutually exclusive + with `grep_open_files` + {use_regex} (boolean) if true, special characters + won't be escaped, allows for + using regex (default: false) + {word_match} (string) can be set to `-w` to enable + exact word matches + {additional_args} (function|table) additional arguments to be + passed on. Can be fn(opts) -> + tbl + {disable_coordinates} (boolean) don't show the line and row + numbers (default: false) + {only_sort_text} (boolean) only sort the text, not the + file, line or row (default: + false) builtin.find_files({opts}) *telescope.builtin.find_files()* @@ -857,19 +838,25 @@ builtin.find_files({opts}) *telescope.builtin.find_files()* {opts} (table) options to pass to the picker Options: ~ - {cwd} (string) root dir to search from (default: cwd, use - utils.buffer_dir() to search relative to - open buffer) - {find_command} (table) command line arguments for `find_files` to - use for the search, overrides default: - config - {follow} (boolean) if true, follows symlinks (i.e. uses `-L` - flag for the `find` command) - {hidden} (boolean) determines whether to show hidden files or - not (default: false) - {no_ignore} (boolean) show files ignored by .gitignore, .ignore, - etc. (default: false) - {search_dirs} (table) directory/directories to search in + {cwd} (string) root dir to search from (default: + cwd, use utils.buffer_dir() to + search relative to open buffer) + {find_command} (function|table) cmd to use for the search. Can be + a fn(opts) -> tbl (default: + autodetect) + {follow} (boolean) if true, follows symlinks (i.e. + uses `-L` flag for the `find` + command) + {hidden} (boolean) determines whether to show hidden + files or not (default: false) + {no_ignore} (boolean) show files ignored by .gitignore, + .ignore, etc. (default: false) + {no_ignore_parent} (boolean) show files ignored by .gitignore, + .ignore, etc. in parent dirs. + (default: false) + {search_dirs} (table) directory/directories/files to + search + {search_file} (string) specify a filename to search for builtin.fd() *telescope.builtin.fd()* @@ -952,8 +939,7 @@ builtin.current_buffer_tags({opts}) *telescope.builtin.current_buffer_tags()* builtin.git_files({opts}) *telescope.builtin.git_files()* Fuzzy search for files tracked by Git. This command lists the output of the - `git ls-files` command, respects .gitignore, and optionally ignores - untracked files + `git ls-files` command, respects .gitignore - Default keymaps: - ``: opens the currently selected file @@ -968,7 +954,7 @@ builtin.git_files({opts}) *telescope.builtin.git_files()* (default: true) {show_untracked} (boolean) if true, adds `--others` flag to command and shows untracked files - (default: true) + (default: false) {recurse_submodules} (boolean) if true, adds the `--recurse-submodules` flag to command (default: false) @@ -1088,6 +1074,8 @@ builtin.builtin({opts}) *telescope.builtin.builtin()* Options: ~ {include_extensions} (boolean) if true will show the pickers of the installed extensions (default: false) + {use_default_opts} (boolean) if the selected picker should use its + default options (default: false) builtin.resume({opts}) *telescope.builtin.resume()* @@ -1129,6 +1117,8 @@ builtin.planets({opts}) *telescope.builtin.planets()* Options: ~ {show_pluto} (boolean) we love pluto (default: false, because its a hidden feature) + {show_moon} (boolean) we love the moon (default: false, because its + a hidden feature) builtin.symbols({opts}) *telescope.builtin.symbols()* @@ -1169,9 +1159,11 @@ builtin.quickfix({opts}) *telescope.builtin.quickfix()* {opts} (table) options to pass to the picker Options: ~ - {ignore_filename} (boolean) dont show filenames (default: true) - {trim_text} (boolean) trim results text (default: false) - {nr} (number) specify the quickfix list number + {show_line} (boolean) show results text (default: true) + {trim_text} (boolean) trim results text (default: false) + {fname_width} (number) defines the width of the filename section + (default: 30) + {nr} (number) specify the quickfix list number builtin.quickfixhistory({opts}) *telescope.builtin.quickfixhistory()* @@ -1193,8 +1185,10 @@ builtin.loclist({opts}) *telescope.builtin.loclist()* {opts} (table) options to pass to the picker Options: ~ - {ignore_filename} (boolean) dont show filenames (default: true) - {trim_text} (boolean) trim results text (default: false) + {show_line} (boolean) show results text (default: true) + {trim_text} (boolean) trim results text (default: false) + {fname_width} (number) defines the width of the filename section + (default: 30) builtin.oldfiles({opts}) *telescope.builtin.oldfiles()* @@ -1393,8 +1387,10 @@ builtin.tagstack({opts}) *telescope.builtin.tagstack()* {opts} (table) options to pass to the picker Options: ~ - {ignore_filename} (boolean) dont show filenames (default: true) - {trim_text} (boolean) trim results text (default: false) + {show_line} (boolean) show results text (default: true) + {trim_text} (boolean) trim results text (default: false) + {fname_width} (number) defines the width of the filename section + (default: 30) builtin.jumplist({opts}) *telescope.builtin.jumplist()* @@ -1405,8 +1401,10 @@ builtin.jumplist({opts}) *telescope.builtin.jumplist()* {opts} (table) options to pass to the picker Options: ~ - {ignore_filename} (boolean) dont show filenames (default: true) - {trim_text} (boolean) trim results text (default: false) + {show_line} (boolean) show results text (default: true) + {trim_text} (boolean) trim results text (default: false) + {fname_width} (number) defines the width of the filename section + (default: 30) builtin.lsp_references({opts}) *telescope.builtin.lsp_references()* @@ -1422,9 +1420,42 @@ builtin.lsp_references({opts}) *telescope.builtin.lsp_references()* lsp references (default: true) {include_current_line} (boolean) include current line (default: false) + {fname_width} (number) defines the width of the filename + section (default: 30) + {show_line} (boolean) show results text (default: true) {trim_text} (boolean) trim results text (default: false) +builtin.lsp_incoming_calls({opts}) *telescope.builtin.lsp_incoming_calls()* + Lists LSP incoming calls for word under the cursor, jumps to reference on + `` + + + Parameters: ~ + {opts} (table) options to pass to the picker + + Options: ~ + {fname_width} (number) defines the width of the filename section + (default: 30) + {show_line} (boolean) show results text (default: true) + {trim_text} (boolean) trim results text (default: false) + + +builtin.lsp_outgoing_calls({opts}) *telescope.builtin.lsp_outgoing_calls()* + Lists LSP outgoing calls for word under the cursor, jumps to reference on + `` + + + Parameters: ~ + {opts} (table) options to pass to the picker + + Options: ~ + {fname_width} (number) defines the width of the filename section + (default: 30) + {show_line} (boolean) show results text (default: true) + {trim_text} (boolean) trim results text (default: false) + + builtin.lsp_definitions({opts}) *telescope.builtin.lsp_definitions()* Goto the definition of the word under the cursor, if there's only one, otherwise show all options in Telescope @@ -1434,11 +1465,12 @@ builtin.lsp_definitions({opts}) *telescope.builtin.lsp_definitions()* {opts} (table) options to pass to the picker Options: ~ - {jump_type} (string) how to goto definition if there is only - one, values: "tab", "split", "vsplit", - "never" - {ignore_filename} (boolean) dont show filenames (default: true) - {trim_text} (boolean) trim results text (default: false) + {jump_type} (string) how to goto definition if there is only one, + values: "tab", "split", "vsplit", "never" + {fname_width} (number) defines the width of the filename section + (default: 30) + {show_line} (boolean) show results text (default: true) + {trim_text} (boolean) trim results text (default: false) builtin.lsp_type_definitions({opts}) *telescope.builtin.lsp_type_definitions()* @@ -1450,11 +1482,12 @@ builtin.lsp_type_definitions({opts}) *telescope.builtin.lsp_type_definitions()* {opts} (table) options to pass to the picker Options: ~ - {jump_type} (string) how to goto definition if there is only - one, values: "tab", "split", "vsplit", - "never" - {ignore_filename} (boolean) dont show filenames (default: true) - {trim_text} (boolean) trim results text (default: false) + {jump_type} (string) how to goto definition if there is only one, + values: "tab", "split", "vsplit", "never" + {fname_width} (number) defines the width of the filename section + (default: 30) + {show_line} (boolean) show results text (default: true) + {trim_text} (boolean) trim results text (default: false) builtin.lsp_implementations({opts}) *telescope.builtin.lsp_implementations()* @@ -1466,11 +1499,13 @@ builtin.lsp_implementations({opts}) *telescope.builtin.lsp_implementations()* {opts} (table) options to pass to the picker Options: ~ - {jump_type} (string) how to goto implementation if there is - only one, values: "tab", "split", - "vsplit", "never" - {ignore_filename} (boolean) dont show filenames (default: true) - {trim_text} (boolean) trim results text (default: false) + {jump_type} (string) how to goto implementation if there is only + one, values: "tab", "split", "vsplit", + "never" + {fname_width} (number) defines the width of the filename section + (default: 30) + {show_line} (boolean) show results text (default: true) + {trim_text} (boolean) trim results text (default: false) builtin.lsp_document_symbols({opts}) *telescope.builtin.lsp_document_symbols()* @@ -1484,8 +1519,8 @@ builtin.lsp_document_symbols({opts}) *telescope.builtin.lsp_document_symbols()* {opts} (table) options to pass to the picker Options: ~ - {ignore_filename} (boolean) dont show filenames (default: - true) + {fname_width} (number) defines the width of the filename + section (default: 30) {show_line} (boolean) if true, shows the content of the line the tag is found on (default: false) @@ -1508,8 +1543,8 @@ builtin.lsp_workspace_symbols({opts}) *telescope.builtin.lsp_workspace_symbols() Options: ~ {query} (string) for what to query the workspace (default: "") - {ignore_filename} (boolean) dont show filenames (default: - false) + {fname_width} (number) defines the width of the filename + section (default: 30) {show_line} (boolean) if true, shows the content of the line the tag is found on (default: false) @@ -1530,8 +1565,8 @@ builtin.lsp_dynamic_workspace_symbols({opts}) *telescope.builtin.lsp_dynamic_wor {opts} (table) options to pass to the picker Options: ~ - {ignore_filename} (boolean) dont show filenames (default: - false) + {fname_width} (number) defines the width of the filename + section (default: 30) {show_line} (boolean) if true, shows the content of the line the symbol is found on (default: false) @@ -1555,8 +1590,9 @@ builtin.diagnostics({opts}) *telescope.builtin.diagnostics()* {opts} (table) options to pass to the picker Options: ~ - {bufnr} (string|number) if nil get diagnostics for all open - buffers. Use 0 for current buffer + {bufnr} (number|nil) Buffer number to get diagnostics + from. Use 0 for current buffer or + nil for all buffers {severity} (string|number) filter diagnostics by severity name (string) or id (number) {severity_limit} (string|number) keep diagnostics equal or more @@ -1580,7 +1616,7 @@ builtin.diagnostics({opts}) *telescope.builtin.diagnostics()* ================================================================================ - *telescope.themes* +THEMES *telescope.themes* Themes are ways to combine several elements of styling together. @@ -1626,7 +1662,129 @@ themes.get_ivy() *telescope.themes.get_ivy()* ================================================================================ - *telescope.layout* +MAPPINGS *telescope.mappings* + +|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 +once you exit the picker. + +We provide multiple different ways of configuring, as described below, to +provide an easy to use experience for changing the default behavior of +telescope or extending for your own purposes. + +To see many of the builtin actions that you can use as values for this table, +see |telescope.actions| + +Format is: +> + { + mode = { ..keys } + } +< + +where {mode} is the one character letter for a mode ('i' for insert, 'n' for +normal). + +For example: +> + mappings = { + i = { + [""] = require('telescope.actions').close, + }, + } +< + +To disable a keymap, put `[map] = false` +For example: +> + { + ..., + [""] = false, + ..., + } +< +Into your config. + +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) +> + { + ..., + [""] = require('telescope.actions').select_default, + ..., + } +< + +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: +> + { + ..., + [""] = "select_default", + ..., + } +< + +You can also add other mappings using tables with `type = "command"`. For +example: +> + { + ..., + ["jj"] = { "", type = "command" }, + ["kk"] = { "echo \"Hello, World!\"", type = "command" },) + ..., + } +< + +You can also add additional options for mappings of any type ("action" and +"command"). For example: +> + { + ..., + [""] = { + actions.move_selection_next, type = "action", + opts = { nowait = true, silent = true } + }, + ..., + } +< + +There are three main places you can configure |telescope.mappings|. These are +ordered from the lowest priority to the highest priority. + +1. |telescope.defaults.mappings| +2. In the |telescope.setup()| table, inside a picker with a given name, use the + `mappings` key +> + require("telescope").setup { + pickers = { + find_files = { + mappings = { + n = { + ["kj"] = "close", + }, + }, + }, + }, + } +< +3. `attach_mappings` function for a particular picker. +> + require("telescope.builtin").find_files { + attach_mappings = function(_, map) + map("i", "asdf", function(_prompt_bufnr) + print "You typed asdf" + end) + -- needs to return true if you want to map default_mappings and + -- false if not + return true + end, + } +< + + +================================================================================ +LAYOUT *telescope.layout* The layout of telescope pickers can be adjusted using the |telescope.defaults.layout_strategy| and |telescope.defaults.layout_config| @@ -1875,20 +2033,23 @@ layout_strategies.bottom_pane() *telescope.layout.bottom_pane()* ================================================================================ - *telescope.resolve* +RESOLVE *telescope.resolve* Provides "resolver functions" to allow more customisable inputs for options. resolver.resolve_height() *telescope.resolve.resolve_height()* Converts input to a function that returns the height. The input must take - one of four forms: + one of five forms: 1. 0 <= number < 1 This means total height as a percentage. 2. 1 <= number This means total height as a fixed number. 3. function Must have signature: function(self, max_columns, max_lines): number - 4. table of the form: {padding = `foo`} + 4. table of the form: { val, max = ..., min = ... } + val has to be in the first form 0 <= val < 1 and only one is given, + `min` or `max` as fixed number + 5. table of the form: {padding = `foo`} where `foo` has one of the previous three forms. The height is then set to be the remaining space after padding. For example, if the window has height 50, and the input is {padding = 5}, @@ -1901,14 +2062,17 @@ resolver.resolve_height() *telescope.resolve.resolve_height()* resolver.resolve_width() *telescope.resolve.resolve_width()* Converts input to a function that returns the width. The input must take - one of four forms: + one of five forms: 1. 0 <= number < 1 This means total width as a percentage. 2. 1 <= number This means total width as a fixed number. 3. function Must have signature: function(self, max_columns, max_lines): number - 4. table of the form: {padding = `foo`} + 4. table of the form: { val, max = ..., min = ... } + val has to be in the first form 0 <= val < 1 and only one is given, + `min` or `max` as fixed number + 5. table of the form: {padding = `foo`} where `foo` has one of the previous three forms. The width is then set to be the remaining space after padding. For example, if the window has width 100, and the input is {padding = 5}, @@ -1935,7 +2099,135 @@ resolver.resolve_anchor_pos() *telescope.resolve.resolve_anchor_pos()* ================================================================================ - *telescope.actions* +MAKE_ENTRY *telescope.make_entry* + +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 +from make_entry functions. These will be referrd to as entry_makers in the +following documentation. + +Every entry maker returns a function which accepts the data to be used for an +entry. This function will return an entry table (or nil, meaning skip this +entry) which contains of the - following important keys: +- 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 + set to false it will not be displayed by the picker. (optional) +- ordinal string: is the text that is used for filtering (required) +- 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 + is actually being displayed. A function can be useful here if complex + calculation have 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 + array has the following signature `{ { start_col, end_col }, hl_group }` + (required). +- filename string: will be interpreted by the default `` action as open + this file (optional) +- bufnr number: will be interpreted by the default `` action as open this + buffer (optional) +- lnum number: lnum value which will be interpreted by the default `` + action as a jump to this line (optional) +- col number: col value which will be interpreted by the default `` action + as a jump to this column (optional) + +More information on easier displaying, see |telescope.pickers.entry_display| + +TODO: Document something we call `entry_index` + + +================================================================================ +ENTRY_DISPLAY *telescope.pickers.entry_display* + +Entry Display is used to format each entry shown in the result panel. + +Entry Display create() will give us a function based on the configuration of +column widths we pass into it. We then can use this function n times to return +a string based on structured input. + +Note that if you call `create()` inside `make_display` it will be called for +every single entry. So it is suggested to do this outside of `make_display` for +the best performance. + +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 +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'. + +An example of this configuration is shown for the buffers picker +> +local displayer = entry_display.create { + separator = " ", + items = { + { width = opts.bufnr_width }, + { width = 4 }, + { width = icon_width }, + { remaining = true }, + }, +} +< + +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 +and the 3rd column's widht will be decided by the width of the 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 " ". + +An example of how the display reference will be used is shown, again for the +buffers picker: +> +return displayer { + { entry.bufnr, "TelescopeResultsNumber" }, + { entry.indicator, "TelescopeResultsComment" }, + { icon, hl_group }, + display_bufname .. ":" .. entry.lnum, +} +< + +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. + +The displayer can return values, string and an optional highlights. String is +all the text to be displayed for this entry as a single string. If parts of 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 +look at the code in make_entry.lua. + + +================================================================================ +UTILS *telescope.utils* + +Utilities for writing telescope pickers + +utils.transform_path({opts}, {path}) *telescope.utils.transform_path()* + Transform path is a util function that formats a path based on path_display + found in `opts` or the default value from config. It is meant to be used in + make_entry to have a uniform interface for builtins as well as extensions + utilizing the same user configuration Note: It is only supported inside + `make_entry`/`make_display` the use of this function outside of telescope + might yield to undefined behavior and will not be addressed by us + + + Parameters: ~ + {opts} (table) The opts the users passed into the picker. Might + contains a path_display key + {path} (string) The path that should be formated + + Return: ~ + string: The transformed path ready to be displayed + + +utils.notify({funname}, {opts}) *telescope.utils.notify()* + Telescope Wrapper around vim.notify + + + Parameters: ~ + {funname} (string) name of the function that will be + {opts} (table) opts.level string, opts.msg string, opts.once bool + + + +================================================================================ +ACTIONS *telescope.actions* Actions functions that are useful for people creating their own mappings. @@ -2178,6 +2470,28 @@ actions.select_tab({prompt_bufnr}) *telescope.actions.select_tab()* {prompt_bufnr} (number) The prompt bufnr +actions.select_drop({prompt_bufnr}) *telescope.actions.select_drop()* + Perform 'drop' action on selection, usually something like + `:drop ` + + 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 ` + + 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()* Perform file edit on selection, usually something like `:edit ` @@ -2275,6 +2589,8 @@ actions.edit_register({prompt_bufnr}) *telescope.actions.edit_register()* actions.paste_register({prompt_bufnr}) *telescope.actions.paste_register()* Paste the selected register into the buffer + Note: only meant to be used inside builtin.registers + Parameters: ~ {prompt_bufnr} (number) The prompt bufnr @@ -2599,9 +2915,19 @@ actions.which_key({prompt_bufnr}) *telescope.actions.which_key()* {prompt_bufnr} (number) The prompt bufnr +actions.to_fuzzy_refine({prompt_bufnr}) *telescope.actions.to_fuzzy_refine()* + Move from a none fuzzy search to a fuzzy one + This action is meant to be used in live_grep and + lsp_dynamic_workspace_symbols + + + Parameters: ~ + {prompt_bufnr} (number) The prompt bufnr + + ================================================================================ - *telescope.actions.state* +ACTIONS_STATE *telescope.actions.state* Functions to be used to determine the current state of telescope. @@ -2627,7 +2953,7 @@ action_state.get_current_picker({prompt_bufnr}) *telescope.actions.state.get_cur ================================================================================ - *telescope.actions.set* +ACTIONS_SET *telescope.actions.set* Telescope action sets are used to provide an interface for managing actions that all primarily do the same thing, but with slight tweaks. @@ -2692,7 +3018,7 @@ action_set.scroll_results({prompt_bufnr}, {direction}) *telescope.actions.set.sc ================================================================================ - *telescope.actions.layout* +ACTIONS_LAYOUT *telescope.actions.layout* The layout actions are actions to be used to change the layout of a picker. @@ -2751,7 +3077,7 @@ action_layout.cycle_layout_prev({prompt_bufnr}) *telescope.actions.layout.cycle_ ================================================================================ - *telescope.actions.utils* +ACTIONS_UTILS *telescope.actions.utils* Utilities to wrap functions around picker selections and entries. @@ -2760,7 +3086,8 @@ Generally used from within other |telescope.actions| utils.map_entries({prompt_bufnr}, {f}) *telescope.actions.utils.map_entries()* Apply `f` to the entries of the current picker. - Notes: - - Mapped entries may include results not visible in the results popup. + - Mapped entries include all currently filtered results, not just the + visible onces. - Indices are 1-indexed, whereas rows are 0-indexed. - Warning: `map_entries` has no return value. - The below example showcases how to collect results @@ -2830,7 +3157,7 @@ utils.get_registered_mappings({prompt_bufnr}) *telescope.actions.utils.get_regis ================================================================================ - *telescope.actions.generate* +ACTIONS_GENERATE *telescope.actions.generate* Module for convenience to override defaults of corresponding |telescope.actions| at |telescope.setup()|. @@ -2908,7 +3235,7 @@ action_generate.which_key({opts}) *telescope.actions.generate.which_key()* ================================================================================ - *telescope.previewers* +PREVIEWERS *telescope.previewers* 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 @@ -3234,7 +3561,7 @@ previewers.display_content() *telescope.previewers.display_content()* ================================================================================ - *telescope.actions.history* +HISTORY *telescope.actions.history* A base implementation of a prompt history that provides a simple history and can be replaced with a custom implementation. diff --git a/bundle/telescope.nvim/doc/telescope_changelog.txt b/bundle/telescope.nvim/doc/telescope_changelog.txt index a11ad841c..fbbb47169 100644 --- a/bundle/telescope.nvim/doc/telescope_changelog.txt +++ b/bundle/telescope.nvim/doc/telescope_changelog.txt @@ -195,5 +195,64 @@ https://github.com/stevearc/dressing.nvim which has support for multiple different backends including telescope. + *telescope.changelog-1945* + +Date: July 01, 2022 +PR: https://github.com/nvim-telescope/telescope.nvim/pull/1945 + +This is our dev branch which contains a lot of PRs, a lot of fixes, +refactoring and general quality of life improvements. It also contains new +features, the most noteworthy are the following (mostly developed by the +community): +- feat: none strategy & control attachment (#1867) +- feat: force buffer delete for terminal and improvements for + Picker:delete_selection (#1943) +- feat(tags): process tagfiles on the fly (#1989) +- feat(builtin.lsp): implement builtin handlers for + lsp.(incoming|outgoing)_calls (#1484) +- feat: clear previewer if no item is selected (#2004) +- feat: add min max boundary to width, height resolver (#2002) +- feat: Add entry_index for entry_makers (#1850) +- feat: refine with new_table (#1115) + +The last one is one of the most exciting new features, because it allows you +to go from live_grep into a fuzzy environment with the following mapping +``. It's a general interface we now implemented for `live_grep` and +`lsp_dynamic_workspace_symbols` but it could also be easily implemented for +other builtins, by us or the user. It's now available for extension developers. +We will add documentation in the next couple of days and improve it by adding +more options to configure it after the initial 0.1 release. + +But as with all longer development phases, there are also some breaking +changes. This is the main reason we moved development to a separate branch, for +the past two months. We can't promise that there won't be more breaking +changes, but it is the plan that this is the last set of breaking changes prior +to the 0.1 release on July, 12. We are deeply sorry for the inconvenience. The +following breaking changes are included in this PR: +- break(git_files): change `show_untracked` default to false. Can be changed + back with `:Telescope git_files show_untracked=true` +- break: deprecate `utils.get_default` `utils.if_nil`, will be removed prior + to 0.1, so if you use it in your config, please move to `vim.F.if_nil` +- break: drops `ignore_filename` option, use `path_display= { "hidden" }` + instead +- break: prefix internal interfaces with __ so + `require("telescope.builtin.files").find_files` will show a notify error but + still works for now. The error will be removed prior to 0.1! You should use + `require("telescope.builtin").find_files` because we wrap all the functions + that are exposed in this module. +- break: defaults.preview.treesitter rework that allows you to either enable a + list of languages, or enable all and disable some. Please read + `:help telescope.defaults.preview` for more information. + Something like this is now possible: + > + treesitter = { + enable = false, + -- or + enable = { "c" }, + -- disable can be set if enable isn't set + disable = { "perl", "javascript" }, + }, +< + vim:tw=78:ts=8:ft=help:norl: diff --git a/bundle/telescope.nvim/lua/telescope/actions/generate.lua b/bundle/telescope.nvim/lua/telescope/actions/generate.lua index 2069b03b3..93a772791 100644 --- a/bundle/telescope.nvim/lua/telescope/actions/generate.lua +++ b/bundle/telescope.nvim/lua/telescope/actions/generate.lua @@ -1,5 +1,5 @@ ---@tag telescope.actions.generate ----@config { ["module"] = "telescope.actions.generate" } +---@config { ["module"] = "telescope.actions.generate", ["name"] = "ACTIONS_GENERATE" } ---@brief [[ --- Module for convenience to override defaults of corresponding |telescope.actions| at |telescope.setup()|. @@ -24,6 +24,10 @@ ---@brief ]] local actions = require "telescope.actions" +local config = require "telescope.config" +local action_state = require "telescope.actions.state" +local finders = require "telescope.finders" + local action_generate = {} --- Display the keymaps of registered actions similar to which-key.nvim.
@@ -54,4 +58,60 @@ action_generate.which_key = function(opts) end end +action_generate.refine = function(prompt_bufnr, opts) + opts = opts or {} + 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.prompt_prefix = vim.F.if_nil(opts.promt_prefix, config.values.prompt_prefix) + 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.sorter = vim.F.if_nil(opts.sorter, config.values.generic_sorter {}) + local push_history = vim.F.if_nil(opts.push_history, true) + + local current_picker = action_state.get_current_picker(prompt_bufnr) + local current_line = action_state.get_current_line() + if push_history then + action_state.get_current_history():append(current_line, current_picker) + end + + -- title + if opts.prompt_title then + current_picker.prompt_border:change_title(opts.prompt_title) + end + + if opts.results_title then + current_picker.results_border:change_title(opts.results_title) + end + + local results = {} + for entry in current_picker.manager:iter() do + table.insert(results, entry) + end + + -- if opts.sorter == false, keep older sorter + if opts.sorter then + current_picker.sorter:_destroy() + current_picker.sorter = opts.sorter + current_picker.sorter:_init() + end + + local new_finder = finders.new_table { + results = results, + entry_maker = function(x) + return x + end, + } + + if not opts.reset_multi_selection and current_line ~= "" then + opts.multi = current_picker._multi + end + + if opts.prompt_to_prefix then + local current_prefix = current_picker.prompt_prefix + local suffix = current_prefix ~= opts.prompt_prefix and current_prefix or "" + opts.new_prefix = suffix .. current_line .. " " .. opts.prompt_prefix + end + current_picker:refresh(new_finder, opts) +end + return action_generate diff --git a/bundle/telescope.nvim/lua/telescope/actions/init.lua b/bundle/telescope.nvim/lua/telescope/actions/init.lua index 11b46a2be..3a6ccc7cb 100644 --- a/bundle/telescope.nvim/lua/telescope/actions/init.lua +++ b/bundle/telescope.nvim/lua/telescope/actions/init.lua @@ -54,7 +54,7 @@ local a = vim.api -local config = require "telescope.config" +local conf = require("telescope.config").values local state = require "telescope.state" local utils = require "telescope.utils" local popup = require "plenary.popup" @@ -242,10 +242,9 @@ end ---@param prompt_bufnr number: The prompt bufnr actions.select_default = { pre = function(prompt_bufnr) - action_state.get_current_history():append( - action_state.get_current_line(), - action_state.get_current_picker(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, "default") @@ -259,10 +258,9 @@ actions.select_default = { ---@param prompt_bufnr number: The prompt bufnr actions.select_horizontal = { pre = function(prompt_bufnr) - action_state.get_current_history():append( - action_state.get_current_line(), - action_state.get_current_picker(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, "horizontal") @@ -276,10 +274,9 @@ actions.select_horizontal = { ---@param prompt_bufnr number: The prompt bufnr actions.select_vertical = { pre = function(prompt_bufnr) - action_state.get_current_history():append( - action_state.get_current_line(), - action_state.get_current_picker(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, "vertical") @@ -293,16 +290,47 @@ actions.select_vertical = { ---@param prompt_bufnr number: The prompt bufnr actions.select_tab = { pre = function(prompt_bufnr) - action_state.get_current_history():append( - action_state.get_current_line(), - action_state.get_current_picker(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") end, } +--- Perform 'drop' action on selection, usually something like
+---`:drop ` +--- +--- 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
+---`:tab drop ` +--- +--- 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! -- https://github.com/nvim-telescope/telescope.nvim/issues/365 @@ -343,14 +371,17 @@ end --- Close the Telescope window, usually used within an action ---@param prompt_bufnr number: The prompt bufnr actions.close = function(prompt_bufnr) - action_state.get_current_history():reset() local picker = action_state.get_current_picker(prompt_bufnr) local original_win_id = picker.original_win_id + local cursor_valid, original_cursor = pcall(a.nvim_win_get_cursor, original_win_id) actions.close_pum(prompt_bufnr) require("telescope.pickers").on_close_prompt(prompt_bufnr) pcall(a.nvim_set_current_win, original_win_id) + if cursor_valid and a.nvim_get_mode().mode == "i" and picker._original_mode ~= "i" then + pcall(a.nvim_win_set_cursor, original_win_id, { original_cursor[1], original_cursor[2] + 1 }) + end end --- Close the Telescope window, usually used within an action
@@ -428,6 +459,8 @@ actions.edit_register = function(prompt_bufnr) end --- Paste the selected register into the buffer +--- +--- Note: only meant to be used inside builtin.registers ---@param prompt_bufnr number: The prompt bufnr actions.paste_register = function(prompt_bufnr) local selection = action_state.get_selected_entry() @@ -559,6 +592,7 @@ actions.git_checkout = function(prompt_bufnr) msg = string.format("Checked out: %s", selection.value), level = "INFO", }) + vim.cmd "checktime" else utils.notify("actions.git_checkout", { msg = string.format( @@ -601,7 +635,7 @@ actions.git_switch_branch = function(prompt_bufnr) selection.value, table.concat(stderr, " ") ), - level = "ERORR", + level = "ERROR", }) end end @@ -748,6 +782,7 @@ actions.git_checkout_current_buffer = function(prompt_bufnr) end actions.close(prompt_bufnr) utils.get_os_command_output({ "git", "checkout", selection.value, "--", selection.file }, cwd) + vim.cmd "checktime" end --- Stage/unstage selected file @@ -1017,7 +1052,9 @@ end actions.delete_buffer = function(prompt_bufnr) local current_picker = action_state.get_current_picker(prompt_bufnr) current_picker:delete_selection(function(selection) - vim.api.nvim_buf_delete(selection.bufnr, { force = false }) + local force = vim.api.nvim_buf_get_option(selection.bufnr, "buftype") == "terminal" + local ok = pcall(vim.api.nvim_buf_delete, selection.bufnr, { force = force }) + return ok end) end @@ -1056,22 +1093,22 @@ end ---@param prompt_bufnr number: The prompt bufnr actions.which_key = function(prompt_bufnr, opts) opts = opts or {} - opts.max_height = utils.get_default(opts.max_height, 0.4) - opts.only_show_current_mode = utils.get_default(opts.only_show_current_mode, true) - opts.mode_width = utils.get_default(opts.mode_width, 1) - opts.keybind_width = utils.get_default(opts.keybind_width, 7) - opts.name_width = utils.get_default(opts.name_width, 30) - opts.line_padding = utils.get_default(opts.line_padding, 1) - opts.separator = utils.get_default(opts.separator, " -> ") - opts.close_with_action = utils.get_default(opts.close_with_action, true) - opts.normal_hl = utils.get_default(opts.normal_hl, "TelescopePrompt") - opts.border_hl = utils.get_default(opts.border_hl, "TelescopePromptBorder") - opts.winblend = utils.get_default(opts.winblend, config.values.winblend) - opts.column_padding = utils.get_default(opts.column_padding, " ") + opts.max_height = vim.F.if_nil(opts.max_height, 0.4) + opts.only_show_current_mode = vim.F.if_nil(opts.only_show_current_mode, true) + opts.mode_width = vim.F.if_nil(opts.mode_width, 1) + opts.keybind_width = vim.F.if_nil(opts.keybind_width, 7) + opts.name_width = vim.F.if_nil(opts.name_width, 30) + opts.line_padding = vim.F.if_nil(opts.line_padding, 1) + opts.separator = vim.F.if_nil(opts.separator, " -> ") + opts.close_with_action = vim.F.if_nil(opts.close_with_action, true) + opts.normal_hl = vim.F.if_nil(opts.normal_hl, "TelescopePrompt") + opts.border_hl = vim.F.if_nil(opts.border_hl, "TelescopePromptBorder") + opts.winblend = vim.F.if_nil(opts.winblend, conf.winblend) + opts.column_padding = vim.F.if_nil(opts.column_padding, " ") -- Assigning into 'opts.column_indent' would override a number with a string and -- cause issues with subsequent calls, keep a local copy of the string instead - local column_indent = table.concat(utils.repeated_table(utils.get_default(opts.column_indent, 4), " ")) + local column_indent = table.concat(utils.repeated_table(vim.F.if_nil(opts.column_indent, 4), " ")) -- close on repeated keypress local km_bufs = (function() @@ -1100,7 +1137,7 @@ actions.which_key = function(prompt_bufnr, opts) local displayer = entry_display.create { separator = opts.separator, items = { - { width = opts.mode_with }, + { width = opts.mode_width }, { width = opts.keybind_width }, { width = opts.name_width }, }, @@ -1108,9 +1145,9 @@ actions.which_key = function(prompt_bufnr, opts) local make_display = function(mapping) return displayer { - { mapping.mode, utils.get_default(opts.mode_hl, "TelescopeResultsConstant") }, - { mapping.keybind, utils.get_default(opts.keybind_hl, "TelescopeResultsVariable") }, - { mapping.name, utils.get_default(opts.name_hl, "TelescopeResultsFunction") }, + { mapping.mode, vim.F.if_nil(opts.mode_hl, "TelescopeResultsConstant") }, + { mapping.keybind, vim.F.if_nil(opts.keybind_hl, "TelescopeResultsVariable") }, + { mapping.name, vim.F.if_nil(opts.name_hl, "TelescopeResultsFunction") }, } end @@ -1125,7 +1162,7 @@ actions.which_key = function(prompt_bufnr, opts) name = name == "" and action or name .. " + " .. action end end - if name and name ~= "which_key" then + 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 @@ -1168,10 +1205,8 @@ actions.which_key = function(prompt_bufnr, opts) + opts.name_width + (3 * #opts.separator) local num_total_columns = math.floor((vim.o.columns - #column_indent) / entry_width) - opts.num_rows = math.min( - math.ceil(#mappings / num_total_columns), - resolver.resolve_height(opts.max_height)(_, _, vim.o.lines) - ) + opts.num_rows = + math.min(math.ceil(#mappings / num_total_columns), resolver.resolve_height(opts.max_height)(_, _, vim.o.lines)) local total_available_entries = opts.num_rows * num_total_columns local winheight = opts.num_rows + 2 * opts.line_padding @@ -1266,6 +1301,30 @@ actions.which_key = function(prompt_bufnr, opts) end end +--- Move from a none fuzzy search to a fuzzy one
+--- This action is meant to be used in live_grep and lsp_dynamic_workspace_symbols +---@param prompt_bufnr number: The prompt bufnr +actions.to_fuzzy_refine = function(prompt_bufnr) + local line = action_state.get_current_line() + local prefix = (function() + local title = action_state.get_current_picker(prompt_bufnr).prompt_title + if title == "Live Grep" then + return "Find Word" + elseif title == "LSP Dynamic Workspace Symbols" then + return "LSP Workspace Symbols" + else + return "Fuzzy over" + end + end)() + + require("telescope.actions.generate").refine(prompt_bufnr, { + prompt_title = string.format("%s (%s)", prefix, line), + sorter = conf.generic_sorter {}, + }) +end + +actions.nop = function(_) end + -- ================================================== -- Transforms modules and sets the correct metatables. -- ================================================== diff --git a/bundle/telescope.nvim/lua/telescope/actions/layout.lua b/bundle/telescope.nvim/lua/telescope/actions/layout.lua index f6f6b13c8..0e8b27a96 100644 --- a/bundle/telescope.nvim/lua/telescope/actions/layout.lua +++ b/bundle/telescope.nvim/lua/telescope/actions/layout.lua @@ -1,5 +1,5 @@ ---@tag telescope.actions.layout ----@config { ["module"] = "telescope.actions.layout" } +---@config { ["module"] = "telescope.actions.layout", ["name"] = "ACTIONS_LAYOUT" } ---@brief [[ --- The layout actions are actions to be used to change the layout of a picker. diff --git a/bundle/telescope.nvim/lua/telescope/actions/set.lua b/bundle/telescope.nvim/lua/telescope/actions/set.lua index b88042488..11d379bbb 100644 --- a/bundle/telescope.nvim/lua/telescope/actions/set.lua +++ b/bundle/telescope.nvim/lua/telescope/actions/set.lua @@ -1,5 +1,5 @@ ---@tag telescope.actions.set ----@config { ["module"] = "telescope.actions.set" } +---@config { ["module"] = "telescope.actions.set", ["name"] = "ACTIONS_SET" } ---@brief [[ --- Telescope action sets are used to provide an interface for managing @@ -67,6 +67,8 @@ end local edit_buffer do local map = { + drop = "drop", + ["tab drop"] = "tab drop", edit = "buffer", new = "sbuffer", vnew = "vert sbuffer", @@ -78,7 +80,11 @@ do if command == nil then error "There was no associated buffer command" end - vim.cmd(string.format("%s %d", command, bufnr)) + if command ~= "drop" and command ~= "tab drop" then + 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 @@ -104,7 +110,7 @@ action_set.edit = function(prompt_bufnr, command) -- TODO: Check for off-by-one row = entry.row or entry.lnum - col = entry.col + col = vim.F.if_nil(entry.col, 1) elseif not entry.bufnr then -- TODO: Might want to remove this and force people -- to put stuff into `filename` @@ -131,12 +137,24 @@ action_set.edit = function(prompt_bufnr, command) local entry_bufnr = entry.bufnr local picker = action_state.get_current_picker(prompt_bufnr) - require("telescope.actions").close(prompt_bufnr) + require("telescope.pickers").on_close_prompt(prompt_bufnr) + pcall(vim.api.nvim_set_current_win, picker.original_win_id) + local win_id = picker.get_selection_window(picker, entry) if picker.push_cursor_on_edit then vim.cmd "normal! m'" end + if picker.push_tagstack_on_edit then + local from = { vim.fn.bufnr "%", vim.fn.line ".", vim.fn.col ".", 0 } + local items = { { tagname = vim.fn.expand "", from = from } } + vim.fn.settagstack(vim.fn.win_getid(), { items = items }, "t") + end + + if win_id ~= 0 and a.nvim_get_current_win() ~= win_id then + vim.api.nvim_set_current_win(win_id) + end + if entry_bufnr then if not vim.api.nvim_buf_get_option(entry_bufnr, "buflisted") then vim.api.nvim_buf_set_option(entry_bufnr, "buflisted", true) @@ -167,13 +185,13 @@ end -- Valid directions include: "1", "-1" action_set.scroll_previewer = function(prompt_bufnr, direction) local previewer = action_state.get_current_picker(prompt_bufnr).previewer + local status = state.get_status(prompt_bufnr) - -- Check if we actually have a previewer - if type(previewer) ~= "table" or previewer.scroll_fn == nil then + -- Check if we actually have a previewer and a preview window + if type(previewer) ~= "table" or previewer.scroll_fn == nil or status.preview_win == nil then return end - local status = state.get_status(prompt_bufnr) local default_speed = vim.api.nvim_win_get_height(status.preview_win) / 2 local speed = status.picker.layout_config.scroll_speed or default_speed diff --git a/bundle/telescope.nvim/lua/telescope/actions/state.lua b/bundle/telescope.nvim/lua/telescope/actions/state.lua index 597e2f67d..d5109ed20 100644 --- a/bundle/telescope.nvim/lua/telescope/actions/state.lua +++ b/bundle/telescope.nvim/lua/telescope/actions/state.lua @@ -1,5 +1,5 @@ ---@tag telescope.actions.state ----@config { ["module"] = "telescope.actions.state" } +---@config { ["module"] = "telescope.actions.state", ["name"] = "ACTIONS_STATE" } ---@brief [[ --- Functions to be used to determine the current state of telescope. @@ -33,6 +33,8 @@ local select_to_edit_map = { horizontal = "new", vertical = "vnew", tab = "tabedit", + drop = "drop", + ["tab drop"] = "tab drop", } function action_state.select_key_to_edit_key(type) return select_to_edit_map[type] diff --git a/bundle/telescope.nvim/lua/telescope/actions/utils.lua b/bundle/telescope.nvim/lua/telescope/actions/utils.lua index 9684414bd..8018d64fa 100644 --- a/bundle/telescope.nvim/lua/telescope/actions/utils.lua +++ b/bundle/telescope.nvim/lua/telescope/actions/utils.lua @@ -1,5 +1,5 @@ ---@tag telescope.actions.utils ----@config { ["module"] = "telescope.actions.utils" } +---@config { ["module"] = "telescope.actions.utils", ["name"] = "ACTIONS_UTILS" } ---@brief [[ --- Utilities to wrap functions around picker selections and entries. @@ -13,7 +13,7 @@ local utils = {} --- Apply `f` to the entries of the current picker. --- - Notes: ---- - Mapped entries may include results not visible in the results popup. +--- - Mapped entries include all currently filtered results, not just the visible onces. --- - Indices are 1-indexed, whereas rows are 0-indexed. --- - Warning: `map_entries` has no return value. --- - The below example showcases how to collect results @@ -96,8 +96,11 @@ function utils.get_registered_mappings(prompt_bufnr) for _, mode in ipairs { "n", "i" } do local mode_mappings = vim.api.nvim_buf_get_keymap(prompt_bufnr, mode) for _, mapping in ipairs(mode_mappings) do - local funcid = findnth(mapping.rhs, 2) - table.insert(ret, { mode = mode, keybind = mapping.lhs, func = __TelescopeKeymapStore[prompt_bufnr][funcid] }) + -- ensure only telescope mappings + if mapping.rhs and string.find(mapping.rhs, [[require%('telescope.mappings'%).execute_keymap]]) then + local funcid = findnth(mapping.rhs, 2) + table.insert(ret, { mode = mode, keybind = mapping.lhs, func = __TelescopeKeymapStore[prompt_bufnr][funcid] }) + end end end return ret diff --git a/bundle/telescope.nvim/lua/telescope/builtin/diagnostics.lua b/bundle/telescope.nvim/lua/telescope/builtin/__diagnostics.lua similarity index 89% rename from bundle/telescope.nvim/lua/telescope/builtin/diagnostics.lua rename to bundle/telescope.nvim/lua/telescope/builtin/__diagnostics.lua index 2614e3638..ad50cfa81 100644 --- a/bundle/telescope.nvim/lua/telescope/builtin/diagnostics.lua +++ b/bundle/telescope.nvim/lua/telescope/builtin/__diagnostics.lua @@ -122,18 +122,20 @@ diagnostics.get = function(opts) end opts.path_display = vim.F.if_nil(opts.path_display, "hidden") - pickers.new(opts, { - prompt_title = opts.bufnr == nil and "Workspace Diagnostics" or "Document Diagnostics", - finder = finders.new_table { - results = locations, - entry_maker = opts.entry_maker or make_entry.gen_from_diagnostics(opts), - }, - previewer = conf.qflist_previewer(opts), - sorter = conf.prefilter_sorter { - tag = "type", - sorter = conf.generic_sorter(opts), - }, - }):find() + pickers + .new(opts, { + prompt_title = opts.bufnr == nil and "Workspace Diagnostics" or "Document Diagnostics", + finder = finders.new_table { + results = locations, + entry_maker = opts.entry_maker or make_entry.gen_from_diagnostics(opts), + }, + previewer = conf.qflist_previewer(opts), + sorter = conf.prefilter_sorter { + tag = "type", + sorter = conf.generic_sorter(opts), + }, + }) + :find() end local function apply_checks(mod) diff --git a/bundle/telescope.nvim/lua/telescope/builtin/files.lua b/bundle/telescope.nvim/lua/telescope/builtin/__files.lua similarity index 57% rename from bundle/telescope.nvim/lua/telescope/builtin/files.lua rename to bundle/telescope.nvim/lua/telescope/builtin/__files.lua index 2dd11c722..2044d16b4 100644 --- a/bundle/telescope.nvim/lua/telescope/builtin/files.lua +++ b/bundle/telescope.nvim/lua/telescope/builtin/__files.lua @@ -1,5 +1,6 @@ local action_state = require "telescope.actions.state" local action_set = require "telescope.actions.set" +local actions = require "telescope.actions" local finders = require "telescope.finders" local make_entry = require "telescope.make_entry" local pickers = require "telescope.pickers" @@ -35,6 +36,29 @@ local escape_chars = function(string) }) end +local get_open_filelist = function(grep_open_files, cwd) + if not grep_open_files then + return nil + end + + local bufnrs = filter(function(b) + if 1 ~= vim.fn.buflisted(b) then + return false + end + return true + end, vim.api.nvim_list_bufs()) + if not next(bufnrs) then + return + end + + local filelist = {} + for _, bufnr in ipairs(bufnrs) do + local file = vim.api.nvim_buf_get_name(bufnr) + table.insert(filelist, Path:new(file):make_relative(cwd)) + end + return filelist +end + -- Special keys: -- opts.search_dirs -- list of directory to search in -- opts.grep_open_files -- boolean to restrict search to open files @@ -44,40 +68,32 @@ files.live_grep = function(opts) local grep_open_files = opts.grep_open_files opts.cwd = opts.cwd and vim.fn.expand(opts.cwd) or vim.loop.cwd() - local filelist = {} - - if grep_open_files then - local bufnrs = filter(function(b) - if 1 ~= vim.fn.buflisted(b) then - return false - end - return true - end, vim.api.nvim_list_bufs()) - if not next(bufnrs) then - return - end - - for _, bufnr in ipairs(bufnrs) do - local file = vim.api.nvim_buf_get_name(bufnr) - table.insert(filelist, Path:new(file):make_relative(opts.cwd)) - end - elseif search_dirs then + local filelist = get_open_filelist(grep_open_files, opts.cwd) + if search_dirs then for i, path in ipairs(search_dirs) do search_dirs[i] = vim.fn.expand(path) end end local additional_args = {} - if opts.additional_args ~= nil and type(opts.additional_args) == "function" then - additional_args = opts.additional_args(opts) + if opts.additional_args ~= nil then + if type(opts.additional_args) == "function" then + additional_args = opts.additional_args(opts) + elseif type(opts.additional_args) == "table" then + additional_args = opts.additional_args + end end if opts.type_filter then additional_args[#additional_args + 1] = "--type=" .. opts.type_filter end - if opts.glob_pattern then + if type(opts.glob_pattern) == "string" then additional_args[#additional_args + 1] = "--glob=" .. opts.glob_pattern + elseif type(opts.glob_pattern) == "table" then + for i = 1, #opts.glob_pattern do + additional_args[#additional_args + 1] = "--glob=" .. opts.glob_pattern[i] + end end local live_grepper = finders.new_job(function(prompt) @@ -89,80 +105,95 @@ files.live_grep = function(opts) local search_list = {} - if search_dirs then - table.insert(search_list, search_dirs) - end - if grep_open_files then search_list = filelist + elseif search_dirs then + search_list = search_dirs end return flatten { vimgrep_arguments, additional_args, "--", prompt, search_list } end, opts.entry_maker or make_entry.gen_from_vimgrep(opts), opts.max_results, opts.cwd) - pickers.new(opts, { - prompt_title = "Live Grep", - finder = live_grepper, - previewer = conf.grep_previewer(opts), - -- TODO: It would be cool to use `--json` output for this - -- and then we could get the highlight positions directly. - sorter = sorters.highlighter_only(opts), - }):find() + pickers + .new(opts, { + prompt_title = "Live Grep", + finder = live_grepper, + previewer = conf.grep_previewer(opts), + -- TODO: It would be cool to use `--json` output for this + -- and then we could get the highlight positions directly. + sorter = sorters.highlighter_only(opts), + attach_mappings = function(_, map) + map("i", "", actions.to_fuzzy_refine) + return true + end, + }) + :find() end --- Special keys: --- opts.search -- the string to search. --- opts.search_dirs -- list of directory to search in --- opts.use_regex -- special characters won't be escaped files.grep_string = function(opts) -- TODO: This should probably check your visual selection as well, if you've got one - - local vimgrep_arguments = opts.vimgrep_arguments or conf.vimgrep_arguments - local search_dirs = opts.search_dirs - local word = opts.search or vim.fn.expand "" + opts.cwd = opts.cwd and vim.fn.expand(opts.cwd) or vim.loop.cwd() + local vimgrep_arguments = vim.F.if_nil(opts.vimgrep_arguments, conf.vimgrep_arguments) + local word = vim.F.if_nil(opts.search, vim.fn.expand "") local search = opts.use_regex and word or escape_chars(word) - local word_match = opts.word_match - opts.entry_maker = opts.entry_maker or make_entry.gen_from_vimgrep(opts) local additional_args = {} - if opts.additional_args ~= nil and type(opts.additional_args) == "function" then - additional_args = opts.additional_args(opts) + if opts.additional_args ~= nil then + if type(opts.additional_args) == "function" then + additional_args = opts.additional_args(opts) + elseif type(opts.additional_args) == "table" then + additional_args = opts.additional_args + end + end + + if search == "" then + search = { "-v", "--", "^[[:space:]]*$" } + opts.__inverted = true + else + search = { "--", search } end local args = flatten { vimgrep_arguments, additional_args, - word_match, - "--", + opts.word_match, search, } - if search_dirs then - for _, path in ipairs(search_dirs) do + if opts.grep_open_files then + for _, file in ipairs(get_open_filelist(opts.grep_open_files, opts.cwd)) do + table.insert(args, file) + end + elseif opts.search_dirs then + for _, path in ipairs(opts.search_dirs) do table.insert(args, vim.fn.expand(path)) end end - pickers.new(opts, { - prompt_title = "Find Word (" .. word .. ")", - finder = finders.new_oneshot_job(args, opts), - previewer = conf.grep_previewer(opts), - sorter = conf.generic_sorter(opts), - }):find() + opts.entry_maker = opts.entry_maker or make_entry.gen_from_vimgrep(opts) + pickers + .new(opts, { + prompt_title = "Find Word (" .. word:gsub("\n", "\\n") .. ")", + finder = finders.new_oneshot_job(args, opts), + previewer = conf.grep_previewer(opts), + sorter = conf.generic_sorter(opts), + }) + :find() end --- TODO: Maybe just change this to `find`. --- TODO: Support `find` and maybe let people do other stuff with it as well. files.find_files = function(opts) local find_command = (function() if opts.find_command then + if type(opts.find_command) == "function" then + return opts.find_command(opts) + end return opts.find_command - elseif 1 == vim.fn.executable "fd" then - return { "fd", "--type", "f" } - elseif 1 == vim.fn.executable "fdfind" then - return { "fdfind", "--type", "f" } elseif 1 == vim.fn.executable "rg" then - return { "rg", "--files" } + return { "rg", "--files", "--color", "never" } + elseif 1 == vim.fn.executable "fd" then + return { "fd", "--type", "f", "--color", "never" } + elseif 1 == vim.fn.executable "fdfind" then + return { "fdfind", "--type", "f", "--color", "never" } elseif 1 == vim.fn.executable "find" and vim.fn.has "win32" == 0 then return { "find", ".", "-type", "f" } elseif 1 == vim.fn.executable "where" then @@ -181,8 +212,10 @@ files.find_files = function(opts) local command = find_command[1] local hidden = opts.hidden local no_ignore = opts.no_ignore + local no_ignore_parent = opts.no_ignore_parent local follow = opts.follow local search_dirs = opts.search_dirs + local search_file = opts.search_file if search_dirs then for k, v in pairs(search_dirs) do @@ -192,21 +225,30 @@ files.find_files = function(opts) if command == "fd" or command == "fdfind" or command == "rg" then if hidden then - table.insert(find_command, "--hidden") + find_command[#find_command + 1] = "--hidden" end if no_ignore then - table.insert(find_command, "--no-ignore") + find_command[#find_command + 1] = "--no-ignore" + end + if no_ignore_parent then + find_command[#find_command + 1] = "--no-ignore-parent" end if follow then - table.insert(find_command, "-L") + find_command[#find_command + 1] = "-L" + end + if search_file then + if command == "rg" then + find_command[#find_command + 1] = "-g" + find_command[#find_command + 1] = "*" .. search_file .. "*" + else + find_command[#find_command + 1] = search_file + end end if search_dirs then - if command ~= "rg" then - table.insert(find_command, ".") - end - for _, v in pairs(search_dirs) do - table.insert(find_command, v) + if command ~= "rg" and not search_file then + find_command[#find_command + 1] = "." end + vim.list_extend(find_command, search_dirs) end elseif command == "find" then if not hidden then @@ -216,9 +258,16 @@ files.find_files = function(opts) if no_ignore ~= nil then log.warn "The `no_ignore` key is not available for the `find` command in `find_files`." end + if no_ignore_parent ~= nil then + log.warn "The `no_ignore_parent` key is not available for the `find` command in `find_files`." + end if follow then table.insert(find_command, 2, "-L") end + if search_file then + table.insert(find_command, "-name") + table.insert(find_command, "*" .. search_file .. "*") + end if search_dirs then table.remove(find_command, 2) for _, v in pairs(search_dirs) do @@ -232,12 +281,18 @@ files.find_files = function(opts) if no_ignore ~= nil then log.warn "The `no_ignore` key is not available for the Windows `where` command in `find_files`." end + if no_ignore_parent ~= nil then + log.warn "The `no_ignore_parent` key is not available for the Windows `where` command in `find_files`." + end if follow ~= nil then log.warn "The `follow` key is not available for the Windows `where` command in `find_files`." end if search_dirs ~= nil then log.warn "The `search_dirs` key is not available for the Windows `where` command in `find_files`." end + if search_file ~= nil then + log.warn "The `search_file` key is not available for the Windows `where` command in `find_files`." + end end if opts.cwd then @@ -246,12 +301,14 @@ files.find_files = function(opts) opts.entry_maker = opts.entry_maker or make_entry.gen_from_file(opts) - pickers.new(opts, { - prompt_title = "Find Files", - finder = finders.new_oneshot_job(find_command, opts), - previewer = conf.file_previewer(opts), - sorter = conf.file_sorter(opts), - }):find() + pickers + .new(opts, { + prompt_title = "Find Files", + finder = finders.new_oneshot_job(find_command, opts), + previewer = conf.file_previewer(opts), + sorter = conf.file_sorter(opts), + }) + :find() end local function prepare_match(entry, kind) @@ -270,7 +327,7 @@ end -- TODO: finish docs for opts.show_line files.treesitter = function(opts) - opts.show_line = utils.get_default(opts.show_line, true) + opts.show_line = vim.F.if_nil(opts.show_line, true) local has_nvim_treesitter, _ = pcall(require, "nvim-treesitter") if not has_nvim_treesitter then @@ -304,18 +361,20 @@ files.treesitter = function(opts) return end - pickers.new(opts, { - prompt_title = "Treesitter Symbols", - finder = finders.new_table { - results = results, - entry_maker = opts.entry_maker or make_entry.gen_from_treesitter(opts), - }, - previewer = conf.grep_previewer(opts), - sorter = conf.prefilter_sorter { - tag = "kind", - sorter = conf.generic_sorter(opts), - }, - }):find() + pickers + .new(opts, { + prompt_title = "Treesitter Symbols", + finder = finders.new_table { + results = results, + entry_maker = opts.entry_maker or make_entry.gen_from_treesitter(opts), + }, + previewer = conf.grep_previewer(opts), + sorter = conf.prefilter_sorter { + tag = "kind", + sorter = conf.generic_sorter(opts), + }, + }) + :find() end files.current_buffer_fuzzy_find = function(opts) @@ -356,8 +415,12 @@ files.current_buffer_fuzzy_find = function(opts) return obj end, }) + + -- update to changes on Neovim master, see https://github.com/neovim/neovim/pull/19931 + -- TODO(clason): remove when dropping support for Neovim 0.7 + local on_nvim_master = vim.fn.has "nvim-0.8" == 1 for id, node in query:iter_captures(root, opts.bufnr, 0, -1) do - local hl = highlighter_query:_get_hl_from_capture(id) + local hl = on_nvim_master and query.captures[id] or highlighter_query:_get_hl_from_capture(id) if hl and type(hl) ~= "number" then local row1, col1, row2, col2 = node:range() @@ -387,29 +450,34 @@ files.current_buffer_fuzzy_find = function(opts) opts.line_highlights = line_highlights end - pickers.new(opts, { - prompt_title = "Current Buffer Fuzzy", - finder = finders.new_table { - results = lines_with_numbers, - entry_maker = opts.entry_maker or make_entry.gen_from_buffer_lines(opts), - }, - sorter = conf.generic_sorter(opts), - previewer = conf.grep_previewer(opts), - attach_mappings = function() - action_set.select:enhance { - post = function() - local selection = action_state.get_selected_entry() - vim.api.nvim_win_set_cursor(0, { selection.lnum, 0 }) - end, - } + pickers + .new(opts, { + prompt_title = "Current Buffer Fuzzy", + finder = finders.new_table { + results = lines_with_numbers, + entry_maker = opts.entry_maker or make_entry.gen_from_buffer_lines(opts), + }, + sorter = conf.generic_sorter(opts), + previewer = conf.grep_previewer(opts), + attach_mappings = function() + action_set.select:enhance { + post = function() + local selection = action_state.get_selected_entry() + vim.api.nvim_win_set_cursor(0, { selection.lnum, 0 }) + end, + } - return true - end, - }):find() + return true + end, + }) + :find() end files.tags = function(opts) local tagfiles = opts.ctags_file and { opts.ctags_file } or vim.fn.tagfiles() + for i, ctags_file in ipairs(tagfiles) do + tagfiles[i] = vim.fn.expand(ctags_file, true) + end if vim.tbl_isempty(tagfiles) then utils.notify("builtin.tags", { msg = "No tags file found. Create one with ctags -R", @@ -417,46 +485,42 @@ files.tags = function(opts) }) return end + opts.entry_maker = vim.F.if_nil(opts.entry_maker, make_entry.gen_from_ctags(opts)) - local results = {} - for _, ctags_file in ipairs(tagfiles) do - for line in Path:new(vim.fn.expand(ctags_file, true)):iter() do - results[#results + 1] = line - end - end + pickers + .new(opts, { + prompt_title = "Tags", + finder = finders.new_oneshot_job(flatten { "cat", tagfiles }, opts), + previewer = previewers.ctags.new(opts), + sorter = conf.generic_sorter(opts), + attach_mappings = function() + action_set.select:enhance { + post = function() + local selection = action_state.get_selected_entry() + if not selection then + return + end - pickers.new(opts, { - prompt_title = "Tags", - finder = finders.new_table { - results = results, - entry_maker = opts.entry_maker or make_entry.gen_from_ctags(opts), - }, - previewer = previewers.ctags.new(opts), - sorter = conf.generic_sorter(opts), - attach_mappings = function() - action_set.select:enhance { - post = function() - local selection = action_state.get_selected_entry() + if selection.scode then + -- un-escape / then escape required + -- special chars for vim.fn.search() + -- ] ~ * + local scode = selection.scode:gsub([[\/]], "/"):gsub("[%]~*]", function(x) + return "\\" .. x + end) - if selection.scode then - -- un-escape / then escape required - -- special chars for vim.fn.search() - -- ] ~ * - local scode = selection.scode:gsub([[\/]], "/"):gsub("[%]~*]", function(x) - return "\\" .. x - end) - - vim.cmd "norm! gg" - vim.fn.search(scode) - vim.cmd "norm! zz" - else - vim.api.nvim_win_set_cursor(0, { selection.lnum, 0 }) - end - end, - } - return true - end, - }):find() + vim.cmd "norm! gg" + vim.fn.search(scode) + vim.cmd "norm! zz" + else + vim.api.nvim_win_set_cursor(0, { selection.lnum, 0 }) + end + end, + } + return true + end, + }) + :find() end files.current_buffer_tags = function(opts) diff --git a/bundle/telescope.nvim/lua/telescope/builtin/__git.lua b/bundle/telescope.nvim/lua/telescope/builtin/__git.lua new file mode 100644 index 000000000..acab6c415 --- /dev/null +++ b/bundle/telescope.nvim/lua/telescope/builtin/__git.lua @@ -0,0 +1,427 @@ +local actions = require "telescope.actions" +local action_state = require "telescope.actions.state" +local finders = require "telescope.finders" +local make_entry = require "telescope.make_entry" +local pickers = require "telescope.pickers" +local previewers = require "telescope.previewers" +local utils = require "telescope.utils" +local entry_display = require "telescope.pickers.entry_display" +local strings = require "plenary.strings" +local Path = require "plenary.path" + +local conf = require("telescope.config").values + +local git = {} + +git.files = function(opts) + if opts.is_bare then + utils.notify("builtin.git_files", { + msg = "This operation must be run in a work tree", + level = "ERROR", + }) + return + end + + local show_untracked = vim.F.if_nil(opts.show_untracked, false) + local recurse_submodules = vim.F.if_nil(opts.recurse_submodules, false) + if show_untracked and recurse_submodules then + utils.notify("builtin.git_files", { + msg = "Git does not support both --others and --recurse-submodules", + level = "ERROR", + }) + return + end + + -- By creating the entry maker after the cwd options, + -- we ensure the maker uses the cwd options when being created. + opts.entry_maker = vim.F.if_nil(opts.entry_maker, make_entry.gen_from_file(opts)) + local git_command = vim.F.if_nil(opts.git_command, { "git", "ls-files", "--exclude-standard", "--cached" }) + + pickers + .new(opts, { + prompt_title = "Git Files", + finder = finders.new_oneshot_job( + vim.tbl_flatten { + git_command, + show_untracked and "--others" or nil, + recurse_submodules and "--recurse-submodules" or nil, + }, + opts + ), + previewer = conf.file_previewer(opts), + sorter = conf.file_sorter(opts), + }) + :find() +end + +git.commits = function(opts) + opts.entry_maker = vim.F.if_nil(opts.entry_maker, make_entry.gen_from_git_commits(opts)) + local git_command = vim.F.if_nil(opts.git_command, { "git", "log", "--pretty=oneline", "--abbrev-commit", "--", "." }) + + pickers + .new(opts, { + prompt_title = "Git Commits", + finder = finders.new_oneshot_job(git_command, opts), + previewer = { + previewers.git_commit_diff_to_parent.new(opts), + previewers.git_commit_diff_to_head.new(opts), + previewers.git_commit_diff_as_was.new(opts), + previewers.git_commit_message.new(opts), + }, + sorter = conf.file_sorter(opts), + attach_mappings = function(_, map) + actions.select_default:replace(actions.git_checkout) + map("i", "m", actions.git_reset_mixed) + map("n", "m", actions.git_reset_mixed) + map("i", "s", actions.git_reset_soft) + map("n", "s", actions.git_reset_soft) + map("i", "h", actions.git_reset_hard) + map("n", "h", actions.git_reset_hard) + return true + end, + }) + :find() +end + +git.stash = function(opts) + opts.show_branch = vim.F.if_nil(opts.show_branch, true) + opts.entry_maker = vim.F.if_nil(opts.entry_maker, make_entry.gen_from_git_stash(opts)) + + pickers + .new(opts, { + prompt_title = "Git Stash", + finder = finders.new_oneshot_job( + vim.tbl_flatten { + "git", + "--no-pager", + "stash", + "list", + }, + opts + ), + previewer = previewers.git_stash_diff.new(opts), + sorter = conf.file_sorter(opts), + attach_mappings = function() + actions.select_default:replace(actions.git_apply_stash) + return true + end, + }) + :find() +end + +local get_current_buf_line = function(winnr) + local lnum = vim.api.nvim_win_get_cursor(winnr)[1] + return vim.trim(vim.api.nvim_buf_get_lines(vim.api.nvim_win_get_buf(winnr), lnum - 1, lnum, false)[1]) +end + +git.bcommits = function(opts) + opts.current_line = (opts.current_file == nil) and get_current_buf_line(opts.winnr) or nil + opts.current_file = vim.F.if_nil(opts.current_file, vim.api.nvim_buf_get_name(opts.bufnr)) + opts.entry_maker = vim.F.if_nil(opts.entry_maker, make_entry.gen_from_git_commits(opts)) + local git_command = + vim.F.if_nil(opts.git_command, { "git", "log", "--pretty=oneline", "--abbrev-commit", "--follow" }) + + pickers + .new(opts, { + prompt_title = "Git BCommits", + finder = finders.new_oneshot_job( + vim.tbl_flatten { + git_command, + opts.current_file, + }, + opts + ), + previewer = { + previewers.git_commit_diff_to_parent.new(opts), + previewers.git_commit_diff_to_head.new(opts), + previewers.git_commit_diff_as_was.new(opts), + previewers.git_commit_message.new(opts), + }, + sorter = conf.file_sorter(opts), + attach_mappings = function() + actions.select_default:replace(actions.git_checkout_current_buffer) + local transfrom_file = function() + return opts.current_file and Path:new(opts.current_file):make_relative(opts.cwd) or "" + end + + local get_buffer_of_orig = function(selection) + local value = selection.value .. ":" .. transfrom_file() + local content = utils.get_os_command_output({ "git", "--no-pager", "show", value }, opts.cwd) + + local bufnr = vim.api.nvim_create_buf(false, true) + vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, content) + vim.api.nvim_buf_set_name(bufnr, "Original") + return bufnr + end + + local vimdiff = function(selection, command) + local ft = vim.bo.filetype + vim.cmd "diffthis" + + local bufnr = get_buffer_of_orig(selection) + vim.cmd(string.format("%s %s", command, bufnr)) + vim.bo.filetype = ft + vim.cmd "diffthis" + + vim.api.nvim_create_autocmd("WinClosed", { + buffer = bufnr, + nested = true, + once = true, + callback = function() + vim.api.nvim_buf_delete(bufnr, { force = true }) + end, + }) + end + + actions.select_vertical:replace(function(prompt_bufnr) + actions.close(prompt_bufnr) + local selection = action_state.get_selected_entry() + vimdiff(selection, "leftabove vert sbuffer") + end) + + actions.select_horizontal:replace(function(prompt_bufnr) + actions.close(prompt_bufnr) + local selection = action_state.get_selected_entry() + vimdiff(selection, "belowright sbuffer") + end) + + actions.select_tab:replace(function(prompt_bufnr) + actions.close(prompt_bufnr) + local selection = action_state.get_selected_entry() + vim.cmd("tabedit " .. transfrom_file()) + vimdiff(selection, "leftabove vert sbuffer") + end) + return true + end, + }) + :find() +end + +git.branches = function(opts) + local format = "%(HEAD)" + .. "%(refname)" + .. "%(authorname)" + .. "%(upstream:lstrip=2)" + .. "%(committerdate:format-local:%Y/%m/%d %H:%M:%S)" + local output = + utils.get_os_command_output({ "git", "for-each-ref", "--perl", "--format", format, opts.pattern }, opts.cwd) + + local results = {} + local widths = { + name = 0, + authorname = 0, + upstream = 0, + committerdate = 0, + } + local unescape_single_quote = function(v) + return string.gsub(v, "\\([\\'])", "%1") + end + local parse_line = function(line) + local fields = vim.split(string.sub(line, 2, -2), "''", true) + local entry = { + head = fields[1], + refname = unescape_single_quote(fields[2]), + authorname = unescape_single_quote(fields[3]), + upstream = unescape_single_quote(fields[4]), + committerdate = fields[5], + } + local prefix + if vim.startswith(entry.refname, "refs/remotes/") then + prefix = "refs/remotes/" + elseif vim.startswith(entry.refname, "refs/heads/") then + prefix = "refs/heads/" + else + return + end + local index = 1 + if entry.head ~= "*" then + index = #results + 1 + end + + entry.name = string.sub(entry.refname, string.len(prefix) + 1) + for key, value in pairs(widths) do + widths[key] = math.max(value, strings.strdisplaywidth(entry[key] or "")) + end + if string.len(entry.upstream) > 0 then + widths.upstream_indicator = 2 + end + table.insert(results, index, entry) + end + for _, line in ipairs(output) do + parse_line(line) + end + if #results == 0 then + return + end + + local displayer = entry_display.create { + separator = " ", + items = { + { width = 1 }, + { width = widths.name }, + { width = widths.authorname }, + { width = widths.upstream_indicator }, + { width = widths.upstream }, + { width = widths.committerdate }, + }, + } + + local make_display = function(entry) + return displayer { + { entry.head }, + { entry.name, "TelescopeResultsIdentifier" }, + { entry.authorname }, + { string.len(entry.upstream) > 0 and "=>" or "" }, + { entry.upstream, "TelescopeResultsIdentifier" }, + { entry.committerdate }, + } + end + + pickers + .new(opts, { + prompt_title = "Git Branches", + finder = finders.new_table { + results = results, + entry_maker = function(entry) + entry.value = entry.name + entry.ordinal = entry.name + entry.display = make_display + return make_entry.set_default_entry_mt(entry, opts) + end, + }, + previewer = previewers.git_branch_log.new(opts), + sorter = conf.file_sorter(opts), + attach_mappings = function(_, map) + actions.select_default:replace(actions.git_checkout) + map("i", "", actions.git_track_branch) + map("n", "", actions.git_track_branch) + + map("i", "", actions.git_rebase_branch) + map("n", "", actions.git_rebase_branch) + + map("i", "", actions.git_create_branch) + map("n", "", actions.git_create_branch) + + map("i", "", actions.git_switch_branch) + map("n", "", actions.git_switch_branch) + + map("i", "", actions.git_delete_branch) + map("n", "", actions.git_delete_branch) + + map("i", "", actions.git_merge_branch) + map("n", "", actions.git_merge_branch) + return true + end, + }) + :find() +end + +git.status = function(opts) + if opts.is_bare then + utils.notify("builtin.git_status", { + msg = "This operation must be run in a work tree", + level = "ERROR", + }) + return + end + + local gen_new_finder = function() + local expand_dir = vim.F.if_nil(opts.expand_dir, true) + local git_cmd = { "git", "status", "-s", "--", "." } + + if expand_dir then + table.insert(git_cmd, #git_cmd - 1, "-u") + end + + local output = utils.get_os_command_output(git_cmd, opts.cwd) + + if #output == 0 then + print "No changes found" + utils.notify("builtin.git_status", { + msg = "No changes found", + level = "WARN", + }) + return + end + + return finders.new_table { + results = output, + entry_maker = vim.F.if_nil(opts.entry_maker, make_entry.gen_from_git_status(opts)), + } + end + + local initial_finder = gen_new_finder() + if not initial_finder then + return + end + + pickers + .new(opts, { + prompt_title = "Git Status", + finder = initial_finder, + previewer = previewers.git_file_diff.new(opts), + sorter = conf.file_sorter(opts), + attach_mappings = function(prompt_bufnr, map) + actions.git_staging_toggle:enhance { + post = function() + action_state.get_current_picker(prompt_bufnr):refresh(gen_new_finder(), { reset_prompt = true }) + end, + } + + map("i", "", actions.git_staging_toggle) + map("n", "", actions.git_staging_toggle) + return true + end, + }) + :find() +end + +local set_opts_cwd = function(opts) + if opts.cwd then + opts.cwd = vim.fn.expand(opts.cwd) + else + opts.cwd = vim.loop.cwd() + end + + -- Find root of git directory and remove trailing newline characters + local git_root, ret = utils.get_os_command_output({ "git", "rev-parse", "--show-toplevel" }, opts.cwd) + local use_git_root = vim.F.if_nil(opts.use_git_root, true) + + if ret ~= 0 then + local in_worktree = utils.get_os_command_output({ "git", "rev-parse", "--is-inside-work-tree" }, 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 + utils.notify("builtin.git", { + msg = opts.cwd .. " is not a git directory", + level = "ERROR", + }) + return false + elseif in_worktree[1] ~= "true" and in_bare[1] == "true" then + opts.is_bare = true + end + else + if use_git_root then + opts.cwd = git_root[1] + end + end + + return true +end + +local function apply_checks(mod) + for k, v in pairs(mod) do + mod[k] = function(opts) + opts = vim.F.if_nil(opts, {}) + + local ok = set_opts_cwd(opts) + if ok then + v(opts) + end + end + end + + return mod +end + +return apply_checks(git) diff --git a/bundle/telescope.nvim/lua/telescope/builtin/__internal.lua b/bundle/telescope.nvim/lua/telescope/builtin/__internal.lua new file mode 100644 index 000000000..3684518a6 --- /dev/null +++ b/bundle/telescope.nvim/lua/telescope/builtin/__internal.lua @@ -0,0 +1,1369 @@ +local actions = require "telescope.actions" +local action_set = require "telescope.actions.set" +local action_state = require "telescope.actions.state" +local finders = require "telescope.finders" +local make_entry = require "telescope.make_entry" +local Path = require "plenary.path" +local pickers = require "telescope.pickers" +local previewers = require "telescope.previewers" +local p_window = require "telescope.pickers.window" +local state = require "telescope.state" +local utils = require "telescope.utils" + +local conf = require("telescope.config").values + +local filter = vim.tbl_filter + +-- Makes sure aliased options are set correctly +local function apply_cwd_only_aliases(opts) + local has_cwd_only = opts.cwd_only ~= nil + local has_only_cwd = opts.only_cwd ~= nil + + if has_only_cwd and not has_cwd_only then + -- Internally, use cwd_only + opts.cwd_only = opts.only_cwd + opts.only_cwd = nil + end + + return opts +end + +local internal = {} + +internal.builtin = function(opts) + opts.include_extensions = vim.F.if_nil(opts.include_extensions, false) + opts.use_default_opts = vim.F.if_nil(opts.use_default_opts, false) + + local objs = {} + + for k, v in pairs(require "telescope.builtin") do + local debug_info = debug.getinfo(v) + table.insert(objs, { + filename = string.sub(debug_info.source, 2), + text = k, + }) + end + + local title = "Telescope Builtin" + + if opts.include_extensions then + title = "Telescope Pickers" + for ext, funcs in pairs(require("telescope").extensions) do + for func_name, func_obj in pairs(funcs) do + -- Only include exported functions whose name doesn't begin with an underscore + if type(func_obj) == "function" and string.sub(func_name, 0, 1) ~= "_" then + local debug_info = debug.getinfo(func_obj) + table.insert(objs, { + filename = string.sub(debug_info.source, 2), + text = string.format("%s : %s", ext, func_name), + }) + end + end + end + end + + opts.bufnr = vim.api.nvim_get_current_buf() + opts.winnr = vim.api.nvim_get_current_win() + pickers + .new(opts, { + prompt_title = title, + finder = finders.new_table { + results = objs, + entry_maker = function(entry) + return make_entry.set_default_entry_mt({ + value = entry, + text = entry.text, + display = entry.text, + ordinal = entry.text, + filename = entry.filename, + }, opts) + end, + }, + previewer = previewers.builtin.new(opts), + sorter = conf.generic_sorter(opts), + attach_mappings = function(_) + actions.select_default:replace(function(prompt_bufnr) + local selection = action_state.get_selected_entry() + if not selection then + utils.__warn_no_selection "builtin.builtin" + return + end + + -- we do this to avoid any surprises + opts.include_extensions = nil + + local picker_opts + if not opts.use_default_opts then + picker_opts = opts + end + + actions.close(prompt_bufnr) + if string.match(selection.text, " : ") then + -- Call appropriate function from extensions + local split_string = vim.split(selection.text, " : ") + local ext = split_string[1] + local func = split_string[2] + require("telescope").extensions[ext][func](picker_opts) + else + -- Call appropriate telescope builtin + require("telescope.builtin")[selection.text](picker_opts) + end + end) + return true + end, + }) + :find() +end + +internal.resume = function(opts) + opts = opts or {} + opts.cache_index = vim.F.if_nil(opts.cache_index, 1) + + local cached_pickers = state.get_global_key "cached_pickers" + if cached_pickers == nil or vim.tbl_isempty(cached_pickers) then + utils.notify("builtin.resume", { + msg = "No cached picker(s).", + level = "INFO", + }) + return + end + local picker = cached_pickers[opts.cache_index] + if picker == nil then + utils.notify("builtin.resume", { + msg = string.format("Index too large as there are only '%s' pickers cached", #cached_pickers), + level = "ERROR", + }) + return + end + -- reset layout strategy and get_window_options if default as only one is valid + -- and otherwise unclear which was actually set + if picker.layout_strategy == conf.layout_strategy then + picker.layout_strategy = nil + end + if picker.get_window_options == p_window.get_window_options then + picker.get_window_options = nil + end + picker.cache_picker.index = opts.cache_index + + -- avoid partial `opts.cache_picker` at picker creation + if opts.cache_picker ~= false then + picker.cache_picker = vim.tbl_extend("keep", opts.cache_picker or {}, picker.cache_picker) + else + picker.cache_picker.disabled = true + end + opts.cache_picker = nil + picker.previewer = picker.all_previewers + if picker.hidden_previewer then + picker.hidden_previewer = nil + opts.previewer = vim.F.if_nil(opts.previewer, false) + end + pickers.new(opts, picker):find() +end + +internal.pickers = function(opts) + local cached_pickers = state.get_global_key "cached_pickers" + if cached_pickers == nil or vim.tbl_isempty(cached_pickers) then + utils.notify("builtin.pickers", { + msg = "No cached picker(s).", + level = "INFO", + }) + return + end + + opts = opts or {} + + -- clear cache picker for immediate pickers.new and pass option to resumed picker + if opts.cache_picker ~= nil then + opts._cache_picker = opts.cache_picker + opts.cache_picker = nil + end + + pickers + .new(opts, { + prompt_title = "Pickers", + finder = finders.new_table { + results = cached_pickers, + entry_maker = make_entry.gen_from_picker(opts), + }, + previewer = previewers.pickers.new(opts), + sorter = conf.generic_sorter(opts), + cache_picker = false, + attach_mappings = function(_, map) + actions.select_default:replace(function(prompt_bufnr) + local current_picker = action_state.get_current_picker(prompt_bufnr) + local selection_index = current_picker:get_index(current_picker:get_selection_row()) + actions.close(prompt_bufnr) + opts.cache_picker = opts._cache_picker + opts["cache_index"] = selection_index + opts["initial_mode"] = cached_pickers[selection_index].initial_mode + internal.resume(opts) + end) + map("i", "", actions.remove_selected_picker) + map("n", "", actions.remove_selected_picker) + return true + end, + }) + :find() +end + +internal.planets = function(opts) + local show_pluto = opts.show_pluto or false + local show_moon = opts.show_moon or false + + local sourced_file = require("plenary.debug_utils").sourced_filepath() + local base_directory = vim.fn.fnamemodify(sourced_file, ":h:h:h:h") + + local globbed_files = vim.fn.globpath(base_directory .. "/data/memes/planets/", "*", true, true) + local acceptable_files = {} + for _, v in ipairs(globbed_files) do + if (show_pluto or not v:find "pluto") and (show_moon or not v:find "moon") then + table.insert(acceptable_files, vim.fn.fnamemodify(v, ":t")) + end + end + + pickers + .new(opts, { + prompt_title = "Planets", + finder = finders.new_table { + results = acceptable_files, + entry_maker = function(line) + return make_entry.set_default_entry_mt({ + ordinal = line, + display = line, + filename = base_directory .. "/data/memes/planets/" .. line, + }, opts) + end, + }, + previewer = previewers.cat.new(opts), + sorter = conf.generic_sorter(opts), + attach_mappings = function(prompt_bufnr) + actions.select_default:replace(function() + local selection = action_state.get_selected_entry() + if selection == nil then + utils.__warn_no_selection "builtin.planets" + return + end + + actions.close(prompt_bufnr) + print("Enjoy astronomy! You viewed:", selection.display) + end) + + return true + end, + }) + :find() +end + +internal.symbols = function(opts) + local initial_mode = vim.fn.mode() + local files = vim.api.nvim_get_runtime_file("data/telescope-sources/*.json", true) + local data_path = (function() + if not opts.symbol_path then + return Path:new { vim.fn.stdpath "data", "telescope", "symbols" } + else + return Path:new { opts.symbol_path } + end + end)() + if data_path:exists() then + for _, v in ipairs(require("plenary.scandir").scan_dir(data_path:absolute(), { search_pattern = "%.json$" })) do + table.insert(files, v) + end + end + + if #files == 0 then + utils.notify("builtin.symbols", { + msg = "No sources found! Check out https://github.com/nvim-telescope/telescope-symbols.nvim " + .. "for some prebuild symbols or how to create you own symbol source.", + level = "ERROR", + }) + return + end + + local sources = {} + if opts.sources then + for _, v in ipairs(files) do + for _, s in ipairs(opts.sources) do + if v:find(s) then + table.insert(sources, v) + end + end + end + else + sources = files + end + + local results = {} + for _, source in ipairs(sources) do + local data = vim.json.decode(Path:new(source):read()) + for _, entry in ipairs(data) do + table.insert(results, entry) + end + end + + pickers + .new(opts, { + prompt_title = "Symbols", + finder = finders.new_table { + results = results, + entry_maker = function(entry) + return make_entry.set_default_entry_mt({ + value = entry, + ordinal = entry[1] .. " " .. entry[2], + display = entry[1] .. " " .. entry[2], + }, opts) + end, + }, + sorter = conf.generic_sorter(opts), + attach_mappings = function(_) + if initial_mode == "i" then + actions.select_default:replace(actions.insert_symbol_i) + else + actions.select_default:replace(actions.insert_symbol) + end + return true + end, + }) + :find() +end + +internal.commands = function(opts) + pickers + .new(opts, { + prompt_title = "Commands", + finder = finders.new_table { + results = (function() + local command_iter = vim.api.nvim_get_commands {} + local commands = {} + + for _, cmd in pairs(command_iter) do + table.insert(commands, cmd) + end + + local need_buf_command = vim.F.if_nil(opts.show_buf_command, true) + + if need_buf_command then + local buf_command_iter = vim.api.nvim_buf_get_commands(0, {}) + buf_command_iter[true] = nil -- remove the redundant entry + for _, cmd in pairs(buf_command_iter) do + table.insert(commands, cmd) + end + end + return commands + end)(), + + entry_maker = opts.entry_maker or make_entry.gen_from_commands(opts), + }, + sorter = conf.generic_sorter(opts), + attach_mappings = function(prompt_bufnr) + actions.select_default:replace(function() + local selection = action_state.get_selected_entry() + if selection == nil then + utils.__warn_no_selection "builtin.commands" + return + end + + actions.close(prompt_bufnr) + local val = selection.value + local cmd = string.format([[:%s ]], val.name) + + if val.nargs == "0" then + vim.cmd(cmd) + else + vim.cmd [[stopinsert]] + vim.fn.feedkeys(cmd, "n") + end + end) + + return true + end, + }) + :find() +end + +internal.quickfix = function(opts) + local qf_identifier = opts.id or vim.F.if_nil(opts.nr, "$") + local locations = vim.fn.getqflist({ [opts.id and "id" or "nr"] = qf_identifier, items = true }).items + + if vim.tbl_isempty(locations) then + return + end + + pickers + .new(opts, { + prompt_title = "Quickfix", + finder = finders.new_table { + results = locations, + entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts), + }, + previewer = conf.qflist_previewer(opts), + sorter = conf.generic_sorter(opts), + }) + :find() +end + +internal.quickfixhistory = function(opts) + local qflists = {} + for i = 1, 10 do -- (n)vim keeps at most 10 quickfix lists in full + -- qf weirdness: id = 0 gets id of quickfix list nr + local qflist = vim.fn.getqflist { nr = i, id = 0, title = true, items = true } + if not vim.tbl_isempty(qflist.items) then + table.insert(qflists, qflist) + end + end + local entry_maker = opts.make_entry + or function(entry) + return make_entry.set_default_entry_mt({ + value = entry.title or "Untitled", + ordinal = entry.title or "Untitled", + display = entry.title or "Untitled", + nr = entry.nr, + id = entry.id, + items = entry.items, + }, opts) + end + local qf_entry_maker = make_entry.gen_from_quickfix(opts) + pickers + .new(opts, { + prompt_title = "Quickfix History", + finder = finders.new_table { + results = qflists, + entry_maker = entry_maker, + }, + previewer = previewers.new_buffer_previewer { + title = "Quickfix List Preview", + dyn_title = function(_, entry) + return entry.title + end, + + get_buffer_by_name = function(_, entry) + return "quickfixlist_" .. tostring(entry.nr) + end, + + define_preview = function(self, entry) + if self.state.bufname then + return + end + local entries = vim.tbl_map(function(i) + return qf_entry_maker(i):display() + end, entry.items) + vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, entries) + end, + }, + sorter = conf.generic_sorter(opts), + attach_mappings = function(_, _) + action_set.select:replace(function(prompt_bufnr) + local nr = action_state.get_selected_entry().nr + actions.close(prompt_bufnr) + internal.quickfix { nr = nr } + end) + return true + end, + }) + :find() +end + +internal.loclist = function(opts) + local locations = vim.fn.getloclist(0) + local filenames = {} + for _, value in pairs(locations) do + local bufnr = value.bufnr + if filenames[bufnr] == nil then + filenames[bufnr] = vim.api.nvim_buf_get_name(bufnr) + end + value.filename = filenames[bufnr] + end + + if vim.tbl_isempty(locations) then + return + end + + pickers + .new(opts, { + prompt_title = "Loclist", + finder = finders.new_table { + results = locations, + entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts), + }, + previewer = conf.qflist_previewer(opts), + sorter = conf.generic_sorter(opts), + }) + :find() +end + +internal.oldfiles = function(opts) + opts = apply_cwd_only_aliases(opts) + opts.include_current_session = vim.F.if_nil(opts.include_current_session, true) + + local current_buffer = vim.api.nvim_get_current_buf() + local current_file = vim.api.nvim_buf_get_name(current_buffer) + local results = {} + + if opts.include_current_session then + for _, buffer in ipairs(vim.split(vim.fn.execute ":buffers! t", "\n")) do + local match = tonumber(string.match(buffer, "%s*(%d+)")) + local open_by_lsp = string.match(buffer, "line 0$") + if match and not open_by_lsp then + local file = vim.api.nvim_buf_get_name(match) + if vim.loop.fs_stat(file) and match ~= current_buffer then + table.insert(results, file) + end + end + end + end + + 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 + table.insert(results, file) + end + end + + if opts.cwd_only then + local cwd = vim.loop.cwd() + cwd = cwd:gsub([[\]], [[\\]]) + results = vim.tbl_filter(function(file) + return vim.fn.matchstrpos(file, cwd)[2] ~= -1 + end, results) + end + + pickers + .new(opts, { + prompt_title = "Oldfiles", + finder = finders.new_table { + results = results, + entry_maker = opts.entry_maker or make_entry.gen_from_file(opts), + }, + sorter = conf.file_sorter(opts), + previewer = conf.file_previewer(opts), + }) + :find() +end + +internal.command_history = function(opts) + local history_string = vim.fn.execute "history cmd" + local history_list = vim.split(history_string, "\n") + + local results = {} + for i = #history_list, 3, -1 do + local item = history_list[i] + local _, finish = string.find(item, "%d+ +") + table.insert(results, string.sub(item, finish + 1)) + end + + pickers + .new(opts, { + prompt_title = "Command History", + finder = finders.new_table(results), + sorter = conf.generic_sorter(opts), + + attach_mappings = function(_, map) + map("i", "", actions.set_command_line) + map("n", "", actions.set_command_line) + map("n", "", actions.edit_command_line) + map("i", "", actions.edit_command_line) + + -- TODO: Find a way to insert the text... it seems hard. + -- map('i', '', actions.insert_value, { expr = true }) + + return true + end, + }) + :find() +end + +internal.search_history = function(opts) + local search_string = vim.fn.execute "history search" + local search_list = vim.split(search_string, "\n") + + local results = {} + for i = #search_list, 3, -1 do + local item = search_list[i] + local _, finish = string.find(item, "%d+ +") + table.insert(results, string.sub(item, finish + 1)) + end + + pickers + .new(opts, { + prompt_title = "Search History", + finder = finders.new_table(results), + sorter = conf.generic_sorter(opts), + + attach_mappings = function(_, map) + map("i", "", actions.set_search_line) + map("n", "", actions.set_search_line) + map("n", "", actions.edit_search_line) + map("i", "", actions.edit_search_line) + + -- TODO: Find a way to insert the text... it seems hard. + -- map('i', '', actions.insert_value, { expr = true }) + + return true + end, + }) + :find() +end + +internal.vim_options = function(opts) + local res = {} + for _, v in pairs(vim.api.nvim_get_all_options_info()) do + table.insert(res, v) + end + table.sort(res, function(left, right) + return left.name < right.name + end) + + pickers + .new(opts, { + prompt_title = "options", + finder = finders.new_table { + results = res, + entry_maker = opts.entry_maker or make_entry.gen_from_vimoptions(opts), + }, + sorter = conf.generic_sorter(opts), + attach_mappings = function() + actions.select_default:replace(function() + local selection = action_state.get_selected_entry() + if selection == nil then + utils.__warn_no_selection "builtin.vim_options" + return + end + + local esc = "" + if vim.fn.mode() == "i" then + esc = vim.api.nvim_replace_termcodes("", true, false, true) + end + + vim.api.nvim_feedkeys( + string.format("%s:set %s=%s", esc, selection.value.name, selection.value.value), + "m", + true + ) + end) + + return true + end, + }) + :find() +end + +internal.help_tags = function(opts) + opts.lang = vim.F.if_nil(opts.lang, vim.o.helplang) + opts.fallback = vim.F.if_nil(opts.fallback, true) + opts.file_ignore_patterns = {} + + local langs = vim.split(opts.lang, ",", true) + if opts.fallback and not vim.tbl_contains(langs, "en") then + table.insert(langs, "en") + end + local langs_map = {} + for _, lang in ipairs(langs) do + langs_map[lang] = true + end + + local tag_files = {} + local function add_tag_file(lang, file) + if langs_map[lang] then + if tag_files[lang] then + table.insert(tag_files[lang], file) + else + tag_files[lang] = { file } + end + end + end + + local help_files = {} + local all_files = vim.api.nvim_get_runtime_file("doc/*", true) + for _, fullpath in ipairs(all_files) do + local file = utils.path_tail(fullpath) + if file == "tags" then + add_tag_file("en", fullpath) + elseif file:match "^tags%-..$" then + local lang = file:sub(-2) + add_tag_file(lang, fullpath) + else + help_files[file] = fullpath + end + end + + local tags = {} + local tags_map = {} + local delimiter = string.char(9) + for _, lang in ipairs(langs) do + for _, file in ipairs(tag_files[lang] or {}) do + local lines = vim.split(Path:new(file):read(), "\n", true) + for _, line in ipairs(lines) do + -- TODO: also ignore tagComment starting with ';' + if not line:match "^!_TAG_" then + local fields = vim.split(line, delimiter, true) + if #fields == 3 and not tags_map[fields[1]] then + if fields[1] ~= "help-tags" or fields[2] ~= "tags" then + table.insert(tags, { + name = fields[1], + filename = help_files[fields[2]], + cmd = fields[3], + lang = lang, + }) + tags_map[fields[1]] = true + end + end + end + end + end + end + + pickers + .new(opts, { + prompt_title = "Help", + finder = finders.new_table { + results = tags, + entry_maker = function(entry) + return make_entry.set_default_entry_mt({ + value = entry.name .. "@" .. entry.lang, + display = entry.name, + ordinal = entry.name, + filename = entry.filename, + cmd = entry.cmd, + }, opts) + end, + }, + previewer = previewers.help.new(opts), + sorter = conf.generic_sorter(opts), + attach_mappings = function(prompt_bufnr) + action_set.select:replace(function(_, cmd) + local selection = action_state.get_selected_entry() + if selection == nil then + utils.__warn_no_selection "builtin.help_tags" + return + end + + actions.close(prompt_bufnr) + if cmd == "default" or cmd == "horizontal" then + vim.cmd("help " .. selection.value) + elseif cmd == "vertical" then + vim.cmd("vert help " .. selection.value) + elseif cmd == "tab" then + vim.cmd("tab help " .. selection.value) + end + end) + + return true + end, + }) + :find() +end + +internal.man_pages = function(opts) + opts.sections = vim.F.if_nil(opts.sections, { "1" }) + assert(vim.tbl_islist(opts.sections), "sections should be a list") + opts.man_cmd = utils.get_lazy_default(opts.man_cmd, function() + local is_darwin = vim.loop.os_uname().sysname == "Darwin" + return is_darwin and { "apropos", " " } or { "apropos", "" } + end) + opts.entry_maker = opts.entry_maker or make_entry.gen_from_apropos(opts) + opts.env = { PATH = vim.env.PATH, MANPATH = vim.env.MANPATH } + + pickers + .new(opts, { + prompt_title = "Man", + finder = finders.new_oneshot_job(opts.man_cmd, opts), + previewer = previewers.man.new(opts), + sorter = conf.generic_sorter(opts), + attach_mappings = function(prompt_bufnr) + action_set.select:replace(function(_, cmd) + local selection = action_state.get_selected_entry() + if selection == nil then + utils.__warn_no_selection "builtin.man_pages" + return + end + + local args = selection.section .. " " .. selection.value + actions.close(prompt_bufnr) + if cmd == "default" or cmd == "horizontal" then + vim.cmd("Man " .. args) + elseif cmd == "vertical" then + vim.cmd("vert Man " .. args) + elseif cmd == "tab" then + vim.cmd("tab Man " .. args) + end + end) + + return true + end, + }) + :find() +end + +internal.reloader = function(opts) + local package_list = vim.tbl_keys(package.loaded) + + -- filter out packages we don't want and track the longest package name + local column_len = 0 + for index, module_name in pairs(package_list) do + if + type(require(module_name)) ~= "table" + or module_name:sub(1, 1) == "_" + or package.searchpath(module_name, package.path) == nil + then + table.remove(package_list, index) + elseif #module_name > column_len then + column_len = #module_name + end + end + opts.column_len = vim.F.if_nil(opts.column_len, column_len) + + pickers + .new(opts, { + prompt_title = "Packages", + finder = finders.new_table { + results = package_list, + entry_maker = opts.entry_maker or make_entry.gen_from_packages(opts), + }, + -- previewer = previewers.vim_buffer.new(opts), + sorter = conf.generic_sorter(opts), + + attach_mappings = function(prompt_bufnr) + actions.select_default:replace(function() + local selection = action_state.get_selected_entry() + if selection == nil then + utils.__warn_no_selection "builtin.reloader" + return + end + + actions.close(prompt_bufnr) + require("plenary.reload").reload_module(selection.value) + utils.notify("builtin.reloader", { + msg = string.format("[%s] - module reloaded", selection.value), + level = "INFO", + }) + end) + + return true + end, + }) + :find() +end + +internal.buffers = function(opts) + opts = apply_cwd_only_aliases(opts) + local bufnrs = filter(function(b) + if 1 ~= vim.fn.buflisted(b) then + return false + end + -- only hide unloaded buffers if opts.show_all_buffers is false, keep them listed if true or nil + if opts.show_all_buffers == false and not vim.api.nvim_buf_is_loaded(b) then + return false + end + if opts.ignore_current_buffer and b == vim.api.nvim_get_current_buf() then + return false + end + if opts.cwd_only and not string.find(vim.api.nvim_buf_get_name(b), vim.loop.cwd(), 1, true) then + return false + end + return true + end, vim.api.nvim_list_bufs()) + if not next(bufnrs) then + return + end + if opts.sort_mru then + table.sort(bufnrs, function(a, b) + return vim.fn.getbufinfo(a)[1].lastused > vim.fn.getbufinfo(b)[1].lastused + end) + end + + local buffers = {} + local default_selection_idx = 1 + for _, bufnr in ipairs(bufnrs) do + local flag = bufnr == vim.fn.bufnr "" and "%" or (bufnr == vim.fn.bufnr "#" and "#" or " ") + + if opts.sort_lastused and not opts.ignore_current_buffer and flag == "#" then + default_selection_idx = 2 + end + + local element = { + bufnr = bufnr, + flag = flag, + info = vim.fn.getbufinfo(bufnr)[1], + } + + if opts.sort_lastused and (flag == "#" or flag == "%") then + local idx = ((buffers[1] ~= nil and buffers[1].flag == "%") and 2 or 1) + table.insert(buffers, idx, element) + else + table.insert(buffers, element) + end + end + + if not opts.bufnr_width then + local max_bufnr = math.max(unpack(bufnrs)) + opts.bufnr_width = #tostring(max_bufnr) + end + + pickers + .new(opts, { + prompt_title = "Buffers", + finder = finders.new_table { + results = buffers, + entry_maker = opts.entry_maker or make_entry.gen_from_buffer(opts), + }, + previewer = conf.grep_previewer(opts), + sorter = conf.generic_sorter(opts), + default_selection_index = default_selection_idx, + }) + :find() +end + +internal.colorscheme = function(opts) + local before_background = vim.o.background + local before_color = vim.api.nvim_exec("colorscheme", true) + local need_restore = true + + local colors = opts.colors or { before_color } + if not vim.tbl_contains(colors, before_color) then + table.insert(colors, 1, before_color) + end + + colors = vim.list_extend( + colors, + vim.tbl_filter(function(color) + return color ~= before_color + end, vim.fn.getcompletion("", "color")) + ) + + local previewer + if opts.enable_preview then + -- define previewer + local bufnr = vim.api.nvim_get_current_buf() + local p = vim.api.nvim_buf_get_name(bufnr) + + -- don't need previewer + if vim.fn.buflisted(bufnr) ~= 1 then + local deleted = false + local function del_win(win_id) + if win_id and vim.api.nvim_win_is_valid(win_id) then + utils.buf_delete(vim.api.nvim_win_get_buf(win_id)) + pcall(vim.api.nvim_win_close, win_id, true) + end + end + + previewer = previewers.new { + preview_fn = function(_, entry, status) + if not deleted then + deleted = true + del_win(status.preview_win) + del_win(status.preview_border_win) + end + vim.cmd("colorscheme " .. entry.value) + end, + } + else + -- show current buffer content in previewer + previewer = previewers.new_buffer_previewer { + get_buffer_by_name = function() + return p + end, + define_preview = function(self, entry) + if vim.loop.fs_stat(p) then + conf.buffer_previewer_maker(p, self.state.bufnr, { bufname = self.state.bufname }) + else + local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false) + vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, lines) + end + vim.cmd("colorscheme " .. entry.value) + end, + } + end + end + + local picker = pickers.new(opts, { + prompt_title = "Change Colorscheme", + finder = finders.new_table { + results = colors, + }, + sorter = conf.generic_sorter(opts), + previewer = previewer, + attach_mappings = function(prompt_bufnr) + actions.select_default:replace(function() + local selection = action_state.get_selected_entry() + if selection == nil then + utils.__warn_no_selection "builtin.colorscheme" + return + end + + actions.close(prompt_bufnr) + need_restore = false + vim.cmd("colorscheme " .. selection.value) + end) + + return true + end, + }) + + if opts.enable_preview then + -- rewrite picker.close_windows. restore color if needed + local close_windows = picker.close_windows + picker.close_windows = function(status) + close_windows(status) + if need_restore then + vim.o.background = before_background + vim.cmd("colorscheme " .. before_color) + end + end + end + + picker:find() +end + +internal.marks = function(opts) + local local_marks = { + items = vim.fn.getmarklist(opts.bufnr), + name_func = function(_, line) + return vim.api.nvim_buf_get_lines(opts.bufnr, line - 1, line, false)[1] + end, + } + local global_marks = { + items = vim.fn.getmarklist(), + name_func = function(mark, _) + -- get buffer name if it is opened, otherwise get file name + return vim.api.nvim_get_mark(mark, {})[4] + end, + } + local marks_table = {} + local marks_others = {} + local bufname = vim.api.nvim_buf_get_name(opts.bufnr) + for _, cnf in ipairs { local_marks, global_marks } do + for _, v in ipairs(cnf.items) do + -- strip the first single quote character + local mark = string.sub(v.mark, 2, 3) + local _, lnum, col, _ = unpack(v.pos) + local name = cnf.name_func(mark, lnum) + -- same format to :marks command + local line = string.format("%s %6d %4d %s", mark, lnum, col - 1, name) + local row = { + line = line, + lnum = lnum, + col = col, + filename = v.file or bufname, + } + -- non alphanumeric marks goes to last + if mark:match "%w" then + table.insert(marks_table, row) + else + table.insert(marks_others, row) + end + end + end + marks_table = vim.fn.extend(marks_table, marks_others) + + pickers + .new(opts, { + prompt_title = "Marks", + finder = finders.new_table { + results = marks_table, + entry_maker = opts.entry_maker or make_entry.gen_from_marks(opts), + }, + previewer = conf.grep_previewer(opts), + sorter = conf.generic_sorter(opts), + push_cursor_on_edit = true, + push_tagstack_on_edit = true, + }) + :find() +end + +internal.registers = function(opts) + local registers_table = { '"', "_", "#", "=", "_", "/", "*", "+", ":", ".", "%" } + + -- named + for i = 0, 9 do + table.insert(registers_table, tostring(i)) + end + + -- alphabetical + for i = 65, 90 do + table.insert(registers_table, string.char(i)) + end + + pickers + .new(opts, { + prompt_title = "Registers", + finder = finders.new_table { + results = registers_table, + entry_maker = opts.entry_maker or make_entry.gen_from_registers(opts), + }, + sorter = conf.generic_sorter(opts), + attach_mappings = function(_, map) + actions.select_default:replace(actions.paste_register) + map("i", "", actions.edit_register) + + return true + end, + }) + :find() +end + +-- TODO: make filtering include the mapping and the action +internal.keymaps = function(opts) + opts.modes = vim.F.if_nil(opts.modes, { "n", "i", "c", "x" }) + opts.show_plug = vim.F.if_nil(opts.show_plug, true) + + local keymap_encountered = {} -- used to make sure no duplicates are inserted into keymaps_table + local keymaps_table = {} + local max_len_lhs = 0 + + -- helper function to populate keymaps_table and determine max_len_lhs + local function extract_keymaps(keymaps) + for _, keymap in pairs(keymaps) do + local keymap_key = keymap.buffer .. keymap.mode .. keymap.lhs -- should be distinct for every keymap + if not keymap_encountered[keymap_key] then + keymap_encountered[keymap_key] = true + if opts.show_plug or not string.find(keymap.lhs, "") then + table.insert(keymaps_table, keymap) + max_len_lhs = math.max(max_len_lhs, #utils.display_termcodes(keymap.lhs)) + end + end + end + end + + for _, mode in pairs(opts.modes) do + local global = vim.api.nvim_get_keymap(mode) + local buf_local = vim.api.nvim_buf_get_keymap(0, mode) + extract_keymaps(global) + extract_keymaps(buf_local) + end + opts.width_lhs = max_len_lhs + 1 + + pickers + .new(opts, { + prompt_title = "Key Maps", + finder = finders.new_table { + results = keymaps_table, + entry_maker = opts.entry_maker or make_entry.gen_from_keymaps(opts), + }, + sorter = conf.generic_sorter(opts), + attach_mappings = function(prompt_bufnr) + actions.select_default:replace(function() + local selection = action_state.get_selected_entry() + if selection == nil then + utils.__warn_no_selection "builtin.keymaps" + return + end + + vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(selection.value.lhs, true, false, true), "t", true) + return actions.close(prompt_bufnr) + end) + return true + end, + }) + :find() +end + +internal.filetypes = function(opts) + local filetypes = vim.fn.getcompletion("", "filetype") + + pickers + .new(opts, { + prompt_title = "Filetypes", + finder = finders.new_table { + results = filetypes, + }, + sorter = conf.generic_sorter(opts), + attach_mappings = function(prompt_bufnr) + actions.select_default:replace(function() + local selection = action_state.get_selected_entry() + if selection == nil then + print "[telescope] Nothing currently selected" + return + end + + actions.close(prompt_bufnr) + vim.cmd("setfiletype " .. selection[1]) + end) + return true + end, + }) + :find() +end + +internal.highlights = function(opts) + local highlights = vim.fn.getcompletion("", "highlight") + + pickers + .new(opts, { + prompt_title = "Highlights", + finder = finders.new_table { + results = highlights, + entry_maker = opts.entry_maker or make_entry.gen_from_highlights(opts), + }, + sorter = conf.generic_sorter(opts), + attach_mappings = function(prompt_bufnr) + actions.select_default:replace(function() + local selection = action_state.get_selected_entry() + if selection == nil then + utils.__warn_no_selection "builtin.highlights" + return + end + + actions.close(prompt_bufnr) + vim.cmd("hi " .. selection.value) + end) + return true + end, + previewer = previewers.highlights.new(opts), + }) + :find() +end + +internal.autocommands = function(opts) + local autocmds = vim.api.nvim_get_autocmds {} + table.sort(autocmds, function(lhs, rhs) + return lhs.event < rhs.event + end) + pickers + .new(opts, { + prompt_title = "autocommands", + finder = finders.new_table { + results = autocmds, + entry_maker = opts.entry_maker or make_entry.gen_from_autocommands(opts), + }, + previewer = previewers.autocommands.new(opts), + sorter = conf.generic_sorter(opts), + attach_mappings = function(prompt_bufnr) + action_set.select:replace_if(function() + local selection = action_state.get_selected_entry() + if selection == nil then + return false + end + local val = selection.value + local group_name = val.group_name ~= "" and val.group_name or "" + local output = + vim.fn.execute("verb autocmd " .. group_name .. " " .. val.event .. " " .. val.pattern, "silent") + for line in output:gmatch "[^\r\n]+" do + local source_file = line:match "Last set from (.*) line %d*$" or line:match "Last set from (.*)$" + if source_file and source_file ~= "Lua" then + selection.filename = source_file + local source_lnum = line:match "line (%d*)$" or "1" + selection.lnum = tonumber(source_lnum) + selection.col = 1 + return false + end + end + return true + end, function() + local selection = action_state.get_selected_entry() + actions.close(prompt_bufnr) + print("You selected autocmd: " .. vim.inspect(selection.value)) + end) + + return true + end, + }) + :find() +end + +internal.spell_suggest = function(opts) + local cursor_word = vim.fn.expand "" + local suggestions = vim.fn.spellsuggest(cursor_word) + + pickers + .new(opts, { + prompt_title = "Spelling Suggestions", + finder = finders.new_table { + results = suggestions, + }, + sorter = conf.generic_sorter(opts), + attach_mappings = function(prompt_bufnr) + actions.select_default:replace(function() + local selection = action_state.get_selected_entry() + if selection == nil then + utils.__warn_no_selection "builtin.spell_suggest" + return + end + + action_state.get_current_picker(prompt_bufnr)._original_mode = "i" + actions.close(prompt_bufnr) + vim.cmd("normal! ciw" .. selection[1]) + vim.cmd "stopinsert" + end) + return true + end, + }) + :find() +end + +internal.tagstack = function(opts) + opts = opts or {} + local tagstack = vim.fn.gettagstack().items + + local tags = {} + for i = #tagstack, 1, -1 do + local tag = tagstack[i] + tag.bufnr = tag.from[1] + if vim.api.nvim_buf_is_valid(tag.bufnr) then + tags[#tags + 1] = tag + tag.filename = vim.fn.bufname(tag.bufnr) + tag.lnum = tag.from[2] + tag.col = tag.from[3] + + tag.text = vim.api.nvim_buf_get_lines(tag.bufnr, tag.lnum - 1, tag.lnum, false)[1] or "" + end + end + + if vim.tbl_isempty(tags) then + utils.notify("builtin.tagstack", { + msg = "No tagstack available", + level = "WARN", + }) + return + end + + pickers + .new(opts, { + prompt_title = "TagStack", + finder = finders.new_table { + results = tags, + entry_maker = make_entry.gen_from_quickfix(opts), + }, + previewer = conf.qflist_previewer(opts), + sorter = conf.generic_sorter(opts), + }) + :find() +end + +internal.jumplist = function(opts) + opts = opts or {} + local jumplist = vim.fn.getjumplist()[1] + + -- reverse the list + local sorted_jumplist = {} + for i = #jumplist, 1, -1 do + 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] + or "" + table.insert(sorted_jumplist, jumplist[i]) + end + end + + pickers + .new(opts, { + prompt_title = "Jumplist", + finder = finders.new_table { + results = sorted_jumplist, + entry_maker = make_entry.gen_from_quickfix(opts), + }, + previewer = conf.qflist_previewer(opts), + sorter = conf.generic_sorter(opts), + }) + :find() +end + +local function apply_checks(mod) + for k, v in pairs(mod) do + mod[k] = function(opts) + opts = opts or {} + + v(opts) + end + end + + return mod +end + +return apply_checks(internal) diff --git a/bundle/telescope.nvim/lua/telescope/builtin/lsp.lua b/bundle/telescope.nvim/lua/telescope/builtin/__lsp.lua similarity index 60% rename from bundle/telescope.nvim/lua/telescope/builtin/lsp.lua rename to bundle/telescope.nvim/lua/telescope/builtin/__lsp.lua index af3b5d497..21aa8ed26 100644 --- a/bundle/telescope.nvim/lua/telescope/builtin/lsp.lua +++ b/bundle/telescope.nvim/lua/telescope/builtin/__lsp.lua @@ -1,5 +1,6 @@ local channel = require("plenary.async.control").channel - +local actions = require "telescope.actions" +local sorters = require "telescope.sorters" local conf = require("telescope.config").values local finders = require "telescope.finders" local make_entry = require "telescope.make_entry" @@ -24,7 +25,7 @@ lsp.references = function(opts) local locations = {} if result then local results = vim.lsp.util.locations_to_items(result, vim.lsp.get_client_by_id(ctx.client_id).offset_encoding) - if include_current_line then + if not include_current_line then locations = vim.tbl_filter(function(v) -- Remove current line from result return not (v.filename == filepath and v.lnum == lnum) @@ -38,22 +39,111 @@ lsp.references = function(opts) return end - pickers.new(opts, { - prompt_title = "LSP References", - finder = finders.new_table { - results = locations, - entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts), - }, - previewer = conf.qflist_previewer(opts), - sorter = conf.generic_sorter(opts), - push_cursor_on_edit = true, - }):find() + pickers + .new(opts, { + prompt_title = "LSP References", + finder = finders.new_table { + results = locations, + entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts), + }, + previewer = conf.qflist_previewer(opts), + sorter = conf.generic_sorter(opts), + push_cursor_on_edit = true, + push_tagstack_on_edit = true, + }) + :find() end) end -local function list_or_jump(action, title, opts) - opts = opts or {} +local function call_hierarchy(opts, method, title, direction, item) + vim.lsp.buf_request(opts.bufnr, method, { item = item }, function(err, result) + if err then + vim.api.nvim_err_writeln("Error handling " .. title .. ": " .. err.message) + return + end + if not result or vim.tbl_isempty(result) then + return + end + + local locations = {} + for _, ch_call in pairs(result) do + local ch_item = ch_call[direction] + for _, range in pairs(ch_call.fromRanges) do + table.insert(locations, { + filename = vim.uri_to_fname(ch_item.uri), + text = ch_item.name, + lnum = range.start.line + 1, + col = range.start.character + 1, + }) + end + end + + pickers + .new(opts, { + prompt_title = title, + finder = finders.new_table { + results = locations, + entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts), + }, + previewer = conf.qflist_previewer(opts), + sorter = conf.generic_sorter(opts), + push_cursor_on_edit = true, + push_tagstack_on_edit = true, + }) + :find() + end) +end + +local function pick_call_hierarchy_item(call_hierarchy_items) + if not call_hierarchy_items then + return + end + if #call_hierarchy_items == 1 then + return call_hierarchy_items[1] + end + local items = {} + for i, item in pairs(call_hierarchy_items) do + local entry = item.detail or item.name + table.insert(items, string.format("%d. %s", i, entry)) + end + local choice = vim.fn.inputlist(items) + if choice < 1 or choice > #items then + return + end + return choice +end + +local function calls(opts, direction) + local params = vim.lsp.util.make_position_params() + vim.lsp.buf_request(opts.bufnr, "textDocument/prepareCallHierarchy", params, function(err, result) + if err then + vim.api.nvim_err_writeln("Error when preparing call hierarchy: " .. err) + return + end + + local call_hierarchy_item = pick_call_hierarchy_item(result) + if not call_hierarchy_item then + return + end + + if direction == "from" then + call_hierarchy(opts, "callHierarchy/incomingCalls", "LSP Incoming Calls", direction, call_hierarchy_item) + else + call_hierarchy(opts, "callHierarchy/outgoingCalls", "LSP Outgoing Calls", direction, call_hierarchy_item) + end + end) +end + +lsp.incoming_calls = function(opts) + calls(opts, "from") +end + +lsp.outgoing_calls = function(opts) + calls(opts, "to") +end + +local function list_or_jump(action, title, opts) local params = vim.lsp.util.make_position_params(opts.winnr) vim.lsp.buf_request(opts.bufnr, action, params, function(err, result, ctx, _) if err then @@ -85,15 +175,19 @@ local function list_or_jump(action, title, opts) vim.lsp.util.jump_to_location(flattened_results[1], offset_encoding) else local locations = vim.lsp.util.locations_to_items(flattened_results, offset_encoding) - pickers.new(opts, { - prompt_title = title, - finder = finders.new_table { - results = locations, - entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts), - }, - previewer = conf.qflist_previewer(opts), - sorter = conf.generic_sorter(opts), - }):find() + pickers + .new(opts, { + prompt_title = title, + finder = finders.new_table { + results = locations, + entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts), + }, + previewer = conf.qflist_previewer(opts), + sorter = conf.generic_sorter(opts), + push_cursor_on_edit = true, + push_tagstack_on_edit = true, + }) + :find() end end) end @@ -141,20 +235,23 @@ lsp.document_symbols = function(opts) return end - opts.ignore_filename = opts.ignore_filename or true - pickers.new(opts, { - prompt_title = "LSP Document Symbols", - finder = finders.new_table { - results = locations, - entry_maker = opts.entry_maker or make_entry.gen_from_lsp_symbols(opts), - }, - previewer = conf.qflist_previewer(opts), - sorter = conf.prefilter_sorter { - tag = "symbol_type", - sorter = conf.generic_sorter(opts), - }, - push_cursor_on_edit = true, - }):find() + opts.path_display = { "hidden" } + pickers + .new(opts, { + prompt_title = "LSP Document Symbols", + finder = finders.new_table { + results = locations, + entry_maker = opts.entry_maker or make_entry.gen_from_lsp_symbols(opts), + }, + previewer = conf.qflist_previewer(opts), + sorter = conf.prefilter_sorter { + tag = "symbol_type", + sorter = conf.generic_sorter(opts), + }, + push_cursor_on_edit = true, + push_tagstack_on_edit = true, + }) + :find() end) end @@ -182,20 +279,22 @@ lsp.workspace_symbols = function(opts) return end - opts.ignore_filename = utils.get_default(opts.ignore_filename, false) + opts.ignore_filename = vim.F.if_nil(opts.ignore_filename, false) - pickers.new(opts, { - prompt_title = "LSP Workspace Symbols", - finder = finders.new_table { - results = locations, - entry_maker = opts.entry_maker or make_entry.gen_from_lsp_symbols(opts), - }, - previewer = conf.qflist_previewer(opts), - sorter = conf.prefilter_sorter { - tag = "symbol_type", - sorter = conf.generic_sorter(opts), - }, - }):find() + pickers + .new(opts, { + prompt_title = "LSP Workspace Symbols", + finder = finders.new_table { + results = locations, + entry_maker = opts.entry_maker or make_entry.gen_from_lsp_symbols(opts), + }, + previewer = conf.qflist_previewer(opts), + sorter = conf.prefilter_sorter { + tag = "symbol_type", + sorter = conf.generic_sorter(opts), + }, + }) + :find() end) end @@ -220,15 +319,21 @@ local function get_workspace_symbols_requester(bufnr, opts) end lsp.dynamic_workspace_symbols = function(opts) - pickers.new(opts, { - prompt_title = "LSP Dynamic Workspace Symbols", - finder = finders.new_dynamic { - entry_maker = opts.entry_maker or make_entry.gen_from_lsp_symbols(opts), - fn = get_workspace_symbols_requester(opts.bufnr, opts), - }, - previewer = conf.qflist_previewer(opts), - sorter = conf.generic_sorter(opts), - }):find() + pickers + .new(opts, { + prompt_title = "LSP Dynamic Workspace Symbols", + finder = finders.new_dynamic { + entry_maker = opts.entry_maker or make_entry.gen_from_lsp_symbols(opts), + fn = get_workspace_symbols_requester(opts.bufnr, opts), + }, + previewer = conf.qflist_previewer(opts), + sorter = sorters.highlighter_only(opts), + attach_mappings = function(_, map) + map("i", "", actions.to_fuzzy_refine) + return true + end, + }) + :find() end local function check_capabilities(feature, bufnr) @@ -267,6 +372,8 @@ local feature_map = { ["type_definitions"] = "typeDefinitionProvider", ["implementations"] = "implementationProvider", ["workspace_symbols"] = "workspaceSymbolProvider", + ["incoming_calls"] = "callHierarchyProvider", + ["outgoing_calls"] = "callHierarchyProvider", } local function apply_checks(mod) diff --git a/bundle/telescope.nvim/lua/telescope/builtin/git.lua b/bundle/telescope.nvim/lua/telescope/builtin/git.lua deleted file mode 100644 index a0007ccfd..000000000 --- a/bundle/telescope.nvim/lua/telescope/builtin/git.lua +++ /dev/null @@ -1,409 +0,0 @@ -local actions = require "telescope.actions" -local action_state = require "telescope.actions.state" -local finders = require "telescope.finders" -local make_entry = require "telescope.make_entry" -local pickers = require "telescope.pickers" -local previewers = require "telescope.previewers" -local utils = require "telescope.utils" -local entry_display = require "telescope.pickers.entry_display" -local strings = require "plenary.strings" -local Path = require "plenary.path" - -local conf = require("telescope.config").values - -local git = {} - -git.files = function(opts) - if opts.is_bare then - utils.notify("builtin.git_files", { - msg = "This operation must be run in a work tree", - level = "ERROR", - }) - return - end - - local show_untracked = utils.get_default(opts.show_untracked, true) - local recurse_submodules = utils.get_default(opts.recurse_submodules, false) - if show_untracked and recurse_submodules then - utils.notify("builtin.git_files", { - msg = "Git does not support both --others and --recurse-submodules", - level = "ERROR", - }) - return - end - - -- By creating the entry maker after the cwd options, - -- we ensure the maker uses the cwd options when being created. - opts.entry_maker = vim.F.if_nil(opts.entry_maker, make_entry.gen_from_file(opts)) - local git_command = vim.F.if_nil(opts.git_command, { "git", "ls-files", "--exclude-standard", "--cached" }) - - pickers.new(opts, { - prompt_title = "Git Files", - finder = finders.new_oneshot_job( - vim.tbl_flatten { - git_command, - show_untracked and "--others" or nil, - recurse_submodules and "--recurse-submodules" or nil, - }, - opts - ), - previewer = conf.file_previewer(opts), - sorter = conf.file_sorter(opts), - }):find() -end - -git.commits = function(opts) - opts.entry_maker = vim.F.if_nil(opts.entry_maker, make_entry.gen_from_git_commits(opts)) - local git_command = vim.F.if_nil(opts.git_command, { "git", "log", "--pretty=oneline", "--abbrev-commit", "--", "." }) - - pickers.new(opts, { - prompt_title = "Git Commits", - finder = finders.new_oneshot_job(git_command, opts), - previewer = { - previewers.git_commit_diff_to_parent.new(opts), - previewers.git_commit_diff_to_head.new(opts), - previewers.git_commit_diff_as_was.new(opts), - previewers.git_commit_message.new(opts), - }, - sorter = conf.file_sorter(opts), - attach_mappings = function(_, map) - actions.select_default:replace(actions.git_checkout) - map("i", "m", actions.git_reset_mixed) - map("n", "m", actions.git_reset_mixed) - map("i", "s", actions.git_reset_soft) - map("n", "s", actions.git_reset_soft) - map("i", "h", actions.git_reset_hard) - map("n", "h", actions.git_reset_hard) - return true - end, - }):find() -end - -git.stash = function(opts) - opts.show_branch = vim.F.if_nil(opts.show_branch, true) - opts.entry_maker = vim.F.if_nil(opts.entry_maker, make_entry.gen_from_git_stash(opts)) - - pickers.new(opts, { - prompt_title = "Git Stash", - finder = finders.new_oneshot_job( - vim.tbl_flatten { - "git", - "--no-pager", - "stash", - "list", - }, - opts - ), - previewer = previewers.git_stash_diff.new(opts), - sorter = conf.file_sorter(opts), - attach_mappings = function() - actions.select_default:replace(actions.git_apply_stash) - return true - end, - }):find() -end - -local get_current_buf_line = function(winnr) - local lnum = vim.api.nvim_win_get_cursor(winnr)[1] - return vim.trim(vim.api.nvim_buf_get_lines(vim.api.nvim_win_get_buf(winnr), lnum - 1, lnum, false)[1]) -end - -git.bcommits = function(opts) - opts.current_line = (opts.current_file == nil) and get_current_buf_line(opts.winnr) or nil - opts.current_file = vim.F.if_nil(opts.current_file, vim.api.nvim_buf_get_name(opts.bufnr)) - opts.entry_maker = vim.F.if_nil(opts.entry_maker, make_entry.gen_from_git_commits(opts)) - local git_command = vim.F.if_nil(opts.git_command, { "git", "log", "--pretty=oneline", "--abbrev-commit" }) - - pickers.new(opts, { - prompt_title = "Git BCommits", - finder = finders.new_oneshot_job( - vim.tbl_flatten { - git_command, - opts.current_file, - }, - opts - ), - previewer = { - previewers.git_commit_diff_to_parent.new(opts), - previewers.git_commit_diff_to_head.new(opts), - previewers.git_commit_diff_as_was.new(opts), - previewers.git_commit_message.new(opts), - }, - sorter = conf.file_sorter(opts), - attach_mappings = function() - actions.select_default:replace(actions.git_checkout_current_buffer) - local transfrom_file = function() - return opts.current_file and Path:new(opts.current_file):make_relative(opts.cwd) or "" - end - - local get_buffer_of_orig = function(selection) - local value = selection.value .. ":" .. transfrom_file() - local content = utils.get_os_command_output({ "git", "--no-pager", "show", value }, opts.cwd) - - local bufnr = vim.api.nvim_create_buf(false, true) - vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, content) - vim.api.nvim_buf_set_name(bufnr, "Original") - return bufnr - end - - local vimdiff = function(selection, command) - local ft = vim.bo.filetype - vim.cmd "diffthis" - - local bufnr = get_buffer_of_orig(selection) - vim.cmd(string.format("%s %s", command, bufnr)) - vim.bo.filetype = ft - vim.cmd "diffthis" - - vim.api.nvim_create_autocmd("WinClosed", { - event = "WinClosed", - buffer = bufnr, - nested = true, - once = true, - function() - vim.api.nvim_buf_delete(bufnr, { force = true }) - end, - }) - end - - actions.select_vertical:replace(function(prompt_bufnr) - actions.close(prompt_bufnr) - local selection = action_state.get_selected_entry() - vimdiff(selection, "leftabove vert sbuffer") - end) - - actions.select_horizontal:replace(function(prompt_bufnr) - actions.close(prompt_bufnr) - local selection = action_state.get_selected_entry() - vimdiff(selection, "belowright sbuffer") - end) - - actions.select_tab:replace(function(prompt_bufnr) - actions.close(prompt_bufnr) - local selection = action_state.get_selected_entry() - vim.cmd("tabedit " .. transfrom_file()) - vimdiff(selection, "leftabove vert sbuffer") - end) - return true - end, - }):find() -end - -git.branches = function(opts) - local format = "%(HEAD)" - .. "%(refname)" - .. "%(authorname)" - .. "%(upstream:lstrip=2)" - .. "%(committerdate:format-local:%Y/%m/%d %H:%M:%S)" - local output = utils.get_os_command_output( - { "git", "for-each-ref", "--perl", "--format", format, opts.pattern }, - opts.cwd - ) - - local results = {} - local widths = { - name = 0, - authorname = 0, - upstream = 0, - committerdate = 0, - } - local unescape_single_quote = function(v) - return string.gsub(v, "\\([\\'])", "%1") - end - local parse_line = function(line) - local fields = vim.split(string.sub(line, 2, -2), "''", true) - local entry = { - head = fields[1], - refname = unescape_single_quote(fields[2]), - authorname = unescape_single_quote(fields[3]), - upstream = unescape_single_quote(fields[4]), - committerdate = fields[5], - } - local prefix - if vim.startswith(entry.refname, "refs/remotes/") then - prefix = "refs/remotes/" - elseif vim.startswith(entry.refname, "refs/heads/") then - prefix = "refs/heads/" - else - return - end - local index = 1 - if entry.head ~= "*" then - index = #results + 1 - end - - entry.name = string.sub(entry.refname, string.len(prefix) + 1) - for key, value in pairs(widths) do - widths[key] = math.max(value, strings.strdisplaywidth(entry[key] or "")) - end - if string.len(entry.upstream) > 0 then - widths.upstream_indicator = 2 - end - table.insert(results, index, entry) - end - for _, line in ipairs(output) do - parse_line(line) - end - if #results == 0 then - return - end - - local displayer = entry_display.create { - separator = " ", - items = { - { width = 1 }, - { width = widths.name }, - { width = widths.authorname }, - { width = widths.upstream_indicator }, - { width = widths.upstream }, - { width = widths.committerdate }, - }, - } - - local make_display = function(entry) - return displayer { - { entry.head }, - { entry.name, "TelescopeResultsIdentifier" }, - { entry.authorname }, - { string.len(entry.upstream) > 0 and "=>" or "" }, - { entry.upstream, "TelescopeResultsIdentifier" }, - { entry.committerdate }, - } - end - - pickers.new(opts, { - prompt_title = "Git Branches", - finder = finders.new_table { - results = results, - entry_maker = function(entry) - entry.value = entry.name - entry.ordinal = entry.name - entry.display = make_display - return entry - end, - }, - previewer = previewers.git_branch_log.new(opts), - sorter = conf.file_sorter(opts), - attach_mappings = function(_, map) - actions.select_default:replace(actions.git_checkout) - map("i", "", actions.git_track_branch) - map("n", "", actions.git_track_branch) - - map("i", "", actions.git_rebase_branch) - map("n", "", actions.git_rebase_branch) - - map("i", "", actions.git_create_branch) - map("n", "", actions.git_create_branch) - - map("i", "", actions.git_switch_branch) - map("n", "", actions.git_switch_branch) - - map("i", "", actions.git_delete_branch) - map("n", "", actions.git_delete_branch) - - map("i", "", actions.git_merge_branch) - map("n", "", actions.git_merge_branch) - return true - end, - }):find() -end - -git.status = function(opts) - if opts.is_bare then - utils.notify("builtin.git_status", { - msg = "This operation must be run in a work tree", - level = "ERROR", - }) - return - end - - local gen_new_finder = function() - local expand_dir = utils.if_nil(opts.expand_dir, true, opts.expand_dir) - local git_cmd = { "git", "status", "-s", "--", "." } - - if expand_dir then - table.insert(git_cmd, #git_cmd - 1, "-u") - end - - local output = utils.get_os_command_output(git_cmd, opts.cwd) - - if #output == 0 then - print "No changes found" - utils.notify("builtin.git_status", { - msg = "No changes found", - level = "WARN", - }) - return - end - - return finders.new_table { - results = output, - entry_maker = vim.F.if_nil(opts.entry_maker, make_entry.gen_from_git_status(opts)), - } - end - - local initial_finder = gen_new_finder() - if not initial_finder then - return - end - - pickers.new(opts, { - prompt_title = "Git Status", - finder = initial_finder, - previewer = previewers.git_file_diff.new(opts), - sorter = conf.file_sorter(opts), - attach_mappings = function(prompt_bufnr, map) - actions.git_staging_toggle:enhance { - post = function() - action_state.get_current_picker(prompt_bufnr):refresh(gen_new_finder(), { reset_prompt = true }) - end, - } - - map("i", "", actions.git_staging_toggle) - map("n", "", actions.git_staging_toggle) - return true - end, - }):find() -end - -local set_opts_cwd = function(opts) - if opts.cwd then - opts.cwd = vim.fn.expand(opts.cwd) - else - opts.cwd = vim.loop.cwd() - end - - -- Find root of git directory and remove trailing newline characters - local git_root, ret = utils.get_os_command_output({ "git", "rev-parse", "--show-toplevel" }, opts.cwd) - local use_git_root = utils.get_default(opts.use_git_root, true) - - if ret ~= 0 then - local in_worktree = utils.get_os_command_output({ "git", "rev-parse", "--is-inside-work-tree" }, 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 - error(opts.cwd .. " is not a git directory") - elseif in_worktree[1] ~= "true" and in_bare[1] == "true" then - opts.is_bare = true - end - else - if use_git_root then - opts.cwd = git_root[1] - end - end -end - -local function apply_checks(mod) - for k, v in pairs(mod) do - mod[k] = function(opts) - opts = vim.F.if_nil(opts, {}) - - set_opts_cwd(opts) - v(opts) - end - end - - return mod -end - -return apply_checks(git) diff --git a/bundle/telescope.nvim/lua/telescope/builtin/init.lua b/bundle/telescope.nvim/lua/telescope/builtin/init.lua index ebbbe6930..5a2199440 100644 --- a/bundle/telescope.nvim/lua/telescope/builtin/init.lua +++ b/bundle/telescope.nvim/lua/telescope/builtin/init.lua @@ -26,11 +26,6 @@ --- ---@brief ]] -if 1 ~= vim.fn.has "nvim-0.7.0" then - vim.api.nvim_err_writeln "Telescope.nvim requires at least nvim-0.7.0. See `:h telescope.changelog-1851`" - return -end - local builtin = {} -- Ref: https://github.com/tjdevries/lazy.nvim @@ -50,39 +45,42 @@ end -- -- ---- Search for a string and get results live as you type (respecting .gitignore) +--- Search for a string and get results live as you type, respects .gitignore ---@param opts table: options to pass to the picker ---@field cwd string: root dir to search from (default: cwd, use utils.buffer_dir() to search relative to open buffer) ---@field grep_open_files boolean: if true, restrict search to open files only, mutually exclusive with `search_dirs` ----@field search_dirs table: directory/directories to search in, mutually exclusive with `grep_open_files` ----@field glob_pattern string: argument to be used with `--glob`, e.g. "*.toml", can use the opposite "!*.toml" +---@field search_dirs table: directory/directories/files to search, mutually exclusive with `grep_open_files` +---@field glob_pattern string|table: argument to be used with `--glob`, e.g. "*.toml", can use the opposite "!*.toml" ---@field type_filter string: argument to be used with `--type`, e.g. "rust", see `rg --type-list` ----@field additional_args function: function(opts) which returns a table of additional arguments to be passed on +---@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 disable_coordinates boolean: don't show the line & row numbers (default: false) -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 ---@param opts table: options to pass to the picker ---@field cwd string: root dir to search from (default: cwd, use utils.buffer_dir() to search relative to open buffer) ---@field search string: the query to search ----@field search_dirs table: directory/directories to search in +---@field grep_open_files boolean: if true, restrict search to open files only, mutually exclusive with `search_dirs` +---@field search_dirs table: directory/directories/files to search, mutually exclusive with `grep_open_files` ---@field use_regex boolean: if true, special characters won't be escaped, allows for using regex (default: false) ---@field word_match string: can be set to `-w` to enable exact word matches ----@field additional_args function: function(opts) which returns a table of additional arguments to be passed on +---@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 sort_only_text boolean: only sort the text, not the file, line or row (default: false) -builtin.grep_string = require_on_exported_call("telescope.builtin.files").grep_string +---@field only_sort_text boolean: only sort the text, not the file, line or row (default: false) +builtin.grep_string = require_on_exported_call("telescope.builtin.__files").grep_string --- Search for files (respecting .gitignore) ---@param opts table: options to pass to the picker ---@field cwd string: root dir to search from (default: cwd, use utils.buffer_dir() to search relative to open buffer) ----@field find_command table: command line arguments for `find_files` to use for the search, overrides default: config +---@field find_command function|table: cmd to use for the search. Can be a fn(opts) -> tbl (default: autodetect) ---@field follow boolean: if true, follows symlinks (i.e. uses `-L` flag for the `find` command) ---@field hidden boolean: determines whether to show hidden files or not (default: false) ---@field no_ignore boolean: show files ignored by .gitignore, .ignore, etc. (default: false) ----@field search_dirs table: directory/directories to search in -builtin.find_files = require_on_exported_call("telescope.builtin.files").find_files +---@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_file string: specify a filename to search for +builtin.find_files = require_on_exported_call("telescope.builtin.__files").find_files --- This is an alias for the `find_files` picker builtin.fd = builtin.find_files @@ -93,12 +91,12 @@ builtin.fd = builtin.find_files ---@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 symbol_highlights table: string -> string. Matches symbol with hl_group -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 ---@param opts table: options to pass to the picker ---@field skip_empty_lines boolean: if true we dont display empty lines (default: false) -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 --- or update when introducing new changes) @@ -108,7 +106,7 @@ builtin.current_buffer_fuzzy_find = require_on_exported_call("telescope.builtin. ---@field show_line boolean: if true, shows the content of the line the tag is found on in the picker (default: true) ---@field only_sort_tags boolean: if true we will only sort tags (default: false) ---@field fname_width number: defines the width of the filename section (default: 30) -builtin.tags = require_on_exported_call("telescope.builtin.files").tags +builtin.tags = require_on_exported_call("telescope.builtin.__files").tags --- Lists all of the tags for the currently open buffer, with a preview ---@param opts table: options to pass to the picker @@ -117,7 +115,7 @@ builtin.tags = require_on_exported_call("telescope.builtin.files").tags ---@field show_line boolean: if true, shows the content of the line the tag is found on in the picker (default: true) ---@field only_sort_tags boolean: if true we will only sort tags (default: false) ---@field fname_width number: defines the width of the filename section (default: 30) -builtin.current_buffer_tags = require_on_exported_call("telescope.builtin.files").current_buffer_tags +builtin.current_buffer_tags = require_on_exported_call("telescope.builtin.__files").current_buffer_tags -- -- @@ -125,17 +123,17 @@ builtin.current_buffer_tags = require_on_exported_call("telescope.builtin.files" -- -- ---- Fuzzy search for files tracked by Git. This command lists the output of the `git ls-files` command, respects ---- .gitignore, and optionally ignores untracked files +--- Fuzzy search for files tracked by Git. This command lists the output of the `git ls-files` command, +--- respects .gitignore --- - Default keymaps: --- - ``: opens the currently selected file ---@param opts table: options to pass to the picker ---@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 show_untracked boolean: if true, adds `--others` flag to command and shows untracked files (default: true) +---@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 git_command table: command that will be exectued. {"git","ls-files","--exclude-standard","--cached"} -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 --- - Default keymaps: @@ -147,7 +145,7 @@ builtin.git_files = require_on_exported_call("telescope.builtin.git").files ---@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 git_command table: command that will be exectued. {"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 --- - Default keymaps or your overriden `select_` keys: @@ -160,7 +158,7 @@ builtin.git_commits = require_on_exported_call("telescope.builtin.git").commits ---@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 git_command table: command that will be exectued. {"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 --- - Default keymaps: @@ -174,7 +172,7 @@ builtin.git_bcommits = require_on_exported_call("telescope.builtin.git").bcommit ---@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 pattern string: specify the pattern to match all refs -builtin.git_branches = require_on_exported_call("telescope.builtin.git").branches +builtin.git_branches = require_on_exported_call("telescope.builtin.__git").branches --- Lists git status for current directory --- - Default keymaps: @@ -184,7 +182,7 @@ builtin.git_branches = require_on_exported_call("telescope.builtin.git").branche ---@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 git_icons table: string -> string. Matches name with icon (see source code, make_entry.lua git_icon_defaults) -builtin.git_status = require_on_exported_call("telescope.builtin.git").status +builtin.git_status = require_on_exported_call("telescope.builtin.__git").status --- Lists stash items in current repository --- - Default keymaps: @@ -193,7 +191,7 @@ builtin.git_status = require_on_exported_call("telescope.builtin.git").status ---@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 show_branch boolean: if we should display the branch name for git stash entries (default: true) -builtin.git_stash = require_on_exported_call("telescope.builtin.git").stash +builtin.git_stash = require_on_exported_call("telescope.builtin.__git").stash -- -- @@ -204,14 +202,15 @@ builtin.git_stash = require_on_exported_call("telescope.builtin.git").stash --- Lists all of the community maintained pickers built into Telescope ---@param opts table: options to pass to the picker ---@field include_extensions boolean: if true will show the pickers of the installed extensions (default: false) -builtin.builtin = require_on_exported_call("telescope.builtin.internal").builtin +---@field use_default_opts boolean: if the selected picker should use its default options (default: false) +builtin.builtin = require_on_exported_call("telescope.builtin.__internal").builtin --- Opens the previous picker in the identical state (incl. multi selections) --- - Notes: --- - Requires `cache_picker` in setup or when having invoked pickers, see |telescope.defaults.cache_picker| ---@param opts table: options to pass to the picker ---@field cache_index number: what picker to resume, where 1 denotes most recent (default: 1) -builtin.resume = require_on_exported_call("telescope.builtin.internal").resume +builtin.resume = require_on_exported_call("telescope.builtin.__internal").resume --- Opens a picker over previously cached pickers in their preserved states (incl. multi selections) --- - Default keymaps: @@ -219,12 +218,13 @@ builtin.resume = require_on_exported_call("telescope.builtin.internal").resume --- - Notes: --- - Requires `cache_picker` in setup or when having invoked pickers, see |telescope.defaults.cache_picker| ---@param opts table: options to pass to the picker -builtin.pickers = require_on_exported_call("telescope.builtin.internal").pickers +builtin.pickers = require_on_exported_call("telescope.builtin.__internal").pickers --- Use the telescope... ---@param opts table: options to pass to the picker ---@field show_pluto boolean: we love pluto (default: false, because its a hidden feature) -builtin.planets = require_on_exported_call("telescope.builtin.internal").planets +---@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 --- Lists symbols inside of `data/telescope-sources/*.json` found in your runtime path --- or found in `stdpath("data")/telescope/symbols/*.json`. The second path can be customized. @@ -234,69 +234,71 @@ builtin.planets = require_on_exported_call("telescope.builtin.internal").planets ---@param opts table: options to pass to the picker ---@field symbol_path string: specify the second path. Default: `stdpath("data")/telescope/symbols/*.json` ---@field sources table: specify a table of sources you want to load this time -builtin.symbols = require_on_exported_call("telescope.builtin.internal").symbols +builtin.symbols = require_on_exported_call("telescope.builtin.__internal").symbols --- Lists available plugin/user commands and runs them on `` ---@param opts table: options to pass to the picker ---@field show_buf_command boolean: show buf local command (Default: true) -builtin.commands = require_on_exported_call("telescope.builtin.internal").commands +builtin.commands = require_on_exported_call("telescope.builtin.__internal").commands --- Lists items in the quickfix list, jumps to location on `` ---@param opts table: options to pass to the picker ----@field ignore_filename boolean: dont show filenames (default: true) +---@field show_line boolean: show results text (default: true) ---@field trim_text boolean: trim results text (default: false) +---@field fname_width number: defines the width of the filename section (default: 30) ---@field nr number: specify the quickfix list number -builtin.quickfix = require_on_exported_call("telescope.builtin.internal").quickfix +builtin.quickfix = require_on_exported_call("telescope.builtin.__internal").quickfix --- Lists all quickfix lists in your history and open them with `builtin.quickfix`. It seems that neovim --- only keeps the full history for 10 lists ---@param opts table: options to pass to the picker -builtin.quickfixhistory = require_on_exported_call("telescope.builtin.internal").quickfixhistory +builtin.quickfixhistory = require_on_exported_call("telescope.builtin.__internal").quickfixhistory --- Lists items from the current window's location list, jumps to location on `` ---@param opts table: options to pass to the picker ----@field ignore_filename boolean: dont show filenames (default: true) +---@field show_line boolean: show results text (default: true) ---@field trim_text boolean: trim results text (default: false) -builtin.loclist = require_on_exported_call("telescope.builtin.internal").loclist +---@field fname_width number: defines the width of the filename section (default: 30) +builtin.loclist = require_on_exported_call("telescope.builtin.__internal").loclist --- Lists previously open files, opens on `` ---@param opts table: options to pass to the picker ---@field only_cwd boolean: show only files in the cwd (default: false) ---@field cwd_only boolean: alias for only_cwd -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 `` --- - Default keymaps: --- - ``: open the command line with the text of the currently selected result populated in it ---@param opts table: options to pass to the picker -builtin.command_history = require_on_exported_call("telescope.builtin.internal").command_history +builtin.command_history = require_on_exported_call("telescope.builtin.__internal").command_history --- Lists searches that were executed recently, and reruns them on `` --- - Default keymaps: --- - ``: open a search window with the text of the currently selected search result populated in it ---@param opts table: options to pass to the picker -builtin.search_history = require_on_exported_call("telescope.builtin.internal").search_history +builtin.search_history = require_on_exported_call("telescope.builtin.__internal").search_history --- Lists vim options, allows you to edit the current value on `` ---@param opts table: options to pass to the picker -builtin.vim_options = require_on_exported_call("telescope.builtin.internal").vim_options +builtin.vim_options = require_on_exported_call("telescope.builtin.__internal").vim_options --- Lists available help tags and opens a new window with the relevant help info on `` ---@param opts table: options to pass to the picker ---@field lang string: specify language (default: vim.o.helplang) ---@field fallback boolean: fallback to en if language isn't installed (default: true) -builtin.help_tags = require_on_exported_call("telescope.builtin.internal").help_tags +builtin.help_tags = require_on_exported_call("telescope.builtin.__internal").help_tags --- Lists manpage entries, opens them in a help window on `` ---@param opts table: options to pass to the picker ---@field sections table: a list of sections to search, use `{ "ALL" }` to search in all sections (default: { "1" }) ---@field man_cmd function: that returns the man command. (Default: `apropos ""` on linux, `apropos " "` on macos) -builtin.man_pages = require_on_exported_call("telescope.builtin.internal").man_pages +builtin.man_pages = require_on_exported_call("telescope.builtin.__internal").man_pages --- Lists lua modules and reloads them on `` ---@param opts table: options to pass to the picker ---@field column_len number: define the max column len for the module name (default: dynamic, longest module name) -builtin.reloader = require_on_exported_call("telescope.builtin.internal").reloader +builtin.reloader = require_on_exported_call("telescope.builtin.__internal").reloader --- Lists open buffers in current neovim instance, opens selected buffer on `` ---@param opts table: options to pass to the picker @@ -307,56 +309,58 @@ builtin.reloader = require_on_exported_call("telescope.builtin.internal").reload ---@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 bufnr_width number: Defines the width of the buffer numbers in front of the filenames (default: dynamic) -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 `` ---@param opts table: options to pass to the picker ---@field enable_preview boolean: if true, will preview the selected color -builtin.colorscheme = require_on_exported_call("telescope.builtin.internal").colorscheme +builtin.colorscheme = require_on_exported_call("telescope.builtin.__internal").colorscheme --- Lists vim marks and their value, jumps to the mark on `` ---@param opts table: options to pass to the picker -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 `` --- - Default keymaps: --- - ``: edit the contents of the currently selected register ---@param opts table: options to pass to the picker -builtin.registers = require_on_exported_call("telescope.builtin.internal").registers +builtin.registers = require_on_exported_call("telescope.builtin.__internal").registers --- Lists normal mode keymappings, runs the selected keymap on `` ---@param opts table: options to pass to the picker ---@field modes table: a list of short-named keymap modes to search (default: { "n", "i", "c", "x" }) ---@field show_plug boolean: if true, the keymaps for which the lhs contains "" are also shown (default: true) -builtin.keymaps = require_on_exported_call("telescope.builtin.internal").keymaps +builtin.keymaps = require_on_exported_call("telescope.builtin.__internal").keymaps --- Lists all available filetypes, sets currently open buffer's filetype to selected filetype in Telescope on `` ---@param opts table: options to pass to the picker -builtin.filetypes = require_on_exported_call("telescope.builtin.internal").filetypes +builtin.filetypes = require_on_exported_call("telescope.builtin.__internal").filetypes --- Lists all available highlights ---@param opts table: options to pass to the picker -builtin.highlights = require_on_exported_call("telescope.builtin.internal").highlights +builtin.highlights = require_on_exported_call("telescope.builtin.__internal").highlights --- Lists vim autocommands and goes to their declaration on `` ---@param opts table: options to pass to the picker -builtin.autocommands = require_on_exported_call("telescope.builtin.internal").autocommands +builtin.autocommands = require_on_exported_call("telescope.builtin.__internal").autocommands --- Lists spelling suggestions for the current word under the cursor, replaces word with selected suggestion on `` ---@param opts table: options to pass to the picker -builtin.spell_suggest = require_on_exported_call("telescope.builtin.internal").spell_suggest +builtin.spell_suggest = require_on_exported_call("telescope.builtin.__internal").spell_suggest --- Lists the tag stack for the current window, jumps to tag on `` ---@param opts table: options to pass to the picker ----@field ignore_filename boolean: dont show filenames (default: true) +---@field show_line boolean: show results text (default: true) ---@field trim_text boolean: trim results text (default: false) -builtin.tagstack = require_on_exported_call("telescope.builtin.internal").tagstack +---@field fname_width number: defines the width of the filename section (default: 30) +builtin.tagstack = require_on_exported_call("telescope.builtin.__internal").tagstack --- Lists items from Vim's jumplist, jumps to location on `` ---@param opts table: options to pass to the picker ----@field ignore_filename boolean: dont show filenames (default: true) +---@field show_line boolean: show results text (default: true) ---@field trim_text boolean: trim results text (default: false) -builtin.jumplist = require_on_exported_call("telescope.builtin.internal").jumplist +---@field fname_width number: defines the width of the filename section (default: 30) +builtin.jumplist = require_on_exported_call("telescope.builtin.__internal").jumplist -- -- @@ -368,64 +372,83 @@ builtin.jumplist = require_on_exported_call("telescope.builtin.internal").jumpli ---@param opts table: options to pass to the picker ---@field include_declaration boolean: include symbol declaration in the lsp references (default: true) ---@field include_current_line boolean: include current line (default: false) +---@field fname_width number: defines the width of the filename section (default: 30) +---@field show_line boolean: show results text (default: true) ---@field trim_text boolean: trim results text (default: false) -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 `` +---@param opts table: options to pass to the picker +---@field fname_width number: defines the width of the filename section (default: 30) +---@field show_line boolean: show results text (default: true) +---@field trim_text boolean: trim results text (default: false) +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 `` +---@param opts table: options to pass to the picker +---@field fname_width number: defines the width of the filename section (default: 30) +---@field show_line boolean: show results text (default: true) +---@field trim_text boolean: trim results text (default: false) +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 ---@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 ignore_filename boolean: dont show filenames (default: true) +---@field fname_width number: defines the width of the filename section (default: 30) +---@field show_line boolean: show results text (default: true) ---@field trim_text boolean: trim results text (default: false) -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, --- otherwise show all options in Telescope ---@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 ignore_filename boolean: dont show filenames (default: true) +---@field fname_width number: defines the width of the filename section (default: 30) +---@field show_line boolean: show results text (default: true) ---@field trim_text boolean: trim results text (default: false) -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 ---@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 ignore_filename boolean: dont show filenames (default: true) +---@field fname_width number: defines the width of the filename section (default: 30) +---@field show_line boolean: show results text (default: true) ---@field trim_text boolean: trim results text (default: false) -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 --- - Default keymaps: --- - ``: 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 ----@field ignore_filename boolean: dont show filenames (default: true) +---@field fname_width number: defines the width of the filename section (default: 30) ---@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 ignore_symbols string|table: list of symbols to ignore ---@field symbol_highlights table: string -> string. Matches symbol with hl_group -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 --- - Default keymaps: --- - ``: 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 ---@field query string: for what to query the workspace (default: "") ----@field ignore_filename boolean: dont show filenames (default: false) +---@field fname_width number: defines the width of the filename section (default: 30) ---@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 ignore_symbols string|table: list of symbols to ignore ---@field symbol_highlights table: string -> string. Matches symbol with hl_group -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 --- - Default keymaps: --- - ``: 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 ----@field ignore_filename boolean: dont show filenames (default: false) +---@field fname_width number: defines the width of the filename section (default: 30) ---@field show_line boolean: if true, shows the content of the line the symbol is found on (default: false) ---@field symbols string|table: filter results by symbol kind(s) ---@field ignore_symbols string|table: list of symbols to ignore ---@field symbol_highlights table: string -> string. Matches symbol with hl_group -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 -- -- @@ -439,7 +462,7 @@ builtin.lsp_dynamic_workspace_symbols = require_on_exported_call("telescope.buil --- - Default keymaps: --- - ``: show autocompletion menu to prefilter your query with the diagnostic you want to see (i.e. `:warning:`) ---@param opts table: options to pass to the picker ----@field bufnr string|number: if nil get diagnostics for all open buffers. Use 0 for current buffer +---@field bufnr number|nil: Buffer number to get diagnostics from. Use 0 for current buffer or nil for all buffers ---@field severity string|number: filter diagnostics by severity name (string) or id (number) ---@field severity_limit string|number: keep diagnostics equal or more severe wrt severity name (string) or id (number) ---@field severity_bound string|number: keep diagnostics equal or less severe wrt severity name (string) or id (number) @@ -448,7 +471,7 @@ builtin.lsp_dynamic_workspace_symbols = require_on_exported_call("telescope.buil ---@field no_sign boolean: hide DiagnosticSigns from Results (default: false) ---@field line_width number: set length of diagnostic entry text in Results ---@field namespace number: limit your diagnostics to a specific namespace -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 pickers_conf = require("telescope.config").pickers diff --git a/bundle/telescope.nvim/lua/telescope/builtin/internal.lua b/bundle/telescope.nvim/lua/telescope/builtin/internal.lua deleted file mode 100644 index be244cc0e..000000000 --- a/bundle/telescope.nvim/lua/telescope/builtin/internal.lua +++ /dev/null @@ -1,1348 +0,0 @@ -local actions = require "telescope.actions" -local action_set = require "telescope.actions.set" -local action_state = require "telescope.actions.state" -local finders = require "telescope.finders" -local make_entry = require "telescope.make_entry" -local Path = require "plenary.path" -local pickers = require "telescope.pickers" -local previewers = require "telescope.previewers" -local p_window = require "telescope.pickers.window" -local sorters = require "telescope.sorters" -local state = require "telescope.state" -local utils = require "telescope.utils" - -local conf = require("telescope.config").values - -local filter = vim.tbl_filter - --- Makes sure aliased options are set correctly -local function apply_cwd_only_aliases(opts) - local has_cwd_only = opts.cwd_only ~= nil - local has_only_cwd = opts.only_cwd ~= nil - - if has_only_cwd and not has_cwd_only then - -- Internally, use cwd_only - opts.cwd_only = opts.only_cwd - opts.only_cwd = nil - end - - return opts -end - -local internal = {} - -internal.builtin = function(opts) - opts.include_extensions = utils.get_default(opts.include_extensions, false) - - local objs = {} - - for k, v in pairs(require "telescope.builtin") do - local debug_info = debug.getinfo(v) - table.insert(objs, { - filename = string.sub(debug_info.source, 2), - text = k, - }) - end - - local title = "Telescope Builtin" - - if opts.include_extensions then - title = "Telescope Pickers" - for ext, funcs in pairs(require("telescope").extensions) do - for func_name, func_obj in pairs(funcs) do - -- Only include exported functions whose name doesn't begin with an underscore - if type(func_obj) == "function" and string.sub(func_name, 0, 1) ~= "_" then - local debug_info = debug.getinfo(func_obj) - table.insert(objs, { - filename = string.sub(debug_info.source, 2), - text = string.format("%s : %s", ext, func_name), - }) - end - end - end - end - - opts.bufnr = vim.api.nvim_get_current_buf() - opts.winnr = vim.api.nvim_get_current_win() - pickers.new(opts, { - prompt_title = title, - finder = finders.new_table { - results = objs, - entry_maker = function(entry) - return { - value = entry, - text = entry.text, - display = entry.text, - ordinal = entry.text, - filename = entry.filename, - } - end, - }, - previewer = previewers.builtin.new(opts), - sorter = conf.generic_sorter(opts), - attach_mappings = function(_) - actions.select_default:replace(function(_) - local selection = action_state.get_selected_entry() - if not selection then - utils.__warn_no_selection "builtin.builtin" - return - end - - -- we do this to avoid any surprises - opts.include_extensions = nil - - if string.match(selection.text, " : ") then - -- Call appropriate function from extensions - local split_string = vim.split(selection.text, " : ") - local ext = split_string[1] - local func = split_string[2] - require("telescope").extensions[ext][func](opts) - else - -- Call appropriate telescope builtin - require("telescope.builtin")[selection.text](opts) - end - end) - return true - end, - }):find() -end - -internal.resume = function(opts) - opts = opts or {} - opts.cache_index = vim.F.if_nil(opts.cache_index, 1) - - local cached_pickers = state.get_global_key "cached_pickers" - if cached_pickers == nil or vim.tbl_isempty(cached_pickers) then - utils.notify("builtin.resume", { - msg = "No cached picker(s).", - level = "INFO", - }) - return - end - local picker = cached_pickers[opts.cache_index] - if picker == nil then - utils.notify("builtin.resume", { - msg = string.format("Index too large as there are only '%s' pickers cached", #cached_pickers), - level = "ERROR", - }) - return - end - -- reset layout strategy and get_window_options if default as only one is valid - -- and otherwise unclear which was actually set - if picker.layout_strategy == conf.layout_strategy then - picker.layout_strategy = nil - end - if picker.get_window_options == p_window.get_window_options then - picker.get_window_options = nil - end - picker.cache_picker.index = opts.cache_index - - -- avoid partial `opts.cache_picker` at picker creation - if opts.cache_picker ~= false then - picker.cache_picker = vim.tbl_extend("keep", opts.cache_picker or {}, picker.cache_picker) - else - picker.cache_picker.disabled = true - end - opts.cache_picker = nil - pickers.new(opts, picker):find() -end - -internal.pickers = function(opts) - local cached_pickers = state.get_global_key "cached_pickers" - if cached_pickers == nil or vim.tbl_isempty(cached_pickers) then - utils.notify("builtin.pickers", { - msg = "No cached picker(s).", - level = "INFO", - }) - return - end - - opts = opts or {} - - -- clear cache picker for immediate pickers.new and pass option to resumed picker - if opts.cache_picker ~= nil then - opts._cache_picker = opts.cache_picker - opts.cache_picker = nil - end - - pickers.new(opts, { - prompt_title = "Pickers", - finder = finders.new_table { - results = cached_pickers, - entry_maker = make_entry.gen_from_picker(opts), - }, - previewer = previewers.pickers.new(opts), - sorter = conf.generic_sorter(opts), - cache_picker = false, - attach_mappings = function(_, map) - actions.select_default:replace(function(prompt_bufnr) - local current_picker = action_state.get_current_picker(prompt_bufnr) - local selection_index = current_picker:get_index(current_picker:get_selection_row()) - actions.close(prompt_bufnr) - opts.cache_picker = opts._cache_picker - opts["cache_index"] = selection_index - opts["initial_mode"] = cached_pickers[selection_index].initial_mode - internal.resume(opts) - end) - map("i", "", actions.remove_selected_picker) - map("n", "", actions.remove_selected_picker) - return true - end, - }):find() -end - -internal.planets = function(opts) - local show_pluto = opts.show_pluto or false - - local sourced_file = require("plenary.debug_utils").sourced_filepath() - local base_directory = vim.fn.fnamemodify(sourced_file, ":h:h:h:h") - - local globbed_files = vim.fn.globpath(base_directory .. "/data/memes/planets/", "*", true, true) - local acceptable_files = {} - for _, v in ipairs(globbed_files) do - if show_pluto or not v:find "pluto" then - table.insert(acceptable_files, vim.fn.fnamemodify(v, ":t")) - end - end - - pickers.new({ - prompt_title = "Planets", - finder = finders.new_table { - results = acceptable_files, - entry_maker = function(line) - return { - ordinal = line, - display = line, - filename = base_directory .. "/data/memes/planets/" .. line, - } - end, - }, - previewer = previewers.cat.new(opts), - sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr) - actions.select_default:replace(function() - local selection = action_state.get_selected_entry() - if selection == nil then - utils.__warn_no_selection "builtin.planets" - return - end - - actions.close(prompt_bufnr) - print("Enjoy astronomy! You viewed:", selection.display) - end) - - return true - end, - }):find() -end - -internal.symbols = function(opts) - local initial_mode = vim.fn.mode() - local files = vim.api.nvim_get_runtime_file("data/telescope-sources/*.json", true) - local data_path = (function() - if not opts.symbol_path then - return Path:new { vim.fn.stdpath "data", "telescope", "symbols" } - else - return Path:new { opts.symbol_path } - end - end)() - if data_path:exists() then - for _, v in ipairs(require("plenary.scandir").scan_dir(data_path:absolute(), { search_pattern = "%.json$" })) do - table.insert(files, v) - end - end - - if #files == 0 then - utils.notify("builtin.symbols", { - msg = "No sources found! Check out https://github.com/nvim-telescope/telescope-symbols.nvim " - .. "for some prebuild symbols or how to create you own symbol source.", - level = "ERROR", - }) - return - end - - local sources = {} - if opts.sources then - for _, v in ipairs(files) do - for _, s in ipairs(opts.sources) do - if v:find(s) then - table.insert(sources, v) - end - end - end - else - sources = files - end - - local results = {} - for _, source in ipairs(sources) do - local data = vim.json.decode(Path:new(source):read()) - for _, entry in ipairs(data) do - table.insert(results, entry) - end - end - - pickers.new(opts, { - prompt_title = "Symbols", - finder = finders.new_table { - results = results, - entry_maker = function(entry) - return { - value = entry, - ordinal = entry[1] .. " " .. entry[2], - display = entry[1] .. " " .. entry[2], - } - end, - }, - sorter = conf.generic_sorter(opts), - attach_mappings = function(_) - if initial_mode == "i" then - actions.select_default:replace(actions.insert_symbol_i) - else - actions.select_default:replace(actions.insert_symbol) - end - return true - end, - }):find() -end - -internal.commands = function(opts) - pickers.new(opts, { - prompt_title = "Commands", - finder = finders.new_table { - results = (function() - local command_iter = vim.api.nvim_get_commands {} - local commands = {} - - for _, cmd in pairs(command_iter) do - table.insert(commands, cmd) - end - - local need_buf_command = vim.F.if_nil(opts.show_buf_command, true) - - if need_buf_command then - local buf_command_iter = vim.api.nvim_buf_get_commands(0, {}) - buf_command_iter[true] = nil -- remove the redundant entry - for _, cmd in pairs(buf_command_iter) do - table.insert(commands, cmd) - end - end - return commands - end)(), - - entry_maker = opts.entry_maker or make_entry.gen_from_commands(opts), - }, - sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr) - actions.select_default:replace(function() - local selection = action_state.get_selected_entry() - if selection == nil then - utils.__warn_no_selection "builtin.commands" - return - end - - actions.close(prompt_bufnr) - local val = selection.value - local cmd = string.format([[:%s ]], val.name) - - if val.nargs == "0" then - vim.cmd(cmd) - else - vim.cmd [[stopinsert]] - vim.fn.feedkeys(cmd) - end - end) - - return true - end, - }):find() -end - -internal.quickfix = function(opts) - local qf_identifier = opts.id or vim.F.if_nil(opts.nr, "$") - local locations = vim.fn.getqflist({ [opts.id and "id" or "nr"] = qf_identifier, items = true }).items - - if vim.tbl_isempty(locations) then - return - end - - pickers.new(opts, { - prompt_title = "Quickfix", - finder = finders.new_table { - results = locations, - entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts), - }, - previewer = conf.qflist_previewer(opts), - sorter = conf.generic_sorter(opts), - }):find() -end - -internal.quickfixhistory = function(opts) - local qflists = {} - for i = 1, 10 do -- (n)vim keeps at most 10 quickfix lists in full - -- qf weirdness: id = 0 gets id of quickfix list nr - local qflist = vim.fn.getqflist { nr = i, id = 0, title = true, items = true } - if not vim.tbl_isempty(qflist.items) then - table.insert(qflists, qflist) - end - end - local entry_maker = opts.make_entry - or function(entry) - return { - value = entry.title or "Untitled", - ordinal = entry.title or "Untitled", - display = entry.title or "Untitled", - nr = entry.nr, - id = entry.id, - items = entry.items, - } - end - local qf_entry_maker = make_entry.gen_from_quickfix(opts) - pickers.new(opts, { - prompt_title = "Quickfix History", - finder = finders.new_table { - results = qflists, - entry_maker = entry_maker, - }, - previewer = previewers.new_buffer_previewer { - title = "Quickfix List Preview", - dyn_title = function(_, entry) - return entry.title - end, - - get_buffer_by_name = function(_, entry) - return "quickfixlist_" .. tostring(entry.nr) - end, - - define_preview = function(self, entry) - if self.state.bufname then - return - end - local entries = vim.tbl_map(function(i) - return qf_entry_maker(i):display() - end, entry.items) - vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, entries) - end, - }, - sorter = conf.generic_sorter(opts), - attach_mappings = function(_, _) - action_set.select:replace(function(prompt_bufnr) - local nr = action_state.get_selected_entry().nr - actions.close(prompt_bufnr) - internal.quickfix { nr = nr } - end) - return true - end, - }):find() -end - -internal.loclist = function(opts) - local locations = vim.fn.getloclist(0) - local filenames = {} - for _, value in pairs(locations) do - local bufnr = value.bufnr - if filenames[bufnr] == nil then - filenames[bufnr] = vim.api.nvim_buf_get_name(bufnr) - end - value.filename = filenames[bufnr] - end - - if vim.tbl_isempty(locations) then - return - end - - pickers.new(opts, { - prompt_title = "Loclist", - finder = finders.new_table { - results = locations, - entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts), - }, - previewer = conf.qflist_previewer(opts), - sorter = conf.generic_sorter(opts), - }):find() -end - -internal.oldfiles = function(opts) - opts = apply_cwd_only_aliases(opts) - opts.include_current_session = utils.get_default(opts.include_current_session, true) - - local current_buffer = vim.api.nvim_get_current_buf() - local current_file = vim.api.nvim_buf_get_name(current_buffer) - local results = {} - - if opts.include_current_session then - for _, buffer in ipairs(vim.split(vim.fn.execute ":buffers! t", "\n")) do - local match = tonumber(string.match(buffer, "%s*(%d+)")) - local open_by_lsp = string.match(buffer, "line 0$") - if match and not open_by_lsp then - local file = vim.api.nvim_buf_get_name(match) - if vim.loop.fs_stat(file) and match ~= current_buffer then - table.insert(results, file) - end - end - end - end - - 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 - table.insert(results, file) - end - end - - if opts.cwd_only then - local cwd = vim.loop.cwd() - cwd = cwd:gsub([[\]], [[\\]]) - results = vim.tbl_filter(function(file) - return vim.fn.matchstrpos(file, cwd)[2] ~= -1 - end, results) - end - - pickers.new(opts, { - prompt_title = "Oldfiles", - finder = finders.new_table { - results = results, - entry_maker = opts.entry_maker or make_entry.gen_from_file(opts), - }, - sorter = conf.file_sorter(opts), - previewer = conf.file_previewer(opts), - }):find() -end - -internal.command_history = function(opts) - local history_string = vim.fn.execute "history cmd" - local history_list = vim.split(history_string, "\n") - - local results = {} - for i = #history_list, 3, -1 do - local item = history_list[i] - local _, finish = string.find(item, "%d+ +") - table.insert(results, string.sub(item, finish + 1)) - end - - pickers.new(opts, { - prompt_title = "Command History", - finder = finders.new_table(results), - sorter = conf.generic_sorter(opts), - - attach_mappings = function(_, map) - map("i", "", actions.set_command_line) - map("n", "", actions.set_command_line) - map("n", "", actions.edit_command_line) - map("i", "", actions.edit_command_line) - - -- TODO: Find a way to insert the text... it seems hard. - -- map('i', '', actions.insert_value, { expr = true }) - - return true - end, - }):find() -end - -internal.search_history = function(opts) - local search_string = vim.fn.execute "history search" - local search_list = vim.split(search_string, "\n") - - local results = {} - for i = #search_list, 3, -1 do - local item = search_list[i] - local _, finish = string.find(item, "%d+ +") - table.insert(results, string.sub(item, finish + 1)) - end - - pickers.new(opts, { - prompt_title = "Search History", - finder = finders.new_table(results), - sorter = conf.generic_sorter(opts), - - attach_mappings = function(_, map) - map("i", "", actions.set_search_line) - map("n", "", actions.set_search_line) - map("n", "", actions.edit_search_line) - map("i", "", actions.edit_search_line) - - -- TODO: Find a way to insert the text... it seems hard. - -- map('i', '', actions.insert_value, { expr = true }) - - return true - end, - }):find() -end - -internal.vim_options = function(opts) - -- Load vim options. - local vim_opts = loadfile(Path:new({ utils.data_directory(), "options", "options.lua" }):absolute())().options - - pickers.new(opts, { - prompt_title = "options", - finder = finders.new_table { - results = vim_opts, - entry_maker = opts.entry_maker or make_entry.gen_from_vimoptions(opts), - }, - -- TODO: previewer for Vim options - -- previewer = previewers.help.new(opts), - sorter = conf.generic_sorter(opts), - attach_mappings = function() - actions.select_default:replace(function() - local selection = action_state.get_selected_entry() - if selection == nil then - utils.__warn_no_selection "builtin.vim_options" - return - end - - local esc = "" - if vim.fn.mode() == "i" then - -- TODO: don't make this local - esc = vim.api.nvim_replace_termcodes("", true, false, true) - end - - -- TODO: Make this actually work. - - -- actions.close(prompt_bufnr) - -- vim.api.nvim_win_set_var(vim.api.nvim_get_current_win(), "telescope", 1) - -- print(prompt_bufnr) - -- print(vim.fn.bufnr()) - -- vim.cmd([[ autocmd BufEnter ++nested ++once startinsert!]]) - -- print(vim.fn.winheight(0)) - - -- local prompt_winnr = vim.fn.getbufinfo(prompt_bufnr)[1].windows[1] - -- print(prompt_winnr) - - -- local float_opts = {} - -- float_opts.relative = "editor" - -- float_opts.anchor = "sw" - -- float_opts.focusable = false - -- float_opts.style = "minimal" - -- float_opts.row = vim.api.nvim_get_option("lines") - 2 -- TODO: inc `cmdheight` and `laststatus` in this calc - -- float_opts.col = 2 - -- float_opts.height = 10 - -- float_opts.width = string.len(selection.last_set_from)+15 - -- local buf = vim.api.nvim_create_buf(false, true) - -- vim.api.nvim_buf_set_lines(buf, 0, 0, false, - -- {"default value: abcdef", "last set from: " .. selection.last_set_from}) - -- local status_win = vim.api.nvim_open_win(buf, false, float_opts) - -- -- vim.api.nvim_win_set_option(status_win, "winblend", 100) - -- vim.api.nvim_win_set_option(status_win, "winhl", "Normal:PmenuSel") - -- -- vim.api.nvim_set_current_win(status_win) - -- vim.cmd[[redraw!]] - -- vim.cmd("autocmd CmdLineLeave : ++once echom 'beep'") - vim.api.nvim_feedkeys(string.format("%s:set %s=%s", esc, selection.name, selection.current_value), "m", true) - end) - - return true - end, - }):find() -end - -internal.help_tags = function(opts) - opts.lang = utils.get_default(opts.lang, vim.o.helplang) - opts.fallback = utils.get_default(opts.fallback, true) - opts.file_ignore_patterns = {} - - local langs = vim.split(opts.lang, ",", true) - if opts.fallback and not vim.tbl_contains(langs, "en") then - table.insert(langs, "en") - end - local langs_map = {} - for _, lang in ipairs(langs) do - langs_map[lang] = true - end - - local tag_files = {} - local function add_tag_file(lang, file) - if langs_map[lang] then - if tag_files[lang] then - table.insert(tag_files[lang], file) - else - tag_files[lang] = { file } - end - end - end - - local help_files = {} - local all_files = vim.api.nvim_get_runtime_file("doc/*", true) - for _, fullpath in ipairs(all_files) do - local file = utils.path_tail(fullpath) - if file == "tags" then - add_tag_file("en", fullpath) - elseif file:match "^tags%-..$" then - local lang = file:sub(-2) - add_tag_file(lang, fullpath) - else - help_files[file] = fullpath - end - end - - local tags = {} - local tags_map = {} - local delimiter = string.char(9) - for _, lang in ipairs(langs) do - for _, file in ipairs(tag_files[lang] or {}) do - local lines = vim.split(Path:new(file):read(), "\n", true) - for _, line in ipairs(lines) do - -- TODO: also ignore tagComment starting with ';' - if not line:match "^!_TAG_" then - local fields = vim.split(line, delimiter, true) - if #fields == 3 and not tags_map[fields[1]] then - if fields[1] ~= "help-tags" or fields[2] ~= "tags" then - table.insert(tags, { - name = fields[1], - filename = help_files[fields[2]], - cmd = fields[3], - lang = lang, - }) - tags_map[fields[1]] = true - end - end - end - end - end - end - - pickers.new(opts, { - prompt_title = "Help", - finder = finders.new_table { - results = tags, - entry_maker = function(entry) - return { - value = entry.name .. "@" .. entry.lang, - display = entry.name, - ordinal = entry.name, - filename = entry.filename, - cmd = entry.cmd, - } - end, - }, - previewer = previewers.help.new(opts), - sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr) - action_set.select:replace(function(_, cmd) - local selection = action_state.get_selected_entry() - if selection == nil then - utils.__warn_no_selection "builtin.help_tags" - return - end - - actions.close(prompt_bufnr) - if cmd == "default" or cmd == "horizontal" then - vim.cmd("help " .. selection.value) - elseif cmd == "vertical" then - vim.cmd("vert help " .. selection.value) - elseif cmd == "tab" then - vim.cmd("tab help " .. selection.value) - end - end) - - return true - end, - }):find() -end - -internal.man_pages = function(opts) - opts.sections = utils.get_default(opts.sections, { "1" }) - assert(vim.tbl_islist(opts.sections), "sections should be a list") - opts.man_cmd = utils.get_lazy_default(opts.man_cmd, function() - local is_darwin = vim.loop.os_uname().sysname == "Darwin" - return is_darwin and { "apropos", " " } or { "apropos", "" } - end) - opts.entry_maker = opts.entry_maker or make_entry.gen_from_apropos(opts) - opts.env = { PATH = vim.env.PATH, MANPATH = vim.env.MANPATH } - - pickers.new(opts, { - prompt_title = "Man", - finder = finders.new_oneshot_job(opts.man_cmd, opts), - previewer = previewers.man.new(opts), - sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr) - action_set.select:replace(function(_, cmd) - local selection = action_state.get_selected_entry() - if selection == nil then - utils.__warn_no_selection "builtin.man_pages" - return - end - - local args = selection.section .. " " .. selection.value - actions.close(prompt_bufnr) - if cmd == "default" or cmd == "horizontal" then - vim.cmd("Man " .. args) - elseif cmd == "vertical" then - vim.cmd("vert Man " .. args) - elseif cmd == "tab" then - vim.cmd("tab Man " .. args) - end - end) - - return true - end, - }):find() -end - -internal.reloader = function(opts) - local package_list = vim.tbl_keys(package.loaded) - - -- filter out packages we don't want and track the longest package name - local column_len = 0 - for index, module_name in pairs(package_list) do - if - type(require(module_name)) ~= "table" - or module_name:sub(1, 1) == "_" - or package.searchpath(module_name, package.path) == nil - then - table.remove(package_list, index) - elseif #module_name > column_len then - column_len = #module_name - end - end - opts.column_len = vim.F.if_nil(opts.column_len, column_len) - - pickers.new(opts, { - prompt_title = "Packages", - finder = finders.new_table { - results = package_list, - entry_maker = opts.entry_maker or make_entry.gen_from_packages(opts), - }, - -- previewer = previewers.vim_buffer.new(opts), - sorter = conf.generic_sorter(opts), - - attach_mappings = function(prompt_bufnr) - actions.select_default:replace(function() - local selection = action_state.get_selected_entry() - if selection == nil then - utils.__warn_no_selection "builtin.reloader" - return - end - - actions.close(prompt_bufnr) - require("plenary.reload").reload_module(selection.value) - utils.notify("builtin.reloader", { - msg = string.format("[%s] - module reloaded", selection.value), - level = "INFO", - }) - end) - - return true - end, - }):find() -end - -internal.buffers = function(opts) - opts = apply_cwd_only_aliases(opts) - local bufnrs = filter(function(b) - if 1 ~= vim.fn.buflisted(b) then - return false - end - -- only hide unloaded buffers if opts.show_all_buffers is false, keep them listed if true or nil - if opts.show_all_buffers == false and not vim.api.nvim_buf_is_loaded(b) then - return false - end - if opts.ignore_current_buffer and b == vim.api.nvim_get_current_buf() then - return false - end - if opts.cwd_only and not string.find(vim.api.nvim_buf_get_name(b), vim.loop.cwd(), 1, true) then - return false - end - return true - end, vim.api.nvim_list_bufs()) - if not next(bufnrs) then - return - end - if opts.sort_mru then - table.sort(bufnrs, function(a, b) - return vim.fn.getbufinfo(a)[1].lastused > vim.fn.getbufinfo(b)[1].lastused - end) - end - - local buffers = {} - local default_selection_idx = 1 - for _, bufnr in ipairs(bufnrs) do - local flag = bufnr == vim.fn.bufnr "" and "%" or (bufnr == vim.fn.bufnr "#" and "#" or " ") - - if opts.sort_lastused and not opts.ignore_current_buffer and flag == "#" then - default_selection_idx = 2 - end - - local element = { - bufnr = bufnr, - flag = flag, - info = vim.fn.getbufinfo(bufnr)[1], - } - - if opts.sort_lastused and (flag == "#" or flag == "%") then - local idx = ((buffers[1] ~= nil and buffers[1].flag == "%") and 2 or 1) - table.insert(buffers, idx, element) - else - table.insert(buffers, element) - end - end - - if not opts.bufnr_width then - local max_bufnr = math.max(unpack(bufnrs)) - opts.bufnr_width = #tostring(max_bufnr) - end - - pickers.new(opts, { - prompt_title = "Buffers", - finder = finders.new_table { - results = buffers, - entry_maker = opts.entry_maker or make_entry.gen_from_buffer(opts), - }, - previewer = conf.grep_previewer(opts), - sorter = conf.generic_sorter(opts), - default_selection_index = default_selection_idx, - }):find() -end - -internal.colorscheme = function(opts) - local before_background = vim.o.background - local before_color = vim.api.nvim_exec("colorscheme", true) - local need_restore = true - - local colors = opts.colors or { before_color } - if not vim.tbl_contains(colors, before_color) then - table.insert(colors, 1, before_color) - end - - colors = vim.list_extend( - colors, - vim.tbl_filter(function(color) - return color ~= before_color - end, vim.fn.getcompletion("", "color")) - ) - - local previewer - if opts.enable_preview then - -- define previewer - local bufnr = vim.api.nvim_get_current_buf() - local p = vim.api.nvim_buf_get_name(bufnr) - - -- don't need previewer - if vim.fn.buflisted(bufnr) ~= 1 then - local deleted = false - local function del_win(win_id) - if win_id and vim.api.nvim_win_is_valid(win_id) then - utils.buf_delete(vim.api.nvim_win_get_buf(win_id)) - pcall(vim.api.nvim_win_close, win_id, true) - end - end - - previewer = previewers.new { - preview_fn = function(_, entry, status) - if not deleted then - deleted = true - del_win(status.preview_win) - del_win(status.preview_border_win) - end - vim.cmd("colorscheme " .. entry.value) - end, - } - else - -- show current buffer content in previewer - previewer = previewers.new_buffer_previewer { - get_buffer_by_name = function() - return p - end, - define_preview = function(self, entry) - if vim.loop.fs_stat(p) then - conf.buffer_previewer_maker(p, self.state.bufnr, { bufname = self.state.bufname }) - else - local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false) - vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, lines) - end - vim.cmd("colorscheme " .. entry.value) - end, - } - end - end - - local picker = pickers.new(opts, { - prompt_title = "Change Colorscheme", - finder = finders.new_table { - results = colors, - }, - sorter = conf.generic_sorter(opts), - previewer = previewer, - attach_mappings = function(prompt_bufnr) - actions.select_default:replace(function() - local selection = action_state.get_selected_entry() - if selection == nil then - utils.__warn_no_selection "builtin.colorscheme" - return - end - - actions.close(prompt_bufnr) - need_restore = false - vim.cmd("colorscheme " .. selection.value) - end) - - return true - end, - }) - - if opts.enable_preview then - -- rewrite picker.close_windows. restore color if needed - local close_windows = picker.close_windows - picker.close_windows = function(status) - close_windows(status) - if need_restore then - vim.o.background = before_background - vim.cmd("colorscheme " .. before_color) - end - end - end - - picker:find() -end - -internal.marks = function(opts) - local marks = vim.api.nvim_exec("marks", true) - local marks_table = vim.fn.split(marks, "\n") - - -- Pop off the header. - table.remove(marks_table, 1) - - pickers.new(opts, { - prompt_title = "Marks", - finder = finders.new_table { - results = marks_table, - entry_maker = opts.entry_maker or make_entry.gen_from_marks(opts), - }, - previewer = conf.grep_previewer(opts), - sorter = conf.generic_sorter(opts), - push_cursor_on_edit = true, - }):find() -end - -internal.registers = function(opts) - local registers_table = { '"', "_", "#", "=", "_", "/", "*", "+", ":", ".", "%" } - - -- named - for i = 0, 9 do - table.insert(registers_table, tostring(i)) - end - - -- alphabetical - for i = 65, 90 do - table.insert(registers_table, string.char(i)) - end - - pickers.new(opts, { - prompt_title = "Registers", - finder = finders.new_table { - results = registers_table, - entry_maker = opts.entry_maker or make_entry.gen_from_registers(opts), - }, - -- use levenshtein as n-gram doesn't support <2 char matches - sorter = sorters.get_levenshtein_sorter(), - attach_mappings = function(_, map) - actions.select_default:replace(actions.paste_register) - map("i", "", actions.edit_register) - - return true - end, - }):find() -end - --- TODO: make filtering include the mapping and the action -internal.keymaps = function(opts) - opts.modes = vim.F.if_nil(opts.modes, { "n", "i", "c", "x" }) - opts.show_plug = vim.F.if_nil(opts.show_plug, true) - - local keymap_encountered = {} -- used to make sure no duplicates are inserted into keymaps_table - local keymaps_table = {} - local max_len_lhs = 0 - - -- helper function to populate keymaps_table and determine max_len_lhs - local function extract_keymaps(keymaps) - for _, keymap in pairs(keymaps) do - local keymap_key = keymap.buffer .. keymap.mode .. keymap.lhs -- should be distinct for every keymap - if not keymap_encountered[keymap_key] then - keymap_encountered[keymap_key] = true - if opts.show_plug or not string.find(keymap.lhs, "") then - table.insert(keymaps_table, keymap) - max_len_lhs = math.max(max_len_lhs, #utils.display_termcodes(keymap.lhs)) - end - end - end - end - - for _, mode in pairs(opts.modes) do - local global = vim.api.nvim_get_keymap(mode) - local buf_local = vim.api.nvim_buf_get_keymap(0, mode) - extract_keymaps(global) - extract_keymaps(buf_local) - end - opts.width_lhs = max_len_lhs + 1 - - pickers.new(opts, { - prompt_title = "Key Maps", - finder = finders.new_table { - results = keymaps_table, - entry_maker = opts.entry_maker or make_entry.gen_from_keymaps(opts), - }, - sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr) - actions.select_default:replace(function() - local selection = action_state.get_selected_entry() - if selection == nil then - utils.__warn_no_selection "builtin.keymaps" - return - end - - vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(selection.value.lhs, true, false, true), "t", true) - return actions.close(prompt_bufnr) - end) - return true - end, - }):find() -end - -internal.filetypes = function(opts) - local filetypes = vim.fn.getcompletion("", "filetype") - - pickers.new(opts, { - prompt_title = "Filetypes", - finder = finders.new_table { - results = filetypes, - }, - sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr) - actions.select_default:replace(function() - local selection = action_state.get_selected_entry() - if selection == nil then - print "[telescope] Nothing currently selected" - return - end - - actions.close(prompt_bufnr) - vim.cmd("setfiletype " .. selection[1]) - end) - return true - end, - }):find() -end - -internal.highlights = function(opts) - local highlights = vim.fn.getcompletion("", "highlight") - - pickers.new(opts, { - prompt_title = "Highlights", - finder = finders.new_table { - results = highlights, - entry_maker = opts.entry_maker or make_entry.gen_from_highlights(opts), - }, - sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr) - actions.select_default:replace(function() - local selection = action_state.get_selected_entry() - if selection == nil then - utils.__warn_no_selection "builtin.highlights" - return - end - - actions.close(prompt_bufnr) - vim.cmd("hi " .. selection.value) - end) - return true - end, - previewer = previewers.highlights.new(opts), - }):find() -end - -internal.autocommands = function(opts) - local autocmd_table = {} - - local pattern = {} - pattern.BUFFER = "" - pattern.EVENT = "[%a]+" - pattern.GROUP = "[%a%d_:]+" - pattern.INDENT = "^%s%s%s%s" -- match indentation of 4 spaces - - local event, group, ft_pat, cmd, source_file, source_lnum - local current_event, current_group, current_ft - - local inner_loop = function(line) - -- capture group and event - group, event = line:match("^(" .. pattern.GROUP .. ")%s+(" .. pattern.EVENT .. ")") - -- ..or just an event - if event == nil then - event = line:match("^(" .. pattern.EVENT .. ")") - end - - if event then - group = group or "" - if event ~= current_event or group ~= current_group then - current_event = event - current_group = group - end - return - end - - -- non event/group lines - ft_pat = line:match(pattern.INDENT .. "(%S+)") - if ft_pat then - if ft_pat:match "^%d+" then - ft_pat = "" - end - current_ft = ft_pat - - -- is there a command on the same line? - cmd = line:match(pattern.INDENT .. "%S+%s+(.+)") - - return - end - - if current_ft and cmd == nil then - -- trim leading spaces - cmd = line:gsub("^%s+", "") - return - end - - if current_ft and cmd then - source_file = line:match "Last set from (.*) line %d*$" or line:match "Last set from (.*)$" - source_lnum = line:match "line (%d*)$" or "1" - if source_file then - local autocmd = {} - autocmd.event = current_event - autocmd.group = current_group - autocmd.ft_pattern = current_ft - autocmd.command = cmd - autocmd.source_file = source_file - autocmd.source_lnum = source_lnum - table.insert(autocmd_table, autocmd) - - cmd = nil - end - end - end - - local cmd_output = vim.fn.execute("verb autocmd *", "silent") - for line in cmd_output:gmatch "[^\r\n]+" do - inner_loop(line) - end - - pickers.new(opts, { - prompt_title = "autocommands", - finder = finders.new_table { - results = autocmd_table, - entry_maker = opts.entry_maker or make_entry.gen_from_autocommands(opts), - }, - previewer = previewers.autocommands.new(opts), - sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr) - action_set.select:replace(function(_, type) - local selection = action_state.get_selected_entry() - if selection == nil then - utils.__warn_no_selection "builtin.autocommands" - return - end - - actions.close(prompt_bufnr) - vim.cmd(action_state.select_key_to_edit_key(type) .. " " .. selection.value) - end) - - return true - end, - }):find() -end - -internal.spell_suggest = function(opts) - local cursor_word = vim.fn.expand "" - local suggestions = vim.fn.spellsuggest(cursor_word) - - pickers.new(opts, { - prompt_title = "Spelling Suggestions", - finder = finders.new_table { - results = suggestions, - }, - sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr) - actions.select_default:replace(function() - local selection = action_state.get_selected_entry() - if selection == nil then - utils.__warn_no_selection "builtin.spell_suggest" - return - end - - actions.close(prompt_bufnr) - vim.cmd("normal! ciw" .. selection[1]) - vim.cmd "stopinsert" - end) - return true - end, - }):find() -end - -internal.tagstack = function(opts) - opts = opts or {} - local tagstack = vim.fn.gettagstack().items - - local tags = {} - for i = #tagstack, 1, -1 do - local tag = tagstack[i] - tag.bufnr = tag.from[1] - if vim.api.nvim_buf_is_valid(tag.bufnr) then - tags[#tags + 1] = tag - tag.filename = vim.fn.bufname(tag.bufnr) - tag.lnum = tag.from[2] - tag.col = tag.from[3] - - tag.text = vim.api.nvim_buf_get_lines(tag.bufnr, tag.lnum - 1, tag.lnum, false)[1] or "" - end - end - - if vim.tbl_isempty(tags) then - utils.notify("builtin.tagstack", { - msg = "No tagstack available", - level = "WARN", - }) - return - end - - pickers.new(opts, { - prompt_title = "TagStack", - finder = finders.new_table { - results = tags, - entry_maker = make_entry.gen_from_quickfix(opts), - }, - previewer = conf.qflist_previewer(opts), - sorter = conf.generic_sorter(opts), - }):find() -end - -internal.jumplist = function(opts) - opts = opts or {} - local jumplist = vim.fn.getjumplist()[1] - - -- reverse the list - local sorted_jumplist = {} - for i = #jumplist, 1, -1 do - 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] - or "" - table.insert(sorted_jumplist, jumplist[i]) - end - end - - pickers.new(opts, { - prompt_title = "Jumplist", - finder = finders.new_table { - results = sorted_jumplist, - entry_maker = make_entry.gen_from_quickfix(opts), - }, - previewer = conf.qflist_previewer(opts), - sorter = conf.generic_sorter(opts), - }):find() -end - -local function apply_checks(mod) - for k, v in pairs(mod) do - mod[k] = function(opts) - opts = opts or {} - - v(opts) - end - end - - return mod -end - -return apply_checks(internal) diff --git a/bundle/telescope.nvim/lua/telescope/config.lua b/bundle/telescope.nvim/lua/telescope/config.lua index 37a28461c..8eeb60e9f 100644 --- a/bundle/telescope.nvim/lua/telescope/config.lua +++ b/bundle/telescope.nvim/lua/telescope/config.lua @@ -1,7 +1,6 @@ local strings = require "plenary.strings" local deprecated = require "telescope.deprecated" local sorters = require "telescope.sorters" -local if_nil = vim.F.if_nil local os_sep = require("plenary.path").path.sep local has_win = vim.fn.has "win32" == 1 @@ -69,7 +68,7 @@ config.descriptions = {} config.pickers = _TelescopeConfigurationPickers function config.set_pickers(pickers) - pickers = if_nil(pickers, {}) + pickers = vim.F.if_nil(pickers, {}) for k, v in pairs(pickers) do config.pickers[k] = v @@ -153,25 +152,6 @@ append( - "ascending"]] ) -append( - "tiebreak", - function(current_entry, existing_entry, _) - return #current_entry.ordinal < #existing_entry.ordinal - end, - [[ - A function that determines how to break a tie when two entries have - the same score. - Having a function that always returns false would keep the entries in - the order they are found, so existing_entry before current_entry. - Vice versa always returning true would place the current_entry - before the existing_entry. - - Signature: function(current_entry, existing_entry, prompt) -> boolean - - Default: function that breaks the tie based on the length of the - entry's ordinal]] -) - append( "selection_strategy", "reset", @@ -182,7 +162,8 @@ append( - "reset" (default) - "follow" - "row" - - "closest"]] + - "closest" + - "none"]] ) append( @@ -442,6 +423,28 @@ append( Default: "Prompt"]] ) +append( + "mappings", + {}, + [[ + Your mappings to override telescope's default mappings. + + See: ~ + |telescope.mappings| + ]] +) + +append( + "default_mappings", + nil, + [[ + Not recommended to use except for advanced users. + + Will allow you to completely remove all of telescope's default maps + and use your own. + ]] +) + append( "history", { @@ -593,8 +596,17 @@ append( highlighting, which falls back to regex-based highlighting. `true`: treesitter highlighting for all available filetypes `false`: regex-based highlighting for all filetypes - `table`: table of filetypes for which to attach treesitter - highlighting + `table`: following nvim-treesitters highlighting options: + It contains two keys: + - enable boolean|table: if boolean, enable all ts + highlighing with that flag, + disable still considered. + Containing a list of filetypes, + that are enabled, disabled + ignored because it doesnt make + any sense in this case. + - disable table: containing a list of filetypes + that are disabled Default: true - msg_bg_fillchar: Character to fill background of unpreviewable buffers with Default: "╱" @@ -653,91 +665,12 @@ append( true, [[ Boolean if devicons should be enabled or not. If set to false, the - "TelescopeResultsFileIcon" highlight group is used. + text highlight group is used. Hint: Coloring only works if |termguicolors| is enabled. Default: true]] ) -append( - "mappings", - {}, - [[ - Your mappings to override telescope's default mappings. - - Format is: - { - mode = { ..keys } - } - - where {mode} is the one character letter for a mode - ('i' for insert, 'n' for normal). - - For example: - - mappings = { - i = { - [""] = require('telescope.actions').close, - }, - } - - - To disable a keymap, put [map] = false - So, to not map "", just put - - ..., - [""] = false, - ..., - - Into your config. - - - otherwise, just set the mapping to the function that you want it to - be. - - ..., - [""] = require('telescope.actions').select_default, - ..., - - 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: - - ..., - [""] = "select_default", - ..., - - You can also add other mappings using tables with `type = "command"`. - For example: - - ..., - ["jj"] = { "", type = "command" }, - ["kk"] = { "echo \"Hello, World!\"", type = "command" },) - ..., - - You can also add additional options for mappings of any type - ("action" and "command"). For example: - - ..., - [""] = { - action = actions.move_selection_next, - opts = { nowait = true, silent = true } - }, - ..., - ]] -) - -append( - "default_mappings", - nil, - [[ - Not recommended to use except for advanced users. - - Will allow you to completely remove all of telescope's default maps - and use your own. - ]] -) - append( "file_sorter", sorters.get_fzy_sorter, @@ -774,6 +707,25 @@ append( Default: require("telescope.sorters").prefilter]] ) +append( + "tiebreak", + function(current_entry, existing_entry, _) + return #current_entry.ordinal < #existing_entry.ordinal + end, + [[ + A function that determines how to break a tie when two entries have + the same score. + Having a function that always returns false would keep the entries in + the order they are found, so existing_entry before current_entry. + Vice versa always returning true would place the current_entry + before the existing_entry. + + Signature: function(current_entry, existing_entry, prompt) -> boolean + + Default: function that breaks the tie based on the length of the + entry's ordinal]] +) + append( "file_ignore_patterns", nil, @@ -783,10 +735,35 @@ append( Example: { "%.npz" } -- ignore all npz files See: https://www.lua.org/manual/5.1/manual.html#5.4.1 for more information about lua regex + Note: `file_ignore_patterns` will be used in all pickers that have a + file associated. This might lead to the problem that lsp_ pickers + aren't displaying results because they might be ignored by + `file_ignore_patterns`. For example, setting up node_modules as ignored + will never show node_modules in any results, even if you are + interested in lsp_ results. + + If you only want `file_ignore_patterns` for `find_files` and + `grep_string`/`live_grep` it is suggested that you setup `gitignore` + and have fd and or ripgrep installed because both tools will not show + `gitignore`d files on default. Default: nil]] ) +append( + "get_selection_window", + function() + return 0 + end, + [[ + Function that takes function(picker, entry) and returns a window id. + The window ID will be used to decide what window the chosen file will + be opened in and the cursor placed in upon leaving the picker. + + Default: `function() return 0 end` + ]] +) + append( "file_previewer", function(...) @@ -851,8 +828,8 @@ append( -- @param tele_defaults table: (optional) a table containing all of the defaults -- for telescope [defaults to `telescope_defaults`] function config.set_defaults(user_defaults, tele_defaults) - user_defaults = if_nil(user_defaults, {}) - tele_defaults = if_nil(tele_defaults, telescope_defaults) + user_defaults = vim.F.if_nil(user_defaults, {}) + tele_defaults = vim.F.if_nil(tele_defaults, telescope_defaults) -- Check if using layout keywords outside of `layout_config` deprecated.options(user_defaults) @@ -860,18 +837,21 @@ function config.set_defaults(user_defaults, tele_defaults) local function get(name, default_val) if name == "layout_config" then return smarter_depth_2_extend( - if_nil(user_defaults[name], {}), - vim.tbl_deep_extend("keep", if_nil(config.values[name], {}), if_nil(default_val, {})) + vim.F.if_nil(user_defaults[name], {}), + vim.tbl_deep_extend("keep", vim.F.if_nil(config.values[name], {}), vim.F.if_nil(default_val, {})) ) end if name == "history" or name == "cache_picker" or name == "preview" then if user_defaults[name] == false or config.values[name] == false then return false end + if user_defaults[name] == true then + return vim.F.if_nil(config.values[name], {}) + end return smarter_depth_2_extend( - if_nil(user_defaults[name], {}), - vim.tbl_deep_extend("keep", if_nil(config.values[name], {}), if_nil(default_val, {})) + vim.F.if_nil(user_defaults[name], {}), + vim.tbl_deep_extend("keep", vim.F.if_nil(config.values[name], {}), vim.F.if_nil(default_val, {})) ) end return first_non_null(user_defaults[name], config.values[name], default_val) @@ -881,9 +861,7 @@ function config.set_defaults(user_defaults, tele_defaults) assert(description, "Config values must always have a description") config.values[name] = get(name, default_val) - if description then - config.descriptions[name] = strings.dedent(description) - end + config.descriptions[name] = strings.dedent(description) end for key, info in pairs(tele_defaults) do diff --git a/bundle/telescope.nvim/lua/telescope/config/resolve.lua b/bundle/telescope.nvim/lua/telescope/config/resolve.lua index 0c92ac609..9b951d32a 100644 --- a/bundle/telescope.nvim/lua/telescope/config/resolve.lua +++ b/bundle/telescope.nvim/lua/telescope/config/resolve.lua @@ -91,8 +91,6 @@ That's the next step to scrolling. --]] -local get_default = require("telescope.utils").get_default - local resolver = {} local _resolve_map = {} @@ -129,9 +127,6 @@ end] = function(selector, val) end end --- Tables TODO: --- ... {70, max} - -- function: -- Function must have same signature as get_window_layout -- function(self, max_columns, max_lines): number @@ -143,6 +138,26 @@ end] = function(_, val) return val end +_resolve_map[function(val) + return type(val) == "table" and val["max"] ~= nil and val[1] ~= nil and val[1] >= 0 and val[1] < 1 +end] = + function(selector, val) + return function(...) + local selected = select(selector, ...) + return math.min(math.floor(val[1] * selected), val["max"]) + end + end + +_resolve_map[function(val) + return type(val) == "table" and val["min"] ~= nil and val[1] ~= nil and val[1] >= 0 and val[1] < 1 +end] = + function(selector, val) + return function(...) + local selected = select(selector, ...) + return math.max(math.floor(val[1] * selected), val["min"]) + end + end + -- Add padding option _resolve_map[function(val) return type(val) == "table" and val["padding"] ~= nil @@ -164,7 +179,7 @@ end] = function(selector, val) end --- Converts input to a function that returns the height. ---- The input must take one of four forms: +--- The input must take one of five forms: --- 1. 0 <= number < 1
--- This means total height as a percentage. --- 2. 1 <= number
@@ -172,7 +187,10 @@ end --- 3. function
--- Must have signature: --- function(self, max_columns, max_lines): number ---- 4. table of the form: {padding = `foo`}
+--- 4. table of the form: { val, max = ..., min = ... }
+--- val has to be in the first form 0 <= val < 1 and only one is given, +--- `min` or `max` as fixed number +--- 5. table of the form: {padding = `foo`}
--- where `foo` has one of the previous three forms.
--- The height is then set to be the remaining space after padding. --- For example, if the window has height 50, and the input is {padding = 5}, @@ -190,7 +208,7 @@ resolver.resolve_height = function(val) end --- Converts input to a function that returns the width. ---- The input must take one of four forms: +--- The input must take one of five forms: --- 1. 0 <= number < 1
--- This means total width as a percentage. --- 2. 1 <= number
@@ -198,7 +216,10 @@ end --- 3. function
--- Must have signature: --- function(self, max_columns, max_lines): number ---- 4. table of the form: {padding = `foo`}
+--- 4. table of the form: { val, max = ..., min = ... }
+--- val has to be in the first form 0 <= val < 1 and only one is given, +--- `min` or `max` as fixed number +--- 5. table of the form: {padding = `foo`}
--- where `foo` has one of the previous three forms.
--- The width is then set to be the remaining space after padding. --- For example, if the window has width 100, and the input is {padding = 5}, @@ -286,9 +307,9 @@ resolver.win_option = function(val, default) end return { - preview = get_default(val.preview, val_to_set), - results = get_default(val.results, val_to_set), - prompt = get_default(val.prompt, val_to_set), + preview = vim.F.if_nil(val.preview, val_to_set), + results = vim.F.if_nil(val.results, val_to_set), + prompt = vim.F.if_nil(val.prompt, val_to_set), } end end diff --git a/bundle/telescope.nvim/lua/telescope/finders.lua b/bundle/telescope.nvim/lua/telescope/finders.lua index d9aa810c6..fe1af9617 100644 --- a/bundle/telescope.nvim/lua/telescope/finders.lua +++ b/bundle/telescope.nvim/lua/telescope/finders.lua @@ -44,7 +44,7 @@ function JobFinder:new(opts) assert(not opts.static, "`static` should be used with finder.new_oneshot_job") local obj = setmetatable({ - entry_maker = opts.entry_maker or make_entry.gen_from_string, + entry_maker = opts.entry_maker or make_entry.gen_from_string(opts), fn_command = opts.fn_command, cwd = opts.cwd, writer = opts.writer, @@ -122,7 +122,7 @@ function DynamicFinder:new(opts) local obj = setmetatable({ curr_buf = opts.curr_buf, fn = opts.fn, - entry_maker = opts.entry_maker or make_entry.gen_from_string, + entry_maker = opts.entry_maker or make_entry.gen_from_string(opts), }, self) return obj @@ -180,7 +180,7 @@ finders.new_oneshot_job = function(command_list, opts) local command = table.remove(command_list, 1) return async_oneshot_finder { - entry_maker = opts.entry_maker or make_entry.gen_from_string(), + entry_maker = opts.entry_maker or make_entry.gen_from_string(opts), cwd = opts.cwd, maximum_results = opts.maximum_results, diff --git a/bundle/telescope.nvim/lua/telescope/finders/async_job_finder.lua b/bundle/telescope.nvim/lua/telescope/finders/async_job_finder.lua index f2c4f393d..20af604e8 100644 --- a/bundle/telescope.nvim/lua/telescope/finders/async_job_finder.lua +++ b/bundle/telescope.nvim/lua/telescope/finders/async_job_finder.lua @@ -6,7 +6,7 @@ local log = require "telescope.log" return function(opts) log.trace("Creating async_job:", opts) - local entry_maker = opts.entry_maker or make_entry.gen_from_string() + local entry_maker = opts.entry_maker or make_entry.gen_from_string(opts) local fn_command = function(prompt) local command_list = opts.command_generator(prompt) diff --git a/bundle/telescope.nvim/lua/telescope/finders/async_oneshot_finder.lua b/bundle/telescope.nvim/lua/telescope/finders/async_oneshot_finder.lua index c8c2957b4..bafb1345e 100644 --- a/bundle/telescope.nvim/lua/telescope/finders/async_oneshot_finder.lua +++ b/bundle/telescope.nvim/lua/telescope/finders/async_oneshot_finder.lua @@ -9,7 +9,7 @@ local await_count = 1000 return function(opts) opts = opts or {} - local entry_maker = opts.entry_maker or make_entry.gen_from_string + local entry_maker = opts.entry_maker or make_entry.gen_from_string(opts) local cwd = opts.cwd local env = opts.env local fn_command = assert(opts.fn_command, "Must pass `fn_command`") @@ -30,6 +30,7 @@ return function(opts) end end, results = results, + entry_maker = entry_maker, }, { __call = function(_, prompt, process_result, process_complete) if not job_started then diff --git a/bundle/telescope.nvim/lua/telescope/finders/async_static_finder.lua b/bundle/telescope.nvim/lua/telescope/finders/async_static_finder.lua index 941d85815..140d1c8d9 100644 --- a/bundle/telescope.nvim/lua/telescope/finders/async_static_finder.lua +++ b/bundle/telescope.nvim/lua/telescope/finders/async_static_finder.lua @@ -10,7 +10,7 @@ return function(opts) input_results = opts.results end - local entry_maker = opts.entry_maker or make_entry.gen_from_string() + local entry_maker = opts.entry_maker or make_entry.gen_from_string(opts) local results = {} for k, v in ipairs(input_results) do @@ -24,6 +24,7 @@ return function(opts) return setmetatable({ results = results, + entry_maker = entry_maker, close = function() end, }, { __call = function(_, _, process_result, process_complete) diff --git a/bundle/telescope.nvim/lua/telescope/from_entry.lua b/bundle/telescope.nvim/lua/telescope/from_entry.lua index 572a244d4..486b57cef 100644 --- a/bundle/telescope.nvim/lua/telescope/from_entry.lua +++ b/bundle/telescope.nvim/lua/telescope/from_entry.lua @@ -12,13 +12,7 @@ local from_entry = {} function from_entry.path(entry, validate, escape) escape = vim.F.if_nil(escape, true) - local path - if escape then - path = entry.path and vim.fn.fnameescape(entry.path) or nil - else - path = entry.path - end - + local path = entry.path if path == nil then path = entry.filename end @@ -30,10 +24,20 @@ function from_entry.path(entry, validate, escape) return end - if validate and not vim.fn.filereadable(path) then - return + -- only 0 if neither filereadable nor directory + if validate then + -- We need to expand for filereadable and isdirectory + -- TODO(conni2461): we are not going to return the expanded path because + -- this would lead to cache misses in the perviewer. + -- Requires overall refactoring in previewer interface + local expanded = vim.fn.expand(path) + if (vim.fn.filereadable(expanded) + vim.fn.isdirectory(expanded)) == 0 then + return + end + end + if escape then + return vim.fn.fnameescape(path) end - return path end diff --git a/bundle/telescope.nvim/lua/telescope/health.lua b/bundle/telescope.nvim/lua/telescope/health.lua index 05ec37d74..d33a96673 100644 --- a/bundle/telescope.nvim/lua/telescope/health.lua +++ b/bundle/telescope.nvim/lua/telescope/health.lua @@ -1,4 +1,4 @@ -local health = require "health" +local health = vim.health or require "health" local extension_module = require "telescope._extensions" local extension_info = require("telescope").extensions local is_win = vim.api.nvim_call_function("has", { "win32" }) == 1 diff --git a/bundle/telescope.nvim/lua/telescope/init.lua b/bundle/telescope.nvim/lua/telescope/init.lua index 0cc200944..c267f0666 100644 --- a/bundle/telescope.nvim/lua/telescope/init.lua +++ b/bundle/telescope.nvim/lua/telescope/init.lua @@ -13,7 +13,7 @@ local telescope = {} --- --- Getting started with telescope: --- 1. Run `:checkhealth telescope` to make sure everything is installed. ---- 2. Evalulate it working with +--- 2. Evaluate it working with --- `:Telescope find_files` or --- `:lua require("telescope.builtin").find_files()` --- 3. Put a `require("telescope").setup() call somewhere in your neovim config. @@ -90,6 +90,7 @@ local telescope = {} ---@brief ]] ---@tag telescope.nvim +---@config { ["name"] = "INTRODUCTION" } --- Setup function to be run by user. Configures the defaults, pickers and --- extensions of telescope. @@ -134,12 +135,6 @@ function telescope.setup(opts) _extensions.set_config(opts.extensions) end ---- Register an extension. To be used by plugin authors. ----@param mod table: Module -function telescope.register_extension(mod) - return _extensions.register(mod) -end - --- Load an extension. --- - Notes: --- - Loading triggers ext setup via the config passed in |telescope.setup| @@ -148,6 +143,12 @@ function telescope.load_extension(name) return _extensions.load(name) end +--- Register an extension. To be used by plugin authors. +---@param mod table: Module +function telescope.register_extension(mod) + return _extensions.register(mod) +end + --- Use telescope.extensions to reference any extensions within your configuration.
--- While the docs currently generate this as a function, it's actually a table. Sorry. telescope.extensions = require("telescope._extensions").manager diff --git a/bundle/telescope.nvim/lua/telescope/make_entry.lua b/bundle/telescope.nvim/lua/telescope/make_entry.lua index 5c39c4eca..409da21c5 100644 --- a/bundle/telescope.nvim/lua/telescope/make_entry.lua +++ b/bundle/telescope.nvim/lua/telescope/make_entry.lua @@ -1,3 +1,40 @@ +---@tag telescope.make_entry + +---@brief [[ +--- +--- 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 from make_entry functions. These will be referrd to as +--- entry_makers in the following documentation. +--- +--- Every entry maker returns a function which accepts the data to be used for +--- an entry. This function will return an entry table (or nil, meaning skip +--- this entry) which contains of the - following important keys: +--- - 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 set to false it will not be displayed by the picker. (optional) +--- - ordinal string: is the text that is used for filtering (required) +--- - 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 +--- is actually being displayed. A function can be useful here if complex +--- calculation have 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 array has the following signature `{ { start_col, end_col }, hl_group }` +--- (required). +--- - filename string: will be interpreted by the default `` action as +--- open this file (optional) +--- - bufnr number: will be interpreted by the default `` action as open +--- this buffer (optional) +--- - lnum number: lnum value which will be interpreted by the default `` +--- action as a jump to this line (optional) +--- - col number: col value which will be interpreted by the default `` +--- action as a jump to this column (optional) +--- +--- More information on easier displaying, see |telescope.pickers.entry_display| +--- +--- TODO: Document something we call `entry_index` +---@brief ]] + local entry_display = require "telescope.pickers.entry_display" local utils = require "telescope.utils" local strings = require "plenary.strings" @@ -26,8 +63,55 @@ local lsp_type_highlight = { ["Variable"] = "TelescopeResultsVariable", } +local get_filename_fn = function() + local bufnr_name_cache = {} + return function(bufnr) + bufnr = vim.F.if_nil(bufnr, 0) + local c = bufnr_name_cache[bufnr] + if c then + return c + end + + local n = vim.api.nvim_buf_get_name(bufnr) + bufnr_name_cache[bufnr] = n + return n + end +end + +local handle_entry_index = function(opts, t, k) + local override = ((opts or {}).entry_index or {})[k] + if not override then + return + end + + local val, save = override(t, opts) + if save then + rawset(t, k, val) + end + return val +end + local make_entry = {} +make_entry.set_default_entry_mt = function(tbl, opts) + return setmetatable({}, { + __index = function(t, k) + local override = handle_entry_index(opts, t, k) + if override then + return override + end + + -- Only hit tbl once + local val = tbl[k] + if val then + rawset(t, k, val) + end + + return val + end, + }) +end + do local lookup_keys = { display = 1, @@ -35,13 +119,18 @@ do value = 1, } - local mt_string_entry = { - __index = function(t, k) - return rawget(t, rawget(lookup_keys, k)) - end, - } + function make_entry.gen_from_string(opts) + local mt_string_entry = { + __index = function(t, k) + local override = handle_entry_index(opts, t, k) + if override then + return override + end + + return rawget(t, rawget(lookup_keys, k)) + end, + } - function make_entry.gen_from_string() return function(line) return setmetatable({ line, @@ -82,6 +171,11 @@ do end mt_file_entry.__index = function(t, k) + local override = handle_entry_index(opts, t, k) + if override then + return override + end + local raw = rawget(mt_file_entry, k) if raw then return raw @@ -111,7 +205,7 @@ do } -- Gets called only once to parse everything out for the vimgrep, after that looks up directly. - local parse = function(t) + local parse_with_col = function(t) local _, _, filename, lnum, col, text = string.find(t.value, [[(..-):(%d+):(%d+):(.*)]]) local ok @@ -133,14 +227,32 @@ do return { filename, lnum, col, text } end - --- Special options: - --- - disable_coordinates: Don't show the line & row numbers - --- - only_sort_text: Only sort via the text. Ignore filename and other items - function make_entry.gen_from_vimgrep(opts) - local mt_vimgrep_entry + local parse_without_col = function(t) + local _, _, filename, lnum, text = string.find(t.value, [[(..-):(%d+):(.*)]]) + local ok + ok, lnum = pcall(tonumber, lnum) + if not ok then + lnum = nil + end + + t.filename = filename + t.lnum = lnum + t.col = nil + t.text = text + + return { filename, lnum, nil, text } + end + + function make_entry.gen_from_vimgrep(opts) opts = opts or {} + local mt_vimgrep_entry + local parse = parse_with_col + if opts.__inverted == true then + parse = parse_without_col + end + local disable_devicons = opts.disable_devicons local disable_coordinates = opts.disable_coordinates local only_sort_text = opts.only_sort_text @@ -188,7 +300,11 @@ do local coordinates = "" if not disable_coordinates then - coordinates = string.format("%s:%s:", entry.lnum, entry.col) + if entry.col then + coordinates = string.format("%s:%s:", entry.lnum, entry.col) + else + coordinates = string.format("%s:", entry.lnum) + end end local display, hl_group = utils.transform_devicons( @@ -205,6 +321,11 @@ do end, __index = function(t, k) + local override = handle_entry_index(opts, t, k) + if override then + return override + end + local raw = rawget(mt_vimgrep_entry, k) if raw then return raw @@ -257,13 +378,13 @@ function make_entry.gen_from_git_stash(opts) local _, branch_name = string.match(splitted[2], "^([WIP on|On]+) (.+)") local commit_info = splitted[3] - return { + return make_entry.set_default_entry_mt({ value = stash_idx, ordinal = commit_info, branch_name = branch_name, commit_info = commit_info, display = make_display, - } + }, opts) end end @@ -297,52 +418,61 @@ function make_entry.gen_from_git_commits(opts) msg = "" end - return { + return make_entry.set_default_entry_mt({ value = sha, ordinal = sha .. " " .. msg, msg = msg, display = make_display, current_file = opts.current_file, - } + }, opts) end end function make_entry.gen_from_quickfix(opts) opts = opts or {} + local show_line = vim.F.if_nil(opts.show_line, true) - local displayer = entry_display.create { - separator = "▏", - items = { - { width = 8 }, - { width = 0.45 }, - { remaining = true }, - }, + local hidden = utils.is_path_hidden(opts) + local items = { + { width = vim.F.if_nil(opts.fname_width, 30) }, + { remaining = true }, } - - local make_display = function(entry) - local filename = utils.transform_path(opts, entry.filename) - - local line_info = { table.concat({ entry.lnum, entry.col }, ":"), "TelescopeResultsLineNr" } - - if opts.trim_text then - entry.text = entry.text:gsub("^%s*(.-)%s*$", "%1") - end - - return displayer { - line_info, - entry.text:gsub(".* | ", ""), - filename, - } + if hidden then + items[1] = { width = 8 } + end + if not show_line then + table.remove(items, 1) end + local displayer = entry_display.create { separator = "▏", items = items } + + local make_display = function(entry) + local input = {} + if not hidden then + table.insert(input, string.format("%s:%d:%d", utils.transform_path(opts, entry.filename), entry.lnum, entry.col)) + else + table.insert(input, string.format("%4d:%2d", entry.lnum, entry.col)) + end + + if show_line then + local text = entry.text + if opts.trim_text then + text = text:gsub("^%s*(.-)%s*$", "%1") + end + text = text:gsub(".* | ", "") + table.insert(input, text) + end + + return displayer(input) + end + + local get_filename = get_filename_fn() return function(entry) - local filename = entry.filename or vim.api.nvim_buf_get_name(entry.bufnr) - - return { - valid = true, + local filename = vim.F.if_nil(entry.filename, get_filename(entry.bufnr)) + return make_entry.set_default_entry_mt({ value = entry, - ordinal = (not opts.ignore_filename and filename or "") .. " " .. entry.text, + ordinal = (not hidden and filename or "") .. " " .. entry.text, display = make_display, bufnr = entry.bufnr, @@ -352,7 +482,7 @@ function make_entry.gen_from_quickfix(opts) text = entry.text, start = entry.start, finish = entry.finish, - } + }, opts) end end @@ -361,14 +491,22 @@ function make_entry.gen_from_lsp_symbols(opts) local bufnr = opts.bufnr or vim.api.nvim_get_current_buf() + -- Default we have two columns, symbol and type(unbound) + -- If path is not hidden then its, filepath, symbol and type(still unbound) + -- If show_line is also set, type is bound to len 8 local display_items = { - { width = opts.symbol_width or 25 }, -- symbol - { width = opts.symbol_type_width or 8 }, -- symbol type - { remaining = true }, -- filename{:optional_lnum+col} OR content preview + { width = opts.symbol_width or 25 }, + { remaining = true }, } - if opts.ignore_filename and opts.show_line then - table.insert(display_items, 2, { width = 6 }) + local hidden = utils.is_path_hidden(opts) + if not hidden then + table.insert(display_items, 1, { width = vim.F.if_nil(opts.fname_width, 30) }) + end + + if opts.show_line then + -- bound type to len 8 or custom + table.insert(display_items, #display_items, { width = opts.symbol_type_width or 8 }) end local displayer = entry_display.create { @@ -376,51 +514,42 @@ function make_entry.gen_from_lsp_symbols(opts) hl_chars = { ["["] = "TelescopeBorder", ["]"] = "TelescopeBorder" }, items = display_items, } + local type_highlight = vim.F.if_nil(opts.symbol_highlights or lsp_type_highlight) local make_display = function(entry) local msg - -- what to show in the last column: filename or symbol information - if opts.ignore_filename then -- ignore the filename and show line preview instead - -- TODO: fixme - if ignore_filename is set for workspace, bufnr will be incorrect - msg = vim.api.nvim_buf_get_lines(bufnr, entry.lnum - 1, entry.lnum, false)[1] or "" - msg = vim.trim(msg) + if opts.show_line then + msg = vim.trim(vim.F.if_nil(vim.api.nvim_buf_get_lines(bufnr, entry.lnum - 1, entry.lnum, false)[1], "")) + end + + if hidden then + return displayer { + entry.symbol_name, + { entry.symbol_type:lower(), type_highlight[entry.symbol_type] }, + msg, + } else - local filename = utils.transform_path(opts, entry.filename) - - if opts.show_line then -- show inline line info - filename = filename .. " [" .. entry.lnum .. ":" .. entry.col .. "]" - end - msg = filename + return displayer { + utils.transform_path(opts, entry.filename), + entry.symbol_name, + { entry.symbol_type:lower(), type_highlight[entry.symbol_type] }, + msg, + } end - - local type_highlight = opts.symbol_highlights or lsp_type_highlight - local display_columns = { - entry.symbol_name, - { entry.symbol_type:lower(), type_highlight[entry.symbol_type], type_highlight[entry.symbol_type] }, - msg, - } - - if opts.ignore_filename and opts.show_line then - table.insert(display_columns, 2, { entry.lnum .. ":" .. entry.col, "TelescopeResultsLineNr" }) - end - - return displayer(display_columns) end + local get_filename = get_filename_fn() return function(entry) - local filename = entry.filename or vim.api.nvim_buf_get_name(entry.bufnr) + local filename = vim.F.if_nil(entry.filename, get_filename(entry.bufnr)) local symbol_msg = entry.text local symbol_type, symbol_name = symbol_msg:match "%[(.+)%]%s+(.*)" - local ordinal = "" - if not opts.ignore_filename and filename then + if not hidden and filename then ordinal = filename .. " " end ordinal = ordinal .. symbol_name .. " " .. (symbol_type or "unknown") - return { - valid = true, - + return make_entry.set_default_entry_mt({ value = entry, ordinal = ordinal, display = make_display, @@ -432,7 +561,7 @@ function make_entry.gen_from_lsp_symbols(opts) symbol_type = symbol_type, start = entry.start, finish = entry.finish, - } + }, opts) end end @@ -460,8 +589,9 @@ function make_entry.gen_from_buffer(opts) local cwd = vim.fn.expand(opts.cwd or vim.loop.cwd()) local make_display = function(entry) + -- bufnr_width + modes + icon + 3 spaces + : + lnum + opts.__prefix = opts.bufnr_width + 4 + icon_width + 3 + 1 + #tostring(entry.lnum) local display_bufname = utils.transform_path(opts, entry.filename) - local icon, hl_group = utils.get_devicons(entry.filename, disable_devicons) return displayer { @@ -483,9 +613,7 @@ function make_entry.gen_from_buffer(opts) local indicator = entry.flag .. hidden .. readonly .. changed local line_count = vim.api.nvim_buf_line_count(entry.bufnr) - return { - valid = true, - + return make_entry.set_default_entry_mt({ value = bufname, ordinal = entry.bufnr .. " : " .. bufname, display = make_display, @@ -495,7 +623,7 @@ function make_entry.gen_from_buffer(opts) -- account for potentially stale lnum as getbufinfo might not be updated or from resuming buffers picker lnum = entry.info.lnum ~= 0 and math.max(math.min(entry.info.lnum, line_count), 1) or 1, indicator = indicator, - } + }, opts) end end @@ -537,13 +665,12 @@ function make_entry.gen_from_treesitter(opts) return displayer(display_columns) end + local get_filename = get_filename_fn() return function(entry) local ts_utils = require "nvim-treesitter.ts_utils" 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) - return { - valid = true, - + return make_entry.set_default_entry_mt({ value = entry.node, kind = entry.kind, ordinal = node_text .. " " .. (entry.kind or "unknown"), @@ -551,14 +678,14 @@ function make_entry.gen_from_treesitter(opts) node_text = node_text, - filename = vim.api.nvim_buf_get_name(bufnr), + filename = get_filename(bufnr), -- need to add one since the previewer substacts one lnum = start_row + 1, col = start_col, text = node_text, start = start_row, finish = end_row, - } + }, opts) end end @@ -573,14 +700,12 @@ function make_entry.gen_from_packages(opts) end return function(module_name) - local entry = { + return make_entry.set_default_entry_mt({ valid = module_name ~= "", value = module_name, ordinal = module_name, - } - entry.display = make_display(module_name) - - return entry + display = make_display(module_name), + }, opts) end end @@ -622,38 +747,33 @@ function make_entry.gen_from_apropos(opts) cmd = vim.split(cmd, ",")[1] return keyword and sections[section] - and { + and make_entry.set_default_entry_mt({ value = cmd, description = desc, ordinal = cmd, display = make_display, section = section, keyword = keyword, - } + }, opts) or nil end end -function make_entry.gen_from_marks(_) - return function(line) - local split_value = utils.max_split(line, "%s+", 4) - - local mark_value = split_value[1] - local cursor_position = vim.fn.getpos("'" .. mark_value) - - return { - value = line, - ordinal = line, - display = line, - lnum = cursor_position[2], - col = cursor_position[3], - start = cursor_position[2], - filename = vim.api.nvim_buf_get_name(cursor_position[1]), - } +function make_entry.gen_from_marks(opts) + return function(item) + return make_entry.set_default_entry_mt({ + value = item.line, + ordinal = item.line, + display = item.line, + lnum = item.lnum, + col = item.col, + start = item.lnum, + filename = item.filename, + }, opts) end end -function make_entry.gen_from_registers(_) +function make_entry.gen_from_registers(opts) local displayer = entry_display.create { separator = " ", hl_chars = { ["["] = "TelescopeBorder", ["]"] = "TelescopeBorder" }, @@ -672,13 +792,13 @@ function make_entry.gen_from_registers(_) end return function(entry) - return { - valid = true, + local contents = vim.fn.getreg(entry) + return make_entry.set_default_entry_mt({ value = entry, - ordinal = entry, - content = vim.fn.getreg(entry), + ordinal = string.format("%s %s", entry, contents), + content = contents, display = make_display, - } + }, opts) end end @@ -711,7 +831,7 @@ function make_entry.gen_from_keymaps(opts) end return function(entry) - return { + return make_entry.set_default_entry_mt({ mode = entry.mode, lhs = get_lhs(entry), desc = get_desc(entry), @@ -720,22 +840,22 @@ function make_entry.gen_from_keymaps(opts) value = entry, ordinal = entry.mode .. " " .. get_lhs(entry) .. " " .. get_desc(entry), display = make_display, - } + }, opts) end end -function make_entry.gen_from_highlights() +function make_entry.gen_from_highlights(opts) local make_display = function(entry) local display = entry.value return display, { { { 0, #display }, display } } end return function(entry) - return { + return make_entry.set_default_entry_mt({ value = entry, display = make_display, ordinal = entry, - } + }, opts) end end @@ -756,12 +876,12 @@ function make_entry.gen_from_picker(opts) end return function(entry) - return { + return make_entry.set_default_entry_mt({ value = entry, text = entry.prompt_title, - ordinal = string.format("%s %s", entry.prompt_title, utils.get_default(entry.default_text, "")), + ordinal = string.format("%s %s", entry.prompt_title, vim.F.if_nil(entry.default_text, "")), display = make_display, - } + }, opts) end end @@ -804,117 +924,61 @@ function make_entry.gen_from_buffer_lines(opts) return end - return { - valid = true, + return make_entry.set_default_entry_mt({ ordinal = entry.text, display = make_display, filename = entry.filename, lnum = entry.lnum, text = entry.text, - } + }, opts) end end -function make_entry.gen_from_vimoptions() - local process_one_opt = function(o) - local ok, value_origin - - local option = { - name = "", - description = "", - current_value = "", - default_value = "", - value_type = "", - set_by_user = false, - last_set_from = "", - } - - local is_global = false - for _, v in ipairs(o.scope) do - if v == "global" then - is_global = true - end - end - - if not is_global then - return - end - - if is_global then - option.name = o.full_name - - ok, option.current_value = pcall(vim.api.nvim_get_option, o.full_name) - if not ok then - return - end - - local str_funcname = o.short_desc() - option.description = assert(loadstring(str_funcname))() - -- if #option.description > opts.desc_col_length then - -- opts.desc_col_length = #option.description - -- end - - if o.defaults ~= nil then - option.default_value = o.defaults.if_true.vim or o.defaults.if_true.vi - end - - if type(option.default_value) == "function" then - option.default_value = "Macro: " .. option.default_value() - end - - option.value_type = (type(option.current_value) == "boolean" and "bool" or type(option.current_value)) - - if option.current_value ~= option.default_value then - option.set_by_user = true - value_origin = vim.fn.execute("verbose set " .. o.full_name .. "?") - if string.match(value_origin, "Last set from") then - -- TODO: parse file and line number as separate items - option.last_set_from = value_origin:gsub("^.*Last set from ", "") - end - end - - return option - end - end - +function make_entry.gen_from_vimoptions(opts) local displayer = entry_display.create { separator = "", hl_chars = { ["["] = "TelescopeBorder", ["]"] = "TelescopeBorder" }, items = { { width = 25 }, { width = 12 }, + { width = 11 }, { remaining = true }, }, } local make_display = function(entry) return displayer { - { entry.name, "Keyword" }, - { "[" .. entry.value_type .. "]", "Type" }, - utils.display_termcodes(tostring(entry.current_value)), - entry.description, + { entry.value.name, "Keyword" }, + { "[" .. entry.value.type .. "]", "Type" }, + { "[" .. entry.value.scope .. "]", "Identifier" }, + utils.display_termcodes(tostring(entry.value.value)), } end - return function(line) - local entry = process_one_opt(line) - if not entry then - return + return function(o) + local entry = { + display = make_display, + value = { + name = o.name, + value = o.default, + type = o.type, + scope = o.scope, + }, + ordinal = string.format("%s %s %s", o.name, o.type, o.scope), + } + + local ok, value = pcall(vim.api.nvim_get_option, o.name) + if ok then + entry.value.value = value + entry.ordinal = entry.ordinal .. " " .. utils.display_termcodes(tostring(value)) + else + entry.ordinal = entry.ordinal .. " " .. utils.display_termcodes(tostring(o.default)) end - entry.valid = true - entry.display = make_display - entry.value = line - entry.ordinal = line.full_name - -- entry.raw_value = d.raw_value - -- entry.last_set_from = d.last_set_from - - return entry + return make_entry.set_default_entry_mt(entry, opts) end end ---- Special options: ---- - only_sort_tags: Only sort via tag name. Ignore filename and other items function make_entry.gen_from_ctags(opts) opts = opts or {} @@ -965,6 +1029,11 @@ function make_entry.gen_from_ctags(opts) local mt = {} mt.__index = function(t, k) + local override = handle_entry_index(opts, t, k) + if override then + return override + end + if k == "path" then local retpath = Path:new({ t.filename }):absolute() if not vim.loop.fs_access(retpath, "R", nil) then @@ -974,6 +1043,7 @@ function make_entry.gen_from_ctags(opts) end end + local current_file_cache = {} return function(line) if line == "" or line:sub(1, 1) == "!" then return nil @@ -991,8 +1061,14 @@ function make_entry.gen_from_ctags(opts) file = string.gsub(file, "/", "\\") end - if opts.only_current_file and file ~= current_file then - return nil + if opts.only_current_file then + if current_file_cache[file] == nil then + current_file_cache[file] = Path:new(file):normalize(cwd) == current_file + end + + if current_file_cache[file] == false then + return nil + end end local tag_entry = {} @@ -1036,11 +1112,12 @@ function make_entry.gen_from_diagnostics(opts) end)() local display_items = { - { width = utils.if_nil(signs, 8, 10) }, + { width = signs ~= nil and 10 or 8 }, { remaining = true }, } local line_width = vim.F.if_nil(opts.line_width, 0.5) - if not utils.is_path_hidden(opts) then + local hidden = utils.is_path_hidden(opts) + if not hidden then table.insert(display_items, 2, { width = line_width }) end local displayer = entry_display.create { @@ -1055,13 +1132,9 @@ function make_entry.gen_from_diagnostics(opts) local pos = string.format("%4d:%2d", entry.lnum, entry.col) local line_info = { (signs and signs[entry.type] .. " " or "") .. pos, - "Diagnostic" .. entry.type, + "DiagnosticSign" .. entry.type, } - --TODO(conni2461): I dont like that this is symbol lnum:col | msg | filename - -- i want: symbol filename:lnum:col | msg - -- or : symbol lnum:col | msg - -- I think this is more natural return displayer { line_info, entry.text, @@ -1070,20 +1143,20 @@ function make_entry.gen_from_diagnostics(opts) end return function(entry) - return { + return make_entry.set_default_entry_mt({ value = entry, - ordinal = ("%s %s"):format(not opts.ignore_filename and entry.filename or "", entry.text), + ordinal = ("%s %s"):format(not hidden and entry.filename or "", entry.text), display = make_display, filename = entry.filename, type = entry.type, lnum = entry.lnum, col = entry.col, text = entry.text, - } + }, opts) end end -function make_entry.gen_from_autocommands(_) +function make_entry.gen_from_autocommands(opts) local displayer = entry_display.create { separator = "▏", items = { @@ -1096,32 +1169,37 @@ function make_entry.gen_from_autocommands(_) local make_display = function(entry) return displayer { - { entry.event, "vimAutoEvent" }, - { entry.group, "vimAugroup" }, - { entry.ft_pattern, "vimAutoCmdSfxList" }, - entry.command, + { entry.value.event, "vimAutoEvent" }, + { entry.value.group_name, "vimAugroup" }, + { entry.value.pattern, "vimAutoCmdSfxList" }, + entry.value.command, } end - -- TODO: dump current filtered items to buffer return function(entry) - return { - event = entry.event, - group = entry.group, - ft_pattern = entry.ft_pattern, - command = entry.command, - value = string.format("+%d %s", entry.source_lnum, entry.source_file), - source_file = entry.source_file, - source_lnum = entry.source_lnum, + local group_name = vim.F.if_nil(entry.group_name, "") + local command = entry.command + if entry.desc and (entry.callback or vim.startswith(command, "%s]?(.+)") - return { + return setmetatable({ value = file, status = mod, ordinal = entry, display = make_display, path = Path:new({ opts.cwd, file }):absolute(), - } + }, opts) end end diff --git a/bundle/telescope.nvim/lua/telescope/mappings.lua b/bundle/telescope.nvim/lua/telescope/mappings.lua index b81552ee3..e5b23bc28 100644 --- a/bundle/telescope.nvim/lua/telescope/mappings.lua +++ b/bundle/telescope.nvim/lua/telescope/mappings.lua @@ -1,4 +1,125 @@ --- TODO: Customize keymap +---@tag telescope.mappings + +---@brief [[ +--- |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 once you exit the picker. +--- +--- We provide multiple different ways of configuring, as described below, +--- to provide an easy to use experience for changing the default behavior +--- of telescope or extending for your own purposes. +--- +--- To see many of the builtin actions that you can use as values for this +--- table, see |telescope.actions| +--- +--- Format is: +--- +--- { +--- mode = { ..keys } +--- } +--- +--- +--- where {mode} is the one character letter for a mode ('i' for insert, 'n' for normal). +--- +--- For example: +--- +--- mappings = { +--- i = { +--- [""] = require('telescope.actions').close, +--- }, +--- } +--- +--- +--- To disable a keymap, put `[map] = false`
+--- For example: +--- +--- { +--- ..., +--- [""] = false, +--- ..., +--- } +--- +--- Into your config. +--- +--- 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) +--- +--- { +--- ..., +--- [""] = require('telescope.actions').select_default, +--- ..., +--- } +--- +--- +--- 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: +--- +--- { +--- ..., +--- [""] = "select_default", +--- ..., +--- } +--- +--- +--- You can also add other mappings using tables with `type = "command"`. +--- For example: +--- +--- { +--- ..., +--- ["jj"] = { "", type = "command" }, +--- ["kk"] = { "echo \"Hello, World!\"", type = "command" },) +--- ..., +--- } +--- +--- +--- You can also add additional options for mappings of any type ("action" and "command"). +--- For example: +--- +--- { +--- ..., +--- [""] = { +--- actions.move_selection_next, type = "action", +--- opts = { nowait = true, silent = true } +--- }, +--- ..., +--- } +--- +--- +--- There are three main places you can configure |telescope.mappings|. These are +--- ordered from the lowest priority to the highest priority. +--- +--- 1. |telescope.defaults.mappings| +--- 2. In the |telescope.setup()| table, inside a picker with a given name, use the `mappings` key +--- +--- require("telescope").setup { +--- pickers = { +--- find_files = { +--- mappings = { +--- n = { +--- ["kj"] = "close", +--- }, +--- }, +--- }, +--- }, +--- } +--- +--- 3. `attach_mappings` function for a particular picker. +--- +--- require("telescope.builtin").find_files { +--- attach_mappings = function(_, map) +--- map("i", "asdf", function(_prompt_bufnr) +--- print "You typed asdf" +--- end) +--- -- needs to return true if you want to map default_mappings and +--- -- false if not +--- return true +--- end, +--- } +--- +---@brief ]] + local a = vim.api local actions = require "telescope.actions" @@ -33,8 +154,12 @@ mappings.default_mappings = config.values.default_mappings [""] = actions.send_to_qflist + actions.open_qflist, [""] = actions.send_selected_to_qflist + actions.open_qflist, [""] = actions.complete_tag, + [""] = actions.which_key, [""] = actions.which_key, -- keys from pressing [""] = { "", type = "command" }, + + -- disable c-j because we dont want to allow new lines #2123 + [""] = actions.nop, }, n = { @@ -95,25 +220,6 @@ local assign_function = function(prompt_bufnr, func) return func_id end ---[[ -Usage: - -mappings.apply_keymap(42, , { - n = { - ["x"] = "just do this string", - - [""] = function(picker, prompt_bufnr) - actions.close_prompt() - -> local filename = ... - vim.cmd(string.format(":e %s", filename)) - end, - }, - - i = { - } -}) ---]] local telescope_map = function(prompt_bufnr, mode, key_bind, key_func, opts) if not key_func then return @@ -147,11 +253,8 @@ local telescope_map = function(prompt_bufnr, mode, key_bind, key_func, opts) local map_string if opts.expr then - map_string = string.format( - [[luaeval("require('telescope.mappings').execute_keymap(%s, %s)")]], - prompt_bufnr, - key_id - ) + 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 = "" @@ -161,12 +264,8 @@ local telescope_map = function(prompt_bufnr, mode, key_bind, key_func, opts) prefix = ":" end - map_string = string.format( - "%slua require('telescope.mappings').execute_keymap(%s, %s)", - prefix, - prompt_bufnr, - key_id - ) + map_string = + string.format("%slua require('telescope.mappings').execute_keymap(%s, %s)", prefix, prompt_bufnr, key_id) end a.nvim_buf_set_keymap(prompt_bufnr, mode, key_bind, map_string, opts) diff --git a/bundle/telescope.nvim/lua/telescope/pickers.lua b/bundle/telescope.nvim/lua/telescope/pickers.lua index d2c6e2bfa..5019abf15 100644 --- a/bundle/telescope.nvim/lua/telescope/pickers.lua +++ b/bundle/telescope.nvim/lua/telescope/pickers.lua @@ -24,8 +24,6 @@ local p_window = require "telescope.pickers.window" local EntryManager = require "telescope.entry_manager" local MultiSelect = require "telescope.pickers.multi" -local get_default = utils.get_default - local truncate = require("plenary.strings").truncate local strdisplaywidth = require("plenary.strings").strdisplaywidth @@ -65,25 +63,27 @@ function Picker:new(opts) -- pcall(v.clear) -- end - local layout_strategy = get_default(opts.layout_strategy, config.values.layout_strategy) + local layout_strategy = vim.F.if_nil(opts.layout_strategy, config.values.layout_strategy) local obj = setmetatable({ - prompt_title = get_default(opts.prompt_title, config.values.prompt_title), - results_title = get_default(opts.results_title, config.values.results_title), + prompt_title = vim.F.if_nil(opts.prompt_title, config.values.prompt_title), + results_title = vim.F.if_nil(opts.results_title, config.values.results_title), -- either whats passed in by the user or whats defined by the previewer preview_title = opts.preview_title, - prompt_prefix = get_default(opts.prompt_prefix, config.values.prompt_prefix), - wrap_results = get_default(opts.wrap_results, config.values.wrap_results), - selection_caret = get_default(opts.selection_caret, config.values.selection_caret), - entry_prefix = get_default(opts.entry_prefix, config.values.entry_prefix), - multi_icon = get_default(opts.multi_icon, config.values.multi_icon), + prompt_prefix = vim.F.if_nil(opts.prompt_prefix, config.values.prompt_prefix), + wrap_results = vim.F.if_nil(opts.wrap_results, config.values.wrap_results), + selection_caret = vim.F.if_nil(opts.selection_caret, config.values.selection_caret), + entry_prefix = vim.F.if_nil(opts.entry_prefix, config.values.entry_prefix), + multi_icon = vim.F.if_nil(opts.multi_icon, config.values.multi_icon), - initial_mode = get_default(opts.initial_mode, config.values.initial_mode), - debounce = get_default(tonumber(opts.debounce), nil), + initial_mode = vim.F.if_nil(opts.initial_mode, config.values.initial_mode), + _original_mode = vim.api.nvim_get_mode().mode, + debounce = vim.F.if_nil(tonumber(opts.debounce), nil), + _finder_attached = true, default_text = opts.default_text, - get_status_text = get_default(opts.get_status_text, config.values.get_status_text), + get_status_text = vim.F.if_nil(opts.get_status_text, config.values.get_status_text), _on_input_filter_cb = opts.on_input_filter_cb or function() end, finder = assert(opts.finder, "Finder is required."), @@ -94,6 +94,8 @@ function Picker:new(opts) default_selection_index = opts.default_selection_index, + get_selection_window = vim.F.if_nil(opts.get_selection_window, config.values.get_selection_window), + cwd = opts.cwd, _find_id = 0, @@ -103,37 +105,40 @@ function Picker:new(opts) and opts._multi or MultiSelect:new(), - track = get_default(opts.track, false), + track = vim.F.if_nil(opts.track, false), stats = {}, attach_mappings = opts.attach_mappings, - file_ignore_patterns = get_default(opts.file_ignore_patterns, config.values.file_ignore_patterns), + file_ignore_patterns = vim.F.if_nil(opts.file_ignore_patterns, config.values.file_ignore_patterns), - scroll_strategy = get_default(opts.scroll_strategy, config.values.scroll_strategy), - sorting_strategy = get_default(opts.sorting_strategy, config.values.sorting_strategy), - tiebreak = get_default(opts.tiebreak, config.values.tiebreak), - selection_strategy = get_default(opts.selection_strategy, config.values.selection_strategy), + scroll_strategy = vim.F.if_nil(opts.scroll_strategy, config.values.scroll_strategy), + sorting_strategy = vim.F.if_nil(opts.sorting_strategy, config.values.sorting_strategy), + tiebreak = vim.F.if_nil(opts.tiebreak, config.values.tiebreak), + selection_strategy = vim.F.if_nil(opts.selection_strategy, config.values.selection_strategy), - push_cursor_on_edit = get_default(opts.push_cursor_on_edit, false), + push_cursor_on_edit = vim.F.if_nil(opts.push_cursor_on_edit, false), + push_tagstack_on_edit = vim.F.if_nil(opts.push_tagstack_on_edit, false), layout_strategy = layout_strategy, layout_config = config.smarter_depth_2_extend(opts.layout_config or {}, config.values.layout_config or {}), - __cycle_layout_list = get_default(opts.cycle_layout_list, config.values.cycle_layout_list), + __cycle_layout_list = vim.F.if_nil(opts.cycle_layout_list, config.values.cycle_layout_list), window = { - winblend = get_default( + winblend = vim.F.if_nil( opts.winblend, type(opts.window) == "table" and opts.window.winblend or config.values.winblend ), - border = get_default(opts.border, type(opts.window) == "table" and opts.window.border or config.values.border), - borderchars = get_default( + border = vim.F.if_nil(opts.border, type(opts.window) == "table" and opts.window.border or config.values.border), + borderchars = vim.F.if_nil( opts.borderchars, type(opts.window) == "table" and opts.window.borderchars or config.values.borderchars ), }, cache_picker = config.resolve_table_opts(opts.cache_picker, vim.deepcopy(config.values.cache_picker)), + + __scrolling_limit = tonumber(vim.F.if_nil(opts.temp__scrolling_limit, 250)), }, self) obj.get_window_options = opts.get_window_options or p_window.get_window_options @@ -369,11 +374,8 @@ function Picker:find() popup_opts.preview.titlehighlight = "TelescopePreviewTitle" end - local results_win, results_opts, results_border_win = self:_create_window( - "", - popup_opts.results, - not self.wrap_results - ) + local results_win, results_opts, results_border_win = + self:_create_window("", popup_opts.results, not self.wrap_results) local results_bufnr = a.nvim_win_get_buf(results_win) pcall(a.nvim_buf_set_option, results_bufnr, "tabstop", 1) -- #1834 @@ -411,7 +413,7 @@ function Picker:find() -- want to scroll through more than 10,000 items. -- -- This just lets us stop doing stuff after tons of things. - self.max_results = 1000 + self.max_results = self.__scrolling_limit vim.api.nvim_buf_set_lines(results_bufnr, 0, self.max_results, false, utils.repeated_table(self.max_results, "")) @@ -501,10 +503,12 @@ function Picker:find() -- Register attach vim.api.nvim_buf_attach(prompt_bufnr, false, { on_lines = function(...) - find_id = self:_next_find_id() + if self._finder_attached then + find_id = self:_next_find_id() - status_updater { completed = false } - self._on_lines(...) + status_updater { completed = false } + self._on_lines(...) + end end, on_detach = function() @@ -527,7 +531,6 @@ function Picker:find() buffer = prompt_bufnr, group = "PickerInsert", nested = true, - once = true, callback = function() require("telescope.pickers").on_resize_window(prompt_bufnr) end, @@ -688,7 +691,7 @@ end --- --- Example usage in telescope: --- - `actions.delete_buffer()` ----@param delete_cb function: called with each deleted selection +---@param delete_cb function: called for each selection fn(s) -> bool|nil (true|nil removes the entry from the results) function Picker:delete_selection(delete_cb) vim.validate { delete_cb = { delete_cb, "f" } } local original_selection_strategy = self.selection_strategy @@ -714,8 +717,10 @@ function Picker:delete_selection(delete_cb) return x > y end) for _, index in ipairs(selection_index) do - local selection = table.remove(self.finder.results, index) - delete_cb(selection) + local delete_cb_return = delete_cb(self.finder.results[index]) + if delete_cb_return == nil or delete_cb_return == true then + table.remove(self.finder.results, index) + end end if used_multi_select then @@ -904,7 +909,7 @@ function Picker:refresh(finder, opts) local handle = type(opts.new_prefix) == "table" and unpack or function(x) return x end - self:change_prompt_prefix(handle(opts.new_prefix)) + self:change_prompt_prefix(handle(opts.new_prefix), opts.prefix_hl_group) end if finder then @@ -958,6 +963,9 @@ function Picker:set_selection(row) state.set_global_key("selected_entry", entry) if not entry then + -- also refresh previewer when there is no entry selected, so the preview window is cleared + self._selection_entry = entry + self:refresh_previewer() return end @@ -1039,7 +1047,7 @@ function Picker:update_prefix(entry, row) local line = vim.api.nvim_buf_get_lines(self.results_bufnr, row, row + 1, false)[1] if not line then - log.warn(string.format("no line found at row %d in buffer %d", row, self.results_bufnr)) + log.trace(string.format("no line found at row %d in buffer %d", row, self.results_bufnr)) return end @@ -1061,10 +1069,6 @@ end --- Refresh the previewer based on the current `status` of the picker function Picker:refresh_previewer() local status = state.get_status(self.prompt_bufnr) - if not self._selection_entry then - -- if selection_entry is nil there is nothing to be previewed - return - end if self.previewer and status.preview_win and a.nvim_win_is_valid(status.preview_win) then self:_increment "previewed" @@ -1361,6 +1365,16 @@ function Picker:_do_selection(prompt) else self:set_selection(self:get_reset_row()) end + elseif selection_strategy == "none" then + if self._selection_entry then + local old_entry, old_row = self._selection_entry, self._selection_row + self:reset_selection() -- required to reset selection before updating prefix + if old_row >= 0 then + self:update_prefix(old_entry, old_row) + self.highlighter:hi_multiselect(old_row, self:is_multi_selected(old_entry)) + end + end + return else error("Unknown selection strategy: " .. selection_strategy) end @@ -1413,6 +1427,7 @@ end function pickers.on_close_prompt(prompt_bufnr) local status = state.get_status(prompt_bufnr) local picker = status.picker + require("telescope.actions.state").get_current_history():reset() if type(picker.cache_picker) == "table" then local cached_pickers = state.get_global_key "cached_pickers" or {} @@ -1490,6 +1505,11 @@ function Picker:_reset_highlights() vim.api.nvim_buf_clear_namespace(self.results_bufnr, ns_telescope_matching, 0, -1) end +-- Toggles whether finder is attached to prompt buffer input +function Picker:_toggle_finder_attach() + self._finder_attached = not self._finder_attached +end + function Picker:_detach() self.finder:close() diff --git a/bundle/telescope.nvim/lua/telescope/pickers/entry_display.lua b/bundle/telescope.nvim/lua/telescope/pickers/entry_display.lua index b1a14730d..6e520f4a6 100644 --- a/bundle/telescope.nvim/lua/telescope/pickers/entry_display.lua +++ b/bundle/telescope.nvim/lua/telescope/pickers/entry_display.lua @@ -1,3 +1,63 @@ +---@tag telescope.pickers.entry_display + +---@brief [[ +--- Entry Display is used to format each entry shown in the result panel. +--- +--- Entry Display create() will give us a function based on the configuration +--- of column widths we pass into it. We then can use this function n times to +--- return a string based on structured input. +--- +--- Note that if you call `create()` inside `make_display` it will be called for +--- every single entry. So it is suggested to do this outside of `make_display` +--- for the best performance. +--- +--- 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 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'. +--- +--- An example of this configuration is shown for the buffers picker +--- +--- local displayer = entry_display.create { +--- separator = " ", +--- items = { +--- { width = opts.bufnr_width }, +--- { width = 4 }, +--- { width = icon_width }, +--- { remaining = true }, +--- }, +--- } +--- +--- +--- 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 and the 3rd column's widht will be decided by the width of the +--- 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 " ". +--- +--- An example of how the display reference will be used is shown, again for +--- the buffers picker: +--- +--- return displayer { +--- { entry.bufnr, "TelescopeResultsNumber" }, +--- { entry.indicator, "TelescopeResultsComment" }, +--- { icon, hl_group }, +--- display_bufname .. ":" .. entry.lnum, +--- } +--- +--- +--- 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. +--- +--- The displayer can return values, string and an optional highlights. +--- String is all the text to be displayed for this entry as a single string. If +--- parts of 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 look +--- at the code in make_entry.lua. +---@brief ]] + local strings = require "plenary.strings" local state = require "telescope.state" local resolve = require "telescope.config.resolve" diff --git a/bundle/telescope.nvim/lua/telescope/pickers/layout_strategies.lua b/bundle/telescope.nvim/lua/telescope/pickers/layout_strategies.lua index 3a847594a..7af776105 100644 --- a/bundle/telescope.nvim/lua/telescope/pickers/layout_strategies.lua +++ b/bundle/telescope.nvim/lua/telescope/pickers/layout_strategies.lua @@ -53,7 +53,6 @@ local resolve = require "telescope.config.resolve" local p_window = require "telescope.pickers.window" -local if_nil = vim.F.if_nil local get_border_size = function(opts) if opts.window.border == false then @@ -125,7 +124,7 @@ local function validate_layout_config(strategy_name, configuration, values, defa local valid_configuration_keys = get_valid_configuration_keys(configuration) -- If no default_layout_config provided, check Telescope's config values - default_layout_config = if_nil(default_layout_config, require("telescope.config").values.layout_config) + default_layout_config = vim.F.if_nil(default_layout_config, require("telescope.config").values.layout_config) local result = {} local get_value = function(k) @@ -263,7 +262,7 @@ local function make_documented_layout(name, layout_config, layout) validate_layout_config( name, layout_config, - vim.tbl_deep_extend("keep", if_nil(override_layout, {}), if_nil(self.layout_config, {})) + vim.tbl_deep_extend("keep", vim.F.if_nil(override_layout, {}), vim.F.if_nil(self.layout_config, {})) ) ) end @@ -320,7 +319,7 @@ layout_strategies.horizontal = make_documented_layout( -- Cap over/undersized width (with previewer) width, w_space = calc_size_and_spacing(width, max_columns, bs, 2, 4, 1) - preview.width = resolve.resolve_width(if_nil(layout_config.preview_width, function(_, cols) + preview.width = resolve.resolve_width(vim.F.if_nil(layout_config.preview_width, function(_, cols) if cols < 150 then return math.floor(cols * 0.4) elseif cols < 200 then @@ -588,7 +587,7 @@ layout_strategies.cursor = make_documented_layout( -- Cap over/undersized width (with preview) width, w_space = calc_size_and_spacing(width, max_columns, bs, 2, 4, 0) - preview.width = resolve.resolve_width(if_nil(layout_config.preview_width, 2 / 3))(self, width, max_lines) + preview.width = resolve.resolve_width(vim.F.if_nil(layout_config.preview_width, 2 / 3))(self, width, max_lines) prompt.width = width - preview.width - w_space results.width = prompt.width else @@ -601,8 +600,14 @@ layout_strategies.cursor = make_documented_layout( end local position = vim.api.nvim_win_get_position(0) + local winbar = (function() + if vim.fn.exists "&winbar" == 1 then + return vim.o.winbar == "" and 0 or 1 + end + return 0 + end)() local top_left = { - line = vim.fn.winline() + position[1] + bs, + line = vim.fn.winline() + position[1] + bs + winbar, col = vim.fn.wincol() + position[2], } local bot_right = { @@ -694,7 +699,8 @@ layout_strategies.vertical = make_documented_layout( -- Cap over/undersized height (with previewer) height, h_space = calc_size_and_spacing(height, max_lines, bs, 3, 6, 2) - preview.height = resolve.resolve_height(if_nil(layout_config.preview_height, 0.5))(self, max_columns, height) + preview.height = + resolve.resolve_height(vim.F.if_nil(layout_config.preview_height, 0.5))(self, max_columns, height) else -- Cap over/undersized height (without previewer) height, h_space = calc_size_and_spacing(height, max_lines, bs, 2, 4, 1) @@ -764,8 +770,8 @@ layout_strategies.flex = make_documented_layout( horizontal = "Options to pass when switching to horizontal layout", }), function(self, max_columns, max_lines, layout_config) - local flip_columns = if_nil(layout_config.flip_columns, 100) - local flip_lines = if_nil(layout_config.flip_lines, 20) + local flip_columns = vim.F.if_nil(layout_config.flip_columns, 100) + local flip_lines = vim.F.if_nil(layout_config.flip_lines, 20) if max_columns < flip_columns and max_lines > flip_lines then self.__flex_strategy = "vertical" @@ -851,7 +857,7 @@ layout_strategies.bottom_pane = make_documented_layout( local tbln max_lines, tbln = calc_tabline(max_lines) - local height = if_nil(resolve.resolve_height(layout_config.height)(self, max_columns, max_lines), 25) + local height = vim.F.if_nil(resolve.resolve_height(layout_config.height)(self, max_columns, max_lines), 25) if type(layout_config.height) == "table" and type(layout_config.height.padding) == "number" then -- Since bottom_pane only has padding at the top, we only need half as much padding in total -- This doesn't match the vim help for `resolve.resolve_height`, but it matches expectations @@ -874,7 +880,7 @@ layout_strategies.bottom_pane = make_documented_layout( -- Cap over/undersized width (with preview) local width, w_space = calc_size_and_spacing(max_columns, max_columns, bs, 2, 4, 0) - preview.width = resolve.resolve_width(if_nil(layout_config.preview_width, 0.5))(self, width, max_lines) + preview.width = resolve.resolve_width(vim.F.if_nil(layout_config.preview_width, 0.5))(self, width, max_lines) results.width = width - preview.width - w_space else results.width = prompt.width diff --git a/bundle/telescope.nvim/lua/telescope/previewers/buffer_previewer.lua b/bundle/telescope.nvim/lua/telescope/previewers/buffer_previewer.lua index 0ba932253..cd795f127 100644 --- a/bundle/telescope.nvim/lua/telescope/previewers/buffer_previewer.lua +++ b/bundle/telescope.nvim/lua/telescope/previewers/buffer_previewer.lua @@ -152,11 +152,13 @@ local scroll_fn = function(self, direction) end previewers.file_maker = function(filepath, bufnr, opts) - opts = opts or {} - opts.preview = opts.preview or {} + opts = vim.F.if_nil(opts, {}) + -- TODO(conni2461): here shouldn't be any hardcoded magic numbers ... + opts.preview = vim.F.if_nil(opts.preview, {}) opts.preview.timeout = vim.F.if_nil(opts.preview.timeout, 250) -- in ms opts.preview.filesize_limit = vim.F.if_nil(opts.preview.filesize_limit, 25) -- in mb opts.preview.msg_bg_fillchar = vim.F.if_nil(opts.preview.msg_bg_fillchar, "╱") -- in mb + opts.preview.treesitter = vim.F.if_nil(opts.preview.treesitter, true) if opts.use_ft_detect == nil then opts.use_ft_detect = true end @@ -333,7 +335,7 @@ previewers.new_buffer_previewer = function(opts) -- Push in another buffer so the last one will not be cleaned up if preview_window_id then local bufnr = vim.api.nvim_create_buf(false, true) - vim.api.nvim_win_set_buf(preview_window_id, bufnr) + utils.win_set_buf_noautocmd(preview_window_id, bufnr) end end @@ -358,14 +360,14 @@ previewers.new_buffer_previewer = function(opts) if opts.get_buffer_by_name and get_bufnr_by_bufname(self, opts.get_buffer_by_name(self, entry)) then self.state.bufname = opts.get_buffer_by_name(self, entry) self.state.bufnr = get_bufnr_by_bufname(self, self.state.bufname) - vim.api.nvim_win_set_buf(status.preview_win, self.state.bufnr) + utils.win_set_buf_noautocmd(status.preview_win, self.state.bufnr) else local bufnr = vim.api.nvim_create_buf(false, true) set_bufnr(self, bufnr) vim.schedule(function() if vim.api.nvim_buf_is_valid(bufnr) then - vim.api.nvim_win_set_buf(status.preview_win, bufnr) + utils.win_set_buf_noautocmd(status.preview_win, bufnr) end end) @@ -385,8 +387,16 @@ previewers.new_buffer_previewer = function(opts) opts.define_preview(self, entry, status) - putils.with_preview_window(status, nil, function() - vim.cmd "do User TelescopePreviewerLoaded" + vim.schedule(function() + if not self or not self.state or not self.state.bufnr then + return + end + + if vim.api.nvim_buf_is_valid(self.state.bufnr) then + vim.api.nvim_buf_call(self.state.bufnr, function() + vim.cmd "do User TelescopePreviewerLoaded" + end) + end end) if opts.get_buffer_by_name then @@ -407,11 +417,11 @@ previewers.cat = defaulter(function(opts) return previewers.new_buffer_previewer { title = "File Preview", dyn_title = function(_, entry) - return Path:new(from_entry.path(entry, true)):normalize(cwd) + return Path:new(from_entry.path(entry, false, false)):normalize(cwd) end, get_buffer_by_name = function(_, entry) - return from_entry.path(entry, true) + return from_entry.path(entry, false) end, define_preview = function(self, entry, status) @@ -446,21 +456,26 @@ previewers.vimgrep = defaulter(function(opts) return previewers.new_buffer_previewer { title = "Grep Preview", dyn_title = function(_, entry) - return Path:new(from_entry.path(entry, true)):normalize(cwd) + return Path:new(from_entry.path(entry, false, false)):normalize(cwd) end, get_buffer_by_name = function(_, entry) - return from_entry.path(entry, true) + return from_entry.path(entry, false) end, define_preview = function(self, entry, status) - local p = from_entry.path(entry, true) - if p == nil or p == "" then - return + -- builtin.buffers: bypass path validation for terminal buffers that don't have appropriate path + local has_buftype = entry.bufnr and vim.api.nvim_buf_get_option(entry.bufnr, "buftype") ~= "" or false + local p + if not has_buftype then + p = from_entry.path(entry, true) + if p == nil or p == "" then + return + end end -- Workaround for unnamed buffer when using builtin.buffer - if entry.bufnr and (p == "[No Name]" or vim.api.nvim_buf_get_option(entry.bufnr, "buftype") ~= "") then + if entry.bufnr and (p == "[No Name]" or has_buftype) then local lines = vim.api.nvim_buf_get_lines(entry.bufnr, 0, -1, false) vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, lines) jump_to_line(self, self.state.bufnr, entry.lnum) @@ -711,8 +726,12 @@ previewers.git_stash_diff = defaulter(function(opts) value = entry.value, bufname = self.state.bufname, cwd = opts.cwd, + callback = function(bufnr) + if vim.api.nvim_buf_is_valid(bufnr) then + putils.regex_highlighter(bufnr, "diff") + end + end, }) - putils.regex_highlighter(self.state.bufnr, "diff") end, } end, {}) @@ -737,10 +756,12 @@ previewers.git_commit_diff_to_parent = defaulter(function(opts) bufname = self.state.bufname, cwd = opts.cwd, callback = function(bufnr) - search_cb_jump(self, bufnr, opts.current_line) + if vim.api.nvim_buf_is_valid(bufnr) then + search_cb_jump(self, bufnr, opts.current_line) + putils.regex_highlighter(bufnr, "diff") + end end, }) - putils.regex_highlighter(self.state.bufnr, "diff") end, } end, {}) @@ -766,10 +787,12 @@ previewers.git_commit_diff_to_head = defaulter(function(opts) bufname = self.state.bufname, cwd = opts.cwd, callback = function(bufnr) - search_cb_jump(self, bufnr, opts.current_line) + if vim.api.nvim_buf_is_valid(bufnr) then + search_cb_jump(self, bufnr, opts.current_line) + putils.regex_highlighter(bufnr, "diff") + end end, }) - putils.regex_highlighter(self.state.bufnr, "diff") end, } end, {}) @@ -795,10 +818,12 @@ previewers.git_commit_diff_as_was = defaulter(function(opts) bufname = self.state.bufname, cwd = opts.cwd, callback = function(bufnr) - search_cb_jump(self, bufnr, opts.current_line) + if vim.api.nvim_buf_is_valid(bufnr) then + search_cb_jump(self, bufnr, opts.current_line) + putils.regex_highlighter(bufnr, ft) + end end, }) - putils.highlighter(self.state.bufnr, ft) end, } end, {}) @@ -860,8 +885,12 @@ previewers.git_file_diff = defaulter(function(opts) value = entry.value, bufname = self.state.bufname, cwd = opts.cwd, + callback = function(bufnr) + if vim.api.nvim_buf_is_valid(bufnr) then + putils.regex_highlighter(bufnr, "diff") + end + end, }) - putils.regex_highlighter(self.state.bufnr, "diff") end end, } @@ -877,12 +906,12 @@ previewers.autocommands = defaulter(function(_) end, get_buffer_by_name = function(_, entry) - return entry.group + return entry.value.group_name end, define_preview = function(self, entry, status) local results = vim.tbl_filter(function(x) - return x.group == entry.group + return x.value.group_name == entry.value.group_name end, status.picker.finder.results) if self.state.last_set_bufnr then @@ -890,9 +919,9 @@ previewers.autocommands = defaulter(function(_) end local selected_row = 0 - if self.state.bufname ~= entry.group then + if self.state.bufname ~= entry.value.group_name then local display = {} - table.insert(display, string.format(" augroup: %s - [ %d entries ]", entry.group, #results)) + table.insert(display, string.format(" augroup: %s - [ %d entries ]", entry.value.group_name, #results)) -- TODO: calculate banner width/string in setup() -- TODO: get column characters to be the same HL group as border table.insert(display, string.rep("─", vim.fn.getwininfo(status.preview_win)[1].width)) @@ -901,7 +930,10 @@ previewers.autocommands = defaulter(function(_) if item == entry then selected_row = idx end - table.insert(display, string.format(" %-14s▏%-08s %s", item.event, item.ft_pattern, item.command)) + table.insert( + display, + string.format(" %-14s▏%-08s %s", item.value.event, item.value.pattern, item.value.command) + ) end vim.api.nvim_buf_set_option(self.state.bufnr, "filetype", "vim") diff --git a/bundle/telescope.nvim/lua/telescope/previewers/previewer.lua b/bundle/telescope.nvim/lua/telescope/previewers/previewer.lua index 834df2c31..f986dac79 100644 --- a/bundle/telescope.nvim/lua/telescope/previewers/previewer.lua +++ b/bundle/telescope.nvim/lua/telescope/previewers/previewer.lua @@ -1,3 +1,5 @@ +local utils = require "telescope.utils" + local Previewer = {} Previewer.__index = Previewer @@ -25,11 +27,19 @@ function Previewer:new(opts) _send_input = opts.send_input, _scroll_fn = opts.scroll_fn, preview_fn = opts.preview_fn, + _empty_bufnr = nil, }, Previewer) end function Previewer:preview(entry, status) if not entry then + if not self._empty_bufnr then + self._empty_bufnr = vim.api.nvim_create_buf(false, true) + end + + if vim.api.nvim_buf_is_valid(self._empty_bufnr) then + vim.api.nvim_win_set_buf(status.preview_win, self._empty_bufnr) + end return end @@ -47,7 +57,11 @@ end function Previewer:title(entry, dynamic) if dynamic == true and self._dyn_title_fn ~= nil then if entry == nil then - return nil + if self._title_fn ~= nil then + return self:_title_fn() + else + return "" + end end return self:_dyn_title_fn(entry) end @@ -57,6 +71,9 @@ function Previewer:title(entry, dynamic) end function Previewer:teardown() + if self._empty_bufnr then + utils.buf_delete(self._empty_bufnr) + end if self._teardown_func then self:_teardown_func() end diff --git a/bundle/telescope.nvim/lua/telescope/previewers/term_previewer.lua b/bundle/telescope.nvim/lua/telescope/previewers/term_previewer.lua index 527fd417d..368f6a979 100644 --- a/bundle/telescope.nvim/lua/telescope/previewers/term_previewer.lua +++ b/bundle/telescope.nvim/lua/telescope/previewers/term_previewer.lua @@ -192,12 +192,12 @@ previewers.new_termopen_previewer = function(opts) local prev_bufnr = get_bufnr_by_bufentry(self, entry) if prev_bufnr then self.state.termopen_bufnr = prev_bufnr - vim.api.nvim_win_set_buf(status.preview_win, self.state.termopen_bufnr) + utils.win_set_buf_noautocmd(status.preview_win, self.state.termopen_bufnr) self.state.termopen_id = term_ids[self.state.termopen_bufnr] else local bufnr = vim.api.nvim_create_buf(false, true) set_bufnr(self, bufnr) - vim.api.nvim_win_set_buf(status.preview_win, bufnr) + utils.win_set_buf_noautocmd(status.preview_win, bufnr) local term_opts = { cwd = opts.cwd or vim.loop.cwd(), @@ -250,11 +250,11 @@ previewers.cat = defaulter(function(opts) return previewers.new_termopen_previewer { title = "File Preview", dyn_title = function(_, entry) - return Path:new(from_entry.path(entry, true)):normalize(cwd) + return Path:new(from_entry.path(entry, false, false)):normalize(cwd) end, get_command = function(entry) - local p = from_entry.path(entry, true) + local p = from_entry.path(entry, true, false) if p == nil or p == "" then return end @@ -273,14 +273,14 @@ previewers.vimgrep = defaulter(function(opts) return previewers.new_termopen_previewer { title = "Grep Preview", dyn_title = function(_, entry) - return Path:new(from_entry.path(entry, true)):normalize(cwd) + return Path:new(from_entry.path(entry, false, false)):normalize(cwd) end, get_command = function(entry, status) local win_id = status.preview_win local height = vim.api.nvim_win_get_height(win_id) - local p = from_entry.path(entry, true) + local p = from_entry.path(entry, true, false) if p == nil or p == "" then return end @@ -308,14 +308,14 @@ previewers.qflist = defaulter(function(opts) return previewers.new_termopen_previewer { title = "Grep Preview", dyn_title = function(_, entry) - return Path:new(from_entry.path(entry, true)):normalize(cwd) + return Path:new(from_entry.path(entry, false, false)):normalize(cwd) end, get_command = function(entry, status) local win_id = status.preview_win local height = vim.api.nvim_win_get_height(win_id) - local p = from_entry.path(entry, true) + local p = from_entry.path(entry, true, false) if p == nil or p == "" then return end diff --git a/bundle/telescope.nvim/lua/telescope/previewers/utils.lua b/bundle/telescope.nvim/lua/telescope/previewers/utils.lua index d250894b5..bd8c3002f 100644 --- a/bundle/telescope.nvim/lua/telescope/previewers/utils.lua +++ b/bundle/telescope.nvim/lua/telescope/previewers/utils.lua @@ -45,28 +45,26 @@ utils.job_maker = function(cmd, bufnr, opts) end end)() - Job - :new({ - command = command, - args = cmd, - env = opts.env, - cwd = opts.cwd, - writer = writer, - on_exit = vim.schedule_wrap(function(j) - if not vim.api.nvim_buf_is_valid(bufnr) then - return - end - if opts.mode == "append" then - vim.api.nvim_buf_set_lines(bufnr, -1, -1, false, j:result()) - elseif opts.mode == "insert" then - vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, j:result()) - end - if opts.callback then - opts.callback(bufnr, j:result()) - end - end), - }) - :start() + Job:new({ + command = command, + args = cmd, + env = opts.env, + cwd = opts.cwd, + writer = writer, + on_exit = vim.schedule_wrap(function(j) + if not vim.api.nvim_buf_is_valid(bufnr) then + return + end + if opts.mode == "append" then + vim.api.nvim_buf_set_lines(bufnr, -1, -1, false, j:result()) + elseif opts.mode == "insert" then + vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, j:result()) + end + if opts.callback then + opts.callback(bufnr, j:result()) + end + end), + }):start() else if opts.callback then opts.callback(bufnr) @@ -80,14 +78,41 @@ end --- Attach default highlighter which will choose between regex and ts utils.highlighter = function(bufnr, ft, opts) - opts = opts or {} - opts.preview = opts.preview or {} - opts.preview.treesitter = vim.F.if_nil( - opts.preview.treesitter, - type(conf.preview) == "table" and conf.preview.treesitter - ) - local ts_highlighting = opts.preview.treesitter == true - or type(opts.preview.treesitter) == "table" and vim.tbl_contains(opts.preview.treesitter, ft) + opts = vim.F.if_nil(opts, {}) + opts.preview = vim.F.if_nil(opts.preview, {}) + opts.preview.treesitter = (function() + if type(opts.preview) == "table" and opts.preview.treesitter then + return opts.preview.treesitter + end + if type(conf.preview) == "table" and conf.preview.treesitter then + return conf.preview.treesitter + end + if type(conf.preview) == "boolean" then + return conf.preview + end + -- We should never get here + return false + end)() + + if type(opts.preview.treesitter) == "boolean" then + local temp = { enable = opts.preview.treesitter } + opts.preview.treesitter = temp + end + + local ts_highlighting = (function() + if type(opts.preview.treesitter.enable) == "table" then + if vim.tbl_contains(opts.preview.treesitter.enable, ft) then + return true + end + return false + end + + if vim.tbl_contains(vim.F.if_nil(opts.preview.treesitter.disable, {}), ft) then + return false + end + + return opts.preview.treesitter.enable == nil or opts.preview.treesitter.enable == true + end)() local ts_success if ts_highlighting then @@ -114,9 +139,6 @@ local treesitter_attach = function(bufnr, ft) end local config = ts_configs.get_module "highlight" - for k, v in pairs(config.custom_captures) do - vim.treesitter.highlighter.hl_map[k] = v - end vim.treesitter.highlighter.new(ts_parsers.get_parser(bufnr, lang)) local is_table = type(config.additional_vim_regex_highlighting) == "table" if diff --git a/bundle/telescope.nvim/lua/telescope/sorters.lua b/bundle/telescope.nvim/lua/telescope/sorters.lua index 8e266b3b4..6817c9752 100644 --- a/bundle/telescope.nvim/lua/telescope/sorters.lua +++ b/bundle/telescope.nvim/lua/telescope/sorters.lua @@ -291,17 +291,17 @@ sorters.get_fuzzy_file = function(opts) end local denominator = ( - (10 * match_count / #prompt_lower_ngrams) - -- biases for shorter strings - + 3 * match_count * ngram_len / #line - + consecutive_matches - + N / (contains_string or (2 * #line)) - -- + 30/(c1 or 2*N) - -- TODO: It might be possible that this too strongly correlates, - -- but it's unlikely for people to type capital letters without actually - -- wanting to do something with a capital letter in it. - + uppers_matching - ) * tail_modifier + (10 * match_count / #prompt_lower_ngrams) + -- biases for shorter strings + + 3 * match_count * ngram_len / #line + + consecutive_matches + + N / (contains_string or (2 * #line)) + -- + 30/(c1 or 2*N) + -- TODO: It might be possible that this too strongly correlates, + -- but it's unlikely for people to type capital letters without actually + -- wanting to do something with a capital letter in it. + + uppers_matching + ) * tail_modifier if denominator == 0 or denominator ~= denominator then return -1 @@ -430,6 +430,7 @@ sorters.fuzzy_with_index_bias = function(opts) return math.min(math.pow(entry.index, 0.25), 2) * base_score end end, + highlighter = fuzzy_sorter.highlighter, } end @@ -602,7 +603,7 @@ end sorters.prefilter = function(opts) local sorter = opts.sorter - opts.delimiter = util.get_default(opts.delimiter, ":") + opts.delimiter = vim.F.if_nil(opts.delimiter, ":") sorter._delimiter = opts.delimiter sorter.tags = create_tag_set(opts.tag) sorter.filter_function = filter_function(opts) diff --git a/bundle/telescope.nvim/lua/telescope/pickers/_test_helpers.lua b/bundle/telescope.nvim/lua/telescope/testharness/helpers.lua similarity index 100% rename from bundle/telescope.nvim/lua/telescope/pickers/_test_helpers.lua rename to bundle/telescope.nvim/lua/telescope/testharness/helpers.lua diff --git a/bundle/telescope.nvim/lua/telescope/testharness/init.lua b/bundle/telescope.nvim/lua/telescope/testharness/init.lua new file mode 100644 index 000000000..9a8e70738 --- /dev/null +++ b/bundle/telescope.nvim/lua/telescope/testharness/init.lua @@ -0,0 +1,112 @@ +local assert = require "luassert" + +local Path = require "plenary.path" + +local tester = {} +tester.debug = false + +local get_results_from_contents = function(content) + local nvim = vim.fn.jobstart( + { "nvim", "--noplugin", "-u", "scripts/minimal_init.vim", "--headless", "--embed" }, + { rpc = true } + ) + + local result = vim.fn.rpcrequest(nvim, "nvim_exec_lua", content, {}) + assert.are.same(true, result[1], vim.inspect(result)) + + local count = 0 + while + vim.fn.rpcrequest(nvim, "nvim_exec_lua", "return require('telescope.testharness.runner').state.done", {}) ~= true + do + count = count + 1 + vim.wait(100) + + -- TODO: Could maybe wait longer, but it's annoying to wait if the test is going to timeout. + if count > 100 then + break + end + end + + local state = vim.fn.rpcrequest(nvim, "nvim_exec_lua", "return require('telescope.testharness.runner').state", {}) + vim.fn.jobstop(nvim) + + assert.are.same(true, state.done, vim.inspect(state)) + + local result_table = {} + for _, v in ipairs(state.results) do + table.insert(result_table, v) + end + + return result_table, state +end + +local check_results = function(results, state) + assert(state, "Must pass state") + + for _, v in ipairs(results) do + local assertion + if not v._type or v._type == "are" or v._type == "_default" then + assertion = assert.are.same + else + assertion = assert.are_not.same + end + + -- TODO: I think it would be nice to be able to see the state, + -- but it clutters up the test output so much here. + -- + -- So we would have to consider how to do that I think. + assertion(v.expected, v.actual, string.format("Test Case: %s // %s", v.location, v.case)) + end +end + +tester.run_string = function(contents) + contents = [[ + return (function() + local tester = require('telescope.testharness') + local runner = require('telescope.testharness.runner') + local helper = require('telescope.testharness.helpers') + helper.make_globals() + local ok, msg = pcall(function() + runner.log("Loading Test") + ]] .. contents .. [[ + end) + return {ok, msg or runner.state} + end)() + ]] + + check_results(get_results_from_contents(contents)) +end + +tester.run_file = function(filename) + local file = "./lua/tests/pickers/" .. filename .. ".lua" + local path = Path:new(file) + + if not path:exists() then + assert.are.same("", file) + end + + local contents = string.format( + [[ + return (function() + local runner = require('telescope.testharness.runner') + local helper = require('telescope.testharness.helpers') + helper.make_globals() + local ok, msg = pcall(function() + runner.log("Loading Test") + return loadfile("%s")() + end) + return {ok, msg or runner.state} + end)() + ]], + path:absolute() + ) + + check_results(get_results_from_contents(contents)) +end + +tester.not_ = function(val) + val._type = "are_not" + return val +end + +return tester diff --git a/bundle/telescope.nvim/lua/telescope/testharness/runner.lua b/bundle/telescope.nvim/lua/telescope/testharness/runner.lua new file mode 100644 index 000000000..af1bf30bd --- /dev/null +++ b/bundle/telescope.nvim/lua/telescope/testharness/runner.lua @@ -0,0 +1,156 @@ +local builtin = require "telescope.builtin" + +local DELAY = vim.g.telescope_test_delay or 50 +local runner = {} + +-- State is test variable +runner.state = { + done = false, + results = {}, + msgs = {}, +} + +local writer = function(val) + table.insert(runner.state.results, val) +end + +local invalid_test_case = function(k) + error { case = k, expected = "", actual = k } +end + +local _VALID_KEYS = { + post_typed = true, + post_close = true, +} + +local replace_terms = function(input) + return vim.api.nvim_replace_termcodes(input, true, false, true) +end + +runner.nvim_feed = function(text, feed_opts) + feed_opts = feed_opts or "m" + + vim.api.nvim_feedkeys(text, feed_opts, true) +end + +local end_test_cases = function() + runner.state.done = true +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, + } + + end_test_cases() + else + writer { + location = location, + case = key, + expected = spec[1], + actual = actual, + + _type = spec._type, + } + end + + return ok +end + +runner.log = function(msg) + table.insert(runner.state.msgs, msg) +end + +runner.picker = function(picker_name, input, test_cases, opts) + opts = opts or {} + + for k, _ in pairs(test_cases) do + if not _VALID_KEYS[k] then + return invalid_test_case(k) + end + end + + opts.on_complete = { + runner.create_on_complete(input, test_cases), + } + + opts._on_error = function(self, msg) + runner.state.done = true + writer { + location = "Error while running on complete", + expected = "To Work", + actual = msg, + } + end + + runner.log "Starting picker" + builtin[picker_name](opts) + runner.log "Called picker" +end + +runner.create_on_complete = function(input, test_cases) + input = replace_terms(input) + + local actions = {} + for i = 1, #input do + local char = input:sub(i, i) + table.insert(actions, { + cb = function() + runner.log("Inserting char: " .. char) + runner.nvim_feed(char, "") + end, + char = char, + }) + end + + return function() + local action + + repeat + action = table.remove(actions, 1) + if action then + action.cb() + end + until not action or string.match(action.char, "%g") + + if #actions > 0 then + return + end + + vim.defer_fn(function() + if test_cases.post_typed then + for k, v in ipairs(test_cases.post_typed) do + if not execute_test_case("post_typed", k, v) then + return + end + end + end + + vim.defer_fn(function() + runner.nvim_feed(replace_terms "", "") + + vim.defer_fn(function() + if test_cases.post_close then + for k, v in ipairs(test_cases.post_close) do + if not execute_test_case("post_close", k, v) then + return + end + end + end + + vim.defer_fn(end_test_cases, DELAY) + end, DELAY) + end, DELAY) + end, DELAY) + end +end + +return runner diff --git a/bundle/telescope.nvim/lua/telescope/utils.lua b/bundle/telescope.nvim/lua/telescope/utils.lua index 46eee274c..dcc3276be 100644 --- a/bundle/telescope.nvim/lua/telescope/utils.lua +++ b/bundle/telescope.nvim/lua/telescope/utils.lua @@ -1,3 +1,10 @@ +---@tag telescope.utils +---@config { ["module"] = "telescope.utils" } + +---@brief [[ +--- Utilities for writing telescope pickers +---@brief ]] + local Path = require "plenary.path" local Job = require "plenary.job" @@ -12,18 +19,6 @@ utils.get_separator = function() return Path.path.sep end -utils.if_nil = function(x, was_nil, was_not_nil) - if x == nil then - return was_nil - else - return was_not_nil - end -end - -utils.get_default = function(x, default) - return utils.if_nil(x, default, x) -end - utils.cycle = function(i, n) return i % n == 0 and n or i % n end @@ -179,21 +174,23 @@ end)() utils.path_tail = (function() local os_sep = utils.get_separator() - local match_string = "[^" .. os_sep .. "]*$" return function(path) - return string.match(path, match_string) + for i = #path, 1, -1 do + if path:sub(i, i) == os_sep then + return path:sub(i + 1, -1) + end + end + return path end end)() utils.is_path_hidden = function(opts, path_display) - path_display = path_display or utils.get_default(opts.path_display, require("telescope.config").values.path_display) + path_display = path_display or vim.F.if_nil(opts.path_display, require("telescope.config").values.path_display) return path_display == nil or path_display == "hidden" - or type(path_display) ~= "table" - or vim.tbl_contains(path_display, "hidden") - or path_display.hidden + or type(path_display) == "table" and (vim.tbl_contains(path_display, "hidden") or path_display.hidden) end local is_uri = function(filename) @@ -206,6 +203,16 @@ local calc_result_length = function(truncate_len) return type(truncate_len) == "number" and len - truncate_len or len end +--- Transform path is a util function that formats a path based on path_display +--- found in `opts` or the default value from config. +--- It is meant to be used in make_entry to have a uniform interface for +--- builtins as well as extensions utilizing the same user configuration +--- Note: It is only supported inside `make_entry`/`make_display` the use of +--- this function outside of telescope might yield to undefined behavior and will +--- not be addressed by us +---@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 +---@return string: The transformed path ready to be displayed utils.transform_path = function(opts, path) if path == nil then return @@ -214,7 +221,7 @@ utils.transform_path = function(opts, path) return path end - local path_display = utils.get_default(opts.path_display, require("telescope.config").values.path_display) + local path_display = vim.F.if_nil(opts.path_display, require("telescope.config").values.path_display) local transformed_path = path @@ -253,7 +260,10 @@ utils.transform_path = function(opts, path) if opts.__length == nil then opts.__length = calc_result_length(path_display.truncate) end - transformed_path = truncate(transformed_path, opts.__length, nil, -1) + if opts.__prefix == nil then + opts.__prefix = 0 + end + transformed_path = truncate(transformed_path, opts.__length - opts.__prefix, nil, -1) end end @@ -393,19 +403,24 @@ function utils.get_os_command_output(cmd, cwd) end local command = table.remove(cmd, 1) local stderr = {} - local stdout, ret = Job - :new({ - command = command, - args = cmd, - cwd = cwd, - on_stderr = function(_, data) - table.insert(stderr, data) - end, - }) - :sync() + local stdout, ret = Job:new({ + command = command, + args = cmd, + cwd = cwd, + on_stderr = function(_, data) + table.insert(stderr, data) + end, + }):sync() return stdout, ret, stderr end +function utils.win_set_buf_noautocmd(win, buf) + local save_ei = vim.o.eventignore + vim.o.eventignore = "all" + vim.api.nvim_win_set_buf(win, buf) + vim.o.eventignore = save_ei +end + local load_once = function(f) local resolved = nil return function(...) @@ -431,13 +446,13 @@ utils.transform_devicons = load_once(function() return display end - local icon, icon_highlight = devicons.get_icon(filename, string.match(filename, "%a+$"), { default = true }) + local icon, icon_highlight = devicons.get_icon(utils.path_tail(filename), nil, { default = true }) local icon_display = (icon or " ") .. " " .. (display or "") if conf.color_devicons then return icon_display, icon_highlight else - return icon_display, "TelescopeResultsFileIcon" + return icon_display, nil end end else @@ -461,11 +476,11 @@ utils.get_devicons = load_once(function() return "" end - local icon, icon_highlight = devicons.get_icon(filename, string.match(filename, "%a+$"), { default = true }) + local icon, icon_highlight = devicons.get_icon(utils.path_tail(filename), nil, { default = true }) if conf.color_devicons then return icon, icon_highlight else - return icon, "TelescopeResultsFileIcon" + return icon, nil end end else diff --git a/bundle/telescope.nvim/lua/tests/automated/action_spec.lua b/bundle/telescope.nvim/lua/tests/automated/action_spec.lua index c1dd8b3d7..3db014f1e 100644 --- a/bundle/telescope.nvim/lua/tests/automated/action_spec.lua +++ b/bundle/telescope.nvim/lua/tests/automated/action_spec.lua @@ -488,7 +488,7 @@ describe("actions", function() eq("replaced:vnew", actions.file_vsplit()) end) - it("handles backwards compat with select and edit files", function() + pending("handles backwards compat with select and edit files", function() -- Reproduce steps: -- In config, we have { [""] = actions.select, ... } -- In caller, we have actions._goto:replace(...) diff --git a/bundle/telescope.nvim/lua/tests/automated/pickers/find_files_spec.lua b/bundle/telescope.nvim/lua/tests/automated/pickers/find_files_spec.lua index e9094cba7..7e1c02770 100644 --- a/bundle/telescope.nvim/lua/tests/automated/pickers/find_files_spec.lua +++ b/bundle/telescope.nvim/lua/tests/automated/pickers/find_files_spec.lua @@ -1,6 +1,9 @@ -require("plenary.reload").reload_module "telescope" +-- Just skip on mac, it has flaky CI for some reason +if vim.fn.has "mac" == 1 then + return +end -local tester = require "telescope.pickers._test" +local tester = require "telescope.testharness" local disp = function(val) return vim.inspect(val, { newline = " ", indent = "" }) @@ -11,10 +14,6 @@ describe("builtin.find_files", function() tester.run_file "find_files__readme" end) - it("should be able to move selections", function() - tester.run_file "find_files__with_ctrl_n" - end) - for _, configuration in ipairs { { sorting_strategy = "descending" }, { sorting_strategy = "ascending" }, @@ -24,7 +23,7 @@ describe("builtin.find_files", function() [[ local max_results = 5 - tester.builtin_picker('find_files', 'README.md', { + runner.picker('find_files', 'README.md', { post_typed = { { "> README.md", GetPrompt }, { "> README.md", GetBestResult }, @@ -41,56 +40,24 @@ describe("builtin.find_files", function() height = max_results + 1, width = 0.9, }, - border = false, }, vim.json.decode([==[%s]==]))) ]], vim.json.encode(configuration) )) end) - it("should only save one line for ascending, but many for descending", function() - local expected - if configuration.sorting_strategy == "descending" then - expected = 5 - else - expected = 1 - end - - tester.run_string(string.format( - [[ - local max_results = 5 - - tester.builtin_picker('find_files', 'README.md', { - post_typed = { - { %s, function() return #GetResults() end }, - }, - }, vim.tbl_extend("force", { - disable_devicons = true, - sorter = require('telescope.sorters').get_fzy_sorter(), - layout_strategy = 'center', - layout_config = { - height = max_results + 1, - width = 0.9, - }, - border = false, - }, vim.json.decode([==[%s]==]))) - ]], - expected, - vim.json.encode(configuration) - )) - end) - - it("use devicons, if it has it when enabled", function() + pending("use devicons, if it has it when enabled", function() if not pcall(require, "nvim-web-devicons") then return end + local md = require("nvim-web-devicons").get_icon "md" tester.run_string(string.format( [[ - tester.builtin_picker('find_files', 'README.md', { + runner.picker('find_files', 'README.md', { post_typed = { { "> README.md", GetPrompt }, - { ">  README.md", GetBestResult } + { "> %s README.md", GetBestResult } }, post_close = { { 'README.md', GetFile }, @@ -101,6 +68,7 @@ describe("builtin.find_files", function() sorter = require('telescope.sorters').get_fzy_sorter(), }, vim.json.decode([==[%s]==]))) ]], + md, vim.json.encode(configuration) )) end) @@ -108,7 +76,7 @@ describe("builtin.find_files", function() it("should find the readme, using lowercase", function() tester.run_string [[ - tester.builtin_picker('find_files', 'readme.md', { + runner.picker('find_files', 'readme.md', { post_close = { { 'README.md', GetFile }, } @@ -118,7 +86,7 @@ describe("builtin.find_files", function() it("should find the pickers.lua, using lowercase", function() tester.run_string [[ - tester.builtin_picker('find_files', 'pickers.lua', { + runner.picker('find_files', 'pickers.lua', { post_close = { { 'pickers.lua', GetFile }, } @@ -128,7 +96,7 @@ describe("builtin.find_files", function() it("should find the pickers.lua", function() tester.run_string [[ - tester.builtin_picker('find_files', 'pickers.lua', { + runner.picker('find_files', 'pickers.lua', { post_close = { { 'pickers.lua', GetFile }, { 'pickers.lua', GetFile }, @@ -139,20 +107,13 @@ describe("builtin.find_files", function() it("should be able to c-n the items", function() tester.run_string [[ - tester.builtin_picker('find_files', 'fixtures/file', { + runner.picker('find_files', 'fixtures/file', { post_typed = { { { - " lua/tests/fixtures/file_abc.txt", - "> lua/tests/fixtures/file_a.txt", - }, function() - local res = GetResults() - - return { - res[#res - 1], - res[#res], - } - end + " lua/tests/fixtures/file_a.txt", + "> lua/tests/fixtures/file_abc.txt", + }, GetResults }, }, post_close = { @@ -160,6 +121,7 @@ describe("builtin.find_files", function() }, }, { sorter = require('telescope.sorters').get_fzy_sorter(), + sorting_strategy = "ascending", disable_devicons = true, }) ]] @@ -167,7 +129,7 @@ describe("builtin.find_files", function() it("should be able to get the current selection", function() tester.run_string [[ - tester.builtin_picker('find_files', 'fixtures/file_abc', { + runner.picker('find_files', 'fixtures/file_abc', { post_typed = { { 'lua/tests/fixtures/file_abc.txt', GetSelectionValue }, } diff --git a/bundle/telescope.nvim/lua/tests/automated/resolver_spec.lua b/bundle/telescope.nvim/lua/tests/automated/resolver_spec.lua index 0251ec09e..f30a3237e 100644 --- a/bundle/telescope.nvim/lua/tests/automated/resolver_spec.lua +++ b/bundle/telescope.nvim/lua/tests/automated/resolver_spec.lua @@ -75,6 +75,14 @@ describe("telescope.config.resolve", function() end end) + it("should handle percentages with min/max boundary", function() + eq(20, resolve.resolve_width { 0.1, min = 20 }(nil, 40, 120)) + eq(30, resolve.resolve_height { 0.1, min = 20 }(nil, 40, 300)) + + eq(24, resolve.resolve_width { 0.4, max = 80 }(nil, 60, 60)) + eq(80, resolve.resolve_height { 0.4, max = 80 }(nil, 60, 300)) + end) + it("should handle fixed size", function() local fixed = { 5, 8, 13, 21, 34 } for _, s in ipairs(test_sizes) do diff --git a/bundle/telescope.nvim/lua/tests/pickers/find_files__readme.lua b/bundle/telescope.nvim/lua/tests/pickers/find_files__readme.lua index 7ec8bcc0e..1b76ad6c4 100644 --- a/bundle/telescope.nvim/lua/tests/pickers/find_files__readme.lua +++ b/bundle/telescope.nvim/lua/tests/pickers/find_files__readme.lua @@ -1,7 +1,7 @@ -local tester = require "telescope.pickers._test" -local helper = require "telescope.pickers._test_helpers" +local helper = require "telescope.testharness.helpers" +local runner = require "telescope.testharness.runner" -tester.builtin_picker("find_files", "README.md", { +runner.picker("find_files", "README.md", { post_close = { { "README.md", helper.get_file }, }, diff --git a/bundle/telescope.nvim/lua/tests/pickers/find_files__scrolling_descending_cycle.lua b/bundle/telescope.nvim/lua/tests/pickers/find_files__scrolling_descending_cycle.lua index 4f8a3f226..6b3c02396 100644 --- a/bundle/telescope.nvim/lua/tests/pickers/find_files__scrolling_descending_cycle.lua +++ b/bundle/telescope.nvim/lua/tests/pickers/find_files__scrolling_descending_cycle.lua @@ -1,10 +1,8 @@ -require("plenary.reload").reload_module "plenary" -require("plenary.reload").reload_module "telescope" +local tester = require "telescope.testharness" +local helper = require "telescope.testharness.helpers" +local runner = require "telescope.testharness.runner" -local tester = require "telescope.pickers._test" -local helper = require "telescope.pickers._test_helpers" - -tester.builtin_picker("find_files", "telescope", { +runner.picker("find_files", "telescope", { post_close = { tester.not_ { "plugin/telescope.vim", helper.get_file }, }, diff --git a/bundle/telescope.nvim/lua/tests/pickers/find_files__with_ctrl_n.lua b/bundle/telescope.nvim/lua/tests/pickers/find_files__with_ctrl_n.lua deleted file mode 100644 index 4820f34fb..000000000 --- a/bundle/telescope.nvim/lua/tests/pickers/find_files__with_ctrl_n.lua +++ /dev/null @@ -1,8 +0,0 @@ -local tester = require "telescope.pickers._test" -local helper = require "telescope.pickers._test_helpers" - -tester.builtin_picker("find_files", "fixtures/file", { - post_close = { - { "lua/tests/fixtures/file_abc.txt", helper.get_selection_value }, - }, -}) diff --git a/bundle/telescope.nvim/media/demo_script.lua b/bundle/telescope.nvim/media/demo_script.lua deleted file mode 100644 index 807452381..000000000 --- a/bundle/telescope.nvim/media/demo_script.lua +++ /dev/null @@ -1,47 +0,0 @@ -local finders = require('telescope.finders') -local previewers = require('telescope.previewers') -local pickers = require('telescope.pickers') -local sorters = require('telescope.sorters') - --- Get all the items from v:oldfiles that are valid files -local valid_oldfiles = vim.tbl_filter(function(val) - return 0 ~= vim.fn.filereadable(val) -end, vim.v.oldfiles) - --- print(vim.inspect(valid_oldfiles)) --- => { --- "/home/tj/blah.txt", --- "/home/tj/another_dir/file.py", --- ... --- } - --- Create a finder from a Lua list. -local oldfiles_finder = finders.new_table(valid_oldfiles) - --- Get a pre-defined sorter. --- Sorters return a "score" for each "Entry" found by a finder. --- --- This sorter is optimized to best find files in a fuzzy manner. -local oldfiles_sorter = sorters.get_fuzzy_file() - --- Get a pre-defined previewer. --- Previewers take the currently selected entry, --- and put a preview of it in a floating window -local oldfiles_previewer = previewers.cat - --- Create and run a Picker. --- Pickers are the main entry point to telescope. --- They manage the interactions between: --- Finder, --- Sorter, --- Previewer --- --- And provide the UI for the user. -pickers.new { - prompt = 'Oldfiles', - finder = oldfiles_finder, - sorter = oldfiles_sorter, - previewer = oldfiles_previewer, -}:find() - - diff --git a/bundle/telescope.nvim/media/demo_script_2.lua b/bundle/telescope.nvim/media/demo_script_2.lua deleted file mode 100644 index 9394ffc64..000000000 --- a/bundle/telescope.nvim/media/demo_script_2.lua +++ /dev/null @@ -1,30 +0,0 @@ -local finders = require('telescope.finders') -local previewers = require('telescope.previewers') -local pickers = require('telescope.pickers') - --- Create a new finder. --- This finder, rather than taking a Lua list, --- generates a shell command that should be run. --- --- Each line of the shell command is converted to an entry, --- and is possible to preview with builtin previews. --- --- In this example, we use ripgrep to search over your entire directory --- live as you type. -local live_grepper = finders.new_job(function(prompt) - if not prompt or prompt == "" then - return nil - end - - return { 'rg', "--vimgrep", prompt} -end) - --- Create and run the Picker. --- --- NOTE: No sorter is needed to be passed. --- Results will be returned in the order they are received. -pickers.new({ - prompt = 'Live Grep', - finder = live_grepper, - previewer = previewers.vimgrep, -}):find() diff --git a/bundle/telescope.nvim/media/simple_rg_example.hnt b/bundle/telescope.nvim/media/simple_rg_example.hnt deleted file mode 100644 index a0074794d..000000000 --- a/bundle/telescope.nvim/media/simple_rg_example.hnt +++ /dev/null @@ -1,34 +0,0 @@ -### Simple demo to show the rg stuff -## key_delay 1 -## feed_full - -:e! ./scratch/simple_rg.lua\ -:set foldlevel=100\ -:luafile %\ - -## pause -## key_delay 80 - -Finder - -## key_delay 150 - -\ - -## pause -\ - -## pause -\ - -## pause -\ - -## pause -\ -:" Went to the file!\ - -## pause - -## feed_full -:qa!\ diff --git a/bundle/telescope.nvim/media/worflow.txt b/bundle/telescope.nvim/media/worflow.txt deleted file mode 100644 index e12d7ec0d..000000000 --- a/bundle/telescope.nvim/media/worflow.txt +++ /dev/null @@ -1,26 +0,0 @@ -+-------------------------------------------------------------------+ -| Picker:find()--------------------+ +------>Picker | -| | ^ | | | -| | | v | | -| | +----------------+ +----------------+ | -| +->| Finder + | Sorter | | -| +----------------+ +----------------+ | -| [1] | -| | -| | -| | -| | -| | -| | -+-------------------------------------------------------------------+ - -Picker starts a `finder`. - Finder returns a list of `entries` to Picker. - Picker can optionally sort w/ `Sorter`. - Picker can optionally preview selected with `Previewer` - - Then you can map stuff in the picker to decide what to do next. - - - - diff --git a/bundle/telescope.nvim/plugin/telescope.lua b/bundle/telescope.nvim/plugin/telescope.lua index 9c0b8f394..0fa8c6847 100644 --- a/bundle/telescope.nvim/plugin/telescope.lua +++ b/bundle/telescope.nvim/plugin/telescope.lua @@ -82,7 +82,6 @@ local highlights = { TelescopeResultsNumber = { default = true, link = "Number" }, TelescopeResultsComment = { default = true, link = "Comment" }, TelescopeResultsSpecialComment = { default = true, link = "SpecialComment" }, - TelescopeResultsFileIcon = { default = true, link = "Normal" }, -- Used for git status Results highlighting TelescopeResultsDiffChange = { default = true, link = "DiffChange" }, diff --git a/bundle/telescope.nvim/scratch/batched_finder_and_sorter.lua b/bundle/telescope.nvim/scratch/batched_finder_and_sorter.lua deleted file mode 100644 index c3e188b8d..000000000 --- a/bundle/telescope.nvim/scratch/batched_finder_and_sorter.lua +++ /dev/null @@ -1,55 +0,0 @@ -local actions = require('telescope.actions') -local finders = require('telescope.finders') -local previewers = require('telescope.previewers') -local pickers = require('telescope.pickers') -local sorters = require('telescope.sorters') -local utils = require('telescope.utils') - -local Job = require('plenary.job') - --- local live_grepper = finders.new { --- fn_command = function(_, prompt) --- -- TODO: Make it so that we can start searching on the first character. --- if not prompt or prompt == "" then --- return nil --- end - --- return { --- command = 'rg', --- args = {"--vimgrep", prompt}, --- } --- end --- } - -local f = function(prompt, process_result, process_complete) - local fzf = Job:new { - command = 'fzf'; - - writer = Job:new { - command = "fdfind", - args = nil, - cwd = "/home/tj/build/neovim", - - enable_handlers = false, - }, - - -- Still doesn't work if you don't pass these args and just run `fzf` - args = {'--no-sort', '--filter', prompt}; - } - - - local start = vim.fn.reltime() - print(vim.inspect(fzf:sync()), vim.fn.reltimestr(vim.fn.reltime(start))) -end - - --- Process all the files --- f("", nil, nil) --- Filter on nvimexec -f("nvim/executor", nil, nil) - --- pickers.new({}, { --- prompt = 'Live Grep', --- finder = f, --- previewer = previewers.vimgrep, --- }):find() diff --git a/bundle/telescope.nvim/scratch/piped_to_fzf.lua b/bundle/telescope.nvim/scratch/piped_to_fzf.lua deleted file mode 100644 index 98577bd3c..000000000 --- a/bundle/telescope.nvim/scratch/piped_to_fzf.lua +++ /dev/null @@ -1,33 +0,0 @@ -RELOAD('telescope') -RELOAD('plenary') - -local finders = require('telescope.finders') -local make_entry = require('telescope.make_entry') -local pickers = require('telescope.pickers') -local sorters = require('telescope.sorters') - -local Job = require('plenary.job') - -pickers.new { - prompt = "Piped FZF", - - finder = finders._new { - fn_command = function(_, prompt) - return { - command = 'fzf', - args = {'--no-sort', '--filter', prompt or ''}, - - writer = Job:new { - command = 'rg', - args = {'--files'}, - cwd = '/home/tj/', - - enable_handlers = false, - }, - } - end, - - entry_maker = make_entry.gen_from_file(), - sorter = sorters.get_fuzzy_file(), - }, -}:find() diff --git a/bundle/telescope.nvim/scratch/slow_proc.sh b/bundle/telescope.nvim/scratch/slow_proc.sh deleted file mode 100644 index a43811de1..000000000 --- a/bundle/telescope.nvim/scratch/slow_proc.sh +++ /dev/null @@ -1,11 +0,0 @@ - -echo "hello" -sleep 1 -echo "help" -sleep 1 -echo "hi" -sleep 1 -echo "husband" -sleep 1 -echo "helper" - diff --git a/bundle/telescope.nvim/scripts/gendocs.lua b/bundle/telescope.nvim/scripts/gendocs.lua index 7016147f7..cfec1601e 100644 --- a/bundle/telescope.nvim/scripts/gendocs.lua +++ b/bundle/telescope.nvim/scripts/gendocs.lua @@ -15,8 +15,12 @@ docs.test = function() "./lua/telescope/command.lua", "./lua/telescope/builtin/init.lua", "./lua/telescope/themes.lua", + "./lua/telescope/mappings.lua", "./lua/telescope/pickers/layout_strategies.lua", "./lua/telescope/config/resolve.lua", + "./lua/telescope/make_entry.lua", + "./lua/telescope/pickers/entry_display.lua", + "./lua/telescope/utils.lua", "./lua/telescope/actions/init.lua", "./lua/telescope/actions/state.lua", "./lua/telescope/actions/set.lua", diff --git a/bundle/telescope.nvim/scripts/minimal_init.vim b/bundle/telescope.nvim/scripts/minimal_init.vim index 780c0e262..c2fd6eaf5 100644 --- a/bundle/telescope.nvim/scripts/minimal_init.vim +++ b/bundle/telescope.nvim/scripts/minimal_init.vim @@ -4,3 +4,6 @@ set rtp+=../tree-sitter-lua/ runtime! plugin/plenary.vim runtime! plugin/telescope.lua +runtime! plugin/ts_lua.vim + +let g:telescope_test_delay = 100 diff --git a/bundle/vim-zettelkasten/ftplugin/zkbrowser.lua b/bundle/vim-zettelkasten/ftplugin/zkbrowser.lua index 7f0a7718b..f3e818e90 100644 --- a/bundle/vim-zettelkasten/ftplugin/zkbrowser.lua +++ b/bundle/vim-zettelkasten/ftplugin/zkbrowser.lua @@ -1,55 +1,58 @@ if vim.b.did_ftp == true then - return + return end vim.opt_local.cursorline = true -vim.opt_local.modifiable = true -vim.opt_local.buflisted = true -vim.opt_local.syntax = "zkbrowser" -vim.opt_local.buftype = "nofile" +vim.opt_local.modifiable = false +vim.opt_local.buflisted = false +vim.opt_local.syntax = 'zkbrowser' +vim.opt_local.buftype = 'nofile' vim.opt_local.swapfile = false -vim.opt_local.iskeyword:append(":") -vim.opt_local.iskeyword:append("-") -vim.opt_local.suffixesadd:append(".md") -vim.opt_local.errorformat = "%f:%l: %m" +vim.opt_local.iskeyword:append(':') +vim.opt_local.iskeyword:append('-') +vim.opt_local.suffixesadd:append('.md') +vim.opt_local.errorformat = '%f:%l: %m' -if vim.opt_local.keywordprg:get() == "" then - vim.opt_local.keywordprg = ":ZkHover -preview" +if vim.opt_local.keywordprg:get() == '' then + vim.opt_local.keywordprg = ':ZkHover -preview' end -if vim.opt_local.tagfunc:get() == "" then - vim.opt_local.tagfunc = "v:lua.zettelkasten.tagfunc" +if vim.opt_local.tagfunc:get() == '' then + vim.opt_local.tagfunc = 'v:lua.zettelkasten.tagfunc' end -require("zettelkasten").add_hover_command() +require('zettelkasten').add_hover_command() -if vim.fn.mapcheck("[I", "n") == "" then - vim.api.nvim_buf_set_keymap( - 0, - "n", - "[I", - 'lua require("zettelkasten").show_back_references(vim.fn.expand(""))', - { noremap = true, silent = true, nowait = true } - ) +if vim.fn.mapcheck('[I', 'n') == '' then + vim.api.nvim_buf_set_keymap( + 0, + 'n', + '[I', + 'lua require("zettelkasten").show_back_references(vim.fn.expand(""))', + { noremap = true, silent = true, nowait = true } + ) + vim.api.nvim_buf_set_keymap( + 0, + 'n', + 'q', + ':bd!', + { noremap = true, silent = true, nowait = true } + ) end -local config = require("zettelkasten.config").get() -if config.notes_path ~= "" then - vim.cmd("lcd " .. config.notes_path) +local config = require('zettelkasten.config') +if config.zettel_dir ~= '' then + vim.cmd('lcd ' .. config.zettel_dir) end -vim.api.nvim_create_autocmd({ "BufEnter" }, { - group = vim.api.nvim_create_augroup("zettelkasten_browser_events", { clear = true }), - buffer = vim.api.nvim_get_current_buf(), - callback = function(opts) - vim.opt_local.syntax = "" - vim.api.nvim_buf_set_lines( - 0, - vim.fn.line("$") - 1, - -1, - true, - require("zettelkasten").get_note_browser_content() - ) - vim.opt_local.syntax = "zkbrowser" - end, +vim.api.nvim_create_autocmd({ 'BufEnter' }, { + group = vim.api.nvim_create_augroup('zettelkasten_browser_events', { clear = true }), + buffer = vim.api.nvim_get_current_buf(), + callback = function(opts) + vim.opt_local.syntax = '' + vim.opt_local.modifiable = true + vim.api.nvim_buf_set_lines(0, 0, -1, false, require('zettelkasten').get_note_browser_content()) + vim.opt_local.syntax = 'zkbrowser' + vim.opt_local.modifiable = false + end, }) diff --git a/bundle/vim-zettelkasten/lua/zettelkasten.lua b/bundle/vim-zettelkasten/lua/zettelkasten.lua index 823d7b8aa..def3749d8 100644 --- a/bundle/vim-zettelkasten/lua/zettelkasten.lua +++ b/bundle/vim-zettelkasten/lua/zettelkasten.lua @@ -1,314 +1,337 @@ +--============================================================================= +-- zettelkasten.lua --- zk plugin +-- Copyright (c) 2016-2022 Wang Shidong & Contributors +-- Author: Wang Shidong < wsdjeg@outlook.com > +-- URL: https://spacevim.org +-- License: GPLv3 +--============================================================================= local M = {} local api = vim.api local fn = vim.fn local log_levels = vim.log.levels -local log = require("zettelkasten.log") -local config = require("zettelkasten.config") -local formatter = require("zettelkasten.formatter") -local browser = require("zettelkasten.browser") +local log = require('zettelkasten.log') +local config = require('zettelkasten.config') +local formatter = require('zettelkasten.formatter') +local browser = require('zettelkasten.browser') -local NOTE_ID_STRFTIME_FORMAT = "%Y-%m-%d-%H-%M-%S" +local NOTE_ID_STRFTIME_FORMAT = '%Y-%m-%d-%H-%M-%S' local function set_qflist(lines, action, bufnr, use_loclist, what) - what = what or {} - local _, local_efm = pcall(vim.api.nvim_buf_get_option, bufnr, "errorformat") - what.efm = what.efm or local_efm - if use_loclist then - fn.setloclist(bufnr, lines, action, what) - else - fn.setqflist(lines, action, what) - end + what = what or {} + local _, local_efm = pcall(vim.api.nvim_buf_get_option, bufnr, 'errorformat') + what.efm = what.efm or local_efm + if use_loclist then + fn.setloclist(bufnr, lines, action, what) + else + fn.setqflist(lines, action, what) + end end local function read_note(file_path, line_count) - local file = io.open(file_path, "r") - assert(file ~= nil) - assert(file:read(0) ~= nil) + local file = io.open(file_path, 'r') + assert(file ~= nil) + assert(file:read(0) ~= nil) - if line_count == nil then - return file:read("*all") + if line_count == nil then + return file:read('*all') + end + + local lines = {} + while #lines < line_count do + local line = file:read('*line') + if line == nil then + break end - local lines = {} - while #lines < line_count do - local line = file:read("*line") - if line == nil then - break - end + table.insert(lines, line) + end - table.insert(lines, line) - end - - return lines + return lines end local function get_all_tags(lookup_tag) - if lookup_tag ~= nil and #lookup_tag > 0 then - lookup_tag = string.gsub(lookup_tag, "\\<", "") - lookup_tag = string.gsub(lookup_tag, "\\>", "") - end + if lookup_tag ~= nil and #lookup_tag > 0 then + lookup_tag = string.gsub(lookup_tag, '\\<', '') + lookup_tag = string.gsub(lookup_tag, '\\>', '') + end - local tags = browser.get_tags() - if lookup_tag ~= nil and #lookup_tag > 0 then - tags = vim.tbl_filter(function(tag) - return string.match(tag.name, lookup_tag) ~= nil - end, tags) - end + local tags = browser.get_tags() + if lookup_tag ~= nil and #lookup_tag > 0 then + tags = vim.tbl_filter(function(tag) + return string.match(tag.name, lookup_tag) ~= nil + end, tags) + end - return tags + return tags end local function generate_note_id() - return fn.strftime(NOTE_ID_STRFTIME_FORMAT) + return fn.strftime(NOTE_ID_STRFTIME_FORMAT) end function M.completefunc(find_start, base) - if find_start == 1 and base == "" then - local pos = api.nvim_win_get_cursor(0) - local line = api.nvim_get_current_line() - local line_to_cursor = line:sub(1, pos[2]) - return fn.match(line_to_cursor, "\\k*$") - end + if find_start == 1 and base == '' then + local pos = api.nvim_win_get_cursor(0) + local line = api.nvim_get_current_line() + local line_to_cursor = line:sub(1, pos[2]) + return fn.match(line_to_cursor, '\\k*$') + end - local notes = vim.tbl_filter(function(note) - return string.match(note.title, base) - end, browser.get_notes()) + local notes = vim.tbl_filter(function(note) + -- here the note sometimes do not have title, then it is nil + return string.match(note.title, base) + end, browser.get_notes()) - local words = {} - for _, ref in ipairs(notes) do - table.insert(words, { - word = ref.id, - abbr = ref.title, - dup = 0, - empty = 0, - kind = "[zettelkasten]", - icase = 1, - }) - end + local words = {} + for _, ref in ipairs(notes) do + table.insert(words, { + word = ref.id, + abbr = ref.title, + dup = 0, + empty = 0, + kind = '[zettelkasten]', + icase = 1, + }) + end - return words + return words end function M.set_note_id(bufnr) - local first_line = vim.api.nvim_buf_get_lines(bufnr, 0, 1, true)[1] - local zk_id = generate_note_id() - if #zk_id > 0 then - first_line, _ = string.gsub(first_line, "# ", "") - api.nvim_buf_set_lines(bufnr, 0, 1, true, { "# " .. zk_id .. " " .. first_line }) - vim.cmd("file " .. zk_id .. ".md") - else - log.notify("There's already a note with the same ID.", log_levels.ERROR, {}) - end + local first_line = vim.api.nvim_buf_get_lines(bufnr, 0, 1, true)[1] + local zk_id = generate_note_id() + if #zk_id > 0 then + first_line, _ = string.gsub(first_line, '# ', '') + api.nvim_buf_set_lines(bufnr, 0, 1, true, { '# ' .. zk_id .. ' ' .. first_line }) + vim.cmd('file ' .. zk_id .. '.md') + else + log.notify("There's already a note with the same ID.", log_levels.ERROR, {}) + end end function M.tagfunc(pattern, flags, info) - local in_insert = string.match(flags, "i") ~= nil - local pattern_provided = pattern ~= "\\<\\k\\k" or pattern == "*" - local all_tags = {} - if pattern_provided then - all_tags = get_all_tags(pattern) - else - all_tags = get_all_tags() - end + local in_insert = string.match(flags, 'i') ~= nil + local pattern_provided = pattern ~= '\\<\\k\\k' or pattern == '*' + local all_tags = {} + if pattern_provided then + all_tags = get_all_tags(pattern) + else + all_tags = get_all_tags() + end - local tags = {} - for _, tag in ipairs(all_tags) do + local tags = {} + for _, tag in ipairs(all_tags) do + table.insert(tags, { + name = string.gsub(tag.name, '#', ''), + filename = tag.file_name, + cmd = tostring(tag.linenr), + kind = 'zettelkasten', + }) + end + + if not in_insert then + local notes = browser.get_notes() + for _, note in ipairs(notes) do + if string.find(note.id, pattern, 1, true) or not pattern_provided then table.insert(tags, { - name = string.gsub(tag.name, "#", ""), - filename = tag.file_name, - cmd = tostring(tag.linenr), - kind = "zettelkasten", + name = note.id, + filename = note.file_name, + cmd = '1', + kind = 'zettelkasten', }) + end end + end - if not in_insert then - local notes = browser.get_notes() - for _, note in ipairs(notes) do - if string.find(note.id, pattern, 1, true) or not pattern_provided then - table.insert(tags, { - name = note.id, - filename = note.file_name, - cmd = "1", - kind = "zettelkasten", - }) - end - end - end + if #tags > 0 then + return tags + end - if #tags > 0 then - return tags - end - - return nil + return nil end function M.keyword_expr(word, opts) - if not word then - return {} - end + if not word then + return {} + end - opts = opts or {} - opts.preview_note = opts.preview_note or false - opts.return_lines = opts.return_lines or false + opts = opts or {} + opts.preview_note = opts.preview_note or false + opts.return_lines = opts.return_lines or false - local note = browser.get_note(word) - if note == nil then - log.notify("Cannot find note.", log_levels.ERROR, {}) - return {} - end + local note = browser.get_note(word) + if note == nil then + log.notify('Cannot find note.', log_levels.ERROR, {}) + return {} + end - local lines = {} - if opts.preview_note and not opts.return_lines then - vim.cmd(config.get().preview_command .. " " .. note.file_name) - elseif opts.preview_note and opts.return_lines then - vim.list_extend(lines, read_note(note.file_name)) - else - table.insert(lines, note.title) - end + local lines = {} + if opts.preview_note and not opts.return_lines then + vim.cmd(config.preview_command .. ' ' .. note.file_name) + elseif opts.preview_note and opts.return_lines then + vim.list_extend(lines, read_note(note.file_name)) + else + table.insert(lines, note.title) + end - return lines + return lines end function M.get_back_references(note_id) - local note = browser.get_note(note_id) - if note == nil then - return {} + local note = browser.get_note(note_id) + if note == nil then + return {} + end + + local title_cache = {} + local get_title = function(id) + if title_cache[id] ~= nil then + return title_cache[id] end - local title_cache = {} - local get_title = function(id) - if title_cache[id] ~= nil then - return title_cache[id] - end + title_cache[id] = browser.get_note(id).title + return title_cache[id] + end - title_cache[id] = browser.get_note(id).title - return title_cache[id] - end + local references = {} + for _, back_reference in ipairs(note.back_references) do + table.insert(references, { + id = back_reference.id, + linenr = back_reference.linenr, + title = back_reference.title, + file_name = back_reference.file_name, + }) + end - local references = {} - for _, back_reference in ipairs(note.back_references) do - table.insert(references, { - id = back_reference.id, - linenr = back_reference.linenr, - title = back_reference.title, - file_name = back_reference.file_name, - }) - end - - return references + return references end function M.show_back_references(cword, use_loclist) - use_loclist = use_loclist or false - local references = M.get_back_references(cword) - if #references == 0 then - log.notify("No back references found.", log_levels.ERROR, {}) - return - end + use_loclist = use_loclist or false + local references = M.get_back_references(cword) + if #references == 0 then + log.notify('No back references found.', log_levels.ERROR, {}) + return + end - local lines = {} - for _, ref in ipairs(references) do - local line = {} - table.insert(line, fn.fnamemodify(ref.file_name, ":.")) - table.insert(line, ":") - table.insert(line, ref.linenr) - table.insert(line, ": ") - table.insert(line, ref.title) + local lines = {} + for _, ref in ipairs(references) do + local line = {} + table.insert(line, fn.fnamemodify(ref.file_name, ':.')) + table.insert(line, ':') + table.insert(line, ref.linenr) + table.insert(line, ': ') + table.insert(line, ref.title) - table.insert(lines, table.concat(line, "")) - end + table.insert(lines, table.concat(line, '')) + end - set_qflist( - {}, - " ", - vim.api.nvim_get_current_buf(), - use_loclist, - { title = "[[" .. cword .. "]] References", lines = lines } - ) + set_qflist( + {}, + ' ', + vim.api.nvim_get_current_buf(), + use_loclist, + { title = '[[' .. cword .. ']] References', lines = lines } + ) - if use_loclist then - vim.cmd([[botright lopen | wincmd p]]) - else - vim.cmd([[botright copen | wincmd p]]) - end + if use_loclist then + vim.cmd([[botright lopen | wincmd p]]) + else + vim.cmd([[botright copen | wincmd p]]) + end end function M.get_toc(note_id, format) - format = format or "- [%h](%d)" - local references = M.get_back_references(note_id) - local lines = {} - for _, note in ipairs(references) do - table.insert(lines, { - file_name = note.file_name, - id = note.id, - title = note.title, - }) - end + format = format or '- [%h](%d)' + local references = M.get_back_references(note_id) + local lines = {} + for _, note in ipairs(references) do + table.insert(lines, { + file_name = note.file_name, + id = note.id, + title = note.title, + }) + end - return formatter.format(lines, format) + return formatter.format(lines, format) end function M.get_note_browser_content() - if config.get().notes_path == "" then - log.notify("'notes_path' option is required for note browsing.", log_levels.WARN, {}) - return {} - end + if config.zettel_dir == '' then + log.notify("'notes_path' option is required for note browsing.", log_levels.WARN, {}) + return {} + end - local all_notes = browser.get_notes() - local lines = {} - for _, note in ipairs(all_notes) do - table.insert(lines, { - file_name = note.file_name, - id = note.id, - references = note.references, - back_references = note.back_references, - tags = note.tags, - title = note.title, - }) - end + local all_notes = browser.get_notes() + local lines = {} + for _, note in ipairs(all_notes) do + table.insert(lines, { + file_name = note.file_name, + id = note.id, + references = note.references, + back_references = note.back_references, + tags = note.tags, + title = note.title, + }) + end - return formatter.format(lines, config.get().browseformat) + return formatter.format(lines, config.browseformat) end function M.add_hover_command() - if fn.exists(":ZkHover") == 2 then - return - end + if fn.exists(':ZkHover') == 2 then + return + end - vim.cmd( - [[command -buffer -nargs=1 ZkHover :lua require"zettelkasten"._internal_execute_hover_cmd()]] - ) + vim.cmd( + [[command -buffer -nargs=1 ZkHover :lua require"zettelkasten"._internal_execute_hover_cmd()]] + ) end function M._internal_execute_hover_cmd(args) - if args ~= nil and type(args) == "string" then - args = vim.split(args, " ", true) - else - args = {} - end + if args ~= nil and type(args) == 'string' then + args = vim.split(args, ' ', true) + else + args = {} + end - local cword = "" - if #args == 1 then - cword = fn.expand("") - else - cword = args[#args] - end + local cword = '' + if #args == 1 then + cword = fn.expand('') + else + cword = args[#args] + end - local lines = M.keyword_expr(cword, { - preview_note = vim.tbl_contains(args, "-preview"), - return_lines = vim.tbl_contains(args, "-return-lines"), - }) - if #lines > 0 then - log.notify(table.concat(lines, "\n"), log_levels.INFO, {}) - end + local lines = M.keyword_expr(cword, { + preview_note = vim.tbl_contains(args, '-preview'), + return_lines = vim.tbl_contains(args, '-return-lines'), + }) + if #lines > 0 then + log.notify(table.concat(lines, '\n'), log_levels.INFO, {}) + end end -function M.setup(opts) - opts = opts or {} - opts.notes_path = opts.notes_path or "" +function M.zknew(opt) -- {{{ + vim.cmd([[new | setlocal filetype=markdown]]) + if config.zettel_dir ~= '' then + if vim.fn.isdirectory(config.zettel_dir) == 0 then + vim.fn.mkdir(vim.fn.expand(config.zettel_dir), 'p', '0700') + end + vim.cmd('lcd ' .. config.zettel_dir) + end - config._set(opts) + vim.cmd('normal ggI# New Note') + require('zettelkasten').set_note_id(vim.api.nvim_get_current_buf()) + vim.cmd('normal $') +end +-- }}} + +function M.setup(opts) + opts = opts or {} + opts.notes_path = opts.notes_path or '' + + config._set(opts) end return M diff --git a/bundle/vim-zettelkasten/lua/zettelkasten/browser.lua b/bundle/vim-zettelkasten/lua/zettelkasten/browser.lua index f9d2c5e77..c5e51e9d1 100644 --- a/bundle/vim-zettelkasten/lua/zettelkasten/browser.lua +++ b/bundle/vim-zettelkasten/lua/zettelkasten/browser.lua @@ -1,215 +1,219 @@ local M = {} local fn = vim.fn -local config = require("zettelkasten.config") +local config = require('zettelkasten.config') -local ZK_FULL_TITLE_PATTERN = "# %d+-%d+-%d+-%d+-%d+-%d+ .+" -local ZK_ID_PATTERN = "%d+-%d+-%d+-%d+-%d+-%d+" -local ZK_FILE_NAME_PATTERN = "%d+-%d+-%d+-%d+-%d+-%d+.md" +local ZK_FULL_TITLE_PATTERN = '# %d+-%d+-%d+-%d+-%d+-%d+ .+' +local ZK_ID_PATTERN = '%d+-%d+-%d+-%d+-%d+-%d+' +local ZK_FILE_NAME_PATTERN = '%d+-%d+-%d+-%d+-%d+-%d+.md' local s_note_cache_with_file_path = {} local s_note_cache_with_id = {} local function get_files(folder) - local files = fn.split(fn.globpath(folder, "*.md"), "\\n") - files = vim.tbl_filter(function(file) - return string.match(file, ZK_FILE_NAME_PATTERN) ~= nil - end, files) + local files = fn.split(fn.globpath(folder, '*.md'), '\\n') + files = vim.tbl_filter(function(file) + return string.match(file, ZK_FILE_NAME_PATTERN) ~= nil + end, files) - return files + return files end local function extract_id_and_title(line) - local zk_id = string.match(line, ZK_FULL_TITLE_PATTERN) - if zk_id == nil then - return nil - end + local zk_id = string.match(line, ZK_FULL_TITLE_PATTERN) + if zk_id == nil then + return nil + end - zk_id = string.gsub(zk_id, "# ", "") - local note_id = string.match(zk_id, ZK_ID_PATTERN) - local title = vim.trim(string.gsub(zk_id, ZK_ID_PATTERN, "")) + zk_id = string.gsub(zk_id, '# ', '') + local note_id = string.match(zk_id, ZK_ID_PATTERN) + local title = vim.trim(string.gsub(zk_id, ZK_ID_PATTERN, '')) - return { id = note_id, title = string.gsub(title, "\r", "") } + return { id = note_id, title = string.gsub(title, '\r', '') } end local function extract_references(line, linenr) - assert(line ~= nil) + assert(line ~= nil) - local references = {} - for ref in string.gmatch(line, "(%[%[" .. ZK_ID_PATTERN .. "%]%])") do - ref = string.gsub(ref, "%[%[", "") - ref = string.gsub(ref, "%]%]", "") - table.insert(references, { id = ref, linenr = linenr }) - end + local references = {} + for ref in string.gmatch(line, '(%[%[' .. ZK_ID_PATTERN .. '%]%])') do + ref = string.gsub(ref, '%[%[', '') + ref = string.gsub(ref, '%]%]', '') + table.insert(references, { id = ref, linenr = linenr }) + end - return references + return references end local function extract_back_references(notes, note_id) - assert(note_id ~= nil) + assert(note_id ~= nil) - local back_references = {} - for _, note in ipairs(notes) do - if note.id == note_id then - goto continue - end - - local references = note.references - for _, ref in ipairs(references) do - if ref.id == note_id then - table.insert(back_references, { - id = note.id, - title = note.title, - file_name = note.file_name, - linenr = ref.linenr, - }) - - break - end - end - - ::continue:: + local back_references = {} + for _, note in ipairs(notes) do + if note.id == note_id then + goto continue end - return back_references + local references = note.references + for _, ref in ipairs(references) do + if ref.id == note_id then + table.insert(back_references, { + id = note.id, + title = note.title, + file_name = note.file_name, + linenr = ref.linenr, + }) + + break + end + end + + ::continue:: + end + + return back_references end local function extract_tags(line, linenr) - assert(line ~= nil) + assert(line ~= nil) - local tags = {} - for tag in string.gmatch(line, "(%#%a[%w-]+)") do - local start_pos, _ = string.find(line, tag, 1, true) - local previous_char = string.sub(line, start_pos - 1, start_pos - 1) - if previous_char == "" or previous_char == " " then - table.insert(tags, { linenr = linenr, name = tag }) - end + local tags = {} + for tag in string.gmatch(line, '(%#%a[%w-]+)') do + local start_pos, _ = string.find(line, tag, 1, true) + local previous_char = string.sub(line, start_pos - 1, start_pos - 1) + if previous_char == '' or previous_char == ' ' then + table.insert(tags, { linenr = linenr, name = tag }) end + end - return tags + return tags end local function get_note_information(file_path) - local last_modified = fn.strftime("%Y-%m-%d.%H:%M:%S", fn.getftime(file_path)) - if - s_note_cache_with_file_path[file_path] ~= nil - and s_note_cache_with_file_path[file_path].last_modified == last_modified - then - return s_note_cache_with_file_path[file_path] + local last_modified = fn.strftime('%Y-%m-%d.%H:%M:%S', fn.getftime(file_path)) + if + s_note_cache_with_file_path[file_path] ~= nil + and s_note_cache_with_file_path[file_path].last_modified == last_modified + then + return s_note_cache_with_file_path[file_path] + end + + local file = io.open(file_path, 'r') + if file:read(0) == nil then + return nil + end + + local info = { + id = '', + title = '', + file_name = file_path, + last_modified = last_modified, + tags = {}, + references = {}, + back_references = {}, + } + + local linenr = 0 + while true do + linenr = linenr + 1 + local line = file:read('*line') + if line == nil then + break end - local file = io.open(file_path, "r") - if file:read(0) == nil then - return nil + if line == '' then + goto continue end - local info = { - file_name = file_path, - last_modified = last_modified, - tags = {}, - references = {}, - back_references = {}, - } - - local linenr = 0 - while true do - linenr = linenr + 1 - local line = file:read("*line") - if line == nil then - break - end - - if line == "" then - goto continue - end - - if info.id == nil then - local id_title = extract_id_and_title(line) - if id_title then - info = vim.tbl_extend("error", info, id_title) - goto continue - end - end - - local refs = extract_references(line, linenr) - if refs then - vim.list_extend(info.references, refs) - end - - local tags = extract_tags(line, linenr) - if tags then - vim.list_extend(info.tags, tags) - end - - ::continue:: + if info.id == '' then + local id_title = extract_id_and_title(line) + if id_title then + info = vim.tbl_extend('force', info, id_title) + goto continue + end end + local refs = extract_references(line, linenr) + if refs then + vim.list_extend(info.references, refs) + end + + local tags = extract_tags(line, linenr) + if tags then + vim.list_extend(info.tags, tags) + end + + ::continue:: + end + + if info.id ~= nil then s_note_cache_with_file_path[file_path] = info s_note_cache_with_id[info.id] = info - return info + end + return info end function M.get_note(id) - if s_note_cache_with_id[id] ~= nil then - return s_note_cache_with_id[id] - end + if s_note_cache_with_id[id] ~= nil then + return s_note_cache_with_id[id] + end - local _ = M.get_notes() + local _ = M.get_notes() - if s_note_cache_with_id[id] ~= nil then - return s_note_cache_with_id[id] - end + if s_note_cache_with_id[id] ~= nil then + return s_note_cache_with_id[id] + end - return nil + return nil end function M.get_notes() - local folder = config.get().notes_path - local files = get_files(folder) - local all_notes = {} - for _, file in ipairs(files) do - table.insert(all_notes, get_note_information(file)) + local folder = config.zettel_dir + local files = get_files(folder) + local all_notes = {} + for _, file in ipairs(files) do + table.insert(all_notes, get_note_information(file)) + end + + for _, note in ipairs(all_notes) do + if note.id == nil then + goto continue end - for _, note in ipairs(all_notes) do - if note.id == nil then - goto continue - end - - local back_references = extract_back_references(all_notes, note.id) - if back_references then - -- When notes are cached, `back_references` field will have the references from before. - -- Since the files that refer to this one might have changed, we'll overwrite it here. - -- extract_back_references() already re-processes the references. - note.back_references = back_references - end - - ::continue:: + local back_references = extract_back_references(all_notes, note.id) + if back_references then + -- When notes are cached, `back_references` field will have the references from before. + -- Since the files that refer to this one might have changed, we'll overwrite it here. + -- extract_back_references() already re-processes the references. + note.back_references = back_references end - return all_notes + ::continue:: + end + + return all_notes end function M.get_tags() - local notes = M.get_notes() - local tags = {} - for _, note in ipairs(notes) do - if #note.tags == 0 then - goto continue - end - - for _, tag in ipairs(note.tags) do - table.insert(tags, { - linenr = tag.linenr, - name = tag.name, - file_name = note.file_name, - }) - end - - ::continue:: + local notes = M.get_notes() + local tags = {} + for _, note in ipairs(notes) do + if #note.tags == 0 then + goto continue end - return tags + for _, tag in ipairs(note.tags) do + table.insert(tags, { + linenr = tag.linenr, + name = tag.name, + file_name = note.file_name, + }) + end + + ::continue:: + end + + return tags end return M diff --git a/bundle/vim-zettelkasten/lua/zettelkasten/config.lua b/bundle/vim-zettelkasten/lua/zettelkasten/config.lua index 62fe69a18..7cc75d806 100644 --- a/bundle/vim-zettelkasten/lua/zettelkasten/config.lua +++ b/bundle/vim-zettelkasten/lua/zettelkasten/config.lua @@ -14,18 +14,17 @@ else M.zettel_dir = '~/.zettelkasten/' end -local s_config = { - notes_path = "", - preview_command = "pedit", - browseformat = "%f - %h [%r Refs] [%b B-Refs] %t", -} - -M.get = function() - return s_config +if vim.g.zettelkasten_template_directory and vim.g.zettelkasten_template_directory ~= '' then + M.templete_dir = vim.g.zettelkasten_template_directory +else + M.templete_dir = '~/.zettelkasten_template' end -M._set = function(new_config) - s_config = vim.tbl_extend("force", s_config, new_config) +M.browseformat = "%f - %h [%r Refs] [%b B-Refs] %t" +M.preview_command = "pedit" + +M.get = function() + return nil end return M diff --git a/bundle/vim-zettelkasten/lua/zettelkasten/formatter.lua b/bundle/vim-zettelkasten/lua/zettelkasten/formatter.lua index 9e7425869..a9a26e07b 100644 --- a/bundle/vim-zettelkasten/lua/zettelkasten/formatter.lua +++ b/bundle/vim-zettelkasten/lua/zettelkasten/formatter.lua @@ -1,54 +1,55 @@ local M = {} local s_formatters = { - ["%r"] = function(line) - return #line.references - end, - ["%b"] = function(line) - return #line.back_references - end, - ["%f"] = function(line) - return vim.fn.fnamemodify(line.file_name, ":t") - end, - ["%h"] = function(line) - return line.title - end, - ["%d"] = function(line) - return line.id - end, - ["%t"] = function(line) - local tags = {} - for _, tag in ipairs(line.tags) do - if vim.tbl_contains(tags, tag.name) == false then - table.insert(tags, tag.name) - end - end + ['%r'] = function(line) + return #line.references + end, + ['%b'] = function(line) + return #line.back_references + end, + ['%f'] = function(line) + return vim.fn.fnamemodify(line.file_name, ':t') + end, + ['%h'] = function(line) + return line.title + end, + ['%d'] = function(line) + return line.id + end, + ['%t'] = function(line) + local tags = {} + for _, tag in ipairs(line.tags) do + if vim.tbl_contains(tags, tag.name) == false then + table.insert(tags, tag.name) + end + end - return table.concat(tags, " ") - end, + return table.concat(tags, ' ') + end, } local function get_format_keys(format) - local matches = {} - for w in string.gmatch(format, "%%%a") do - table.insert(matches, w) - end + local matches = {} + for w in string.gmatch(format, '%%%a') do + table.insert(matches, w) + end - return matches + return matches end function M.format(lines, format) - local formatted_lines = {} - local modifiers = get_format_keys(format) - for _, line in ipairs(lines) do - local cmps = format - for _, modifier in ipairs(modifiers) do - cmps = string.gsub(cmps, "%" .. modifier, s_formatters[modifier](line)) - end - - table.insert(formatted_lines, cmps) + local formatted_lines = {} + local modifiers = get_format_keys(format) + for _, line in ipairs(lines) do + local cmps = format + for _, modifier in ipairs(modifiers) do + local rst = s_formatters[modifier](line) or '' + cmps = string.gsub(cmps, '%' .. modifier, rst) end - return formatted_lines + table.insert(formatted_lines, cmps) + end + + return formatted_lines end return M diff --git a/bundle/vim-zettelkasten/plugin/zettelkasten.lua b/bundle/vim-zettelkasten/plugin/zettelkasten.lua index 78ffc15f9..39a665b1e 100644 --- a/bundle/vim-zettelkasten/plugin/zettelkasten.lua +++ b/bundle/vim-zettelkasten/plugin/zettelkasten.lua @@ -1,8 +1,12 @@ -local api = vim.api -local s_config = require("zettelkasten.config") - +--============================================================================= +-- zettelkasten.lua --- init plugin for zk +-- Copyright (c) 2016-2022 Wang Shidong & Contributors +-- Author: Wang Shidong < wsdjeg@outlook.com > +-- URL: https://spacevim.org +-- License: GPLv3 +--============================================================================= if vim.fn.exists(":ZkNew") == 0 then - vim.cmd([[command ZkNew :lua _G.zettelkasten.zknew()]]) + vim.api.nvim_create_user_command("ZkNew", ":lua require('zettelkasten').zknew({})", {}) end if vim.fn.exists(":ZkBrowse") == 0 then @@ -12,19 +16,7 @@ end _G.zettelkasten = { tagfunc = require("zettelkasten").tagfunc, completefunc = require("zettelkasten").completefunc, - zknew = function() - vim.cmd([[new | setlocal filetype=markdown]]) - if s_config.zettel_dir ~= "" then - if vim.fn.isdirectory(s_config.zettel_dir) == 0 then - vim.fn.mkdir(vim.fn.expand(s_config.zettel_dir), 'p', '0700') - end - vim.cmd("lcd " .. s_config.zettel_dir) - end - - vim.cmd("normal ggI# New Note") - require("zettelkasten").set_note_id(vim.api.nvim_get_current_buf()) - vim.cmd("normal $") - end, + zknew = require("zettelkasten").zknew, zkbrowse = function() vim.cmd("edit zk://browser") end, diff --git a/bundle/vim-zettelkasten/stylua.toml b/bundle/vim-zettelkasten/stylua.toml index a9418b8f2..a2b344750 100644 --- a/bundle/vim-zettelkasten/stylua.toml +++ b/bundle/vim-zettelkasten/stylua.toml @@ -1,2 +1,6 @@ -indent_type = "Spaces" column_width = 100 +line_endings = "Unix" +indent_type = "Spaces" +indent_width = 2 +quote_style = "AutoPreferSingle" +call_parentheses = "Always" diff --git a/config/plugins/telescope.vim b/config/plugins/telescope.vim index 8a6ecad77..05d526b92 100644 --- a/config/plugins/telescope.vim +++ b/config/plugins/telescope.vim @@ -3,6 +3,7 @@ lua require('telescope').load_extension('messages') lua require('telescope').load_extension('project') lua require('telescope').load_extension('scriptnames') lua require('telescope').load_extension('neoyank') +lua require('telescope').load_extension('zettelkasten_template') if filereadable(g:_spacevim_root_dir . 'bundle/telescope-fzf-native.nvim/build/libfzf.so') \ || filereadable(g:_spacevim_root_dir . 'bundle/telescope-fzf-native.nvim/build/libfzf.dll') lua require('telescope').load_extension('fzf') diff --git a/docs/layers/zettelkasten.md b/docs/layers/zettelkasten.md index b58b43ea6..68972d43e 100644 --- a/docs/layers/zettelkasten.md +++ b/docs/layers/zettelkasten.md @@ -20,19 +20,33 @@ This layer adds support for zettelkasten in neovim. ## Install -To use this configuration layer, update your custom configuration file with: +This layer also requires `telescope` layer, so to use this configuration layer, +update your custom configuration file with: ```toml +# load the zettelkasten layer [[layers]] name = "zettelkasten" +# load the fuzzy finder layer: telescope +[[layers]] + name = "telescope" ``` ## Layer options -- `zettel_dir`: set the default zettelkasten directory +- `zettel_dir`: set the zettelkasten directory, default is `~/.zettelkasten/` +- `zettel_template_dir`: set the zettelkasten template directory, default is `~/.zettelkasten_template` ## Key bindings -| Key bindings | description | -| ------------ | --------------- | -| `SPC m z n` | create new note | +| Key bindings | description | +| ------------ | ----------------------------- | +| `SPC m z n` | create new note | +| `SPC m z t` | create new note with template | +| `SPC m z b` | open zettelkasten browse | + +In the zettelkasten browse buffer: + +| key bindings | description | +| ------------ | ---------------- | +| `K` | preview the note | diff --git a/lua/telescope/_extensions/zettelkasten_template.lua b/lua/telescope/_extensions/zettelkasten_template.lua new file mode 100644 index 000000000..0ffcbe60b --- /dev/null +++ b/lua/telescope/_extensions/zettelkasten_template.lua @@ -0,0 +1,53 @@ +local action_state = require("telescope.actions.state") +local actions = require("telescope.actions") +local conf = require("telescope.config").values +local entry_display = require("telescope.pickers.entry_display") +local finders = require("telescope.finders") +local pickers = require("telescope.pickers") +local zk_config = require("zettelkasten.config") + +local function prepare_output_table() + local lines = {} + local result = vim.fn.globpath(zk_config.templete_dir, '**/*', 0, 1) + + for _, templete in ipairs(result) do + table.insert(lines, templete) + end + return lines +end + +local function show_script_names(opts) + opts = opts or {} + pickers.new(opts, { + prompt_title = "ZettelKasten Templete", + finder = finders.new_table { + results = prepare_output_table() + }, + sorter = conf.generic_sorter(opts), + attach_mappings = function(prompt_bufnr) + actions.select_default:replace(function() + local entry = action_state.get_selected_entry() + actions.close(prompt_bufnr) + -- the file name is entry.value + -- do something with the file + vim.cmd('ZkNew') + local templete_context = vim.fn.readfile(entry.value, '') + vim.api.nvim_buf_set_lines(0, 0, -1, false, templete_context) + -- maybe this is a bug, the mode is insert mode. + vim.cmd('stopinsert') + end) + return true + end, + }):find() +end + +local function run() + show_script_names() +end + +return require("telescope").register_extension({ + exports = { + -- Default when to argument is given, i.e. :Telescope scriptnames + zettelkasten_template = run, + }, +})