Прелюдия
Пользовался я ViM'ом и был доволен. Как-то раз узнал, что он ко всей его могучести умеет быть небольшим проводником по файловой системе (прим. достаточно выполнить vim .). Позже раскопал, что гораздо удобнее это делать добавив плагин NERD_Tree — он действительно удобен и я был бы рад если бы на его основе был сделан VimCommander, однако Leandro (автор VimCommander) пошёл другим путём и старался подражать MidnightCommander. Ну что ж, надо обучить VC работать с удаленными системами по ssh, решил я, ведь его старший брат (mc) вполне неплохо делает это. Примерно с такими мыслями я открыл shell и набрал vim ~/.vim/plugin/vimcommander.vim.
Идеи
Реализовывать такой функционал на чистом ssh клиенте ни какого желания и возможностей у меня не было, но тут вспомнилась мне одна утилита — sshfs…
Мысли как всегда шли у меня не от проектирования к реализации, а наоборот (а что поделать)…
Первое что пришлось придумать, а вернее собрать из имеющегося опыта, так это синтаксис команды и как её удобнее вызывать. Работа через sshfs дала удобство в том, что мне не пришлось парсить файл ~/.ssh/config на тот случай если у пользователя там есть алиасы, утилита как ей и положено всё делает сама.
Синтаксис для ввода адреса был выбран незамысловатый: [IdentityFile,][UserName@]HostName[:Port]. Конечно, некоторых усилий стоило проверить и распарсить строку для подключения, что бы наиболее грамотно скормить её sshfs (зачем нам лишние ошибки?).
Вызывать всё это добро было решено более-менее по аналогии с MC клавишей F9 (надо всё-таки сохранить идеологию автора VimCommander, который взял все горячии клавиши именно от туда). Богатое меню там, конечно, не вылезет, но моя функция вызовется :-). И задаст пару вопросов. Какие тут вопросы можно было подумать? Однако они тут играют весьма важную роль.
Логика работы
Первое, что надо понять — подключение само не отваливается, при закрытии VimCommander и даже всех копий ViM'а (в MC все разорвётся при выходе). Как результат получаем первый вопрос от мастера: What are you want to do (mount/dismount/abort) sshfs? [mda]:. И так, всё, что смонтировали надо отключать самим (перезагрузка машины, конечно,
Тут вдадимся немного в архитектуру: всё, что в данный момент примонтировано, записано в файл /tmp/ssh_dir.list. Точки для монтирования, кстати, создаются там же — в /tmp/, с рандомным именем (спасибо /dev/urandom). Получается, что вы можете поработать с удалённой системой, выйти из ViM и через некоторые время вернуться к работе, и не монтировать удалённую систему заново.
Вопрос о размонтировании также не умудрён: Choose which mount point you want to dismont: /tmp/CEc6CgFeRE0U(192.168.0.1);/tmp/4BEK8QqtWqWT(habrahabr.ru). Надо просто указать порядковый номер больше не интересующего хоста.
Изменённый текст скрипта vimcommander.vim прилагается (внутри есть еще небольшие изменения других функций, так что кому надо могут взять только описанную функцию (откатится на интересующий commit), остальные изменения, когда их подкопится опишу отдельно).
Чего не хватает
1. Мб стоило бы добавить функцию размонтировать всё.
2. Возможно, не помешает список смонтированных хостов, хотя его можно увидеть через dismount.
3. Так же код и «приглашения» далеки от совершенства…
P.S. есть и другие вещи которых мне не хватает в VimCommander, будет время состряпаю и их.
Главное — наслаждаться работой в ViM.
Все изменения были залиты по просьбе Leandro Penz (автора VimCommander) на GitHub, надеюсь, что он смержит их со своей веткой.
Мой форк: github.com/Alukardd/vimcommander
Основной проект: github.com/lpenz/vimcommander
Страничка скрипта: www.vim.org/scripts/script.php?script_id=808
UPD: Провёл небольшой рефакторинг кода, заодно исправил пару багов.
Так же небольшое примечание: sshfs работает по sftp протоколу, поэтому на серверной стороне он должен быть активен.