zsh – автозаполнение со скобками в середине каталога

Вопрос или проблема

Предположим, у меня есть следующая структура каталогов:

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/

Мои вопросы следующие:

  1. Существует ли в zsh настройка(и), чтобы сохранить скобки в середине каталога и дополнить общее имя файла, как я описал?

  2. Если нет, есть ли способ написать пользовательскую функцию для достижения этого?

Ответ или решение

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

Теория

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

Основополагающий принцип автодополнения в Zsh заключается в использовании комплешн-системы, позволяющей настраивать и расширять стандартное поведение. Однако, когда речь заходит о фигурных скобках, Zsh интерпретирует их как оператор расширения, что приводит к их раскрытию, как в вашем случае.

Пример

В вашем примере вы пытаетесь выполнить команду:

% diff folder/{aaa,bbb}/

При этом Zsh раскрывает скобки, преобразуя их в отдельные пути folder/aaa/ и folder/bbb/. Это поведение стандартно для Zsh. Однако, когда вы хотите, чтобы это автодополнение подсказало файл, присутствующий в обеих директориях, система компондации не рассматривает содержимое фигурных скобок как единое целое.

Практическое применение

Встроенные настройки

На данный момент в Zsh нет прямолинейного варианта переключения, позволяющего настроить автодополнение таким образом, чтобы оно рассматривало данный случай, не раскрывая фигурные скобки. Однако можно попытаться обойти ограничение стандартными средствами:

  1. Изучите возможности настройки автодополнения в zstyle:
    Вы можете попытаться настроить систему автодополнения через zstyle, хотя полного решения для вашего конкретного случая может не быть. Например, вы можете установить:

    zstyle ':completion:*' menu select

    Это позволит переключаться между всеми возможными вариантами автодополнения с помощью клавиш стрелок.

  2. Альтернативные подходы:

    • Используйте скрипт, чтобы предварительно собрать имена файлов, которые есть в обоих каталогах. Это можно сделать через команду UNIX, например, comm или awk, и затем передать результат напрямую в команду diff или заливать его в переменную для последующего использования в zsh.

Создание собственной функции

Если стандартные средства не решают задачу, можно создать кастомную функцию или скрипт на языке shell:

  1. Пример функции:

    Помните, что вам необходимо будет использовать 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.

  2. Применение функции:

    Вы можете вызывать эту функцию при необходимости:

    % compare_common_files

    Эта функция будет находить общие файлы и сравнивать их.

Заключение

В данном контексте ключевым моментом является понимание, что Zsh не может из коробки обеспечить подобную вами функциональность без определенных модификаций и обхождения стандартного поведения. При использовании настройки автодополнения и, возможно, создания собственных скриптов, вы всё же можете достичь желаемого решения. Это демонстрирует, насколько мощной и настраиваемой может быть оболочка Zsh.

Таким образом, рассмотренные методы предоставляют возможности для более широкого использования Zsh, раскрывая его потенциал в сложных задачах автоматизации и оптимизации повседневной работы. Успехов вам в реализации такой системы под ваши нужды!

Оцените материал
Добавить комментарий

Капча загружается...