Добавьте следующее в ваш .bash_profile
или .bashrc
и запустите новый сеанс:
function _complete_open {
cur=$2
COMPREPLY=( );
[[ "$COMP_WORDS" = "open" ]] || return
[[ "${COMP_WORDS[ $(( $COMP_CWORD - 1 )) ]}" = "-a" ]] || return
OLDIFS="$IFS"
IFS=$'\n'
local _part="${COMP_WORDS[$COMP_CWORD]}"
if [[ "${_part:0:1}" = '"' || "${_part:0:1}" = "'" ]] ; then
COMPREPLY=( $( compgen -W "$( mdfind kMDItemKind==Application | sed -e 's|.*/||g' -e 's|.app$||' | sort -u )" -- $cur ) )
else
COMPREPLY=( $( compgen -W "$( mdfind kMDItemKind==Application | sed -e 's|.*/||g' -e 's|.app$||' -e 's| |\\\\ |g' | sort -u )" -- $cur ) )
fi
IFS="$OLDIFS"
}
complete -o default -F _complete_open open
Не нужно ничего устанавливать. Это работает с bash
из коробки.
Он будет автоматически заполнять имена программ только в том случае, если предыдущая опция имеет -a
и, в противном случае, будет отображать поведение по умолчанию, например, вернет список всех файлов в текущем каталоге или завершит префикс текущего пути.
Получены результаты system_profiler SPApplicationsDataType
, что является самым простым способом получить все приложения, которые могут быть запущены таким образом в вашей системе. Список обрабатывается так, чтобы возвращать только имена программ, которые могут содержать пробелы и могут отличаться от имен пакетов (даже если игнорируется .app
суффикс)
Использование: введите open -a
, затем пробел, затем нажмите Tab
или Esc
(дважды в моей системе, не уверен, что это везде).
Пример, показывающий все вспомогательные приложения для моего сканера:
$ open -a Scan
Scan to E-mail Scan to Excel Scan to Folder Scan to Print Scan to Searchable PDF Scan to Word ScanSnap Manager
Недостатки и проблемы этого решения:
В вашей системе есть тонны программ, о которых вы, возможно, и не подозреваете, как и все остальное /System/Library/CoreServices
. Возможно, вы не захотите перечислить все из них. ОТО, это действительно легко увидеть и запустить, например, CharacterPalette
или KeyboardViewer
так. * Настройте mdfind
вызов (ы) соответствующим образом с -onlyin
аргументом.
Это вроде медленно, из-за system_profiler SPApplicationsDataType
. Возможно, вам придется подождать секунду или две, прежде чем завершится обнаружение. Теперь использует mdfind
для быстрого получения программ. Спасибо @Lri
Он может обрабатывать пробелы в именах приложений и заключать в кавычки имена программ, но это довольно странно. Требуется, чтобы в качестве первого символа использовалась кавычка: пока Scan" to "P
она действительна bash
, эта программа не обнаружит ее. Завершение также не работает после пробела (например Scan\ to
), используйте кавычки в таких случаях ( "Scan to
). Поддержка сбежавших пространств только хорошо завершить DVD
к DVD\ Player
.