fix: merge SSH hosts from .ssh/config with known_hosts

Fixes #2737

- Modified common-aliases plugin to merge hosts from .ssh/config with
  known_hosts instead of overriding them
- This ensures .ssh/config hosts take priority over /etc/hosts entries
- Maintains backward compatibility by including both sources
- Uses sort -u to remove duplicates while preserving order

The issue was that the common-aliases plugin was overriding the SSH
plugin's host completion configuration, causing /etc/hosts entries
to take priority over .ssh/config entries when completing SSH hostnames.

Now both sources are merged, giving users access to all configured
hosts while maintaining the expected priority order.
This commit is contained in:
Paul Frederiksen 2025-09-11 15:38:19 -04:00
commit 7df13688df

View file

@ -87,4 +87,5 @@ if is-at-least 4.2.0; then
fi
# Make zsh know about hosts already accessed by SSH
zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%[# ]*}//,/ })'
# Merge with existing hosts from .ssh/config instead of overriding
zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%[# ]*}//,/ } ${(f)"$(cat ~/.ssh/config 2>/dev/null | grep -E "^Host " | awk '"'"'{for (i=2; i<=NF; i++) print $i}'"'"' | grep -v '"'"'^*'"'"' | sed '"'"'s/\.*\*$//'"'"')"} | sort -u)'