Вопрос или проблема
Предположим, у меня есть следующая структура каталогов:
folder/
aaa/
f.txt
bbb/
f.txt
Я хочу сравнить файл f.txt
, так как он присутствует в обоих каталогах. Поэтому в zsh я набираю это:
% diff folder/{aaa,bbb}/
Приятно, что zsh автоматически дополняет как каталоги aaa
, так и bbb
даже внутри фигурных скобок. Затем я нажимаю клавишу Tab в надежде, что zsh дополнит любые файлы, общие для обоих каталогов aaa
и bbb
, поэтому я надеюсь, что нажатие Tab приведет к этому:
% diff folder/{aaa,bbb}/f.txt
Тем не менее, то, что на самом деле делает zsh, это разворачивает скобки, что приводит к этому:
% diff folder/aaa/ folder/bbb/
Мои вопросы следующие:
-
Существует ли в zsh настройка(и), чтобы сохранить скобки в середине каталога и дополнить общее имя файла, как я описал?
-
Если нет, есть ли способ написать пользовательскую функцию для достижения этого?
Ответ или решение
Существует ряд подходов для решения задачи автодополнения в Zsh, особенно когда дело касается работы с фигурными скобками внутри путей к директориям. Давайте рассмотрим теорию, возможные примеры и применение на практике.
Теория
Zsh – это мощный интерпретатор командной строки, известный своей гибкостью и возможностями настройки. Важной его особенностью является автодополнение, которое существенно ускоряет работу в командной строке, облегчая ввод и предотвращая ошибки.
Основополагающий принцип автодополнения в Zsh заключается в использовании комплешн-системы, позволяющей настраивать и расширять стандартное поведение. Однако, когда речь заходит о фигурных скобках, Zsh интерпретирует их как оператор расширения, что приводит к их раскрытию, как в вашем случае.
Пример
В вашем примере вы пытаетесь выполнить команду:
% diff folder/{aaa,bbb}/
При этом Zsh раскрывает скобки, преобразуя их в отдельные пути folder/aaa/
и folder/bbb/
. Это поведение стандартно для Zsh. Однако, когда вы хотите, чтобы это автодополнение подсказало файл, присутствующий в обеих директориях, система компондации не рассматривает содержимое фигурных скобок как единое целое.
Практическое применение
Встроенные настройки
На данный момент в Zsh нет прямолинейного варианта переключения, позволяющего настроить автодополнение таким образом, чтобы оно рассматривало данный случай, не раскрывая фигурные скобки. Однако можно попытаться обойти ограничение стандартными средствами:
-
Изучите возможности настройки автодополнения в zstyle:
Вы можете попытаться настроить систему автодополнения черезzstyle
, хотя полного решения для вашего конкретного случая может не быть. Например, вы можете установить:zstyle ':completion:*' menu select
Это позволит переключаться между всеми возможными вариантами автодополнения с помощью клавиш стрелок.
-
Альтернативные подходы:
- Используйте скрипт, чтобы предварительно собрать имена файлов, которые есть в обоих каталогах. Это можно сделать через команду UNIX, например,
comm
илиawk
, и затем передать результат напрямую в командуdiff
или заливать его в переменную для последующего использования вzsh
.
- Используйте скрипт, чтобы предварительно собрать имена файлов, которые есть в обоих каталогах. Это можно сделать через команду UNIX, например,
Создание собственной функции
Если стандартные средства не решают задачу, можно создать кастомную функцию или скрипт на языке shell:
-
Пример функции:
Помните, что вам необходимо будет использовать Unix-команды для предварительной выборки файлов, после чего запустить
diff
:compare_common_files() { local files=$(ls folder/aaa | sort) local common_files=() for file in $files; do if [[ -f "folder/bbb/$file" ]]; then common_files+=("$file") fi done for file in "${common_files[@]}"; do echo "Comparing $file" diff folder/aaa/$file folder/bbb/$file done }
Добавьте функцию в ваш файл конфигурации
~/.zshrc
или.zsh_functions
, чтобы она была доступна в интерактивной сессии Zsh. -
Применение функции:
Вы можете вызывать эту функцию при необходимости:
% compare_common_files
Эта функция будет находить общие файлы и сравнивать их.
Заключение
В данном контексте ключевым моментом является понимание, что Zsh не может из коробки обеспечить подобную вами функциональность без определенных модификаций и обхождения стандартного поведения. При использовании настройки автодополнения и, возможно, создания собственных скриптов, вы всё же можете достичь желаемого решения. Это демонстрирует, насколько мощной и настраиваемой может быть оболочка Zsh.
Таким образом, рассмотренные методы предоставляют возможности для более широкого использования Zsh, раскрывая его потенциал в сложных задачах автоматизации и оптимизации повседневной работы. Успехов вам в реализации такой системы под ваши нужды!