September 8th, 2011

glider

файловые менеджеры

Сегодня по пути в универ прочитал статью Мигеля де Икасы Learning Unix. Как раз то, что я хотел найти в посте ищу книжку про юникс/линукс. В сжатом виде аффтар описывает свое видение unix way. Субъективно, opinionated - то, что надо, жаль мало. Пусть даже с непонятно откуда взявшейся рекламой платного курса по слепой печати. Впрочем, сегодняшний пост не об этом.

Когда я читал фрагмент статьи, в котором идет речь про mc (кстати, Мигель де Икаса, оказывается, является автором mc, омг!), у меня что-то щелкнуло в голове, и я, наконец, нашел для себя смысл в посте ребе vp про Total Commander. Напомню краткое содержание: "А вот у нас на работе эта программа запрещена. Если кто-то из работников будет замечен за ее использованием - сразу увольнение. Основная идея файлового менеджера - ускорение работы с файлами, с перенаправлением вывода, с выводом на консоль, с подстановкой параметров в командную строку и т.п. Ни одной задачи эта софтина не решает, а мозг людям, кто ею пользуется."

Сразу признаюсь - основной программой у меня на компе долгое время был тотал.

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

Народ, который юзает фар, всегда вызывал у меня искреннее недоумение - вроде бы то же самое, только с уродливым шрифтом и без закладок. Зачем мучиться? А разгадка крайне проста! (сорри, что сейчас буду играть в кэпа, но, если бы кто-нибудь пару лет назад провел сеанс кэпства для меня, я был бы искренне благодарен)

***

Консоль - мощный и удобный способ организации рабочего окружения. Для себя я это понял примерно через день знакомства с линуксом, но это тема для отдельной лекции К.О., на пока что примем сабж за аксиому. Раз консоль так крута, возникает желание юзать ее все время. Но у меня это желание разбилось о неразрешимую проблему - как же держать в голове список файлов, с которым я в данный момент работаю. На эту тему я слышал много разных ответов, в том числе и стандартный ответ линуксоида: "а нафига это нужно, зато вона что мы умеем".

Вначале я думал, что дело в том, что я не понимаю дзен линуксизма и что надо тренировать моск удовлетворяться аутпутом команды ls или, на худой конец, ls -l. Ессно, моску весьма часто этого не хватает, да и держать все в памяти он не может - ну, по крайней мере, мой. Ну, или, думал я, может, вообще не нужно ручками выбирать файлы-параметры для команд (например, если я хочу скопировать часть файлов из одной папки в другую), у нас же есть вайлдкарды и греп. Ессно, и это не панацея - если бы автоматика могла полностью заменить ручной труд, мы бы уже жили в раю.

Погрустил я на эту тему и забил. Нашел для линукса какой-то тоталоподобный файловый менеджер и стал юзать его вместе с консолью. Если сказать честно, нихрена это не удобно. Смотришь на список файлов в этом самом файловом менеджере и действительно быстро понимаешь: "оба-на, зафигачу-ка я команду delitec для вот этих двух scala-файликов из двадцати лежащих в папке". Набираешь в строке ввода менеджера "delitec file1 file2", нажимаешь ENTER - окошко появилось на секунду и пропало. Что происходит - неизвестно. Брр. Бесишься про себя, в строке ввода набираешь "$TERM", который стартует в текущей директории, а там уже вбиваешь, что надо. Лишние телодвижения, но что поделать. Как вариант, можно скачать плагинчик, который по отдельной просьбе будет открывать $TERM за тебя, но и с этим есть косяки. Что, если внезапно хочется посмотреть список файлов в консоли? Еще один плагинчик искать?

Как же решить все эти проблемы? Просто забить - поставленных проблем не существует, ибо есть программы, которые сочетают в себе и консоль, и файловый менеджер. Да, в общем-то и файловый менеджер как отдельная концепция нифига не нужен. Тотал настолько извратил мое мировосприятие, что я просто не представлял, как такое может быть.



Что видит на картинке ученик класса по информатике? Меню, две панели с файлами, какую-то строчку ввода и кнопки. Ессно, основной фокус внимания на файлы - сознание автоматически воспринимает их как главное, что есть на экране. Ну причем здесь строчка ввода, да и нафига она вообще? А еще тема, можно нажать Ctrl+O и появится какая-то черная хрень на весь экран. Во смеху-то будет, если сделать так челу за соседним компом.

Что на самом деле находится на картинке? Шелл, командная строка которого находится внизу, а основное полотно (предыдущие команды и их вывод) спрятано. Кроме того, на экране также находятся два дополнительных виджета: список файлов текущей папки шелла и список файлов какой-то другой папки.

В такой ментальной модели вся сложность взаимодействия консоли и файлового менеджера, описанная выше, пропадает. Это, на самом деле, одна и та же программа, просто к собственно консоли добавились еще несколько вспомогательных визуальных элементов. Несколько примеров.

1) Основной киллер-фичей тотала для меня было наличие закладок. По сравнению с эксплорером тотал значительно выигрывает в скорости навигации по файловой системе, но без дополнительных средств он не сильно-то и круче в плане одновременной работы с несколькими папками, а то и хуже вообще - обычно, тотал открывают только один, а эксплореров пачку. Блин, фигово. Надо придумывать дополнительную концепцию - закладки (табы ли, букмарки ли, это детали реализации). Вот она, сложность родимая.

А на деле ведь переход в папку описывается простой командой cd. Нравится какая-то папка - не вопрос. Сделай алиас для соответствующего cd и юзай на здоровье. Часто бываешь в папке Downloads - нафигачь алиас dl для "cd /foo/bar/very/long/path/Downloads" и набирай dl, чтобы быстро попасть, куда надо. Набираешь dl в шелле, а, в честь перехода в новую папку, соответствующий виджет автоматически обновляет список файлов. Всяко быстрее, чем тыркать мышкой, и не хуже, чем нажимать C-d <номер закладки>. Но что главное - логичнее.

2) Скажем, файловую систему мы набраузили и теперь надо искать файлы по имени. В модели номер 1 нужно реализовать логику поиска, сваять уи, реализовать концепцию виртуального списка файлов, который не соответствует никакой реально папке в файловой системе. Я специально упоминаю детали реализации в посте про юзабилити потому, что эти детали влияют не только на эффорты программиста, но и на мысленную картину, которую для себя строит пользователь.

В модели номер 2 нужно всего лишь ввести концепцию виртуального виджета, ибо find у нас уже есть (в виде консольной программы), а уи нам не нужен - вместо использования поля ввода юзер просто вобьет имя или вайлдкард в составе команды консоли. Кроме того, такой подход неплохо скейлится на будущие требования, если нам понадобится искать по другим критериям. Скажем, если нужно искать вхождение подстрок в содержимом файлов, нужно лишь заменить вызов find вызовом find + xargs + grep. Я идеализирую, конечно, для некоторых тасков специализированный уи будет удобнее, но идея понятна.

3) Часто бывает необходимо не только посмотреть аутпут какой-то команды, но также и свериться с результатом выполнения некоторой программы в прошлом. В рамках модели номер 2 для этого достаточно нажать тот самый хоткей Ctrl+O и вся история консоли перед глазами.

В модели номер 1 пользователь должен сам заботиться о сохранении аутпута важных программ. Особенно доставляют такому пользователю "нехорошие" программы, которые выполняются в консольном режиме и автоматически закрываются по окончанию работы. Для них надо ручками открывать окошки консолей, добавлять pause в бат-файлы или readline в программы. Чего только не придумаешь для борьбы с ветряными мельницами.

***

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