annotate .zfun/zsh-autosuggestions/src/strategies/match_prev_cmd.zsh @ 477:8373f6924e50

emacs: kludge around a case of emacs being too clever for me
author Augie Fackler <raf@durin42.com>
date Thu, 21 Feb 2019 19:54:55 -0500
parents e1ce8897030d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
467
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
1
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
2 #--------------------------------------------------------------------#
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
3 # Match Previous Command Suggestion Strategy #
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
4 #--------------------------------------------------------------------#
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
5 # Suggests the most recent history item that matches the given
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
6 # prefix and whose preceding history item also matches the most
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
7 # recently executed command.
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
8 #
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
9 # For example, suppose your history has the following entries:
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
10 # - pwd
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
11 # - ls foo
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
12 # - ls bar
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
13 # - pwd
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
14 #
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
15 # Given the history list above, when you type 'ls', the suggestion
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
16 # will be 'ls foo' rather than 'ls bar' because your most recently
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
17 # executed command (pwd) was previously followed by 'ls foo'.
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
18 #
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
19 # Note that this strategy won't work as expected with ZSH options that don't
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
20 # preserve the history order such as `HIST_IGNORE_ALL_DUPS` or
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
21 # `HIST_EXPIRE_DUPS_FIRST`.
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
22
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
23 _zsh_autosuggest_strategy_match_prev_cmd() {
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
24 # Reset options to defaults and enable LOCAL_OPTIONS
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
25 emulate -L zsh
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
26
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
27 # Enable globbing flags so that we can use (#m)
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
28 setopt EXTENDED_GLOB
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
29
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
30 # TODO: Use (b) flag when we can drop support for zsh older than v5.0.8
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
31 local prefix="${1//(#m)[\\*?[\]<>()|^~#]/\\$MATCH}"
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
32
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
33 # Get all history event numbers that correspond to history
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
34 # entries that match pattern $prefix*
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
35 local history_match_keys
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
36 history_match_keys=(${(k)history[(R)$prefix*]})
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
37
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
38 # By default we use the first history number (most recent history entry)
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
39 local histkey="${history_match_keys[1]}"
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
40
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
41 # Get the previously executed command
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
42 local prev_cmd="$(_zsh_autosuggest_escape_command "${history[$((HISTCMD-1))]}")"
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
43
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
44 # Iterate up to the first 200 history event numbers that match $prefix
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
45 for key in "${(@)history_match_keys[1,200]}"; do
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
46 # Stop if we ran out of history
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
47 [[ $key -gt 1 ]] || break
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
48
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
49 # See if the history entry preceding the suggestion matches the
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
50 # previous command, and use it if it does
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
51 if [[ "${history[$((key - 1))]}" == "$prev_cmd" ]]; then
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
52 histkey="$key"
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
53 break
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
54 fi
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
55 done
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
56
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
57 # Give back the matched history entry
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
58 typeset -g suggestion="$history[$histkey]"
e1ce8897030d zsh: import df6f6f9ff41 of zsh-autosuggestions
Augie Fackler <raf@durin42.com>
parents:
diff changeset
59 }