Tcsh: пример пользовательского конфига

Основываясь на "рыбе", доставшейся нам в комплекте, попробуем составить собственный файл ~/.tcshrc. Для начала создаём его в своём домашнем каталоге, например, командой

# touch ~/.tcshrc

Откроем этот файл (пока пустой) в любимом текстовом редакторе и озаглавим его так:

# Мой пользовательский ~/.tcshrc
# Считывается при каждом запуске tcsh
# Работающий конфиг для FreeBSD 7.1

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

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

## Определение псевдонимов# Псевдонимы для команд управления файлами

alias cp	cp -iR		# Рекурсивное копирование
				# с запросом подтверждения
				# перезаписи существующих файлов

alias cpf	cp -Rf		# Рекурсивное копирование
				# с принудительной перезаписью
				# существующих файлов

alias rm	rm -i		# Удаление файлов с запросом
				# подтверждения

alias rmf	rm -Rf		# Принудительное рекурсивное
				# удаление файлов

alias mv	mv -i		# Перемещение/переименование файлов
				# с запросом подтверждения

alias mvf	mv -f		# Принудительное
				# перемещение/переименование файлов

# Псевдонимы команды ls

alias ls	ls -FG		# Колоризованный вывод
				# с символической типизацией файлов

alias la	ls -A		# Вывод всех файлов,
				# за исключением . и ..

alias ll	ls -l		# Вывод списка файлов
				# в "длинном" формате

alias li	ls -ial		# Вывод всех файлов
				# в "длинном" формате
				# с указанием идентификаторов

# Прочие псевдонимы

alias df	df -h		# Вывод в "гуманистическом"
alias du	du -h		# формате, с подбором единиц
				# измерения

alias less	less -M		# Вывод команды less
				# в "more-подобном" виде

alias wget	wget -c		# Скачивание по ftp
				# с продолжением

alias aspell aspell -c	        # Проверка орфографии

alias nano	nano -w		# Вызов nano без переноса слов

Теперь задаём атрибуты доступа для новообразованных файлов и каталогов:

umask 022

что даёт права по схеме 755, то есть чтение, запись и, если возможно, исполнение для файлов и каталогов создавшему его пользователю, чтение и исполнение -- для членов его группы и прочих.

Далее определяем значения переменной path, указывающей на место размещения исполняемых файлов. Для пользователя это выглядит так:

set path = (/bin /usr/bin /usr/local/bin)

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

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

setenv EDITOR	nano
setenv PAGER	less
setenv BLOCKSIZE K

Наступает время для определения встроенных переменных оболочки. В этой секции мы сначала избавляемся от возможности нежелательного выхода из сеанса tcsh по случайному нажатию комбинации Control+D в пустой строке, установив переменную

set ignoreeof

игнорирующую символ окончания файла.

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

set nobeep

Затем обеспечиваем вывод вариантов дополнения слов по нажатию клавиши табулятора:

set autolist

Автоматическая коррекция неправильно введённых команд также может показаться нелишней, хотя это и спорный вопрос:

set correct = cmd

В этом случае, если оболочка воспримет некую команду (из числа определённых в переменной path), как введённую с ошибкой, то предложит корректирующий вариант, с которым можно согласиться (y), проигнорировать (n), вызвать команду для редактирования (e) или оборвать её исполнение с возвратом приглашения командной строки (a).

Для опции correct возможны и другие значения. Так, если определить

set correct = complete

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

Если же переменную correct определить в виде

set correct = all

то вариант исправления ошибок будет предлагаться не только для команд, как при значении cmd, но и для имен файлов или путей к ним, если оболочка сочтёт их неправильно написанными. Последнее крайне раздражает при операциях создания и копирования файлов и каталогов. А поскольку в tcsh, в отличие от zsh, задать исключения для опции correct нельзя, я значением all для неё не пользуюсь.

Следующие переменные имеют отношение к истории команд. Поскольку файл ~/.tcshrc считывается только при работе этой оболочки в интерактивном режиме, необходимости предварять их условным оператором я не вижу. Значения переменных

set history = 1000
set savehist = 1000

устанавливают максимальное количество строк в буфере истории текущего сеанса и в файле истории соответственно. Для простоты делаем их равными и с достаточным запасом -- при современных объемах памяти это не обременительно.

А вот от балласта в виде дубликатов команд в файле истории целесообразно избавиться -- не столько из экономии, сколько ради собственного удобства. Сделать это можно путем определения переменной histdup тремя различными способами, в зависимости от её возможных значений. При значении

set histdup = prev

текущая команда, которая совпадает с последней, имеющейся в файле истории, к файлу истории добавлена не будет.

Установка

set histdup = all

повлечёт за собой сохранение в файле истории только уникальных команд. Оба эти значения переменной histdup вызывают перенумерацию списка команд в файле истории так, чтобы в нём не было никаких "прорех".

После установки

set histdup = erase

перенумерации команд не происходит: последняя введённая команда подменяет собой ранее существовавший её дубликат.

По умолчанию, как уже говорилось, буфер истории команд сохраняется в файле ~/.history. Однако определив переменную histfile, можно дать ему произвольное имя. Это бывает полезно, если tcsh используется попеременно с другими оболочками, файл истории команд которых имеет по умолчанию то же имя -- ~/.history.

Ранее говорилось о конфигурационном файле ~/.cshdirs, но не рассказывалось о том, откуда берётся его содержимое. Так вот, в него при выходе из сеанса tcsh записывается путь к последнему текущему каталогу -- для этого надо определить переменную

set savedirs

После этого в следующем сеансе регистрационного шелла этот каталог станет текущим при запуске.

Последняя необходимая нам переменная определяет вид первичного приглашения командной строки. Для меня удобна следующая форма:

set prompt = '%~%-> '

благодаря которой в приглашении мы видим полный путь к текущему каталогу, что избавляет от лишнего ввода команды pwd, и сохраняем традиционный в csh символ процента для сеанса обычного пользователя, стрелка указывает на область ввода, а пробел после неё отделяет приглашение от вводимых команд.

Напоследок остаётся только с помощью команды bindkeycode> определить назначение некоторых клавиш и клавишных комбинаций, как это сделано в прототипе нашего конфига:

bindkey "^W" backward-delete-word
bindkey -k up history-search-backward
bindkey -k down history-search-forward

Первая из этих строк назначит комбинации клавиш Control+W роль удалителя предшествующего курсору слова -- взамен штатной последовательности Meta+Control+H, вынужденно неуклюжей.


Содержание

. .