Intereting Posts
Как заставить устройство монтироваться как хранилище для массовых коммуникаций (MMS), а не протокол передачи мультимедиа (MTP)? Не удалось получить доступ к systemd –user из-за разрешений доступа DBus Переименовать подмножество файлов в каталоге Имя хоста в аудиторских отчетах не отображается Лучше ли регулярно обновлять mysql, php и apache на linux в текущей версии? Разница в сумме вывода pacsysclean vs. expac с использованием awk? dd для клонирования с меньшим sdcard Получение полного имени пути к заданному каталогу xargs, записи и стандартный ввод Установка Linux на внешний жесткий диск и многозадачность с помощью Windows 7/8 zsh: SHARE_HISTORY или INC_APPEND_HISTORY перерывы EXTENDED_HISTORY Печатать случайные строки в соответствии с порядком исходного файла Как окончательно удалить псевдоним из моей оболочки Сценарий слияния слов Как выполнить двойную загрузку Win7 и Mint17 на / dev / sdb?

Добавить аргументы из предыдущей команды для завершения zsh

В zsh (а также bash) вы можете использовать некоторые расширения слова истории для обозначения аргументов предыдущих команд.

В этом примере показано получение второго параметра из предыдущей команды в истории с помощью !:# расширения:

 % echo foo bar baz foo bar baz % echo !:2 echo bar bar 

Я часто забываю точно, что # параметр является конкретным аргументом и набирает !:# Не всегда так быстро, когда я помню, какой аргумент это. Я знаю о meta-. для замены последнего аргумента, но иногда это не последний аргумент, который я хочу.

Я хотел бы добавить аргументы из предыдущей команды в качестве предложений для завершения любой команды, которую я печатаю в zsh.

Я смог выяснить, как создать функцию оболочки, которая может создать массив аргументов (0..N) из последней команды и привязать ее к определенной команде.

 _last_command_args() { last_command=$history[$[HISTCMD-1]] last_command_array=("${(s/ /)last_command}") _sep_parts last_command_array } # trying to get last_command_args to be suggested for any command, this just works for foo compdef _last_command_args foo 

Это то, что похоже на завершение только foo, когда я нажимаю клавишу табуляции в <TAB> :

 % echo bar baz qux bar baz qux % foo <TAB> bar baz echo qux 

Это отлично подходит для завершения команды «foo», но я бы хотел, чтобы они были параметрами для любого расширения zsh, которое я делаю. Я думаю, что это как-то связано с zstyle дополнением, но после нескольких часов взлома я понял, что я не в своей глубине.

Как я могу получить аргументы из моей предыдущей команды в качестве предлагаемых дополнений для любой команды в zsh?

У меня есть полный файл компиляции zshrc, который можно разделить на битбакет, если это поможет. Многие из них вырезаны из разных источников, а некоторые из них я сам взломал.

ОБНОВИТЬ:

Ответ @Julien Nicoulaud заставил меня приблизиться, я отмечаю это так, как принято, поскольку он доставил меня туда, где мне нужно было добраться.

С моей конкретной конфигурацией, используя предлагаемые:

 zstyle ':completion:*' completer _last_command_args _complete 

Не совсем работала для меня, поскольку это вызывало завершение табуляции, чтобы отображать только список аргументов из последней команды (хотя на самом деле они заполнялись именами файлов, а просто не отображали их). Изменение порядка на _complete _last_command_args . Он отображает обычные имена файлов, но не last_command_args

Я предполагаю, что это имеет какое-то отношение к тому, как это работает. Я думаю, что он отображает только результат первого метода, который возвращается успешно, но у меня возникли проблемы с разбором источника zsh, чтобы полностью понять, что происходит. Я смог настроить мой метод, чтобы включить вызов _complete чтобы он показывал как последние команды аргументов, так и обычные файлы автозаполнения. Не совсем как разделенный, но работает достаточно хорошо для меня.

Вот полная функция, которую я использовал вместе с другими материалами zstyle, которые у меня есть:

 # adds the arguments from the last commadn to the autocomplete list # I wasn't able to get this to work standalone and still print out both regular # completion plus the last args, but this works well enough. _complete_plus_last_command_args() { last_command=$history[$[HISTCMD-1]] last_command_array=("${(s/ /)last_command}") _sep_parts last_command_array _complete } _force_rehash() { (( CURRENT == 1 )) && rehash return 1 # Because we didn't really complete anything } zstyle ':completion:::::' completer _force_rehash _complete_plus_last_command_args _approximate 

Другие строки zstyle, которые мне нужны, не нужны для этого, но могут повлиять на то, почему это работает для меня:

 zstyle -e ':completion:*:approximate:*' max-errors 'reply=( $(( ($#PREFIX + $#SUFFIX) / 3 )) )' zstyle ':completion:*:descriptions' format "- %d -" zstyle ':completion:*:corrections' format "- %d - (errors %e})" zstyle ':completion:*:default' list-prompt '%S%M matches%s' zstyle ':completion:*' group-name '' zstyle ':completion:*:manuals' separate-sections true zstyle ':completion:*' menu select zstyle ':completion:*' verbose yes 

Теперь, если я вхожу в каталог с file1.txt и file2.txt , а моя последняя команда была echo foo bar baz , я получаю это для автозаполнения, которое именно то, что я хотел:

 % ls bar baz echo foo - files - file1.txt file2.txt 

Вы можете добавить свой экземпляр в список дополнений, используемых по умолчанию:

 zstyle ':completion:*' completer _last_command_args _complete