Edição remota com diff / patch?

1

Eu faço a maior parte do meu trabalho no vim. Eu prefiro muito mais editar arquivos usando vim localmente em vez de sshing em um servidor e rodando vim lá, por muitas razões, uma das mais importantes é a capacidade de resposta da UI em uma conexão lenta.

Eu sei que posso editar arquivos remotos usando vim e scp e também tenho uma configuração com o sshfs que me permite simplesmente fazer o cd para um ponto de montagem e criar alguns arquivos.

No entanto, realmente me incomoda que toda vez que eu salvar o arquivo, ele grava o arquivo inteiro no servidor remoto. Isso realmente atrasa meu fluxo de trabalho.

O que eu realmente gostaria de fazer é ter um tipo de configuração assim:

  1. Ao abrir um arquivo remoto com o vim local, puxe o conteúdo do arquivo e um hash do arquivo
  2. Ao salvar o arquivo, verifique se o hash remoto não foi alterado e, se não tiver, faça o upload de um diff e corrija o arquivo remoto com as novas alterações.
  3. De preferência, faça tudo isso por meio de uma conexão ssh persistente, para que não perca tempo abrindo uma nova conexão a cada vez.

Isso seria muito mais rápido e muito mais eficiente na largura de banda e teria a mesma funcionalidade.

Eu costumo usar git ou svn para conseguir um resultado similar, mas eu realmente quero esse tipo de funcionalidade mínima para situações em que eu não tenho o luxo de usar esses sistemas SCM.

Minhas perguntas são:

1. Alguém sabe de algum script ou programa existente que fará parte disso ou tudo isso para mim?

2. Alguém se preocupa em preparar alguns folhetos que farão o truque? Eu sei que deveria poder ser feito com alguns desses ...

    
por Mike 21.01.2011 / 08:33

2 respostas

1

xdelta pode fazer o patch e o hash check para você.

Aqui está um passo, supondo que você tenha o arquivo montado com o sshfs. Mantive a extensão de arquivo para o caso de você gostar de destacar a sintaxe:

#!/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

Digamos que você chame isso de deltavim ou algo assim, apenas

deltavim /path/to/remotefile.conf

Isso precisará de duas cópias localmente para criar o delta, mas removerá tudo isso se for bem-sucedido. Ele deixa o arquivo remoto original com um .orig, mas você pode adicionar uma linha para excluí-lo depois do patch, se quiser.

Se o arquivo remoto mudar enquanto você está editando, o xdelta notará isso e se recusará a corrigir.

De qualquer forma, talvez seja um ponto de partida para você.

Boa sorte! (... e nunca aponte um script carregado e não testado que você tira da Internet em um arquivo que você ama ...)

    
por 21.01.2011 / 23:56
1

Quando você se conecta remotamente com vim , ele realmente escreve o arquivo inteiro?

vim ftp://myserver//path/file.txt
    
por 22.01.2011 / 06:46

Tags