summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2020-03-29 21:26:52 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2020-03-29 21:30:37 +0900
commit18261fe31cf1270f9aa783f99bbdbca343f89479 (patch)
treef7301ce7be8c5b80761ceeed6d75669766aea364
parent079046863c0a9f5bc37d629bab02dccffcf329bc (diff)
[shell] Update CTRL-R to remove duplicate commands
Close #1940 Related: #1363 #749 #270 #49 #88 #492 #600
-rw-r--r--shell/key-bindings.bash2
-rw-r--r--shell/key-bindings.zsh2
-rwxr-xr-xtest/test_go.rb7
3 files changed, 7 insertions, 4 deletions
diff --git a/shell/key-bindings.bash b/shell/key-bindings.bash
index 71cd9991..16e1ec5b 100644
--- a/shell/key-bindings.bash
+++ b/shell/key-bindings.bash
@@ -55,7 +55,7 @@ __fzf_history__() {
local output
output=$(
builtin fc -lnr -2147483648 |
- last_hist=$(HISTTIMEFORMAT='' builtin history 1) perl -p -l0 -e 'BEGIN { getc; $/ = "\n\t"; $HISTCMD = $ENV{last_hist} + 1 } s/^[ *]//; $_ = $HISTCMD - $. . "\t$_"' |
+ last_hist=$(HISTTIMEFORMAT='' builtin history 1) perl -n -l0 -e 'BEGIN { getc; $/ = "\n\t"; $HISTCMD = $ENV{last_hist} + 1 } s/^[ *]//; print $HISTCMD - $. . "\t$_" if !$seen{$_}++' |
FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort $FZF_CTRL_R_OPTS +m --read0" $(__fzfcmd) --query "$READLINE_LINE"
) || return
READLINE_LINE=${output#*$'\t'}
diff --git a/shell/key-bindings.zsh b/shell/key-bindings.zsh
index e291677d..79b83880 100644
--- a/shell/key-bindings.zsh
+++ b/shell/key-bindings.zsh
@@ -68,7 +68,7 @@ bindkey '\ec' fzf-cd-widget
fzf-history-widget() {
local selected num
setopt localoptions noglobsubst noposixbuiltins pipefail no_aliases 2> /dev/null
- selected=( $(fc -rl 1 |
+ selected=( $(fc -rl 1 | perl -ne 'print if !$seen{($_ =~ s/^\s*[0-9]+\s+//r)}++' |
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=$?
if [ -n "$selected" ]; then
diff --git a/test/test_go.rb b/test/test_go.rb
index 765108ca..83d189f5 100755
--- a/test/test_go.rb
+++ b/test/test_go.rb
@@ -1839,15 +1839,18 @@ module TestShell
tmux.send_keys 'echo 1st', :Enter; tmux.prepare
tmux.send_keys 'echo 2nd', :Enter; tmux.prepare
tmux.send_keys 'echo 3d', :Enter; tmux.prepare
- tmux.send_keys 'echo 3rd', :Enter; tmux.prepare
+ 3.times { tmux.send_keys 'echo 3rd', :Enter; tmux.prepare }
tmux.send_keys 'echo 4th', :Enter
retries do
tmux.prepare
tmux.send_keys 'C-r'
tmux.until { |lines| lines.match_count.positive? }
end
- tmux.send_keys 'C-r'
tmux.send_keys '3d'
+ # Duplicates removed: 3d (1) + 3rd (1) => 2 matches
+ tmux.until { |lines| lines.match_count == 2 }
+ tmux.until { |lines| lines[-3].end_with? 'echo 3d' }
+ tmux.send_keys 'C-r'
tmux.until { |lines| lines[-3].end_with? 'echo 3rd' }
tmux.send_keys :Enter
tmux.until { |lines| lines[-1] == 'echo 3rd' }