Назад | Перейти на главную страницу

Удаленное редактирование с помощью diff / patch?

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

Я знаю, что могу редактировать удаленные файлы с помощью vim и scp, и у меня также есть настройка с sshfs, которая позволяет мне довольно просто cd к точке монтирования и vim вверх для некоторых файлов.

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

Что я действительно хотел бы сделать, так это иметь такую ​​настройку:

  1. При открытии удаленного файла с помощью локального vim, вытащите содержимое файла и хеш файла
  2. При сохранении файла проверьте, не изменился ли удаленный хэш, и если это не так, загрузите различие и исправьте удаленный файл с новыми изменениями.
  3. Желательно делать это через постоянное соединение ssh, чтобы не терять время, открывая новое соединение каждый раз.

Это было бы намного быстрее, с большей пропускной способностью и той же функциональностью.

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

Мои вопросы:

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

2. Кто-нибудь хочет придумать какие-нибудь лайнеры bash one, которые сделают свое дело? Я знаю, что это можно сделать с некоторыми из них ...

Когда вы удаленно подключаетесь к vim, действительно ли он записывает весь файл?

vim ftp://myserver//path/file.txt

xdelta мог бы сделать исправление и проверку хэша.

Вот пример, если у вас есть файл, смонтированный с помощью sshfs. Я сохранил расширение файла на случай, если вы хотите насладиться подсветкой синтаксиса:

#!/bin/bash

if [ ! -f "$1" -o ! -w "$1" ]
then
        echo "ERROR: cannot open $1 for editing"
        exit 1
fi

TMP="/tmp/$(date +%s)-$$-$(basename $1)"
TMP2="$TMP.2"
PAT="$TMP.patch"

/bin/cp $1 $TMP
/bin/cp $TMP $TMP2
/usr/bin/vim $TMP2
/usr/bin/xdelta delta $TMP $TMP2 $PAT
/bin/cp $1 $1.orig

if /usr/bin/xdelta patch $PAT $1.orig $1
then
        /bin/rm $TMP $TMP2 $PAT
else
        echo "ERROR: xdelta patch failed, keeping temporary files $TMP $TMP2 $PAT"
        exit 1
fi

Допустим, вы называете это дельтавим или как-то так, вы просто

deltavim /path/to/remotefile.conf

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

Если удаленный файл изменится во время редактирования, xdelta заметит это и откажется исправлять.

В любом случае, может быть, это отправная точка для вас.

Удачи! (... и никогда не указывайте загруженный, непроверенный сценарий, который вы получаете из Интернета, на файл, который вам нравится ...)