summaryrefslogtreecommitdiff
path: root/debian/examples/ssh_completion
diff options
context:
space:
mode:
Diffstat (limited to 'debian/examples/ssh_completion')
-rw-r--r--debian/examples/ssh_completion66
1 files changed, 66 insertions, 0 deletions
diff --git a/debian/examples/ssh_completion b/debian/examples/ssh_completion
new file mode 100644
index 000000000..53e61d193
--- /dev/null
+++ b/debian/examples/ssh_completion
@@ -0,0 +1,66 @@
+NOTE: In order for this to work with newer versions of ssh, you must
+insure that "HashKnownHosts" is set to "no".
+
+This will set the variable $hosts to an array containing
+all the hosts in ~/.ssh/known_hosts and ~/.ssh/known_hosts2
+that do not start with a digit.
+
+hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts <$HOME/.ssh/known_hosts2)"}:#[0-9]*}%%\ *}%%,*})
+
+This will set the variable $hosts to an array containing
+all the hosts in ~/.ssh/known_hosts that do not start with
+a digit.
+
+hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[0-9]*}%%\ *}%%,*})
+
+If you are using the new completion system, you can then place
+
+zstyle ':completion:*:hosts' hosts $hosts
+
+after compinit is autoloaded to use those anywhere hosts would be
+completed, or
+
+zstyle ':completion:*:complete:ssh:*:hosts' hosts $hosts
+
+to use those hosts to complete only ssh.
+
+An explanation of the $hosts assignment, written by Peter Stephenson,
+follows.
+
+$(<$HOME/.ssh/known_hosts)
+
+is a standard substitution: it simply takes the file and sticks it onto the
+command line at that point.
+
+"$(<$HOME/.ssh/known_hosts)"
+
+Now it's quoted, it doesn't do word splitting; we have the complete file as
+one word. From now on, we do nested substitutions: you just have to
+remember that ${${...}}, or ${${...}}, essentially does nothing but an
+ordinary parameter expansion --- the whole point is the extra bits tacked
+on with each extra set of braces. For example, we're now going to do
+
+${(f)"$(<$HOME/.ssh/known_hosts)"}
+
+so we get the same answer, but with the effect of putting the (f) flag at
+the start, which splits the result of that into lines. So we now have the
+entire file as an array, one line per element.
+
+${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[0-9]*}
+(Clint says the ^ shouldn't be there) says take the array elements (= lines
+of the original file) which completely match [0-9]*, i.e. elements
+beginning with a digit, and remove them, which is what ${...:#...} is for.
+
+${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[0-9]*}%%\ *}
+
+takes the result of that, and strips off from the end the largest pattern
+matching ' *', i.e. a space followed by anything else, in other words it
+leaves the largest initial string with no whitespace, which is a hostname
+(this is a standard ${...%%...} which even ordinary shells do, although not
+nested).
+
+${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[0-9]*}%%\ *}%%,*}
+
+does another strip at the end, this time for everything from the first
+comma on. If there wasn't a comma, nothing changes. You could have
+combined the last two as ${...%%[[:blank:],]*}, or something.