Ключевые слова:shell, (найти похожие документы)
Date: Sat, 6 Apr 2002 20:12:56 +0000 (UTC)
From: Anton Kovalenko <a_kovalenko@fromru.com>
Newsgroups: fido7.ru.linux
Subject: Включение контексно зависимых completions в bash и zsh
TG> А нельзя вкратце описать наиболее продвинутые фичи zsh,
TG> например перед везде по умолчанию имеющейся /bin/bash ? Я
TG> Completion вообще люблю, а тут она говорите еще и продвинутая
TG> :) Интересно, но прежде ставить надо понять ради
TG> чего. Спасибо.
Постараюсь, насколько смогу.
В настоящее время и bash, и zsh поддерживают настраиваемые
(программируемые) правила completions. Польза от такой хрени очевидна:
появляется возможность, в зависимости от контекста, "комплетить" тему
команды man, опции различных утилит, имена файлов/каталогов, url,
target'ы makefile'ов, точки монтирования, опции ./configure и многое
другое.. Полезен также отбор файлов по суффиксу в зависимости от
вызываемой утилиты: например, когда делаешь что-то в LaTeX, у тебя
часто оказываются лежащие рядом файлы prikol.tex, prikol.aux,
prikol.log, prikol.dvi, prikol.ps. Приятно, когда делаешь gv pr<Tab>,
сразу получить prikol.ps, а когда делаешь xdvi pr<Tab>, получить
prikol.dvi.
Различие bash и zsh в области completions состоит из трех пунктов:
1) Что и как работает "из коробки".
Так как в zsh программируемые completions появились несколько раньше,
чем в bash, то и напрограммировать их успели несколько больше, и, я бы
сказал, несколько более аккуратно. Конечно, настоящему индейцу такие
мелочи не важны; возможно также, что, посмотрев на zsh, ты пересядешь
обратно на bash и сделаешь там еще более удобные
completions. Общественность скажет тебе спасибо.
Но для того, чтобы понять, насколько удобны бывают completions, zsh
подходит лучше.
2) Как они программируются.
В обоих shell'ах поддерживается программирование completions с помощью
команды compctl. Но в zsh этот способ не является единственным -- в
man zshcompsys можно прочитать о более высокоуровневых средствах.
Поэтому написать или поправить completions для себя тебе будет проще
именно в zsh.
3) Как они выглядят.
Этот пункт сильно связан с индивидуальными предпочтениями
пользователя, поэтому для тебя эти различия могут вообще не иметь
значения, или говорить в пользу bash. Но я обещал описать основные
различия, так что вот:
* В zsh, если список вариантов завершения умещается на экране, он
отображается _под редактируемой командной строкой_.
* В zsh одинарный <Tab> приводит к выводу списка вариантов, в bash -
двойной (одинарный "срабатывает" только в случае однозначного
завершения).
* В zsh есть completions с подсказкой (например, выводятся возможные
опции команды с кратким описанием каждой). В bash я такого не видел,
и как сделать, не понял.
* В zsh повторные нажатия <Tab> последовательно перебирают варианты
completions.
Если соберешься-таки посмотреть на zsh, имей в виду несколько вещей,
чтобы не испугаться раньше времени:
1) Эти знаменитые completions надо сначала загрузить. Через
autoload -U compinit
compinit
(Всё это можно прописать в .zshrc)
2) Если пускать zsh "на посмотреть" из-под bash, можно увидеть
некрасивое приглашение типа \u@\h:\w\$. Это потому, что переменная
PS1 интерпретируется по-разному в bash и zsh. Делай unset PS1 перед
экспериментами, или пропиши в .zshrc PS1=что-надо.
3) Если у тебя $EDITOR содержит vi, zsh будет работать с vi-образными
клавиатурными командами; дело вкуса, конечно, но в shell'е мне
привычнее emacs-образный безрежимный подход. Скорми zsh команду
bindkey -e, если тебе так тоже привычнее.
4) man'ы по zsh состоят из нескольких разделов. man zshall -- огромный
текст, который содержит их все.
run-help <команда> отправит тебя в тот man, где описана команда,
будь это встроенная команда zsh или обычная прога.
--
Удачи!
Антон Коваленко /* http://softlenin.chat.ru */