VIM и редактирование файлов на удаленных серверах
Статья о том, как настроить vim в одном месте, а все файлы, которые находятся на других серверах, подгружать и работать локально. Понятно, что можно поставить vim на каждый удаленный сервер, настроить и работать по ssh, но не всегда есть такая возможность, хотя бы потому, что все быстро устаревает и чтобы использовать супер-современный vim со всеми плагинами и наворотами порой надо заменить OS на удалённом хосте.
Я здесь собрал кое-какие способы (не все), с помощью которых можно редактировать файлы, находящиеся на удаленных машинах, при этом используя свой локально настроенный и причесанный vim со всеми плюшками.
1. scp
Надо настроить авторизацию по ключу, а потом можно редактировать файлы, находящиеся где угодно, с помощью команды:
vim scp://user@myserver[:port]//path/to/file.txt
Либо прямо в командой строке vim:
:e scp://user@myserver[:port]//path/to/file.txt
Помимо scp есть еще аналогичные варианты. Можно ввести :h netrw-nread
и получим справку в nvim:
Плюсы понятны — не надо ничего ставить. Ввел команду и редактируешь файл. Например, если надо отредактировать какой-то один файл конфигурации, типа /etc/nginx/nginx.conf
, то это нормальный путь, но вести большие проекты достаточно проблематично.
Минусы:
Если проект большой, то можно запариться перемещаться таким образом или что-то там искать
Не будут работать LSP, fzf с нечетким поиском и ещё кое-какие другие плагины
Пример, когда файл подгружен через scp. Скриншот с сообщениями от LSP.
LSP ругается, потому что не может найти модули, которые установлены на удаленной машине, он не знает об их существовании
2. sshfs
С помощью sshfs — можно подмонтировать удалённую файловую систему и работать с ней локально.
Установка требуется только там, где стоит ваш vim.
yum install sshfs
или
apt-get install sshfs
И дальше монтируем в нужную папку вот таким образом:
sshfs remote-user@remote-server.com:/home/remote-user/ ~/mnt/remote-user
И получаем удаленную файловую систему у себя в в папке ~/mnt/remote-user
Если запустить vim и начать работать, то LSP продолжит ругаться, и надо внести кое-какие правки. Например, чтобы работал LSP с pyright, надо в папку ~/mnt/remote-user
положить файл pyrightconfig.json
со следующим содержимым:
{
"venvPath": ".",
"venv": "env"
}
Где явно указываем путь к виртуальному окружению и название папки с виртуальным окружением.
После таких манипуляций, LSP перестает ругаться
Чтобы размонтировать, вот такая команда:
fusermount -u ~/mnt/remote-user/
Плюс очевиден, не надо себе ничего скачивать, а просто прикрепляется удаленная файловая система в локальную папку.
Минусы:
Очень медленный
Когда LSP обращается к удаленным модулям, чтобы считать, то беспощадно тупит
3. samba + vpn
Я не буду подробно останавливаться на том, как настроить самбу с впн-ом. Для меня, для лентяя, этот путь не очень хороший, потому что лень ставить всё это и настраивать, как локально, так и удаленно.
Но про то что такой вариант существует, все же имеет смысл написать. В инете полно гайдов, как это сделать. Но даже и в этом случае люди жалуются (возможно, не умеют настраивать), что у них подтупливает LSP. Инфа для тех, кто решит пойти таким путём.
4. distant
Есть такая библиотека с названием distant, которая дает доступ к удаленной файловой системе и даже позволяет выполнять команды удалённо. Distant — быстрый, асинхронный, зашифрованный, написан на rust и всё такое крутое и современное. И вот уже на основе этой библиотеки написан плагин для nvim.
Вот здесь видео, где человек показывает, что локально у него не установлен go, запускает, монтирует в nvim удалённый хост и у него работает LSP с go при этом.
Может работать с виндой (я не пробовал).
Плагин в режиме mode=ssh
может работать и без установленной distant библиотеки, это уже медленнее, не будет работать поиск, LSP и т.д.
Минусы:
Для полноценного запуска distant требуется современная OS. А если OS современная, то вроде как проще поставить на нее nvim со всеми причиндалами и работать, чем валандаться с лишними плагинами. Такая палка о двух концах.
5. vim-arsync
Плагин vim-arsync для асинхронной синхронизации удаленных и локальных файлов с использованием rsync. Из-за того что rsync — штука, которая работает и на старых и на новых серверах, то никаких проблем не будет, если вам придется работать на сервере, который настроили, например, в нулевых, и который с тех пор работает.
Основные возможности:
Синхронизация с помощью rsync (с параметрами сжатия → -avzhe ssh)
Можно игнорировать определенные файлы или папки на основе файла конфигурации
Асинхронная работа
Есть возможность конфигурирования файла для каждого проекта
Автоматическая синхронизация при сохранении файла
Работает с ssh-ключами (рекомендуется) или с открытым паролем в файле конфигурации
Минусы:
Данный плагин утягивает весь проект со всеми файлами с удаленной машины на локальную. Зато потом очень быстро можно работать. Короче, минус только в дисковом пространстве, которое надо отдать под проект.