mirror of
https://github.com/junegunn/fzf.git
synced 2025-08-01 20:52:06 -07:00
Compare commits
33 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
e03e91477b | ||
|
88ac397158 | ||
|
6fd4be580b | ||
|
53348feb89 | ||
|
337cdbb37c | ||
|
05fdf91fc5 | ||
|
c387689d1c | ||
|
cb9238dc4e | ||
|
a484811f78 | ||
|
111d1934c4 | ||
|
972fb1a29d | ||
|
3a6af27586 | ||
|
c89ac341e4 | ||
|
cd59e5d07b | ||
|
0b940e4b2b | ||
|
b29375c844 | ||
|
76d3f6d248 | ||
|
e87a85a179 | ||
|
11407bf656 | ||
|
c82fb3c9b9 | ||
|
309e1d8619 | ||
|
c2db67c1c0 | ||
|
9526594905 | ||
|
3d74d277aa | ||
|
fc274c2ba4 | ||
|
ce43ea9f42 | ||
|
21da02fac2 | ||
|
19569bd5c5 | ||
|
afa25d8c57 | ||
|
1ba7acf4bd | ||
|
a847fe8754 | ||
|
5bb18b6441 | ||
|
876c233a26 |
11
CHANGELOG.md
11
CHANGELOG.md
@@ -1,6 +1,17 @@
|
|||||||
CHANGELOG
|
CHANGELOG
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
0.16.6
|
||||||
|
------
|
||||||
|
- Minor bug fixes and improvements
|
||||||
|
- Added `--no-clear` option for scripting purposes
|
||||||
|
|
||||||
|
0.16.5
|
||||||
|
------
|
||||||
|
- Minor bug fixes
|
||||||
|
- Added `toggle-preview-wrap` action
|
||||||
|
- Built with Go 1.8
|
||||||
|
|
||||||
0.16.4
|
0.16.4
|
||||||
------
|
------
|
||||||
- Added `--border` option to draw border above and below the finder
|
- Added `--border` option to draw border above and below the finder
|
||||||
|
@@ -230,8 +230,8 @@ fish.
|
|||||||
- Set `FZF_CTRL_T_COMMAND` to override the default command
|
- Set `FZF_CTRL_T_COMMAND` to override the default command
|
||||||
- Set `FZF_CTRL_T_OPTS` to pass additional options
|
- Set `FZF_CTRL_T_OPTS` to pass additional options
|
||||||
- `CTRL-R` - Paste the selected command from history onto the command line
|
- `CTRL-R` - Paste the selected command from history onto the command line
|
||||||
- Sort is disabled by default to respect chronological ordering
|
- If you want to see the commands in chronological order, press `CTRL-R`
|
||||||
- Press `CTRL-R` again to toggle sort
|
again which toggles sorting by relevance
|
||||||
- Set `FZF_CTRL_R_OPTS` to pass additional options
|
- Set `FZF_CTRL_R_OPTS` to pass additional options
|
||||||
- `ALT-C` - cd into the selected directory
|
- `ALT-C` - cd into the selected directory
|
||||||
- Set `FZF_ALT_C_COMMAND` to override the default command
|
- Set `FZF_ALT_C_COMMAND` to override the default command
|
||||||
|
@@ -138,6 +138,7 @@ cleanup() {
|
|||||||
|
|
||||||
# Remove temp window if we were zoomed
|
# Remove temp window if we were zoomed
|
||||||
if [[ -n "$zoomed" ]]; then
|
if [[ -n "$zoomed" ]]; then
|
||||||
|
tmux display-message -p "#{window_id}" > /dev/null
|
||||||
tmux swap-pane -t $original_window \; \
|
tmux swap-pane -t $original_window \; \
|
||||||
select-window -t $original_window \; \
|
select-window -t $original_window \; \
|
||||||
kill-window -t $tmp_window \; \
|
kill-window -t $tmp_window \; \
|
||||||
|
81
install
81
install
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
version=0.16.4
|
version=0.16.6
|
||||||
auto_completion=
|
auto_completion=
|
||||||
key_bindings=
|
key_bindings=
|
||||||
update_config=2
|
update_config=2
|
||||||
@@ -161,77 +161,6 @@ case "$archi" in
|
|||||||
*) binary_available=0 binary_error=1 ;;
|
*) binary_available=0 binary_error=1 ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
install_ruby_fzf() {
|
|
||||||
if [ -z "$allow_legacy" ]; then
|
|
||||||
ask "Do you want to install legacy Ruby version instead?" && exit 1
|
|
||||||
fi
|
|
||||||
echo "Installing legacy Ruby version ..."
|
|
||||||
|
|
||||||
# ruby executable
|
|
||||||
echo -n "Checking Ruby executable ... "
|
|
||||||
ruby=$(command -v ruby)
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "ruby executable not found !!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# System ruby is preferred
|
|
||||||
system_ruby=/usr/bin/ruby
|
|
||||||
if [ -x $system_ruby ] && [ $system_ruby != "$ruby" ]; then
|
|
||||||
$system_ruby --disable-gems -rcurses -e0 2> /dev/null
|
|
||||||
[ $? -eq 0 ] && ruby=$system_ruby
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "OK ($ruby)"
|
|
||||||
|
|
||||||
# Curses-support
|
|
||||||
echo -n "Checking Curses support ... "
|
|
||||||
"$ruby" -rcurses -e0 2> /dev/null
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
echo "OK"
|
|
||||||
else
|
|
||||||
echo "Not found"
|
|
||||||
echo "Installing 'curses' gem ... "
|
|
||||||
if (( EUID )); then
|
|
||||||
/usr/bin/env gem install curses --user-install
|
|
||||||
else
|
|
||||||
/usr/bin/env gem install curses
|
|
||||||
fi
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo
|
|
||||||
echo "Failed to install 'curses' gem."
|
|
||||||
if [[ $(uname -r) =~ 'ARCH' ]]; then
|
|
||||||
echo "Make sure that base-devel package group is installed."
|
|
||||||
fi
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Ruby version
|
|
||||||
echo -n "Checking Ruby version ... "
|
|
||||||
"$ruby" -e 'exit RUBY_VERSION >= "1.9"'
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
echo ">= 1.9"
|
|
||||||
"$ruby" --disable-gems -rcurses -e0 2> /dev/null
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
fzf_cmd="$ruby --disable-gems $fzf_base/fzf"
|
|
||||||
else
|
|
||||||
fzf_cmd="$ruby $fzf_base/fzf"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "< 1.9"
|
|
||||||
fzf_cmd="$ruby $fzf_base/fzf"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create fzf script
|
|
||||||
echo -n "Creating wrapper script for fzf ... "
|
|
||||||
rm -f "$fzf_base"/bin/fzf
|
|
||||||
echo "#!/bin/sh" > "$fzf_base"/bin/fzf
|
|
||||||
echo "$fzf_cmd \"\$@\"" >> "$fzf_base"/bin/fzf
|
|
||||||
chmod +x "$fzf_base"/bin/fzf
|
|
||||||
echo "OK"
|
|
||||||
}
|
|
||||||
|
|
||||||
cd "$fzf_base"
|
cd "$fzf_base"
|
||||||
if [ -n "$binary_error" ]; then
|
if [ -n "$binary_error" ]; then
|
||||||
if [ $binary_available -eq 0 ]; then
|
if [ $binary_available -eq 0 ]; then
|
||||||
@@ -249,12 +178,12 @@ if [ -n "$binary_error" ]; then
|
|||||||
echo "OK"
|
echo "OK"
|
||||||
cp "$GOPATH/bin/fzf" "$fzf_base/bin/"
|
cp "$GOPATH/bin/fzf" "$fzf_base/bin/"
|
||||||
else
|
else
|
||||||
echo "Failed to build binary ..."
|
echo "Failed to build binary. Installation failed."
|
||||||
install_ruby_fzf
|
exit 1
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "go executable not found. Cannot build binary ..."
|
echo "go executable not found. Installation failed."
|
||||||
install_ruby_fzf
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@@ -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 "Feb 2017" "fzf 0.16.4" "fzf-tmux - open fzf in tmux split pane"
|
.TH fzf-tmux 1 "Mar 2017" "fzf 0.16.6" "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 "Feb 2017" "fzf 0.16.4" "fzf - a command-line fuzzy finder"
|
.TH fzf 1 "Mar 2017" "fzf 0.16.6" "fzf - a command-line fuzzy finder"
|
||||||
|
|
||||||
.SH NAME
|
.SH NAME
|
||||||
fzf - a command-line fuzzy finder
|
fzf - a command-line fuzzy finder
|
||||||
@@ -339,6 +339,12 @@ Read input delimited by ASCII NUL characters instead of newline characters
|
|||||||
.B "--print0"
|
.B "--print0"
|
||||||
Print output delimited by ASCII NUL characters instead of newline characters
|
Print output delimited by ASCII NUL characters instead of newline characters
|
||||||
.TP
|
.TP
|
||||||
|
.B "--no-clear"
|
||||||
|
Do not clear finder interface on exit. If fzf was started in full screen mode,
|
||||||
|
it will not switch back to the original screen, so you'll have to manually run
|
||||||
|
\fBtput rmcup\fR to return. This option can be used to avoid flickering of the
|
||||||
|
screen when your application needs to start fzf multiple times in order.
|
||||||
|
.TP
|
||||||
.B "--sync"
|
.B "--sync"
|
||||||
Synchronous search for multi-staged filtering. If specified, fzf will launch
|
Synchronous search for multi-staged filtering. If specified, fzf will launch
|
||||||
ncurses finder only after the input stream is complete.
|
ncurses finder only after the input stream is complete.
|
||||||
@@ -500,6 +506,7 @@ e.g. \fBfzf --bind=ctrl-j:accept,ctrl-k:kill-line\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)
|
||||||
\fBtoggle-out\fR (\fB--reverse\fR ? \fBtoggle+down\fR : \fBtoggle+up\fR)
|
\fBtoggle-out\fR (\fB--reverse\fR ? \fBtoggle+down\fR : \fBtoggle+up\fR)
|
||||||
\fBtoggle-preview\fR
|
\fBtoggle-preview\fR
|
||||||
|
\fBtoggle-preview-wrap\fR
|
||||||
\fBtoggle-sort\fR
|
\fBtoggle-sort\fR
|
||||||
\fBtoggle+up\fR \fIbtab (shift-tab)\fR
|
\fBtoggle+up\fR \fIbtab (shift-tab)\fR
|
||||||
\fBunix-line-discard\fR \fIctrl-u\fR
|
\fBunix-line-discard\fR \fIctrl-u\fR
|
||||||
|
@@ -192,6 +192,16 @@ function! s:defaults()
|
|||||||
return empty(colors) ? '' : ('--color='.colors)
|
return empty(colors) ? '' : ('--color='.colors)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! s:validate_layout(layout)
|
||||||
|
for key in keys(a:layout)
|
||||||
|
if index(s:layout_keys, key) < 0
|
||||||
|
throw printf('Invalid entry in g:fzf_layout: %s (allowed: %s)%s',
|
||||||
|
\ key, join(s:layout_keys, ', '), key == 'options' ? '. Use $FZF_DEFAULT_OPTS.' : '')
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return a:layout
|
||||||
|
endfunction
|
||||||
|
|
||||||
" [name string,] [opts dict,] [fullscreen boolean]
|
" [name string,] [opts dict,] [fullscreen boolean]
|
||||||
function! fzf#wrap(...)
|
function! fzf#wrap(...)
|
||||||
let args = ['', {}, 0]
|
let args = ['', {}, 0]
|
||||||
@@ -200,7 +210,7 @@ function! fzf#wrap(...)
|
|||||||
for arg in copy(a:000)
|
for arg in copy(a:000)
|
||||||
let tidx = index(expects, type(arg), tidx)
|
let tidx = index(expects, type(arg), tidx)
|
||||||
if tidx < 0
|
if tidx < 0
|
||||||
throw 'invalid arguments (expected: [name string] [opts dict] [fullscreen boolean])'
|
throw 'Invalid arguments (expected: [name string] [opts dict] [fullscreen boolean])'
|
||||||
endif
|
endif
|
||||||
let args[tidx] = arg
|
let args[tidx] = arg
|
||||||
let tidx += 1
|
let tidx += 1
|
||||||
@@ -223,7 +233,7 @@ function! fzf#wrap(...)
|
|||||||
if !exists('g:fzf_layout') && exists('g:fzf_height')
|
if !exists('g:fzf_layout') && exists('g:fzf_height')
|
||||||
let opts.down = g:fzf_height
|
let opts.down = g:fzf_height
|
||||||
else
|
else
|
||||||
let opts = extend(opts, get(g:, 'fzf_layout', s:default_layout))
|
let opts = extend(opts, s:validate_layout(get(g:, 'fzf_layout', s:default_layout)))
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -290,10 +300,14 @@ try
|
|||||||
throw v:exception
|
throw v:exception
|
||||||
endtry
|
endtry
|
||||||
|
|
||||||
|
if has('nvim') && !has_key(dict, 'dir')
|
||||||
|
let dict.dir = getcwd()
|
||||||
|
endif
|
||||||
|
|
||||||
if !has_key(dict, 'source') && !empty($FZF_DEFAULT_COMMAND)
|
if !has_key(dict, 'source') && !empty($FZF_DEFAULT_COMMAND)
|
||||||
let temps.source = tempname()
|
let temps.source = tempname().(s:is_win ? '.bat' : '')
|
||||||
call writefile(split($FZF_DEFAULT_COMMAND, "\n"), temps.source)
|
call writefile((s:is_win ? ['@echo off'] : []) + split($FZF_DEFAULT_COMMAND, "\n"), temps.source)
|
||||||
let dict.source = (empty($SHELL) ? &shell : $SHELL) . ' ' . s:shellesc(temps.source)
|
let dict.source = (empty($SHELL) ? &shell : $SHELL) . (s:is_win ? ' /c ' : ' ') . s:shellesc(temps.source)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if has_key(dict, 'source')
|
if has_key(dict, 'source')
|
||||||
@@ -304,9 +318,9 @@ try
|
|||||||
elseif type == 3
|
elseif type == 3
|
||||||
let temps.input = tempname()
|
let temps.input = tempname()
|
||||||
call writefile(source, temps.input)
|
call writefile(source, temps.input)
|
||||||
let prefix = 'cat '.s:shellesc(temps.input).'|'
|
let prefix = (s:is_win ? 'type ' : 'cat ').s:shellesc(temps.input).'|'
|
||||||
else
|
else
|
||||||
throw 'invalid source type'
|
throw 'Invalid source type'
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
let prefix = ''
|
let prefix = ''
|
||||||
@@ -436,7 +450,7 @@ function! s:execute(dict, command, use_height, temps) abort
|
|||||||
if has('unix') && !a:use_height
|
if has('unix') && !a:use_height
|
||||||
silent! !clear 2> /dev/null
|
silent! !clear 2> /dev/null
|
||||||
endif
|
endif
|
||||||
let escaped = escape(substitute(a:command, '\n', '\\n', 'g'), '%#')
|
let escaped = escape(substitute(a:command, '\n', '\\n', 'g'), '%#!')
|
||||||
if has('gui_running')
|
if has('gui_running')
|
||||||
let Launcher = get(a:dict, 'launcher', get(g:, 'Fzf_launcher', get(g:, 'fzf_launcher', s:launcher)))
|
let Launcher = get(a:dict, 'launcher', get(g:, 'Fzf_launcher', get(g:, 'fzf_launcher', s:launcher)))
|
||||||
let fmt = type(Launcher) == 2 ? call(Launcher, []) : Launcher
|
let fmt = type(Launcher) == 2 ? call(Launcher, []) : Launcher
|
||||||
@@ -445,7 +459,7 @@ function! s:execute(dict, command, use_height, temps) abort
|
|||||||
endif
|
endif
|
||||||
let command = printf(fmt, escaped)
|
let command = printf(fmt, escaped)
|
||||||
else
|
else
|
||||||
let command = escaped
|
let command = a:use_height ? a:command : escaped
|
||||||
endif
|
endif
|
||||||
if a:use_height
|
if a:use_height
|
||||||
let stdin = has_key(a:dict, 'source') ? '' : '< /dev/tty'
|
let stdin = has_key(a:dict, 'source') ? '' : '< /dev/tty'
|
||||||
|
@@ -143,7 +143,7 @@ _fzf_complete_unalias() {
|
|||||||
|
|
||||||
fzf-completion() {
|
fzf-completion() {
|
||||||
local tokens cmd prefix trigger tail fzf matches lbuf d_cmds
|
local tokens cmd prefix trigger tail fzf matches lbuf d_cmds
|
||||||
setopt localoptions noshwordsplit noksh_arrays
|
setopt localoptions noshwordsplit noksh_arrays noposixbuiltins
|
||||||
|
|
||||||
# http://zsh.sourceforge.net/FAQ/zshfaq03.html
|
# http://zsh.sourceforge.net/FAQ/zshfaq03.html
|
||||||
# http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags
|
# http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
# Key bindings
|
# Key bindings
|
||||||
# ------------
|
# ------------
|
||||||
__fzf_select__() {
|
__fzf_select__() {
|
||||||
local cmd="${FZF_CTRL_T_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \
|
local cmd="${FZF_CTRL_T_COMMAND:-"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 f -print \
|
||||||
-o -type d -print \
|
-o -type d -print \
|
||||||
-o -type l -print 2> /dev/null | cut -b3-"}"
|
-o -type l -print 2> /dev/null | cut -b3-"}"
|
||||||
@@ -46,8 +46,8 @@ fzf-file-widget() {
|
|||||||
|
|
||||||
__fzf_cd__() {
|
__fzf_cd__() {
|
||||||
local cmd dir
|
local cmd dir
|
||||||
cmd="${FZF_ALT_C_COMMAND:-"command find -L . \\( -path '*/\\.*' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \
|
cmd="${FZF_ALT_C_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \
|
||||||
-o -type d -print 2> /dev/null | sed 1d | cut -b3-"}"
|
-o -type d -print 2> /dev/null | cut -b3-"}"
|
||||||
dir=$(eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_ALT_C_OPTS" $(__fzfcmd) +m) && printf 'cd %q' "$dir"
|
dir=$(eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_ALT_C_OPTS" $(__fzfcmd) +m) && printf 'cd %q' "$dir"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@ __fzf_history__() (
|
|||||||
shopt -u nocaseglob nocasematch
|
shopt -u nocaseglob nocasematch
|
||||||
line=$(
|
line=$(
|
||||||
HISTTIMEFORMAT= history |
|
HISTTIMEFORMAT= history |
|
||||||
FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS +s --tac -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort $FZF_CTRL_R_OPTS +m" $(__fzfcmd) |
|
FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS --tac -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort $FZF_CTRL_R_OPTS +m" $(__fzfcmd) |
|
||||||
command grep '^ *[0-9]') &&
|
command grep '^ *[0-9]') &&
|
||||||
if [[ $- =~ H ]]; then
|
if [[ $- =~ H ]]; then
|
||||||
sed 's/^ *\([0-9]*\)\** .*/!\1/' <<< "$line"
|
sed 's/^ *\([0-9]*\)\** .*/!\1/' <<< "$line"
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
# ------------
|
# ------------
|
||||||
function fzf_key_bindings
|
function fzf_key_bindings
|
||||||
|
|
||||||
# Store last token in $dir as root for the 'find' command
|
# Store current token in $dir as root for the 'find' command
|
||||||
function fzf-file-widget -d "List files and folders"
|
function fzf-file-widget -d "List files and folders"
|
||||||
set -l dir (commandline -t)
|
set -l dir (commandline -t)
|
||||||
# The commandline token might be escaped, we need to unescape it.
|
# The commandline token might be escaped, we need to unescape it.
|
||||||
@@ -16,10 +16,10 @@ function fzf_key_bindings
|
|||||||
# "-path \$dir'*/\\.*'" matches hidden files/folders inside $dir but not
|
# "-path \$dir'*/\\.*'" matches hidden files/folders inside $dir but not
|
||||||
# $dir itself, even if hidden.
|
# $dir itself, even if hidden.
|
||||||
set -q FZF_CTRL_T_COMMAND; or set -l FZF_CTRL_T_COMMAND "
|
set -q FZF_CTRL_T_COMMAND; or set -l FZF_CTRL_T_COMMAND "
|
||||||
command find -L \$dir -mindepth 1 \\( -path \$dir'*/\\.*' -o -fstype 'devfs' -o -fstype 'devtmpfs' \\) -prune \
|
command find -L \$dir -mindepth 1 \\( -path \$dir'*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' \\) -prune \
|
||||||
-o -type f -print \
|
-o -type f -print \
|
||||||
-o -type d -print \
|
-o -type d -print \
|
||||||
-o -type l -print 2> /dev/null | sed 's#^\./##'"
|
-o -type l -print 2> /dev/null | cut -b3-"
|
||||||
|
|
||||||
set -q FZF_TMUX_HEIGHT; or set FZF_TMUX_HEIGHT 40%
|
set -q FZF_TMUX_HEIGHT; or set FZF_TMUX_HEIGHT 40%
|
||||||
begin
|
begin
|
||||||
@@ -45,7 +45,7 @@ function fzf_key_bindings
|
|||||||
function fzf-history-widget -d "Show command history"
|
function fzf-history-widget -d "Show command history"
|
||||||
set -q FZF_TMUX_HEIGHT; or set FZF_TMUX_HEIGHT 40%
|
set -q FZF_TMUX_HEIGHT; or set FZF_TMUX_HEIGHT 40%
|
||||||
begin
|
begin
|
||||||
set -lx FZF_DEFAULT_OPTS "--height $FZF_TMUX_HEIGHT $FZF_DEFAULT_OPTS +s --tiebreak=index --bind=ctrl-r:toggle-sort $FZF_CTRL_R_OPTS +m"
|
set -lx FZF_DEFAULT_OPTS "--height $FZF_TMUX_HEIGHT $FZF_DEFAULT_OPTS --tiebreak=index --bind=ctrl-r:toggle-sort $FZF_CTRL_R_OPTS +m"
|
||||||
history | eval (__fzfcmd) -q '(commandline)' | read -l result
|
history | eval (__fzfcmd) -q '(commandline)' | read -l result
|
||||||
and commandline -- $result
|
and commandline -- $result
|
||||||
end
|
end
|
||||||
@@ -54,8 +54,8 @@ function fzf_key_bindings
|
|||||||
|
|
||||||
function fzf-cd-widget -d "Change directory"
|
function fzf-cd-widget -d "Change directory"
|
||||||
set -q FZF_ALT_C_COMMAND; or set -l FZF_ALT_C_COMMAND "
|
set -q FZF_ALT_C_COMMAND; or set -l FZF_ALT_C_COMMAND "
|
||||||
command find -L . \\( -path '*/\\.*' -o -fstype 'devfs' -o -fstype 'devtmpfs' \\) -prune \
|
command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' \\) -prune \
|
||||||
-o -type d -print 2> /dev/null | sed 1d | cut -b3-"
|
-o -type d -print 2> /dev/null | cut -b3-"
|
||||||
set -q FZF_TMUX_HEIGHT; or set FZF_TMUX_HEIGHT 40%
|
set -q FZF_TMUX_HEIGHT; or set FZF_TMUX_HEIGHT 40%
|
||||||
begin
|
begin
|
||||||
set -lx FZF_DEFAULT_OPTS "--height $FZF_TMUX_HEIGHT --reverse $FZF_DEFAULT_OPTS $FZF_ALT_C_OPTS"
|
set -lx FZF_DEFAULT_OPTS "--height $FZF_TMUX_HEIGHT --reverse $FZF_DEFAULT_OPTS $FZF_ALT_C_OPTS"
|
||||||
|
@@ -4,7 +4,7 @@ if [[ $- == *i* ]]; then
|
|||||||
|
|
||||||
# CTRL-T - Paste the selected file path(s) into the command line
|
# CTRL-T - Paste the selected file path(s) into the command line
|
||||||
__fsel() {
|
__fsel() {
|
||||||
local cmd="${FZF_CTRL_T_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \
|
local cmd="${FZF_CTRL_T_COMMAND:-"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 f -print \
|
||||||
-o -type d -print \
|
-o -type d -print \
|
||||||
-o -type l -print 2> /dev/null | cut -b3-"}"
|
-o -type l -print 2> /dev/null | cut -b3-"}"
|
||||||
@@ -38,10 +38,15 @@ bindkey '^T' fzf-file-widget
|
|||||||
|
|
||||||
# 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 . \\( -path '*/\\.*' -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 \
|
||||||
-o -type d -print 2> /dev/null | sed 1d | cut -b3-"}"
|
-o -type d -print 2> /dev/null | cut -b3-"}"
|
||||||
setopt localoptions pipefail 2> /dev/null
|
setopt localoptions pipefail 2> /dev/null
|
||||||
cd "${$(eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_ALT_C_OPTS" $(__fzfcmd) +m):-.}"
|
local dir="$(eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_ALT_C_OPTS" $(__fzfcmd) +m)"
|
||||||
|
if [[ -z "$dir" ]]; then
|
||||||
|
zle redisplay
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
cd "$dir"
|
||||||
local ret=$?
|
local ret=$?
|
||||||
zle reset-prompt
|
zle reset-prompt
|
||||||
typeset -f zle-line-init >/dev/null && zle zle-line-init
|
typeset -f zle-line-init >/dev/null && zle zle-line-init
|
||||||
@@ -53,9 +58,9 @@ bindkey '\ec' fzf-cd-widget
|
|||||||
# CTRL-R - Paste the selected command from history into the command line
|
# CTRL-R - Paste the selected command from history into the command line
|
||||||
fzf-history-widget() {
|
fzf-history-widget() {
|
||||||
local selected num
|
local selected num
|
||||||
setopt localoptions noglobsubst pipefail 2> /dev/null
|
setopt localoptions noglobsubst noposixbuiltins pipefail 2> /dev/null
|
||||||
selected=( $(fc -l 1 |
|
selected=( $(fc -l 1 |
|
||||||
FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS +s --tac -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort $FZF_CTRL_R_OPTS --query=${(q)LBUFFER} +m" $(__fzfcmd)) )
|
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=${(q)LBUFFER} +m" $(__fzfcmd)) )
|
||||||
local ret=$?
|
local ret=$?
|
||||||
if [ -n "$selected" ]; then
|
if [ -n "$selected" ]; then
|
||||||
num=$selected[1]
|
num=$selected[1]
|
||||||
@@ -71,4 +76,3 @@ zle -N fzf-history-widget
|
|||||||
bindkey '^R' fzf-history-widget
|
bindkey '^R' fzf-history-widget
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@@ -1,40 +0,0 @@
|
|||||||
FROM ubuntu:14.04
|
|
||||||
MAINTAINER Junegunn Choi <junegunn.c@gmail.com>
|
|
||||||
|
|
||||||
# apt-get
|
|
||||||
RUN apt-get update && apt-get -y upgrade && \
|
|
||||||
apt-get install -y --force-yes git curl build-essential
|
|
||||||
|
|
||||||
# Install Go 1.4
|
|
||||||
RUN cd / && curl \
|
|
||||||
https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz | \
|
|
||||||
tar -xz && mv go go1.4 && \
|
|
||||||
sed -i 's@#define PTHREAD_KEYS_MAX 128@@' /go1.4/src/runtime/cgo/gcc_android_arm.c
|
|
||||||
|
|
||||||
ENV GOROOT /go1.4
|
|
||||||
ENV PATH /go1.4/bin:$PATH
|
|
||||||
|
|
||||||
RUN cd / && \
|
|
||||||
curl -O http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin && \
|
|
||||||
chmod 755 /android-ndk* && /android-ndk-r10e-linux-x86_64.bin && \
|
|
||||||
mv android-ndk-r10e /android-ndk
|
|
||||||
|
|
||||||
RUN cd /android-ndk && bash ./build/tools/make-standalone-toolchain.sh --platform=android-21 --install-dir=/ndk --arch=arm
|
|
||||||
|
|
||||||
ENV NDK_CC /ndk/bin/arm-linux-androideabi-gcc
|
|
||||||
|
|
||||||
RUN cd $GOROOT/src && \
|
|
||||||
CC_FOR_TARGET=$NDK_CC GOOS=android GOARCH=arm GOARM=7 ./make.bash
|
|
||||||
|
|
||||||
RUN cd / && curl \
|
|
||||||
http://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz | \
|
|
||||||
tar -xz && cd /ncurses-5.9 && \
|
|
||||||
./configure CC=$NDK_CC CFLAGS="-fPIE -march=armv7-a -mfpu=neon -mhard-float -Wl,--no-warn-mismatch" LDFLAGS="-march=armv7-a -Wl,--no-warn-mismatch" --host=arm-linux --enable-overwrite --enable-const --without-cxx-binding --without-shared --without-debug --enable-widec --enable-ext-colors --enable-ext-mouse --enable-pc-files --with-pkg-config-libdir=$PKG_CONFIG_LIBDIR --without-manpages --without-ada --disable-shared --without-tests --prefix=/ndk/sysroot/usr --with-default-terminfo-dirs=/usr/share/terminfo --with-terminfo-dirs=/usr/share/terminfo ac_cv_header_locale_h=n ac_cv_func_getpwent=no ac_cv_func_getpwnam=no ac_cv_func_getpwuid=no && \
|
|
||||||
sed -i 's@#define HAVE_LOCALE_H 1@/* #undef HAVE_LOCALE_H */@' include/ncurses_cfg.h && \
|
|
||||||
make && \
|
|
||||||
sed -i '0,/echo.*/{s/echo.*/exit 0/}' misc/run_tic.sh && \
|
|
||||||
make install && \
|
|
||||||
mv /ndk/sysroot/usr/lib/libncursesw.a /ndk/sysroot/usr/lib/libncurses.a
|
|
||||||
|
|
||||||
# Default CMD
|
|
||||||
CMD cd /fzf/src && /bin/bash
|
|
@@ -1,24 +0,0 @@
|
|||||||
FROM base/archlinux:2014.07.03
|
|
||||||
MAINTAINER Junegunn Choi <junegunn.c@gmail.com>
|
|
||||||
|
|
||||||
# apt-get
|
|
||||||
RUN pacman-key --populate archlinux && pacman-key --refresh-keys
|
|
||||||
RUN pacman-db-upgrade && pacman -Syu --noconfirm base-devel git
|
|
||||||
|
|
||||||
# Install Go 1.4
|
|
||||||
RUN cd / && curl \
|
|
||||||
https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz | \
|
|
||||||
tar -xz && mv go go1.4
|
|
||||||
|
|
||||||
ENV GOROOT /go1.4
|
|
||||||
ENV PATH /go1.4/bin:$PATH
|
|
||||||
|
|
||||||
# For i386 build
|
|
||||||
RUN echo '[multilib]' >> /etc/pacman.conf && \
|
|
||||||
echo 'Include = /etc/pacman.d/mirrorlist' >> /etc/pacman.conf && \
|
|
||||||
pacman-db-upgrade && yes | pacman -Sy gcc-multilib lib32-ncurses && \
|
|
||||||
cd $GOROOT/src && GOARCH=386 ./make.bash
|
|
||||||
|
|
||||||
# Default CMD
|
|
||||||
CMD cd /fzf/src && /bin/bash
|
|
||||||
|
|
@@ -1,32 +0,0 @@
|
|||||||
FROM centos:centos6
|
|
||||||
MAINTAINER Junegunn Choi <junegunn.c@gmail.com>
|
|
||||||
|
|
||||||
# yum
|
|
||||||
RUN yum install -y git gcc make tar glibc-devel glibc-devel.i686 \
|
|
||||||
ncurses-devel ncurses-static ncurses-devel.i686 \
|
|
||||||
gpm-devel gpm-static libgcc.i686
|
|
||||||
|
|
||||||
# Install Go 1.4
|
|
||||||
RUN cd / && curl \
|
|
||||||
https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz | \
|
|
||||||
tar -xz && mv go go1.4
|
|
||||||
|
|
||||||
# Install Go 1.7
|
|
||||||
RUN cd / && curl \
|
|
||||||
https://storage.googleapis.com/golang/go1.7.linux-amd64.tar.gz | \
|
|
||||||
tar -xz && mv go go1.7
|
|
||||||
|
|
||||||
# Install RPMs for building static 32-bit binary
|
|
||||||
RUN curl ftp://ftp.pbone.net/mirror/ftp.centos.org/6.8/os/i386/Packages/ncurses-static-5.7-4.20090207.el6.i686.rpm -o rpm && rpm -i rpm && \
|
|
||||||
curl ftp://ftp.pbone.net/mirror/ftp.centos.org/6.8/os/i386/Packages/gpm-static-1.20.6-12.el6.i686.rpm -o rpm && rpm -i rpm
|
|
||||||
|
|
||||||
ENV GOROOT_BOOTSTRAP /go1.4
|
|
||||||
ENV GOROOT /go1.7
|
|
||||||
ENV PATH /go1.7/bin:$PATH
|
|
||||||
|
|
||||||
# For i386 build
|
|
||||||
RUN cd $GOROOT/src && GOARCH=386 ./make.bash
|
|
||||||
|
|
||||||
# Default CMD
|
|
||||||
CMD cd /fzf/src && /bin/bash
|
|
||||||
|
|
@@ -1,22 +0,0 @@
|
|||||||
FROM ubuntu:14.04
|
|
||||||
MAINTAINER Junegunn Choi <junegunn.c@gmail.com>
|
|
||||||
|
|
||||||
# apt-get
|
|
||||||
RUN apt-get update && apt-get -y upgrade && \
|
|
||||||
apt-get install -y --force-yes git curl build-essential libncurses-dev libgpm-dev
|
|
||||||
|
|
||||||
# Install Go 1.4
|
|
||||||
RUN cd / && curl \
|
|
||||||
https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz | \
|
|
||||||
tar -xz && mv go go1.4
|
|
||||||
|
|
||||||
ENV GOROOT /go1.4
|
|
||||||
ENV PATH /go1.4/bin:$PATH
|
|
||||||
|
|
||||||
# For i386 build
|
|
||||||
RUN apt-get install -y lib32ncurses5-dev && \
|
|
||||||
cd $GOROOT/src && GOARCH=386 ./make.bash
|
|
||||||
|
|
||||||
# Default CMD
|
|
||||||
CMD cd /fzf/src && /bin/bash
|
|
||||||
|
|
49
src/Makefile
49
src/Makefile
@@ -4,6 +4,8 @@ ifeq ($(UNAME_S),Darwin)
|
|||||||
GOOS := darwin
|
GOOS := darwin
|
||||||
else ifeq ($(UNAME_S),Linux)
|
else ifeq ($(UNAME_S),Linux)
|
||||||
GOOS := linux
|
GOOS := linux
|
||||||
|
else
|
||||||
|
$(error "$$GOOS is not defined.")
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -12,7 +14,6 @@ ROOTDIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
|
|||||||
BINDIR := $(shell dirname $(ROOTDIR))/bin
|
BINDIR := $(shell dirname $(ROOTDIR))/bin
|
||||||
GOPATH := $(shell dirname $(ROOTDIR))/gopath
|
GOPATH := $(shell dirname $(ROOTDIR))/gopath
|
||||||
SRCDIR := $(GOPATH)/src/github.com/junegunn/fzf/src
|
SRCDIR := $(GOPATH)/src/github.com/junegunn/fzf/src
|
||||||
DOCKEROPTS := -i -t -v $(ROOTDIR):/fzf/src
|
|
||||||
BINARY32 := fzf-$(GOOS)_386
|
BINARY32 := fzf-$(GOOS)_386
|
||||||
BINARY64 := fzf-$(GOOS)_amd64
|
BINARY64 := fzf-$(GOOS)_amd64
|
||||||
BINARYARM5 := fzf-$(GOOS)_arm5
|
BINARYARM5 := fzf-$(GOOS)_arm5
|
||||||
@@ -86,12 +87,6 @@ deps: $(SRCDIR) $(SOURCES)
|
|||||||
cd $(SRCDIR) && go get -tags "$(TAGS)"
|
cd $(SRCDIR) && go get -tags "$(TAGS)"
|
||||||
./deps
|
./deps
|
||||||
|
|
||||||
android-build: $(SRCDIR)
|
|
||||||
cd $(SRCDIR) && GOARCH=arm GOARM=7 CGO_ENABLED=1 go get
|
|
||||||
cd $(SRCDIR)/fzf && GOARCH=arm GOARM=7 CGO_ENABLED=1 go build -a -ldflags="-w -extldflags=-pie" -o $(BINARYARM7)
|
|
||||||
cd $(SRCDIR)/fzf && cp $(BINARYARM7) $(RELEASEARM7) && tar -czf $(RELEASEARM7).tgz $(RELEASEARM7) && \
|
|
||||||
rm -f $(RELEASEARM7)
|
|
||||||
|
|
||||||
test: deps
|
test: deps
|
||||||
SHELL=/bin/sh GOOS= go test -v -tags "$(TAGS)" ./...
|
SHELL=/bin/sh GOOS= go test -v -tags "$(TAGS)" ./...
|
||||||
|
|
||||||
@@ -129,42 +124,4 @@ $(BINDIR)/fzf: fzf/$(BINARY) | $(BINDIR)
|
|||||||
$(BINDIR):
|
$(BINDIR):
|
||||||
mkdir -p $@
|
mkdir -p $@
|
||||||
|
|
||||||
docker-arch:
|
.PHONY: all deps release release-all test install uninstall clean
|
||||||
docker build -t junegunn/arch-sandbox - < Dockerfile.arch
|
|
||||||
|
|
||||||
docker-ubuntu:
|
|
||||||
docker build -t junegunn/ubuntu-sandbox - < Dockerfile.ubuntu
|
|
||||||
|
|
||||||
docker-centos:
|
|
||||||
docker build -t junegunn/centos-sandbox - < Dockerfile.centos
|
|
||||||
|
|
||||||
docker-android:
|
|
||||||
docker build -t junegunn/android-sandbox - < Dockerfile.android
|
|
||||||
|
|
||||||
arch: docker-arch
|
|
||||||
docker run $(DOCKEROPTS) junegunn/$@-sandbox \
|
|
||||||
sh -c 'cd /fzf/src; /bin/bash'
|
|
||||||
|
|
||||||
ubuntu: docker-ubuntu
|
|
||||||
docker run $(DOCKEROPTS) junegunn/$@-sandbox \
|
|
||||||
sh -c 'cd /fzf/src; /bin/bash'
|
|
||||||
|
|
||||||
centos: docker-centos
|
|
||||||
docker run $(DOCKEROPTS) junegunn/$@-sandbox \
|
|
||||||
sh -c 'cd /fzf/src; /bin/bash'
|
|
||||||
|
|
||||||
linux: docker-centos
|
|
||||||
docker run $(DOCKEROPTS) junegunn/centos-sandbox \
|
|
||||||
/bin/bash -ci 'cd /fzf/src; make TAGS=static release'
|
|
||||||
|
|
||||||
ubuntu-android: docker-android
|
|
||||||
docker run $(DOCKEROPTS) junegunn/android-sandbox \
|
|
||||||
sh -c 'cd /fzf/src; /bin/bash'
|
|
||||||
|
|
||||||
android: docker-android
|
|
||||||
docker run $(DOCKEROPTS) junegunn/android-sandbox \
|
|
||||||
/bin/bash -ci 'cd /fzf/src; GOOS=android make android-build'
|
|
||||||
|
|
||||||
.PHONY: all deps release test install uninstall clean \
|
|
||||||
linux arch ubuntu centos docker-arch docker-ubuntu docker-centos \
|
|
||||||
android-build docker-android ubuntu-android android
|
|
||||||
|
@@ -8,7 +8,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
// Current version
|
// Current version
|
||||||
version = "0.16.4"
|
version = "0.16.6"
|
||||||
|
|
||||||
// Core
|
// Core
|
||||||
coordinatorDelayMax time.Duration = 100 * time.Millisecond
|
coordinatorDelayMax time.Duration = 100 * time.Millisecond
|
||||||
@@ -21,7 +21,6 @@ const (
|
|||||||
initialDelay = 20 * time.Millisecond
|
initialDelay = 20 * time.Millisecond
|
||||||
initialDelayTac = 100 * time.Millisecond
|
initialDelayTac = 100 * time.Millisecond
|
||||||
spinnerDuration = 200 * time.Millisecond
|
spinnerDuration = 200 * time.Millisecond
|
||||||
maxPatternLength = 100
|
|
||||||
|
|
||||||
// Matcher
|
// Matcher
|
||||||
numPartitionsMultiplier = 8
|
numPartitionsMultiplier = 8
|
||||||
|
@@ -4,5 +4,5 @@ package fzf
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
// Reader
|
// Reader
|
||||||
defaultCommand = `find -L . -path '*/\.*' -prune -o -type f -print -o -type l -print 2> /dev/null | sed s/^..//`
|
defaultCommand = `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-`
|
||||||
)
|
)
|
||||||
|
@@ -186,6 +186,7 @@ type Options struct {
|
|||||||
Margin [4]sizeSpec
|
Margin [4]sizeSpec
|
||||||
Bordered bool
|
Bordered bool
|
||||||
Tabstop int
|
Tabstop int
|
||||||
|
ClearOnExit bool
|
||||||
Version bool
|
Version bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,6 +235,7 @@ func defaultOptions() *Options {
|
|||||||
HeaderLines: 0,
|
HeaderLines: 0,
|
||||||
Margin: defaultMargin(),
|
Margin: defaultMargin(),
|
||||||
Tabstop: 8,
|
Tabstop: 8,
|
||||||
|
ClearOnExit: true,
|
||||||
Version: false}
|
Version: false}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -723,6 +725,8 @@ func parseKeymap(keymap map[int][]action, str string) {
|
|||||||
appendAction(actNextHistory)
|
appendAction(actNextHistory)
|
||||||
case "toggle-preview":
|
case "toggle-preview":
|
||||||
appendAction(actTogglePreview)
|
appendAction(actTogglePreview)
|
||||||
|
case "toggle-preview-wrap":
|
||||||
|
appendAction(actTogglePreviewWrap)
|
||||||
case "toggle-sort":
|
case "toggle-sort":
|
||||||
appendAction(actToggleSort)
|
appendAction(actToggleSort)
|
||||||
case "preview-up":
|
case "preview-up":
|
||||||
@@ -1097,6 +1101,10 @@ func parseOptions(opts *Options, allArgs []string) {
|
|||||||
nextString(allArgs, &i, "margin required (TRBL / TB,RL / T,RL,B / T,R,B,L)"))
|
nextString(allArgs, &i, "margin required (TRBL / TB,RL / T,RL,B / T,R,B,L)"))
|
||||||
case "--tabstop":
|
case "--tabstop":
|
||||||
opts.Tabstop = nextInt(allArgs, &i, "tab stop required")
|
opts.Tabstop = nextInt(allArgs, &i, "tab stop required")
|
||||||
|
case "--clear":
|
||||||
|
opts.ClearOnExit = true
|
||||||
|
case "--no-clear":
|
||||||
|
opts.ClearOnExit = false
|
||||||
case "--version":
|
case "--version":
|
||||||
opts.Version = true
|
opts.Version = true
|
||||||
default:
|
default:
|
||||||
|
@@ -46,6 +46,7 @@ type itemLine struct {
|
|||||||
current bool
|
current bool
|
||||||
selected bool
|
selected bool
|
||||||
label string
|
label string
|
||||||
|
queryLen int
|
||||||
width int
|
width int
|
||||||
result Result
|
result Result
|
||||||
}
|
}
|
||||||
@@ -199,6 +200,7 @@ const (
|
|||||||
actPrintQuery
|
actPrintQuery
|
||||||
actToggleSort
|
actToggleSort
|
||||||
actTogglePreview
|
actTogglePreview
|
||||||
|
actTogglePreviewWrap
|
||||||
actPreviewUp
|
actPreviewUp
|
||||||
actPreviewDown
|
actPreviewDown
|
||||||
actPreviewPageUp
|
actPreviewPageUp
|
||||||
@@ -293,7 +295,14 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal {
|
|||||||
strongAttr = tui.AttrRegular
|
strongAttr = tui.AttrRegular
|
||||||
}
|
}
|
||||||
var renderer tui.Renderer
|
var renderer tui.Renderer
|
||||||
if opts.Height.size > 0 {
|
if opts.Height.size == 0 || opts.Height.percent && opts.Height.size == 100 {
|
||||||
|
if tui.HasFullscreenRenderer() {
|
||||||
|
renderer = tui.NewFullscreenRenderer(opts.Theme, opts.Black, opts.Mouse)
|
||||||
|
} else {
|
||||||
|
renderer = tui.NewLightRenderer(opts.Theme, opts.Black, opts.Mouse, opts.Tabstop, opts.ClearOnExit,
|
||||||
|
true, func(h int) int { return h })
|
||||||
|
}
|
||||||
|
} else {
|
||||||
maxHeightFunc := func(termHeight int) int {
|
maxHeightFunc := func(termHeight int) int {
|
||||||
var maxHeight int
|
var maxHeight int
|
||||||
if opts.Height.percent {
|
if opts.Height.percent {
|
||||||
@@ -314,12 +323,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal {
|
|||||||
}
|
}
|
||||||
return util.Min(termHeight, util.Max(maxHeight, effectiveMinHeight))
|
return util.Min(termHeight, util.Max(maxHeight, effectiveMinHeight))
|
||||||
}
|
}
|
||||||
renderer = tui.NewLightRenderer(opts.Theme, opts.Black, opts.Mouse, opts.Tabstop, maxHeightFunc)
|
renderer = tui.NewLightRenderer(opts.Theme, opts.Black, opts.Mouse, opts.Tabstop, opts.ClearOnExit, false, maxHeightFunc)
|
||||||
} else if tui.HasFullscreenRenderer() {
|
|
||||||
renderer = tui.NewFullscreenRenderer(opts.Theme, opts.Black, opts.Mouse)
|
|
||||||
} else {
|
|
||||||
renderer = tui.NewLightRenderer(opts.Theme, opts.Black, opts.Mouse, opts.Tabstop,
|
|
||||||
func(h int) int { return h })
|
|
||||||
}
|
}
|
||||||
wordRubout := "[^[:alnum:]][[:alnum:]]"
|
wordRubout := "[^[:alnum:]][[:alnum:]]"
|
||||||
wordNext := "[[:alnum:]][^[:alnum:]]|(.$)"
|
wordNext := "[[:alnum:]][^[:alnum:]]|(.$)"
|
||||||
@@ -598,11 +602,12 @@ func (t *Terminal) resizeWindows() {
|
|||||||
width,
|
width,
|
||||||
height, tui.BorderNone)
|
height, tui.BorderNone)
|
||||||
}
|
}
|
||||||
if !t.tui.IsOptimized() && t.theme != nil && t.theme.HasBg() {
|
if !t.tui.IsOptimized() {
|
||||||
for i := 0; i < t.window.Height(); i++ {
|
for i := 0; i < t.window.Height(); i++ {
|
||||||
t.window.MoveAndClear(i, 0)
|
t.window.MoveAndClear(i, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
t.truncateQuery()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Terminal) move(y int, x int, clear bool) {
|
func (t *Terminal) move(y int, x int, clear bool) {
|
||||||
@@ -628,13 +633,19 @@ func (t *Terminal) printPrompt() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *Terminal) printInfo() {
|
func (t *Terminal) printInfo() {
|
||||||
|
pos := 0
|
||||||
if t.inlineInfo {
|
if t.inlineInfo {
|
||||||
t.move(0, t.displayWidth([]rune(t.prompt))+t.displayWidth(t.input)+1, true)
|
pos = t.displayWidth([]rune(t.prompt)) + t.displayWidth(t.input) + 1
|
||||||
|
if pos+len(" < ") > t.window.Width() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.move(0, pos, true)
|
||||||
if t.reading {
|
if t.reading {
|
||||||
t.window.CPrint(tui.ColSpinner, t.strong, " < ")
|
t.window.CPrint(tui.ColSpinner, t.strong, " < ")
|
||||||
} else {
|
} else {
|
||||||
t.window.CPrint(tui.ColPrompt, t.strong, " < ")
|
t.window.CPrint(tui.ColPrompt, t.strong, " < ")
|
||||||
}
|
}
|
||||||
|
pos += len(" < ")
|
||||||
} else {
|
} else {
|
||||||
t.move(1, 0, true)
|
t.move(1, 0, true)
|
||||||
if t.reading {
|
if t.reading {
|
||||||
@@ -643,14 +654,15 @@ func (t *Terminal) printInfo() {
|
|||||||
t.window.CPrint(tui.ColSpinner, t.strong, _spinner[idx])
|
t.window.CPrint(tui.ColSpinner, t.strong, _spinner[idx])
|
||||||
}
|
}
|
||||||
t.move(1, 2, false)
|
t.move(1, 2, false)
|
||||||
|
pos = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
output := fmt.Sprintf("%d/%d", t.merger.Length(), t.count)
|
output := fmt.Sprintf("%d/%d", t.merger.Length(), t.count)
|
||||||
if t.toggleSort {
|
if t.toggleSort {
|
||||||
if t.sort {
|
if t.sort {
|
||||||
output += "/S"
|
output += " +S"
|
||||||
} else {
|
} else {
|
||||||
output += " "
|
output += " -S"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if t.multi && len(t.selected) > 0 {
|
if t.multi && len(t.selected) > 0 {
|
||||||
@@ -659,7 +671,9 @@ func (t *Terminal) printInfo() {
|
|||||||
if t.progress > 0 && t.progress < 100 {
|
if t.progress > 0 && t.progress < 100 {
|
||||||
output += fmt.Sprintf(" (%d%%)", t.progress)
|
output += fmt.Sprintf(" (%d%%)", t.progress)
|
||||||
}
|
}
|
||||||
|
if pos+len(output) <= t.window.Width() {
|
||||||
t.window.CPrint(tui.ColInfo, 0, output)
|
t.window.CPrint(tui.ColInfo, 0, output)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Terminal) printHeader() {
|
func (t *Terminal) printHeader() {
|
||||||
@@ -726,11 +740,13 @@ func (t *Terminal) printItem(result *Result, line int, i int, current bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Avoid unnecessary redraw
|
// Avoid unnecessary redraw
|
||||||
newLine := itemLine{current: current, selected: selected, label: label, result: *result, width: 0}
|
newLine := itemLine{current: current, selected: selected, label: label,
|
||||||
|
result: *result, queryLen: len(t.input), width: 0}
|
||||||
prevLine := t.prevLines[i]
|
prevLine := t.prevLines[i]
|
||||||
if prevLine.current == newLine.current &&
|
if prevLine.current == newLine.current &&
|
||||||
prevLine.selected == newLine.selected &&
|
prevLine.selected == newLine.selected &&
|
||||||
prevLine.label == newLine.label &&
|
prevLine.label == newLine.label &&
|
||||||
|
prevLine.queryLen == newLine.queryLen &&
|
||||||
prevLine.result == newLine.result {
|
prevLine.result == newLine.result {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -944,7 +960,7 @@ func (t *Terminal) printPreview() {
|
|||||||
trimmed, _ = t.trimRight(trimmed, maxWidth-t.pwindow.X())
|
trimmed, _ = t.trimRight(trimmed, maxWidth-t.pwindow.X())
|
||||||
}
|
}
|
||||||
str, _ = t.processTabs(trimmed, 0)
|
str, _ = t.processTabs(trimmed, 0)
|
||||||
if ansi != nil && ansi.colored() {
|
if t.theme != nil && ansi != nil && ansi.colored() {
|
||||||
fillRet = t.pwindow.CFill(ansi.fg, ansi.bg, ansi.attr, str)
|
fillRet = t.pwindow.CFill(ansi.fg, ansi.bg, ansi.attr, str)
|
||||||
} else {
|
} else {
|
||||||
fillRet = t.pwindow.Fill(str)
|
fillRet = t.pwindow.Fill(str)
|
||||||
@@ -1210,6 +1226,12 @@ func (t *Terminal) buildPlusList(template string, forcePlus bool) (bool, []*Item
|
|||||||
return true, sels
|
return true, sels
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *Terminal) truncateQuery() {
|
||||||
|
maxPatternLength := util.Max(1, t.window.Width()-t.displayWidth([]rune(t.prompt))-1)
|
||||||
|
t.input, _ = t.trimRight(t.input, maxPatternLength)
|
||||||
|
t.cx = util.Constrain(t.cx, 0, len(t.input))
|
||||||
|
}
|
||||||
|
|
||||||
// Loop is called to start Terminal I/O
|
// Loop is called to start Terminal I/O
|
||||||
func (t *Terminal) Loop() {
|
func (t *Terminal) Loop() {
|
||||||
// prof := profile.Start(profile.ProfilePath("/tmp/"))
|
// prof := profile.Start(profile.ProfilePath("/tmp/"))
|
||||||
@@ -1443,6 +1465,11 @@ func (t *Terminal) Loop() {
|
|||||||
}
|
}
|
||||||
req(reqList, reqInfo, reqHeader)
|
req(reqList, reqInfo, reqHeader)
|
||||||
}
|
}
|
||||||
|
case actTogglePreviewWrap:
|
||||||
|
if t.hasPreviewWindow() {
|
||||||
|
t.preview.wrap = !t.preview.wrap
|
||||||
|
req(reqPreviewRefresh)
|
||||||
|
}
|
||||||
case actToggleSort:
|
case actToggleSort:
|
||||||
t.sort = !t.sort
|
t.sort = !t.sort
|
||||||
t.eventBox.Set(EvtSearchNew, t.sort)
|
t.eventBox.Set(EvtSearchNew, t.sort)
|
||||||
@@ -1688,11 +1715,7 @@ func (t *Terminal) Loop() {
|
|||||||
if !doActions(actions, mapkey) {
|
if !doActions(actions, mapkey) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// Truncate the query if it's too long
|
t.truncateQuery()
|
||||||
if len(t.input) > maxPatternLength {
|
|
||||||
t.input = t.input[:maxPatternLength]
|
|
||||||
t.cx = util.Constrain(t.cx, 0, maxPatternLength)
|
|
||||||
}
|
|
||||||
changed = string(previousInput) != string(t.input)
|
changed = string(previousInput) != string(t.input)
|
||||||
} else {
|
} else {
|
||||||
if mapkey == tui.Rune {
|
if mapkey == tui.Rune {
|
||||||
|
@@ -74,6 +74,7 @@ type LightRenderer struct {
|
|||||||
theme *ColorTheme
|
theme *ColorTheme
|
||||||
mouse bool
|
mouse bool
|
||||||
forceBlack bool
|
forceBlack bool
|
||||||
|
clearOnExit bool
|
||||||
prevDownTime time.Time
|
prevDownTime time.Time
|
||||||
clickY []int
|
clickY []int
|
||||||
ttyin *os.File
|
ttyin *os.File
|
||||||
@@ -106,15 +107,16 @@ type LightWindow struct {
|
|||||||
bg Color
|
bg Color
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLightRenderer(theme *ColorTheme, forceBlack bool, mouse bool, tabstop int, maxHeightFunc func(int) int) Renderer {
|
func NewLightRenderer(theme *ColorTheme, forceBlack bool, mouse bool, tabstop int, clearOnExit bool, fullscreen bool, maxHeightFunc func(int) int) Renderer {
|
||||||
r := LightRenderer{
|
r := LightRenderer{
|
||||||
theme: theme,
|
theme: theme,
|
||||||
forceBlack: forceBlack,
|
forceBlack: forceBlack,
|
||||||
mouse: mouse,
|
mouse: mouse,
|
||||||
|
clearOnExit: clearOnExit,
|
||||||
ttyin: openTtyIn(),
|
ttyin: openTtyIn(),
|
||||||
yoffset: 0,
|
yoffset: 0,
|
||||||
tabstop: tabstop,
|
tabstop: tabstop,
|
||||||
fullscreen: false,
|
fullscreen: fullscreen,
|
||||||
upOneLine: false,
|
upOneLine: false,
|
||||||
maxHeightFunc: maxHeightFunc}
|
maxHeightFunc: maxHeightFunc}
|
||||||
return &r
|
return &r
|
||||||
@@ -174,11 +176,7 @@ func (r *LightRenderer) Init() {
|
|||||||
}
|
}
|
||||||
r.origState = origState
|
r.origState = origState
|
||||||
terminal.MakeRaw(fd)
|
terminal.MakeRaw(fd)
|
||||||
terminalHeight, capHeight := r.updateTerminalSize()
|
r.updateTerminalSize()
|
||||||
if capHeight == terminalHeight {
|
|
||||||
r.fullscreen = true
|
|
||||||
r.height = terminalHeight
|
|
||||||
}
|
|
||||||
initTheme(r.theme, r.defaultTheme(), r.forceBlack)
|
initTheme(r.theme, r.defaultTheme(), r.forceBlack)
|
||||||
|
|
||||||
if r.fullscreen {
|
if r.fullscreen {
|
||||||
@@ -240,20 +238,15 @@ func getEnv(name string, defaultValue int) int {
|
|||||||
return atoi(env, defaultValue)
|
return atoi(env, defaultValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *LightRenderer) updateTerminalSize() (int, int) {
|
func (r *LightRenderer) updateTerminalSize() {
|
||||||
width, height, err := terminal.GetSize(r.fd())
|
width, height, err := terminal.GetSize(r.fd())
|
||||||
if err == nil {
|
if err == nil {
|
||||||
r.width = width
|
r.width = width
|
||||||
if r.fullscreen {
|
|
||||||
r.height = height
|
|
||||||
} else {
|
|
||||||
r.height = r.maxHeightFunc(height)
|
r.height = r.maxHeightFunc(height)
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
r.width = getEnv("COLUMNS", defaultWidth)
|
r.width = getEnv("COLUMNS", defaultWidth)
|
||||||
r.height = r.maxHeightFunc(getEnv("LINES", defaultHeight))
|
r.height = r.maxHeightFunc(getEnv("LINES", defaultHeight))
|
||||||
}
|
}
|
||||||
return height, r.height
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *LightRenderer) getch(nonblock bool) (int, bool) {
|
func (r *LightRenderer) getch(nonblock bool) (int, bool) {
|
||||||
@@ -552,6 +545,9 @@ func (r *LightRenderer) Resume() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *LightRenderer) Clear() {
|
func (r *LightRenderer) Clear() {
|
||||||
|
if r.fullscreen {
|
||||||
|
r.csi("H")
|
||||||
|
}
|
||||||
// r.csi("u")
|
// r.csi("u")
|
||||||
r.origin()
|
r.origin()
|
||||||
r.csi("J")
|
r.csi("J")
|
||||||
@@ -568,6 +564,7 @@ func (r *LightRenderer) Refresh() {
|
|||||||
|
|
||||||
func (r *LightRenderer) Close() {
|
func (r *LightRenderer) Close() {
|
||||||
// r.csi("u")
|
// r.csi("u")
|
||||||
|
if r.clearOnExit {
|
||||||
if r.fullscreen {
|
if r.fullscreen {
|
||||||
r.rmcup()
|
r.rmcup()
|
||||||
} else {
|
} else {
|
||||||
@@ -577,6 +574,11 @@ func (r *LightRenderer) Close() {
|
|||||||
}
|
}
|
||||||
r.csi("J")
|
r.csi("J")
|
||||||
}
|
}
|
||||||
|
} else if r.fullscreen {
|
||||||
|
r.csi("G")
|
||||||
|
} else {
|
||||||
|
r.move(r.height, 0)
|
||||||
|
}
|
||||||
if r.mouse {
|
if r.mouse {
|
||||||
r.csi("?1000l")
|
r.csi("?1000l")
|
||||||
}
|
}
|
||||||
@@ -593,7 +595,7 @@ func (r *LightRenderer) MaxY() int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *LightRenderer) DoesAutoWrap() bool {
|
func (r *LightRenderer) DoesAutoWrap() bool {
|
||||||
return true
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *LightRenderer) IsOptimized() bool {
|
func (r *LightRenderer) IsOptimized() bool {
|
||||||
|
@@ -513,11 +513,11 @@ class TestGoFZF < TestBase
|
|||||||
tmux.send_keys "seq 1 111 | #{fzf "-m +s --tac #{opt} -q11"}", :Enter
|
tmux.send_keys "seq 1 111 | #{fzf "-m +s --tac #{opt} -q11"}", :Enter
|
||||||
tmux.until { |lines| lines[-3].include? '> 111' }
|
tmux.until { |lines| lines[-3].include? '> 111' }
|
||||||
tmux.send_keys :Tab
|
tmux.send_keys :Tab
|
||||||
tmux.until { |lines| lines[-2].include? '4/111 (1)' }
|
tmux.until { |lines| lines[-2].include? '4/111 -S (1)' }
|
||||||
tmux.send_keys 'C-R'
|
tmux.send_keys 'C-R'
|
||||||
tmux.until { |lines| lines[-3].include? '> 11' }
|
tmux.until { |lines| lines[-3].include? '> 11' }
|
||||||
tmux.send_keys :Tab
|
tmux.send_keys :Tab
|
||||||
tmux.until { |lines| lines[-2].include? '4/111/S (2)' }
|
tmux.until { |lines| lines[-2].include? '4/111 +S (2)' }
|
||||||
tmux.send_keys :Enter
|
tmux.send_keys :Enter
|
||||||
assert_equal ['111', '11'], readonce.split($/)
|
assert_equal ['111', '11'], readonce.split($/)
|
||||||
end
|
end
|
||||||
@@ -1296,6 +1296,14 @@ class TestGoFZF < TestBase
|
|||||||
tmux.until { |lines| lines[4] == '> 3' }
|
tmux.until { |lines| lines[4] == '> 3' }
|
||||||
tmux.until { |_| %w[1 2 3] == File.readlines(tempname).map(&:chomp) }
|
tmux.until { |_| %w[1 2 3] == File.readlines(tempname).map(&:chomp) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_no_clear
|
||||||
|
tmux.send_keys 'seq 100 | fzf --no-clear --inline-info --height 5', :Enter
|
||||||
|
prompt = '> < 100/100'
|
||||||
|
tmux.until { |lines| lines[-1] == prompt }
|
||||||
|
tmux.send_keys :Enter
|
||||||
|
tmux.until { |lines| lines[-2] == prompt && lines[-1] == '1' }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
module TestShell
|
module TestShell
|
||||||
@@ -1408,6 +1416,7 @@ module TestShell
|
|||||||
tmux.send_keys 'C-r'
|
tmux.send_keys 'C-r'
|
||||||
tmux.until { |lines| lines.item_count > 0 }
|
tmux.until { |lines| lines.item_count > 0 }
|
||||||
end
|
end
|
||||||
|
tmux.send_keys 'C-r'
|
||||||
tmux.send_keys '3d'
|
tmux.send_keys '3d'
|
||||||
tmux.until { |lines| lines[-3].end_with? 'echo 3rd' }
|
tmux.until { |lines| lines[-3].end_with? 'echo 3rd' }
|
||||||
tmux.send_keys :Enter
|
tmux.send_keys :Enter
|
||||||
|
Reference in New Issue
Block a user