mirror of
https://github.com/junegunn/fzf.git
synced 2025-11-15 06:43:47 -05:00
Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
390b49653b | ||
|
|
b877c385f0 | ||
|
|
9c47739c0e | ||
|
|
04aa2992e7 | ||
|
|
2f1edeff78 | ||
|
|
306d51cdcf | ||
|
|
54a026525a | ||
|
|
d6588fc835 | ||
|
|
5a7b41a2cf | ||
|
|
338a73d764 | ||
|
|
c20954f020 | ||
|
|
1e8e1d3c9d | ||
|
|
f6b1962056 | ||
|
|
b3b101a89c | ||
|
|
9615c4edf1 | ||
|
|
85a75ee035 | ||
|
|
1e5bd55672 | ||
|
|
37d4015d56 | ||
|
|
6b27554cdb | ||
|
|
fc1b119159 | ||
|
|
2cd0d4a9f7 | ||
|
|
fd03aabeb2 | ||
|
|
8068c975c2 | ||
|
|
a6d2ab3360 | ||
|
|
fe7b91dfd9 | ||
|
|
5784101bea | ||
|
|
eaf6eb8978 | ||
|
|
3af63bcf1f | ||
|
|
80a21f7a75 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,4 +1,5 @@
|
|||||||
bin/fzf
|
bin/fzf
|
||||||
|
bin/fzf.exe
|
||||||
target
|
target
|
||||||
pkg
|
pkg
|
||||||
Gemfile.lock
|
Gemfile.lock
|
||||||
|
|||||||
18
CHANGELOG.md
18
CHANGELOG.md
@@ -1,6 +1,24 @@
|
|||||||
CHANGELOG
|
CHANGELOG
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
0.17.3
|
||||||
|
------
|
||||||
|
- `$LINES` and `$COLUMNS` are exported to preview command so that the command
|
||||||
|
knows the exact size of the preview window.
|
||||||
|
- Better error messages when the default command or `$FZF_DEFAULT_COMMAND`
|
||||||
|
fails.
|
||||||
|
- Reverted #1061 to avoid having duplicate entries in the list when find
|
||||||
|
command detected a file system loop (#1120). The default command now
|
||||||
|
requires that find supports `-fstype` option.
|
||||||
|
- fzf now distinguishes mouse left click and right click (#1130)
|
||||||
|
- Right click is now bound to `toggle` action by default
|
||||||
|
- `--bind` understands `left-click` and `right-click`
|
||||||
|
- Added `replace-query` action (#1137)
|
||||||
|
- Replaces query string with the current selection
|
||||||
|
- Added `accept-non-empty` action (#1162)
|
||||||
|
- Same as accept, except that it prevents fzf from exiting without any
|
||||||
|
selection
|
||||||
|
|
||||||
0.17.1
|
0.17.1
|
||||||
------
|
------
|
||||||
|
|
||||||
|
|||||||
@@ -142,6 +142,28 @@ command! -bang MyStuff
|
|||||||
\ call fzf#run(fzf#wrap('my-stuff', {'dir': '~/my-stuff'}, <bang>0))
|
\ call fzf#run(fzf#wrap('my-stuff', {'dir': '~/my-stuff'}, <bang>0))
|
||||||
```
|
```
|
||||||
|
|
||||||
|
fzf inside terminal buffer
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
The latest versions of Vim and Neovim include builtin terminal emulator
|
||||||
|
(`:terminal`) and fzf will start in a terminal buffer in the following cases:
|
||||||
|
|
||||||
|
- On Neovim
|
||||||
|
- On GVim
|
||||||
|
- On Terminal Vim with the non-default layout
|
||||||
|
- `call fzf#run({'left': '30%'})` or `let g:fzf_layout = {'left': '30%'}`
|
||||||
|
|
||||||
|
### Hide statusline
|
||||||
|
|
||||||
|
When fzf starts in a terminal buffer, you may want to hide the statusline of
|
||||||
|
the containing buffer.
|
||||||
|
|
||||||
|
```vim
|
||||||
|
autocmd! FileType fzf
|
||||||
|
autocmd FileType fzf set laststatus=0 noshowmode noruler
|
||||||
|
\| autocmd BufLeave <buffer> set laststatus=2 showmode ruler
|
||||||
|
```
|
||||||
|
|
||||||
GVim
|
GVim
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|||||||
118
README.md
118
README.md
@@ -23,9 +23,10 @@ Table of Contents
|
|||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
* [Installation](#installation)
|
* [Installation](#installation)
|
||||||
* [Using git](#using-git)
|
|
||||||
* [Using Homebrew or Linuxbrew](#using-homebrew-or-linuxbrew)
|
* [Using Homebrew or Linuxbrew](#using-homebrew-or-linuxbrew)
|
||||||
|
* [Using git](#using-git)
|
||||||
* [As Vim plugin](#as-vim-plugin)
|
* [As Vim plugin](#as-vim-plugin)
|
||||||
|
* [Fedora](#fedora)
|
||||||
* [Windows](#windows)
|
* [Windows](#windows)
|
||||||
* [Upgrading fzf](#upgrading-fzf)
|
* [Upgrading fzf](#upgrading-fzf)
|
||||||
* [Building fzf](#building-fzf)
|
* [Building fzf](#building-fzf)
|
||||||
@@ -51,7 +52,7 @@ Table of Contents
|
|||||||
* [Executing external programs](#executing-external-programs)
|
* [Executing external programs](#executing-external-programs)
|
||||||
* [Preview window](#preview-window)
|
* [Preview window](#preview-window)
|
||||||
* [Tips](#tips)
|
* [Tips](#tips)
|
||||||
* [Respecting .gitignore, <code>.hgignore</code>, and <code>svn:ignore</code>](#respecting-gitignore-hgignore-and-svnignore)
|
* [Respecting .gitignore](#respecting-gitignore)
|
||||||
* [git ls-tree for fast traversal](#git-ls-tree-for-fast-traversal)
|
* [git ls-tree for fast traversal](#git-ls-tree-for-fast-traversal)
|
||||||
* [Fish shell](#fish-shell)
|
* [Fish shell](#fish-shell)
|
||||||
* [<a href="LICENSE">License</a>](#license)
|
* [<a href="LICENSE">License</a>](#license)
|
||||||
@@ -73,20 +74,10 @@ stuff.
|
|||||||
|
|
||||||
[bin]: https://github.com/junegunn/fzf-bin/releases
|
[bin]: https://github.com/junegunn/fzf-bin/releases
|
||||||
|
|
||||||
### Using git
|
|
||||||
|
|
||||||
Clone this repository and run
|
|
||||||
[install](https://github.com/junegunn/fzf/blob/master/install) script.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
|
|
||||||
~/.fzf/install
|
|
||||||
```
|
|
||||||
|
|
||||||
### Using Homebrew or Linuxbrew
|
### Using Homebrew or Linuxbrew
|
||||||
|
|
||||||
Alternatively, you can use [Homebrew](http://brew.sh/) or
|
You can use [Homebrew](http://brew.sh/) or [Linuxbrew](http://linuxbrew.sh/)
|
||||||
[Linuxbrew](http://linuxbrew.sh/) to install fzf.
|
to install fzf.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
brew install fzf
|
brew install fzf
|
||||||
@@ -95,25 +86,65 @@ brew install fzf
|
|||||||
$(brew --prefix)/opt/fzf/install
|
$(brew --prefix)/opt/fzf/install
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Using git
|
||||||
|
|
||||||
|
Alternatively, you can "git clone" this repository to any directory and run
|
||||||
|
[install](https://github.com/junegunn/fzf/blob/master/install) script.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
|
||||||
|
~/.fzf/install
|
||||||
|
```
|
||||||
|
|
||||||
### As Vim plugin
|
### As Vim plugin
|
||||||
|
|
||||||
You can manually add the directory to `&runtimepath` as follows,
|
Once you have fzf installed, you can enable it inside Vim simply by adding the
|
||||||
|
directory to `&runtimepath` as follows:
|
||||||
|
|
||||||
```vim
|
```vim
|
||||||
" If installed using git
|
|
||||||
set rtp+=~/.fzf
|
|
||||||
|
|
||||||
" If installed using Homebrew
|
" If installed using Homebrew
|
||||||
set rtp+=/usr/local/opt/fzf
|
set rtp+=/usr/local/opt/fzf
|
||||||
|
|
||||||
|
" If installed using git
|
||||||
|
set rtp+=~/.fzf
|
||||||
```
|
```
|
||||||
|
|
||||||
But it's recommended that you use a plugin manager like
|
If you use [vim-plug](https://github.com/junegunn/vim-plug), the same can be
|
||||||
[vim-plug](https://github.com/junegunn/vim-plug).
|
written as:
|
||||||
|
|
||||||
```vim
|
```vim
|
||||||
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
|
" If installed using Homebrew
|
||||||
|
Plug '/usr/local/opt/fzf'
|
||||||
|
|
||||||
|
" If installed using git
|
||||||
|
Plug '~/.fzf'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
But instead of separately installing fzf on your system (using Homebrew or
|
||||||
|
"git clone") and enabling it on Vim (adding it to `&runtimepath`), you can use
|
||||||
|
vim-plug to do both.
|
||||||
|
|
||||||
|
```vim
|
||||||
|
" PlugInstall and PlugUpdate will clone fzf in ~/.fzf and run install script
|
||||||
|
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
|
||||||
|
" Both options are optional. You don't have to install fzf in ~/.fzf
|
||||||
|
" and you don't have to run install script if you use fzf only in Vim.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fedora
|
||||||
|
|
||||||
|
fzf is available in Fedora 26 and above, and can be installed using the usual
|
||||||
|
method:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo dnf install fzf
|
||||||
|
```
|
||||||
|
|
||||||
|
Shell completion and plugins for vim or neovim are enabled by default. Shell
|
||||||
|
key bindings are installed but not enabled by default. See Fedora's package
|
||||||
|
documentation for more information.
|
||||||
|
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
|
|
||||||
Pre-built binaries for Windows can be downloaded [here][bin]. fzf is also
|
Pre-built binaries for Windows can be downloaded [here][bin]. fzf is also
|
||||||
@@ -231,7 +262,7 @@ or `py`.
|
|||||||
|
|
||||||
- `FZF_DEFAULT_COMMAND`
|
- `FZF_DEFAULT_COMMAND`
|
||||||
- Default command to use when input is tty
|
- Default command to use when input is tty
|
||||||
- e.g. `export FZF_DEFAULT_COMMAND='ag -g ""'`
|
- e.g. `export FZF_DEFAULT_COMMAND='fd --type f'`
|
||||||
- `FZF_DEFAULT_OPTS`
|
- `FZF_DEFAULT_OPTS`
|
||||||
- Default options
|
- Default options
|
||||||
- e.g. `export FZF_DEFAULT_OPTS="--reverse --inline-info"`
|
- e.g. `export FZF_DEFAULT_OPTS="--reverse --inline-info"`
|
||||||
@@ -369,26 +400,20 @@ export FZF_COMPLETION_TRIGGER='~~'
|
|||||||
# Options to fzf command
|
# Options to fzf command
|
||||||
export FZF_COMPLETION_OPTS='+c -x'
|
export FZF_COMPLETION_OPTS='+c -x'
|
||||||
|
|
||||||
# Use ag instead of the default find command for listing path candidates.
|
# Use fd (https://github.com/sharkdp/fd) instead of the default find
|
||||||
# - The first argument to the function is the base path to start traversal
|
# command for listing path candidates.
|
||||||
|
# - The first argument to the function ($1) is the base path to start traversal
|
||||||
# - See the source code (completion.{bash,zsh}) for the details.
|
# - See the source code (completion.{bash,zsh}) for the details.
|
||||||
# - ag only lists files, so we use with-dir script to augment the output
|
|
||||||
_fzf_compgen_path() {
|
_fzf_compgen_path() {
|
||||||
ag -g "" "$1" | with-dir "$1"
|
fd --hidden --follow --exclude ".git" . "$1"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Use ag to generate the list for directory completion
|
# Use fd to generate the list for directory completion
|
||||||
_fzf_compgen_dir() {
|
_fzf_compgen_dir() {
|
||||||
ag -g "" "$1" | only-dir "$1"
|
fd --type d --hidden --follow --exclude ".git" . "$1"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
`only-dir` and `with-dir` scripts can be found [here][dir-scripts]. They are
|
|
||||||
written in Ruby, but you should be able to rewrite them in any language you
|
|
||||||
prefer.
|
|
||||||
|
|
||||||
[dir-scripts]: https://gist.github.com/junegunn/8c3796a965f22e6a803fe53096ad7a75
|
|
||||||
|
|
||||||
#### Supported commands
|
#### Supported commands
|
||||||
|
|
||||||
On bash, fuzzy completion is enabled only for a predefined set of commands
|
On bash, fuzzy completion is enabled only for a predefined set of commands
|
||||||
@@ -489,30 +514,33 @@ For more advanced examples, see [Key bindings for git with fzf][fzf-git].
|
|||||||
Tips
|
Tips
|
||||||
----
|
----
|
||||||
|
|
||||||
#### Respecting `.gitignore`, `.hgignore`, and `svn:ignore`
|
#### Respecting `.gitignore`
|
||||||
|
|
||||||
[ag](https://github.com/ggreer/the_silver_searcher) or
|
You can use [fd](https://github.com/sharkdp/fd),
|
||||||
[rg](https://github.com/BurntSushi/ripgrep) will do the
|
[ripgrep](https://github.com/BurntSushi/ripgrep), or [the silver
|
||||||
filtering:
|
searcher](https://github.com/ggreer/the_silver_searcher) instead of the
|
||||||
|
default find command to traverse the file system while respecting
|
||||||
|
`.gitignore`.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Feed the output of ag into fzf
|
# Feed the output of fd into fzf
|
||||||
ag -g "" | fzf
|
fd --type f | fzf
|
||||||
|
|
||||||
# Setting ag as the default source for fzf
|
# Setting fd as the default source for fzf
|
||||||
export FZF_DEFAULT_COMMAND='ag -g ""'
|
export FZF_DEFAULT_COMMAND='fd --type f'
|
||||||
|
|
||||||
# Now fzf (w/o pipe) will use ag instead of find
|
# Now fzf (w/o pipe) will use fd instead of find
|
||||||
fzf
|
fzf
|
||||||
|
|
||||||
# To apply the command to CTRL-T as well
|
# To apply the command to CTRL-T as well
|
||||||
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
|
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
|
||||||
```
|
```
|
||||||
|
|
||||||
If you don't want to exclude hidden files, use the following command:
|
If you want the command to follow symbolic links, and don't want it to exclude
|
||||||
|
hidden files, use the following command:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
export FZF_DEFAULT_COMMAND='ag --hidden --ignore .git -g ""'
|
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
|
||||||
```
|
```
|
||||||
|
|
||||||
#### `git ls-tree` for fast traversal
|
#### `git ls-tree` for fast traversal
|
||||||
|
|||||||
27
doc/fzf.txt
27
doc/fzf.txt
@@ -1,4 +1,4 @@
|
|||||||
fzf.txt fzf Last change: September 29 2017
|
fzf.txt fzf Last change: November 19 2017
|
||||||
FZF - TABLE OF CONTENTS *fzf* *fzf-toc*
|
FZF - TABLE OF CONTENTS *fzf* *fzf-toc*
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
@@ -8,6 +8,8 @@ FZF - TABLE OF CONTENTS *fzf* *fzf-to
|
|||||||
Examples
|
Examples
|
||||||
fzf#run
|
fzf#run
|
||||||
fzf#wrap
|
fzf#wrap
|
||||||
|
fzf inside terminal buffer
|
||||||
|
Hide statusline
|
||||||
GVim
|
GVim
|
||||||
License
|
License
|
||||||
|
|
||||||
@@ -167,6 +169,29 @@ function that decorates the options dictionary so that it understands
|
|||||||
\ call fzf#run(fzf#wrap('my-stuff', {'dir': '~/my-stuff'}, <bang>0))
|
\ call fzf#run(fzf#wrap('my-stuff', {'dir': '~/my-stuff'}, <bang>0))
|
||||||
<
|
<
|
||||||
|
|
||||||
|
FZF INSIDE TERMINAL BUFFER *fzf-inside-terminal-buffer*
|
||||||
|
==============================================================================
|
||||||
|
|
||||||
|
The latest versions of Vim and Neovim include builtin terminal emulator
|
||||||
|
(`:terminal`) and fzf will start in a terminal buffer in the following cases:
|
||||||
|
|
||||||
|
- On Neovim
|
||||||
|
- On GVim
|
||||||
|
- On Terminal Vim with the non-default layout
|
||||||
|
- `call fzf#run({'left': '30%'})` or `let g:fzf_layout = {'left': '30%'}`
|
||||||
|
|
||||||
|
|
||||||
|
< Hide statusline >___________________________________________________________~
|
||||||
|
*fzf-hide-statusline*
|
||||||
|
|
||||||
|
When fzf starts in a terminal buffer, you may want to hide the statusline of
|
||||||
|
the containing buffer.
|
||||||
|
>
|
||||||
|
autocmd! FileType fzf
|
||||||
|
autocmd FileType fzf set laststatus=0 noshowmode noruler
|
||||||
|
\| autocmd BufLeave <buffer> set laststatus=2 showmode ruler
|
||||||
|
<
|
||||||
|
|
||||||
GVIM *fzf-gvim*
|
GVIM *fzf-gvim*
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
|
|||||||
104
glide.lock
generated
104
glide.lock
generated
@@ -1,24 +1,68 @@
|
|||||||
hash: d68dd0bd779ac4ffca1e0c49ca38d85f90d5d68fa8e2d5d7db70a8ce8c662ec1
|
hash: 92a208bfbaecdf8d1ccaf99a465884c49f9cd91f44f1756d7bbf3290795c781b
|
||||||
updated: 2017-06-01T15:48:41.653745249-07:00
|
updated: 2017-12-03T13:37:23.420874333+09:00
|
||||||
imports:
|
imports:
|
||||||
|
- name: github.com/bjwbell/gensimd
|
||||||
|
version: 06eb18285485c0d572cc7f024050fc6cb652ed4c
|
||||||
|
subpackages:
|
||||||
|
- simd
|
||||||
|
- name: github.com/codegangsta/cli
|
||||||
|
version: c6af8847eb2b7b297d07c3ede98903e95e680ef9
|
||||||
- name: github.com/gdamore/encoding
|
- name: github.com/gdamore/encoding
|
||||||
version: b23993cbb6353f0e6aa98d0ee318a34728f628b9
|
version: b23993cbb6353f0e6aa98d0ee318a34728f628b9
|
||||||
- name: github.com/gdamore/tcell
|
- name: github.com/gdamore/tcell
|
||||||
version: 44772c121bb7838819d3ba4a7e84c0c2d617328e
|
version: 0a0db94084dfe181108c18508ebd312f12d331fb
|
||||||
subpackages:
|
subpackages:
|
||||||
- encoding
|
- encoding
|
||||||
- name: github.com/lucasb-eyer/go-colorful
|
- name: github.com/lucasb-eyer/go-colorful
|
||||||
version: c900de9dbbc73129068f5af6a823068fc5f2308c
|
version: c900de9dbbc73129068f5af6a823068fc5f2308c
|
||||||
|
- name: github.com/Masterminds/semver
|
||||||
|
version: 15d8430ab86497c5c0da827b748823945e1cf1e1
|
||||||
|
- name: github.com/Masterminds/vcs
|
||||||
|
version: 6f1c6d150500e452704e9863f68c2559f58616bf
|
||||||
- name: github.com/mattn/go-isatty
|
- name: github.com/mattn/go-isatty
|
||||||
version: 66b8e73f3f5cda9f96b69efd03dd3d7fc4a5cdb8
|
version: 66b8e73f3f5cda9f96b69efd03dd3d7fc4a5cdb8
|
||||||
- name: github.com/mattn/go-runewidth
|
- name: github.com/mattn/go-runewidth
|
||||||
version: 14207d285c6c197daabb5c9793d63e7af9ab2d50
|
version: 14207d285c6c197daabb5c9793d63e7af9ab2d50
|
||||||
- name: github.com/mattn/go-shellwords
|
- name: github.com/mattn/go-shellwords
|
||||||
version: 02e3cf038dcea8290e44424da473dd12be796a8a
|
version: 02e3cf038dcea8290e44424da473dd12be796a8a
|
||||||
|
- name: github.com/mengzhuo/intrinsic
|
||||||
|
version: 34b800838e0bcd9c5b6abd414e3ad03dc1a686b8
|
||||||
|
subpackages:
|
||||||
|
- sse2
|
||||||
|
- name: github.com/mitchellh/go-homedir
|
||||||
|
version: b8bc1bf767474819792c23f32d8286a45736f1c6
|
||||||
- name: golang.org/x/crypto
|
- name: golang.org/x/crypto
|
||||||
version: e1a4589e7d3ea14a3352255d04b6f1a418845e5e
|
version: e1a4589e7d3ea14a3352255d04b6f1a418845e5e
|
||||||
subpackages:
|
subpackages:
|
||||||
|
- acme
|
||||||
|
- blowfish
|
||||||
|
- cast5
|
||||||
|
- chacha20poly1305/internal/chacha20
|
||||||
|
- curve25519
|
||||||
|
- ed25519
|
||||||
|
- ed25519/internal/edwards25519
|
||||||
|
- hkdf
|
||||||
|
- nacl/secretbox
|
||||||
|
- openpgp
|
||||||
|
- openpgp/armor
|
||||||
|
- openpgp/elgamal
|
||||||
|
- openpgp/errors
|
||||||
|
- openpgp/packet
|
||||||
|
- openpgp/s2k
|
||||||
|
- pbkdf2
|
||||||
|
- pkcs12/internal/rc2
|
||||||
|
- poly1305
|
||||||
|
- ripemd160
|
||||||
|
- salsa20/salsa
|
||||||
|
- ssh
|
||||||
|
- ssh/agent
|
||||||
- ssh/terminal
|
- ssh/terminal
|
||||||
|
- ssh/testdata
|
||||||
|
- name: golang.org/x/net
|
||||||
|
version: a8b9294777976932365dabb6640cf1468d95c70f
|
||||||
|
subpackages:
|
||||||
|
- context
|
||||||
|
- context/ctxhttp
|
||||||
- name: golang.org/x/sys
|
- name: golang.org/x/sys
|
||||||
version: b90f89a1e7a9c1f6b918820b3daa7f08488c8594
|
version: b90f89a1e7a9c1f6b918820b3daa7f08488c8594
|
||||||
subpackages:
|
subpackages:
|
||||||
@@ -26,13 +70,65 @@ imports:
|
|||||||
- name: golang.org/x/text
|
- name: golang.org/x/text
|
||||||
version: 4ee4af566555f5fbe026368b75596286a312663a
|
version: 4ee4af566555f5fbe026368b75596286a312663a
|
||||||
subpackages:
|
subpackages:
|
||||||
|
- cases
|
||||||
|
- collate
|
||||||
|
- collate/build
|
||||||
|
- currency
|
||||||
- encoding
|
- encoding
|
||||||
- encoding/charmap
|
- encoding/charmap
|
||||||
|
- encoding/ianaindex
|
||||||
- encoding/internal
|
- encoding/internal
|
||||||
- encoding/internal/identifier
|
- encoding/internal/identifier
|
||||||
- encoding/japanese
|
- encoding/japanese
|
||||||
- encoding/korean
|
- encoding/korean
|
||||||
- encoding/simplifiedchinese
|
- encoding/simplifiedchinese
|
||||||
- encoding/traditionalchinese
|
- encoding/traditionalchinese
|
||||||
|
- encoding/unicode
|
||||||
|
- encoding/unicode/utf32
|
||||||
|
- internal
|
||||||
|
- internal/colltab
|
||||||
|
- internal/format
|
||||||
|
- internal/gen
|
||||||
|
- internal/stringset
|
||||||
|
- internal/tag
|
||||||
|
- internal/testtext
|
||||||
|
- internal/triegen
|
||||||
|
- internal/ucd
|
||||||
|
- internal/utf8internal
|
||||||
|
- language
|
||||||
|
- language/display
|
||||||
|
- message
|
||||||
|
- runes
|
||||||
|
- secure/bidirule
|
||||||
- transform
|
- transform
|
||||||
testImports: []
|
- unicode/bidi
|
||||||
|
- unicode/cldr
|
||||||
|
- unicode/norm
|
||||||
|
- unicode/rangetable
|
||||||
|
- width
|
||||||
|
- name: golang.org/x/tools
|
||||||
|
version: 04447353bc504b9a5c02eb227b9ecd252e64ea20
|
||||||
|
subpackages:
|
||||||
|
- go/ast/astutil
|
||||||
|
- go/buildutil
|
||||||
|
- go/loader
|
||||||
|
- name: gopkg.in/yaml.v2
|
||||||
|
version: 287cf08546ab5e7e37d55a84f7ed3fd1db036de5
|
||||||
|
testImports:
|
||||||
|
- name: github.com/gopherjs/gopherjs
|
||||||
|
version: 444abdf920945de5d4a977b572bcc6c674d1e4eb
|
||||||
|
subpackages:
|
||||||
|
- js
|
||||||
|
- name: github.com/jtolds/gls
|
||||||
|
version: 77f18212c9c7edc9bd6a33d383a7b545ce62f064
|
||||||
|
- name: github.com/smartystreets/assertions
|
||||||
|
version: 0b37b35ec7434b77e77a4bb29b79677cced992ea
|
||||||
|
subpackages:
|
||||||
|
- internal/go-render/render
|
||||||
|
- internal/oglematchers
|
||||||
|
- name: github.com/smartystreets/goconvey
|
||||||
|
version: e5b2b7c9111590d019a696c7800593f666e1a7f4
|
||||||
|
subpackages:
|
||||||
|
- convey
|
||||||
|
- convey/gotest
|
||||||
|
- convey/reporting
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import:
|
|||||||
- package: github.com/mattn/go-shellwords
|
- package: github.com/mattn/go-shellwords
|
||||||
version: 02e3cf038dcea8290e44424da473dd12be796a8a
|
version: 02e3cf038dcea8290e44424da473dd12be796a8a
|
||||||
- package: github.com/gdamore/tcell
|
- package: github.com/gdamore/tcell
|
||||||
version: 44772c121bb7838819d3ba4a7e84c0c2d617328e
|
version: 0a0db94084dfe181108c18508ebd312f12d331fb
|
||||||
subpackages:
|
subpackages:
|
||||||
- encoding
|
- encoding
|
||||||
- package: golang.org/x/crypto
|
- package: golang.org/x/crypto
|
||||||
|
|||||||
6
install
6
install
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
version=0.17.1
|
version=0.17.3
|
||||||
auto_completion=
|
auto_completion=
|
||||||
key_bindings=
|
key_bindings=
|
||||||
update_config=2
|
update_config=2
|
||||||
@@ -168,13 +168,13 @@ binary_error=""
|
|||||||
case "$archi" in
|
case "$archi" in
|
||||||
Darwin\ *64) download fzf-$version-darwin_${binary_arch:-amd64}.tgz ;;
|
Darwin\ *64) download fzf-$version-darwin_${binary_arch:-amd64}.tgz ;;
|
||||||
Darwin\ *86) download fzf-$version-darwin_${binary_arch:-386}.tgz ;;
|
Darwin\ *86) download fzf-$version-darwin_${binary_arch:-386}.tgz ;;
|
||||||
Linux\ *64) download fzf-$version-linux_${binary_arch:-amd64}.tgz ;;
|
|
||||||
Linux\ *86) download fzf-$version-linux_${binary_arch:-386}.tgz ;;
|
|
||||||
Linux\ armv5*) download fzf-$version-linux_${binary_arch:-arm5}.tgz ;;
|
Linux\ armv5*) download fzf-$version-linux_${binary_arch:-arm5}.tgz ;;
|
||||||
Linux\ armv6*) download fzf-$version-linux_${binary_arch:-arm6}.tgz ;;
|
Linux\ armv6*) download fzf-$version-linux_${binary_arch:-arm6}.tgz ;;
|
||||||
Linux\ armv7*) download fzf-$version-linux_${binary_arch:-arm7}.tgz ;;
|
Linux\ armv7*) download fzf-$version-linux_${binary_arch:-arm7}.tgz ;;
|
||||||
Linux\ armv8*) download fzf-$version-linux_${binary_arch:-arm8}.tgz ;;
|
Linux\ armv8*) download fzf-$version-linux_${binary_arch:-arm8}.tgz ;;
|
||||||
Linux\ aarch64*) download fzf-$version-linux_${binary_arch:-arm8}.tgz ;;
|
Linux\ aarch64*) download fzf-$version-linux_${binary_arch:-arm8}.tgz ;;
|
||||||
|
Linux\ *64) download fzf-$version-linux_${binary_arch:-amd64}.tgz ;;
|
||||||
|
Linux\ *86) download fzf-$version-linux_${binary_arch:-386}.tgz ;;
|
||||||
FreeBSD\ *64) download fzf-$version-freebsd_${binary_arch:-amd64}.tgz ;;
|
FreeBSD\ *64) download fzf-$version-freebsd_${binary_arch:-amd64}.tgz ;;
|
||||||
FreeBSD\ *86) download fzf-$version-freebsd_${binary_arch:-386}.tgz ;;
|
FreeBSD\ *86) download fzf-$version-freebsd_${binary_arch:-386}.tgz ;;
|
||||||
OpenBSD\ *64) download fzf-$version-openbsd_${binary_arch:-amd64}.tgz ;;
|
OpenBSD\ *64) download fzf-$version-openbsd_${binary_arch:-amd64}.tgz ;;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
..
|
..
|
||||||
.TH fzf-tmux 1 "Oct 2017" "fzf 0.17.1" "fzf-tmux - open fzf in tmux split pane"
|
.TH fzf-tmux 1 "Dec 2017" "fzf 0.17.3" "fzf-tmux - open fzf in tmux split pane"
|
||||||
|
|
||||||
.SH NAME
|
.SH NAME
|
||||||
fzf-tmux - open fzf in tmux split pane
|
fzf-tmux - open fzf in tmux split pane
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
..
|
..
|
||||||
.TH fzf 1 "Oct 2017" "fzf 0.17.1" "fzf - a command-line fuzzy finder"
|
.TH fzf 1 "Dec 2017" "fzf 0.17.3" "fzf - a command-line fuzzy finder"
|
||||||
|
|
||||||
.SH NAME
|
.SH NAME
|
||||||
fzf - a command-line fuzzy finder
|
fzf - a command-line fuzzy finder
|
||||||
@@ -272,14 +272,17 @@ string, specify field index expressions between the braces (See \fBFIELD INDEX
|
|||||||
EXPRESSION\fR for the details).
|
EXPRESSION\fR for the details).
|
||||||
|
|
||||||
.RS
|
.RS
|
||||||
e.g. \fBfzf --preview="head -$LINES {}"\fR
|
e.g. \fBfzf --preview='head -$LINES {}'\fR
|
||||||
\fBls -l | fzf --preview="echo user={3} when={-4..-2}; cat {-1}" --header-lines=1\fR
|
\fBls -l | fzf --preview="echo user={3} when={-4..-2}; cat {-1}" --header-lines=1\fR
|
||||||
|
|
||||||
|
fzf overrides \fB$LINES\fR and \fB$COLUMNS\fR so that they represent the exact
|
||||||
|
size of the preview window.
|
||||||
|
|
||||||
A placeholder expression starting with \fB+\fR flag will be replaced to the
|
A placeholder expression starting with \fB+\fR flag will be replaced to the
|
||||||
space-separated list of the selected lines (or the current line if no selection
|
space-separated list of the selected lines (or the current line if no selection
|
||||||
was made) individually quoted.
|
was made) individually quoted.
|
||||||
|
|
||||||
e.g. \fBfzf --multi --preview="head -10 {+}"\fR
|
e.g. \fBfzf --multi --preview='head -10 {+}'\fR
|
||||||
\fBgit log --oneline | fzf --multi --preview 'git show {+1}'\fR
|
\fBgit log --oneline | fzf --multi --preview 'git show {+1}'\fR
|
||||||
|
|
||||||
Also, \fB{q}\fR is replaced to the current query string.
|
Also, \fB{q}\fR is replaced to the current query string.
|
||||||
@@ -476,6 +479,8 @@ e.g. \fBfzf --bind=ctrl-j:accept,ctrl-k:kill-line\fR
|
|||||||
\fIpgdn\fR (\fIpage-down\fR)
|
\fIpgdn\fR (\fIpage-down\fR)
|
||||||
\fIshift-left\fR
|
\fIshift-left\fR
|
||||||
\fIshift-right\fR
|
\fIshift-right\fR
|
||||||
|
\fIleft-click\fR
|
||||||
|
\fIright-click\fR
|
||||||
\fIdouble-click\fR
|
\fIdouble-click\fR
|
||||||
or any single character
|
or any single character
|
||||||
|
|
||||||
@@ -487,12 +492,13 @@ triggered whenever the query string is changed.
|
|||||||
\fBACTION: DEFAULT BINDINGS (NOTES):
|
\fBACTION: DEFAULT BINDINGS (NOTES):
|
||||||
\fBabort\fR \fIctrl-c ctrl-g ctrl-q esc\fR
|
\fBabort\fR \fIctrl-c ctrl-g ctrl-q esc\fR
|
||||||
\fBaccept\fR \fIenter double-click\fR
|
\fBaccept\fR \fIenter double-click\fR
|
||||||
|
\fBaccept-non-empty\fR (same as \fBaccept\fR except that it prevents fzf from exiting without selection)
|
||||||
\fBbackward-char\fR \fIctrl-b left\fR
|
\fBbackward-char\fR \fIctrl-b left\fR
|
||||||
\fBbackward-delete-char\fR \fIctrl-h bspace\fR
|
\fBbackward-delete-char\fR \fIctrl-h bspace\fR
|
||||||
\fBbackward-kill-word\fR \fIalt-bs\fR
|
\fBbackward-kill-word\fR \fIalt-bs\fR
|
||||||
\fBbackward-word\fR \fIalt-b shift-left\fR
|
\fBbackward-word\fR \fIalt-b shift-left\fR
|
||||||
\fBbeginning-of-line\fR \fIctrl-a home\fR
|
\fBbeginning-of-line\fR \fIctrl-a home\fR
|
||||||
\fBcancel\fR
|
\fBcancel\fR (clears query string if not empty, aborts fzf otherwise)
|
||||||
\fBclear-screen\fR \fIctrl-l\fR
|
\fBclear-screen\fR \fIctrl-l\fR
|
||||||
\fBdelete-char\fR \fIdel\fR
|
\fBdelete-char\fR \fIdel\fR
|
||||||
\fBdelete-char/eof\fR \fIctrl-d\fR
|
\fBdelete-char/eof\fR \fIctrl-d\fR
|
||||||
@@ -520,8 +526,9 @@ triggered whenever the query string is changed.
|
|||||||
\fBpreview-page-up\fR
|
\fBpreview-page-up\fR
|
||||||
\fBprevious-history\fR (\fIctrl-p\fR on \fB--history\fR)
|
\fBprevious-history\fR (\fIctrl-p\fR on \fB--history\fR)
|
||||||
\fBprint-query\fR (print query and exit)
|
\fBprint-query\fR (print query and exit)
|
||||||
|
\fBreplace-query\fR (replace query string with the current selection)
|
||||||
\fBselect-all\fR
|
\fBselect-all\fR
|
||||||
\fBtoggle\fR
|
\fBtoggle\fR (\fIright-click\fR)
|
||||||
\fBtoggle-all\fR
|
\fBtoggle-all\fR
|
||||||
\fBtoggle+down\fR \fIctrl-i (tab)\fR
|
\fBtoggle+down\fR \fIctrl-i (tab)\fR
|
||||||
\fBtoggle-in\fR (\fB--reverse\fR ? \fBtoggle+up\fR : \fBtoggle+down\fR)
|
\fBtoggle-in\fR (\fB--reverse\fR ? \fBtoggle+up\fR : \fBtoggle+down\fR)
|
||||||
|
|||||||
@@ -392,7 +392,7 @@ try
|
|||||||
let has_vim8_term = has('terminal') && has('patch-8.0.995')
|
let has_vim8_term = has('terminal') && has('patch-8.0.995')
|
||||||
let has_nvim_term = has('nvim-0.2.1') || has('nvim') && !s:is_win
|
let has_nvim_term = has('nvim-0.2.1') || has('nvim') && !s:is_win
|
||||||
let use_term = has_nvim_term ||
|
let use_term = has_nvim_term ||
|
||||||
\ has_vim8_term && (has('gui_running') || s:is_win || !use_height && s:present(dict, 'down', 'up', 'left', 'right', 'window'))
|
\ has_vim8_term && !has('win32unix') && (has('gui_running') || s:is_win || !use_height && s:present(dict, 'down', 'up', 'left', 'right', 'window'))
|
||||||
let use_tmux = (!use_height && !use_term || prefer_tmux) && !has('win32unix') && s:tmux_enabled() && s:splittable(dict)
|
let use_tmux = (!use_height && !use_term || prefer_tmux) && !has('win32unix') && s:tmux_enabled() && s:splittable(dict)
|
||||||
if prefer_tmux && use_tmux
|
if prefer_tmux && use_tmux
|
||||||
let use_height = 0
|
let use_height = 0
|
||||||
@@ -700,8 +700,7 @@ function! s:execute_term(dict, command, temps) abort
|
|||||||
call termopen(command, fzf)
|
call termopen(command, fzf)
|
||||||
else
|
else
|
||||||
let t = term_start([&shell, &shellcmdflag, command], {'curwin': fzf.buf, 'exit_cb': function(fzf.on_exit)})
|
let t = term_start([&shell, &shellcmdflag, command], {'curwin': fzf.buf, 'exit_cb': function(fzf.on_exit)})
|
||||||
" FIXME: https://github.com/vim/vim/issues/1998
|
if !has('patch-8.0.1261') && !has('nvim') && !s:is_win
|
||||||
if !has('nvim') && !s:is_win
|
|
||||||
call term_wait(t, 20)
|
call term_wait(t, 20)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ _fzf_opts_completion() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_fzf_handle_dynamic_completion() {
|
_fzf_handle_dynamic_completion() {
|
||||||
local cmd orig_var orig ret orig_cmd
|
local cmd orig_var orig ret orig_cmd orig_complete
|
||||||
cmd="$1"
|
cmd="$1"
|
||||||
shift
|
shift
|
||||||
orig_cmd="$1"
|
orig_cmd="$1"
|
||||||
@@ -122,10 +122,14 @@ _fzf_handle_dynamic_completion() {
|
|||||||
if [ -n "$orig" ] && type "$orig" > /dev/null 2>&1; then
|
if [ -n "$orig" ] && type "$orig" > /dev/null 2>&1; then
|
||||||
$orig "$@"
|
$orig "$@"
|
||||||
elif [ -n "$_fzf_completion_loader" ]; then
|
elif [ -n "$_fzf_completion_loader" ]; then
|
||||||
|
orig_complete=$(complete -p "$cmd")
|
||||||
_completion_loader "$@"
|
_completion_loader "$@"
|
||||||
ret=$?
|
ret=$?
|
||||||
|
# _completion_loader may not have updated completion for the command
|
||||||
|
if [ "$(complete -p "$cmd")" != "$orig_complete" ]; then
|
||||||
eval "$(complete | command grep "\-F.* $orig_cmd$" | _fzf_orig_completion_filter)"
|
eval "$(complete | command grep "\-F.* $orig_cmd$" | _fzf_orig_completion_filter)"
|
||||||
source "${BASH_SOURCE[0]}"
|
eval "$orig_complete"
|
||||||
|
fi
|
||||||
return $ret
|
return $ret
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -215,7 +219,7 @@ _fzf_complete_kill() {
|
|||||||
|
|
||||||
local selected fzf
|
local selected fzf
|
||||||
fzf="$(__fzfcmd_complete)"
|
fzf="$(__fzfcmd_complete)"
|
||||||
selected=$(ps -ef | sed 1d | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-50%} --min-height 15 --reverse $FZF_DEFAULT_OPTS --preview 'echo {}' --preview-window down:3:wrap $FZF_COMPLETION_OPTS" $fzf -m | awk '{print $2}' | tr '\n' ' ')
|
selected=$(command ps -ef | sed 1d | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-50%} --min-height 15 --reverse $FZF_DEFAULT_OPTS --preview 'echo {}' --preview-window down:3:wrap $FZF_COMPLETION_OPTS" $fzf -m | awk '{print $2}' | tr '\n' ' ')
|
||||||
printf '\e[5n'
|
printf '\e[5n'
|
||||||
|
|
||||||
if [ -n "$selected" ]; then
|
if [ -n "$selected" ]; then
|
||||||
@@ -234,7 +238,7 @@ _fzf_complete_telnet() {
|
|||||||
_fzf_complete_ssh() {
|
_fzf_complete_ssh() {
|
||||||
_fzf_complete '+m' "$@" < <(
|
_fzf_complete '+m' "$@" < <(
|
||||||
cat <(cat ~/.ssh/config /etc/ssh/ssh_config 2> /dev/null | command grep -i '^host' | command grep -v '*' | awk '{for (i = 2; i <= NF; i++) print $1 " " $i}') \
|
cat <(cat ~/.ssh/config /etc/ssh/ssh_config 2> /dev/null | command grep -i '^host' | command grep -v '*' | awk '{for (i = 2; i <= NF; i++) print $1 " " $i}') \
|
||||||
<(command grep -oE '^[a-z0-9.,:-]+' ~/.ssh/known_hosts | tr ',' '\n' | awk '{ print $1 " " $1 }') \
|
<(command grep -oE '^[[a-z0-9.,:-]+' ~/.ssh/known_hosts | tr ',' '\n' | tr -d '[' | awk '{ print $1 " " $1 }') \
|
||||||
<(command grep -v '^\s*\(#\|$\)' /etc/hosts | command grep -Fv '0.0.0.0') |
|
<(command grep -v '^\s*\(#\|$\)' /etc/hosts | command grep -Fv '0.0.0.0') |
|
||||||
awk '{if (length($2) > 0) {print $2}}' | sort -u
|
awk '{if (length($2) > 0) {print $2}}' | sort -u
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ _fzf_complete_telnet() {
|
|||||||
_fzf_complete_ssh() {
|
_fzf_complete_ssh() {
|
||||||
_fzf_complete '+m' "$@" < <(
|
_fzf_complete '+m' "$@" < <(
|
||||||
command cat <(cat ~/.ssh/config /etc/ssh/ssh_config 2> /dev/null | command grep -i '^host' | command grep -v '*' | awk '{for (i = 2; i <= NF; i++) print $1 " " $i}') \
|
command cat <(cat ~/.ssh/config /etc/ssh/ssh_config 2> /dev/null | command grep -i '^host' | command grep -v '*' | awk '{for (i = 2; i <= NF; i++) print $1 " " $i}') \
|
||||||
<(command grep -oE '^[a-z0-9.,:-]+' ~/.ssh/known_hosts | tr ',' '\n' | awk '{ print $1 " " $1 }') \
|
<(command grep -oE '^[[a-z0-9.,:-]+' ~/.ssh/known_hosts | tr ',' '\n' | tr -d '[' | awk '{ print $1 " " $1 }') \
|
||||||
<(command grep -v '^\s*\(#\|$\)' /etc/hosts | command grep -Fv '0.0.0.0') |
|
<(command grep -v '^\s*\(#\|$\)' /etc/hosts | command grep -Fv '0.0.0.0') |
|
||||||
awk '{if (length($2) > 0) {print $2}}' | sort -u
|
awk '{if (length($2) > 0) {print $2}}' | sort -u
|
||||||
)
|
)
|
||||||
@@ -163,7 +163,7 @@ fzf-completion() {
|
|||||||
# Kill completion (do not require trigger sequence)
|
# Kill completion (do not require trigger sequence)
|
||||||
if [ $cmd = kill -a ${LBUFFER[-1]} = ' ' ]; then
|
if [ $cmd = kill -a ${LBUFFER[-1]} = ' ' ]; then
|
||||||
fzf="$(__fzfcmd_complete)"
|
fzf="$(__fzfcmd_complete)"
|
||||||
matches=$(ps -ef | sed 1d | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-50%} --min-height 15 --reverse $FZF_DEFAULT_OPTS --preview 'echo {}' --preview-window down:3:wrap $FZF_COMPLETION_OPTS" ${=fzf} -m | awk '{print $2}' | tr '\n' ' ')
|
matches=$(command ps -ef | sed 1d | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-50%} --min-height 15 --reverse $FZF_DEFAULT_OPTS --preview 'echo {}' --preview-window down:3:wrap $FZF_COMPLETION_OPTS" ${=fzf} -m | awk '{print $2}' | tr '\n' ' ')
|
||||||
if [ -n "$matches" ]; then
|
if [ -n "$matches" ]; then
|
||||||
LBUFFER="$LBUFFER$matches"
|
LBUFFER="$LBUFFER$matches"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -36,6 +36,16 @@ fzf-file-widget() {
|
|||||||
zle -N fzf-file-widget
|
zle -N fzf-file-widget
|
||||||
bindkey '^T' fzf-file-widget
|
bindkey '^T' fzf-file-widget
|
||||||
|
|
||||||
|
# Ensure precmds are run after cd
|
||||||
|
fzf-redraw-prompt() {
|
||||||
|
local precmd
|
||||||
|
for precmd in $precmd_functions; do
|
||||||
|
$precmd
|
||||||
|
done
|
||||||
|
zle reset-prompt
|
||||||
|
}
|
||||||
|
zle -N fzf-redraw-prompt
|
||||||
|
|
||||||
# ALT-C - cd into the selected directory
|
# ALT-C - cd into the selected directory
|
||||||
fzf-cd-widget() {
|
fzf-cd-widget() {
|
||||||
local cmd="${FZF_ALT_C_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \
|
local cmd="${FZF_ALT_C_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \
|
||||||
@@ -48,7 +58,7 @@ fzf-cd-widget() {
|
|||||||
fi
|
fi
|
||||||
cd "$dir"
|
cd "$dir"
|
||||||
local ret=$?
|
local ret=$?
|
||||||
zle reset-prompt
|
zle fzf-redraw-prompt
|
||||||
typeset -f zle-line-init >/dev/null && zle zle-line-init
|
typeset -f zle-line-init >/dev/null && zle zle-line-init
|
||||||
return $ret
|
return $ret
|
||||||
}
|
}
|
||||||
@@ -59,8 +69,8 @@ bindkey '\ec' fzf-cd-widget
|
|||||||
fzf-history-widget() {
|
fzf-history-widget() {
|
||||||
local selected num
|
local selected num
|
||||||
setopt localoptions noglobsubst noposixbuiltins pipefail 2> /dev/null
|
setopt localoptions noglobsubst noposixbuiltins pipefail 2> /dev/null
|
||||||
selected=( $(fc -l 1 |
|
selected=( $(fc -rl 1 |
|
||||||
FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS --tac -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort $FZF_CTRL_R_OPTS --query=${(qqq)LBUFFER} +m" $(__fzfcmd)) )
|
FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort $FZF_CTRL_R_OPTS --query=${(qqq)LBUFFER} +m" $(__fzfcmd)) )
|
||||||
local ret=$?
|
local ret=$?
|
||||||
if [ -n "$selected" ]; then
|
if [ -n "$selected" ]; then
|
||||||
num=$selected[1]
|
num=$selected[1]
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
// Current version
|
// Current version
|
||||||
version = "0.17.1"
|
version = "0.17.3"
|
||||||
|
|
||||||
// Core
|
// Core
|
||||||
coordinatorDelayMax time.Duration = 100 * time.Millisecond
|
coordinatorDelayMax time.Duration = 100 * time.Millisecond
|
||||||
@@ -55,7 +55,7 @@ var defaultCommand string
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
if !util.IsWindows() {
|
if !util.IsWindows() {
|
||||||
defaultCommand = `set -o pipefail; (command find -L . -mindepth 1 \( -path '*/\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \) -prune -o -type f -print -o -type l -print || command find -L . -mindepth 1 -path '*/\.*' -prune -o -type f -print -o -type l -print) 2> /dev/null | cut -b3-`
|
defaultCommand = `set -o pipefail; command find -L . -mindepth 1 \( -path '*/\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \) -prune -o -type f -print -o -type l -print 2> /dev/null | cut -b3-`
|
||||||
} else if os.Getenv("TERM") == "cygwin" {
|
} else if os.Getenv("TERM") == "cygwin" {
|
||||||
defaultCommand = `sh -c "command find -L . -mindepth 1 -path '*/\.*' -prune -o -type f -print -o -type l -print 2> /dev/null | cut -b3-"`
|
defaultCommand = `sh -c "command find -L . -mindepth 1 -path '*/\.*' -prune -o -type f -print -o -type l -print 2> /dev/null | cut -b3-"`
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -430,6 +430,10 @@ func parseKeyChords(str string, message string) map[int]string {
|
|||||||
chord = tui.SLeft
|
chord = tui.SLeft
|
||||||
case "shift-right":
|
case "shift-right":
|
||||||
chord = tui.SRight
|
chord = tui.SRight
|
||||||
|
case "left-click":
|
||||||
|
chord = tui.LeftClick
|
||||||
|
case "right-click":
|
||||||
|
chord = tui.RightClick
|
||||||
case "double-click":
|
case "double-click":
|
||||||
chord = tui.DoubleClick
|
chord = tui.DoubleClick
|
||||||
case "f10":
|
case "f10":
|
||||||
@@ -658,8 +662,12 @@ func parseKeymap(keymap map[int][]action, str string) {
|
|||||||
appendAction(actAbort)
|
appendAction(actAbort)
|
||||||
case "accept":
|
case "accept":
|
||||||
appendAction(actAccept)
|
appendAction(actAccept)
|
||||||
|
case "accept-non-empty":
|
||||||
|
appendAction(actAcceptNonEmpty)
|
||||||
case "print-query":
|
case "print-query":
|
||||||
appendAction(actPrintQuery)
|
appendAction(actPrintQuery)
|
||||||
|
case "replace-query":
|
||||||
|
appendAction(actReplaceQuery)
|
||||||
case "backward-char":
|
case "backward-char":
|
||||||
appendAction(actBackwardChar)
|
appendAction(actBackwardChar)
|
||||||
case "backward-delete-char":
|
case "backward-delete-char":
|
||||||
|
|||||||
@@ -170,6 +170,7 @@ const (
|
|||||||
actBeginningOfLine
|
actBeginningOfLine
|
||||||
actAbort
|
actAbort
|
||||||
actAccept
|
actAccept
|
||||||
|
actAcceptNonEmpty
|
||||||
actBackwardChar
|
actBackwardChar
|
||||||
actBackwardDeleteChar
|
actBackwardDeleteChar
|
||||||
actBackwardWord
|
actBackwardWord
|
||||||
@@ -203,6 +204,7 @@ const (
|
|||||||
actJump
|
actJump
|
||||||
actJumpAccept
|
actJumpAccept
|
||||||
actPrintQuery
|
actPrintQuery
|
||||||
|
actReplaceQuery
|
||||||
actToggleSort
|
actToggleSort
|
||||||
actTogglePreview
|
actTogglePreview
|
||||||
actTogglePreviewWrap
|
actTogglePreviewWrap
|
||||||
@@ -278,6 +280,8 @@ func defaultKeymap() map[int][]action {
|
|||||||
keymap[tui.Rune] = toActions(actRune)
|
keymap[tui.Rune] = toActions(actRune)
|
||||||
keymap[tui.Mouse] = toActions(actMouse)
|
keymap[tui.Mouse] = toActions(actMouse)
|
||||||
keymap[tui.DoubleClick] = toActions(actAccept)
|
keymap[tui.DoubleClick] = toActions(actAccept)
|
||||||
|
keymap[tui.LeftClick] = toActions(actIgnore)
|
||||||
|
keymap[tui.RightClick] = toActions(actToggle)
|
||||||
return keymap
|
return keymap
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -691,7 +695,11 @@ func (t *Terminal) printInfo() {
|
|||||||
output += fmt.Sprintf(" (%d%%)", t.progress)
|
output += fmt.Sprintf(" (%d%%)", t.progress)
|
||||||
}
|
}
|
||||||
if !t.success && t.count == 0 {
|
if !t.success && t.count == 0 {
|
||||||
output += " [ERROR]"
|
if len(os.Getenv("FZF_DEFAULT_COMMAND")) > 0 {
|
||||||
|
output = "[$FZF_DEFAULT_COMMAND failed]"
|
||||||
|
} else {
|
||||||
|
output = "[default command failed - $FZF_DEFAULT_COMMAND required]"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if pos+len(output) <= t.window.Width() {
|
if pos+len(output) <= t.window.Width() {
|
||||||
t.window.CPrint(tui.ColInfo, 0, output)
|
t.window.CPrint(tui.ColInfo, 0, output)
|
||||||
@@ -1362,6 +1370,12 @@ func (t *Terminal) Loop() {
|
|||||||
command := replacePlaceholder(t.preview.command,
|
command := replacePlaceholder(t.preview.command,
|
||||||
t.ansi, t.delimiter, false, string(t.input), request)
|
t.ansi, t.delimiter, false, string(t.input), request)
|
||||||
cmd := util.ExecCommand(command)
|
cmd := util.ExecCommand(command)
|
||||||
|
if t.pwindow != nil {
|
||||||
|
env := os.Environ()
|
||||||
|
env = append(env, fmt.Sprintf("LINES=%d", t.pwindow.Height()))
|
||||||
|
env = append(env, fmt.Sprintf("COLUMNS=%d", t.pwindow.Width()))
|
||||||
|
cmd.Env = env
|
||||||
|
}
|
||||||
out, _ := cmd.CombinedOutput()
|
out, _ := cmd.CombinedOutput()
|
||||||
t.reqBox.Set(reqPreviewDisplay, string(out))
|
t.reqBox.Set(reqPreviewDisplay, string(out))
|
||||||
} else {
|
} else {
|
||||||
@@ -1556,6 +1570,11 @@ func (t *Terminal) Loop() {
|
|||||||
}
|
}
|
||||||
case actPrintQuery:
|
case actPrintQuery:
|
||||||
req(reqPrintQuery)
|
req(reqPrintQuery)
|
||||||
|
case actReplaceQuery:
|
||||||
|
if t.cy >= 0 && t.cy < t.merger.Length() {
|
||||||
|
t.input = t.merger.Get(t.cy).item.text.ToRunes()
|
||||||
|
t.cx = len(t.input)
|
||||||
|
}
|
||||||
case actAbort:
|
case actAbort:
|
||||||
req(reqQuit)
|
req(reqQuit)
|
||||||
case actDeleteChar:
|
case actDeleteChar:
|
||||||
@@ -1638,6 +1657,10 @@ func (t *Terminal) Loop() {
|
|||||||
req(reqList)
|
req(reqList)
|
||||||
case actAccept:
|
case actAccept:
|
||||||
req(reqClose)
|
req(reqClose)
|
||||||
|
case actAcceptNonEmpty:
|
||||||
|
if len(t.selected) > 0 || t.merger.Length() > 0 || !t.reading && t.count == 0 {
|
||||||
|
req(reqClose)
|
||||||
|
}
|
||||||
case actClearScreen:
|
case actClearScreen:
|
||||||
req(reqRedraw)
|
req(reqRedraw)
|
||||||
case actTop:
|
case actTop:
|
||||||
@@ -1762,6 +1785,10 @@ func (t *Terminal) Loop() {
|
|||||||
toggle()
|
toggle()
|
||||||
}
|
}
|
||||||
req(reqList)
|
req(reqList)
|
||||||
|
if me.Left {
|
||||||
|
return doActions(t.keymap[tui.LeftClick], tui.LeftClick)
|
||||||
|
}
|
||||||
|
return doActions(t.keymap[tui.RightClick], tui.RightClick)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -495,16 +495,19 @@ func (r *LightRenderer) mouseSequence(sz *int) Event {
|
|||||||
}
|
}
|
||||||
*sz = 6
|
*sz = 6
|
||||||
switch r.buffer[3] {
|
switch r.buffer[3] {
|
||||||
case 32, 36, 40, 48, // mouse-down / shift / cmd / ctrl
|
case 32, 34, 36, 40, 48, // mouse-down / shift / cmd / ctrl
|
||||||
35, 39, 43, 51: // mouse-up / shift / cmd / ctrl
|
35, 39, 43, 51: // mouse-up / shift / cmd / ctrl
|
||||||
mod := r.buffer[3] >= 36
|
mod := r.buffer[3] >= 36
|
||||||
|
left := r.buffer[3] == 32
|
||||||
down := r.buffer[3]%2 == 0
|
down := r.buffer[3]%2 == 0
|
||||||
x := int(r.buffer[4] - 33)
|
x := int(r.buffer[4] - 33)
|
||||||
y := int(r.buffer[5]-33) - r.yoffset
|
y := int(r.buffer[5]-33) - r.yoffset
|
||||||
double := false
|
double := false
|
||||||
if down {
|
if down {
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
if now.Sub(r.prevDownTime) < doubleClickDuration {
|
if !left { // Right double click is not allowed
|
||||||
|
r.clickY = []int{}
|
||||||
|
} else if now.Sub(r.prevDownTime) < doubleClickDuration {
|
||||||
r.clickY = append(r.clickY, y)
|
r.clickY = append(r.clickY, y)
|
||||||
} else {
|
} else {
|
||||||
r.clickY = []int{y}
|
r.clickY = []int{y}
|
||||||
@@ -517,14 +520,14 @@ func (r *LightRenderer) mouseSequence(sz *int) Event {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Event{Mouse, 0, &MouseEvent{y, x, 0, down, double, mod}}
|
return Event{Mouse, 0, &MouseEvent{y, x, 0, left, down, double, mod}}
|
||||||
case 96, 100, 104, 112, // scroll-up / shift / cmd / ctrl
|
case 96, 100, 104, 112, // scroll-up / shift / cmd / ctrl
|
||||||
97, 101, 105, 113: // scroll-down / shift / cmd / ctrl
|
97, 101, 105, 113: // scroll-down / shift / cmd / ctrl
|
||||||
mod := r.buffer[3] >= 100
|
mod := r.buffer[3] >= 100
|
||||||
s := 1 - int(r.buffer[3]%2)*2
|
s := 1 - int(r.buffer[3]%2)*2
|
||||||
x := int(r.buffer[4] - 33)
|
x := int(r.buffer[4] - 33)
|
||||||
y := int(r.buffer[5]-33) - r.yoffset
|
y := int(r.buffer[5]-33) - r.yoffset
|
||||||
return Event{Mouse, 0, &MouseEvent{y, x, s, false, false, mod}}
|
return Event{Mouse, 0, &MouseEvent{y, x, s, false, false, false, mod}}
|
||||||
}
|
}
|
||||||
return Event{Invalid, 0, nil}
|
return Event{Invalid, 0, nil}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -193,19 +193,22 @@ func (r *FullscreenRenderer) GetChar() Event {
|
|||||||
button := ev.Buttons()
|
button := ev.Buttons()
|
||||||
mod := ev.Modifiers() != 0
|
mod := ev.Modifiers() != 0
|
||||||
if button&tcell.WheelDown != 0 {
|
if button&tcell.WheelDown != 0 {
|
||||||
return Event{Mouse, 0, &MouseEvent{y, x, -1, false, false, mod}}
|
return Event{Mouse, 0, &MouseEvent{y, x, -1, false, false, false, mod}}
|
||||||
} else if button&tcell.WheelUp != 0 {
|
} else if button&tcell.WheelUp != 0 {
|
||||||
return Event{Mouse, 0, &MouseEvent{y, x, +1, false, false, mod}}
|
return Event{Mouse, 0, &MouseEvent{y, x, +1, false, false, false, mod}}
|
||||||
} else if runtime.GOOS != "windows" {
|
} else if runtime.GOOS != "windows" {
|
||||||
// double and single taps on Windows don't quite work due to
|
// double and single taps on Windows don't quite work due to
|
||||||
// the console acting on the events and not allowing us
|
// the console acting on the events and not allowing us
|
||||||
// to consume them.
|
// to consume them.
|
||||||
|
|
||||||
down := button&tcell.Button1 != 0 // left
|
left := button&tcell.Button1 != 0
|
||||||
|
down := left || button&tcell.Button3 != 0
|
||||||
double := false
|
double := false
|
||||||
if down {
|
if down {
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
if now.Sub(r.prevDownTime) < doubleClickDuration {
|
if !left {
|
||||||
|
r.clickY = []int{}
|
||||||
|
} else if now.Sub(r.prevDownTime) < doubleClickDuration {
|
||||||
r.clickY = append(r.clickY, x)
|
r.clickY = append(r.clickY, x)
|
||||||
} else {
|
} else {
|
||||||
r.clickY = []int{x}
|
r.clickY = []int{x}
|
||||||
@@ -218,7 +221,7 @@ func (r *FullscreenRenderer) GetChar() Event {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Event{Mouse, 0, &MouseEvent{y, x, 0, down, double, mod}}
|
return Event{Mouse, 0, &MouseEvent{y, x, 0, left, down, double, mod}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// process keyboard:
|
// process keyboard:
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ const (
|
|||||||
Resize
|
Resize
|
||||||
Mouse
|
Mouse
|
||||||
DoubleClick
|
DoubleClick
|
||||||
|
LeftClick
|
||||||
|
RightClick
|
||||||
|
|
||||||
BTab
|
BTab
|
||||||
BSpace
|
BSpace
|
||||||
@@ -185,6 +187,7 @@ type MouseEvent struct {
|
|||||||
Y int
|
Y int
|
||||||
X int
|
X int
|
||||||
S int
|
S int
|
||||||
|
Left bool
|
||||||
Down bool
|
Down bool
|
||||||
Double bool
|
Double bool
|
||||||
Mod bool
|
Mod bool
|
||||||
|
|||||||
@@ -277,7 +277,7 @@ class TestGoFZF < TestBase
|
|||||||
|
|
||||||
def test_fzf_default_command_failure
|
def test_fzf_default_command_failure
|
||||||
tmux.send_keys fzf.sub('FZF_DEFAULT_COMMAND=', 'FZF_DEFAULT_COMMAND=false'), :Enter
|
tmux.send_keys fzf.sub('FZF_DEFAULT_COMMAND=', 'FZF_DEFAULT_COMMAND=false'), :Enter
|
||||||
tmux.until { |lines| lines[-2].include?('ERROR') }
|
tmux.until { |lines| lines[-2].include?('FZF_DEFAULT_COMMAND failed') }
|
||||||
tmux.send_keys :Enter
|
tmux.send_keys :Enter
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -769,6 +769,15 @@ class TestGoFZF < TestBase
|
|||||||
assert_equal %w[print-my-query], readonce.split($INPUT_RECORD_SEPARATOR)
|
assert_equal %w[print-my-query], readonce.split($INPUT_RECORD_SEPARATOR)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_bind_replace_query
|
||||||
|
tmux.send_keys "seq 1 1000 | #{fzf '--print-query --bind=ctrl-j:replace-query'}", :Enter
|
||||||
|
tmux.send_keys '1'
|
||||||
|
tmux.until { |lines| lines[-2].end_with? '272/1000' }
|
||||||
|
tmux.send_keys 'C-k', 'C-j'
|
||||||
|
tmux.until { |lines| lines[-2].end_with? '29/1000' }
|
||||||
|
tmux.until { |lines| lines[-1].end_with? '> 10' }
|
||||||
|
end
|
||||||
|
|
||||||
def test_long_line
|
def test_long_line
|
||||||
data = '.' * 256 * 1024
|
data = '.' * 256 * 1024
|
||||||
File.open(tempname, 'w') do |f|
|
File.open(tempname, 'w') do |f|
|
||||||
@@ -1319,12 +1328,12 @@ class TestGoFZF < TestBase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_preview_hidden
|
def test_preview_hidden
|
||||||
tmux.send_keys %(seq 1000 | #{FZF} --preview 'echo {{}-{}}' --preview-window down:1:hidden --bind ?:toggle-preview), :Enter
|
tmux.send_keys %(seq 1000 | #{FZF} --preview 'echo {{}-{}-\\$LINES-\\$COLUMNS}' --preview-window down:1:hidden --bind ?:toggle-preview), :Enter
|
||||||
tmux.until { |lines| lines[-1] == '>' }
|
tmux.until { |lines| lines[-1] == '>' }
|
||||||
tmux.send_keys '?'
|
tmux.send_keys '?'
|
||||||
tmux.until { |lines| lines[-2].include?(' {1-1}') }
|
tmux.until { |lines| lines[-2] =~ / {1-1-1-[0-9]+}/ }
|
||||||
tmux.send_keys '555'
|
tmux.send_keys '555'
|
||||||
tmux.until { |lines| lines[-2].include?(' {555-555}') }
|
tmux.until { |lines| lines[-2] =~ / {555-555-1-[0-9]+}/ }
|
||||||
tmux.send_keys '?'
|
tmux.send_keys '?'
|
||||||
tmux.until { |lines| lines[-1] == '> 555' }
|
tmux.until { |lines| lines[-1] == '> 555' }
|
||||||
end
|
end
|
||||||
@@ -1369,6 +1378,42 @@ class TestGoFZF < TestBase
|
|||||||
tmux.send_keys :Enter
|
tmux.send_keys :Enter
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_accept_non_empty
|
||||||
|
tmux.send_keys %(seq 1000 | #{fzf '--print-query --bind enter:accept-non-empty'}), :Enter
|
||||||
|
tmux.until { |lines| lines.match_count == 1000 }
|
||||||
|
tmux.send_keys 'foo'
|
||||||
|
tmux.until { |lines| lines[-2].include? '0/1000' }
|
||||||
|
# fzf doesn't exit since there's no selection
|
||||||
|
tmux.send_keys :Enter
|
||||||
|
tmux.until { |lines| lines[-2].include? '0/1000' }
|
||||||
|
tmux.send_keys 'C-u'
|
||||||
|
tmux.until { |lines| lines[-2].include? '1000/1000' }
|
||||||
|
tmux.send_keys '999'
|
||||||
|
tmux.until { |lines| lines[-2].include? '1/1000' }
|
||||||
|
tmux.send_keys :Enter
|
||||||
|
assert_equal %w[999 999], readonce.split($INPUT_RECORD_SEPARATOR)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_accept_non_empty_with_multi_selection
|
||||||
|
tmux.send_keys %(seq 1000 | #{fzf '-m --print-query --bind enter:accept-non-empty'}), :Enter
|
||||||
|
tmux.until { |lines| lines.match_count == 1000 }
|
||||||
|
tmux.send_keys :Tab
|
||||||
|
tmux.until { |lines| lines[-2].include? '1000/1000 (1)' }
|
||||||
|
tmux.send_keys 'foo'
|
||||||
|
tmux.until { |lines| lines[-2].include? '0/1000' }
|
||||||
|
# fzf will exit in this case even though there's no match for the current query
|
||||||
|
tmux.send_keys :Enter
|
||||||
|
assert_equal %w[foo 1], readonce.split($INPUT_RECORD_SEPARATOR)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_accept_non_empty_with_empty_list
|
||||||
|
tmux.send_keys %(: | #{fzf '-q foo --print-query --bind enter:accept-non-empty'}), :Enter
|
||||||
|
tmux.until { |lines| lines[-2].strip == '0/0' }
|
||||||
|
tmux.send_keys :Enter
|
||||||
|
# fzf will exit anyway since input list is empty
|
||||||
|
assert_equal %w[foo], readonce.split($INPUT_RECORD_SEPARATOR)
|
||||||
|
end
|
||||||
|
|
||||||
def test_preview_update_on_select
|
def test_preview_update_on_select
|
||||||
tmux.send_keys(%(seq 10 | fzf -m --preview 'echo {+}' --bind a:toggle-all),
|
tmux.send_keys(%(seq 10 | fzf -m --preview 'echo {+}' --bind a:toggle-all),
|
||||||
:Enter)
|
:Enter)
|
||||||
@@ -1716,6 +1761,23 @@ class TestBash < TestBase
|
|||||||
super
|
super
|
||||||
@tmux = Tmux.new :bash
|
@tmux = Tmux.new :bash
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_dynamic_completion_loader
|
||||||
|
tmux.paste 'touch /tmp/foo; _fzf_completion_loader=1'
|
||||||
|
tmux.paste '_completion_loader() { complete -o default fake; }'
|
||||||
|
tmux.paste 'complete -F _fzf_path_completion -o default -o bashdefault fake'
|
||||||
|
tmux.send_keys 'fake /tmp/foo**', :Tab
|
||||||
|
tmux.until { |lines| lines.item_count.positive? }
|
||||||
|
tmux.send_keys 'C-c'
|
||||||
|
|
||||||
|
tmux.prepare
|
||||||
|
tmux.send_keys 'fake /tmp/foo'
|
||||||
|
tmux.send_keys :Tab , 'C-u'
|
||||||
|
|
||||||
|
tmux.prepare
|
||||||
|
tmux.send_keys 'fake /tmp/foo**', :Tab
|
||||||
|
tmux.until { |lines| lines.item_count.positive? }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class TestZsh < TestBase
|
class TestZsh < TestBase
|
||||||
|
|||||||
Reference in New Issue
Block a user