Статья о том, как настроить 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 ругается, потому что не может найти модули, которые установлены на удаленной машине, он не знает об их существовании
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 перестает ругаться
После таких манипуляций, 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 - штука, которая работает и на старых и на новых серверах, то никаких проблем не будет, если вам придется работать на сервере, который настроили, например, в нулевых, и который с тех пор работает.

Основные возможности:

  1. Синхронизация с помощью rsync (с параметрами сжатия -> -avzhe ssh)

  2. Можно игнорировать определенные файлы или папки на основе файла конфигурации

  3. Асинхронная работа

  4. Есть возможность конфигурирования файла для каждого проекта

  5. Автоматическая синхронизация при сохранении файла

  6. Работает с ssh-ключами (рекомендуется) или с открытым паролем в файле конфигурации

Минусы:

  • Данный плагин утягивает весь проект со всеми файлами с удаленной машины на локальную. Зато потом очень быстро можно работать. Короче, минус только в дисковом пространстве, которое надо отдать под проект.

Комментарии (16)


  1. arheops
    04.11.2022 17:22
    +3

    Простите, а какие из функций, которых нет на серверах с пятилетним VIM вы реально используете то?
    У редактирования локально есть куча минусов. Начиная с лага загрузки-выгрузки и возможного фейла в процессе, заканчивая случайным редактированием одного и того же файла двумя людьми.


    1. pcdesign Автор
      04.11.2022 17:34
      +1

      Лично мне LSP позволяет намного быстрее сориентироваться в проекте, на старых серверах его не запустить. А вы можете что-то посоветовать? Спасибо.


      1. arheops
        04.11.2022 17:43
        -3

        Ну лично я вот о LSP первый раз услышал сегодня. Я вместо настройки таких штук просто использую старомодный grep c регулярками. Насколько я понимаю, закрывает все кейсы использования LSP.


        1. 0xd34df00d
          04.11.2022 18:57
          +4

          Как греп с регулярками помогает получать предупреждения и ошибки от компиляторов-линтеров во время набора кода? Как греп с регулярками помогает с «подбери мне функцию, создающую объект ожидаемого в этом месте типа»?


          1. arheops
            04.11.2022 20:20
            -1

            Так это функции IDE уже, а не редактора.


            1. 0xd34df00d
              04.11.2022 20:56
              +8

              Эм, ну да. Но vim эти функции вполне себе может выполнять.


              Более того, если мы говорим не о виме, а о неовиме (оцените игру слов, а? а?), то лично я весьма активно использую возможность довольно легко писать под него плагины на других языках, кроме вимскрипта и питона — у меня есть модуль поддержки агды, который я попиливаю на хаскеле, например.


    1. lrrr11
      04.11.2022 18:02

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

      Поэтому увы, лично мне приходится использовать vscode для редактирования по ssh. Там, где vim лагает, в vscode не ощущается вообще никакой разницы по сравнению с локальными файлами. При этом lsp работает


  1. copyhold
    04.11.2022 17:48
    +2

    А я использую mirror.vim - безопасно, нет лагов но требует настройки.

    https://github.com/zenbro/mirror.vim


    1. pcdesign Автор
      04.11.2022 17:52

      Спасибо. Обязательно попробую.


  1. kvazimoda24
    04.11.2022 18:25

    И тут мы натыкаемся на то, что на удалённом сервере разрешено редактировать нужный нам файл только с помощью sudoedit. Как это обходить?


    1. pcdesign Автор
      04.11.2022 18:36

      1. kvazimoda24
        04.11.2022 18:55

        Тот вариант, что там предлагается, предполагает разрешение делать sudo cp. А этого в моих условиях нет. Только sudoedit.


  1. cobb
    05.11.2022 14:32

    Вроде vi - это редактор по умолчанию на всех юникс-системах? Или я ошибаюсь? vim ставить необязательно.


    1. pcdesign Автор
      05.11.2022 14:33

      Конечно, можно и не ставить. Проблема возникает, когда хочется на удаленном сервере запустить neovim современный со всеми плагинами.


  1. obbana
    06.11.2022 08:40

    А зачем, извините, проект редактировать на сервере?) А как же git, IDE и так далее? Для линтеров зачастую нужно настроенное окружение (npm, virtualenv, etc.)

    Ещё я обычно работаю с docker, и на хостах обычно не настроено и не установлено вообще ничего, в таком случае vim редактор и что угодно для отладки (curl, wget, zsh, strace, dnsutils, nettools) можно положить в базовый образ - тогда всё подтянется в каждый ваш проект. Тоже вариант. :)


    1. pcdesign Автор
      06.11.2022 08:43

      А как же git, IDE и так далее? Для линтеров зачастую нужно настроенное окружение (npm, virtualenv, etc.)

      Да, в том то и дело, что neovim со всем этим работает. А связка neovim + LSP + плагины превращается в IDE, которая впереди планеты всей.