私の仕事では、SSHを使用してさまざまなマシンに接続し、vimを使用してそれらのマシン上のファイルを編集する傾向があります。問題は、.vimrcファイルを常にコピーする必要があることです。 vimを開いて設定がないのは非常に面倒です。手動でどこにもコピーせずに、vim設定をマシン間で持ち運ぶことはできますか?
あなたの痛みが分かります。私はすべての〜/.* rcファイルをバージョン管理(Subversion)で管理しています。1998年にCVSを使用して開始して以来、うまく機能しています。これを行う1つの方法は、ホームディレクトリに立っているときに、次のようにすべてのrcファイルをチェックアウトすることです。
svn co svn+ssh://user@Host/path/to/repo/trunk/home/user .
A .signature
A .vimrc
A .bashrc
A .screenrc
A .psqlrc
[...]
Checked out revision 7645.
このように、svn updateを実行すると、構成ファイルもさまざまなコンピューター間で同期および更新されます。
作業する必要のある各サーバーに.vimrcを導入する代わりに、ローカルvimからリモートファイルを編集してみませんか。
Vim/gvimで、次を実行:
:e scp://[email protected]//path/to/document
または、次のようにvimを起動します。
vim scp://[email protected]//path/to/document
これにより、ファイルが所定の位置に継ぎ目なく開かれ(実際にはファイルがローカルにコピーされます)、保存すると、編集されたファイルがサーバーに送信されます。
Sshパスワードを要求しますが、これはsshキーを使用して効率化できます。
他の人がこの方法の唯一の欠点を述べたように、マシンで直接作業する場合のようにパス/ファイルの競合が発生しないことです。
詳細については、 次のチュートリアルを確認してください 。
次のように、ログインするたびに自動的にコピーするbashスクリプトを作成できます。
#!/usr/bin/env bash
scp ~/.vimrc $1:
ssh $1
たとえば、ssh_vimと呼ぶことができます。これは理想的なソリューションではありませんが、問題を解決します。
既にそこにあるかどうかを最初にチェックするように改善できます。同じマシンから常にsshを実行しているわけではない場合は、スクリプトを変更して、scpから別のマシンからファイルを取得できます。
EDIT1
関連する注意点として、リモートマシンのファイルシステムをsshfsでマウントすることもできます。そうすれば、環境とツール(.vimrcだけでなく)のメリットが得られ、(scp://を使用しなくても)シェルを完了できます。
編集2
次のように、scp://を使用して.vimrcファイルを入手できることがわかりました。
:source scp://you@your_computer//yourpath/.vimrc
これはvimコマンドラインから機能しますが、現時点では自動化する方法がわかりません。 '-u'スイッチ、.vimrc、$ VIMINITでは機能しないようです。
EDIT
見つけた!これを行うと、参照ホストから取得した.vimrcでvimを起動できます。
vim -c ':source scp://you@your_computer//yourpath/.vimrc'
オプション「-c」は、vimを起動した直後にコマンドを実行します。
入力を避けるために、選択したシェルでエイリアスを作成できます。 bashでは次のようになります。
alias vim="vim -c ':source scp://you@your_computer//yourpath/.vimrc'"
公開鍵認証を使用している場合は、これを~/.ssh/config
:
Host *
PermitLocalCommand yes
LocalCommand bash -c 'scp -P %p %d/.vimrc %u@%n: &>/dev/null &'
ssh
コマンドの呼び出しを台無しにしないため、上記のスクリプトトリックよりも気に入っています(追加のパラメーターを指定する場合など)。
Sunny256とまったく同じ答えですが、Subversionの代わりにgitを使用します。
すべてのコンピューターに共通のファイルを含む1つのメインブランチを保持し、新しいコンピューターごとに1つのブランチを用意します。
これにより、ほとんどのコンピューターでほぼ同じファイルを使用でき、混乱することはありません。
いくつかの解決策:
1)ホームフォルダーのNFS共有を作成し、複数の場所にマッピングします。
2)小さなスクリプトを作成して、ID /鍵ファイルで接続しているサーバーに.vimrcをプッシュします。次のようになります(疑似コード):
connectString = arg0 #username@ipaddress
scp -i ~/.ssh/indentity connectString:~/ ~/.vimrc
ssh -i ~/.ssh/indentity connectString
私はこれが古いスレッドであることを知っていますが、それを行う1つの方法は、Fuseを介してファイルシステムをマウントするsshfsを使用することです。ローカルvimがすべての編集を行うため、.vimrcをコピーする理由はありません。
これには、リモートサーバーで実行する必要のあるコマンドのために別のターミナルを開く必要があるという欠点がありますが、編集にはこの方法が最適です。
また、システムのクリップボードを使用できるという利点もあります。
私は https://github.com/andsens/homeshick を使用してドットファイルを管理し、githubに保存しています。
Homeshickは100%bashで書かれており、/ home /ディレクトリを含む単なるgitリポジトリである「城」を管理するのに役立ちます。既存のドットファイルをリポジトリに移動し、シンボリックリンクに置き換えるコマンドがあります。そして、リポジトリ内のすべてのファイルを新しいマシンのホームディレクトリにシンボリックリンクします。
したがって、一般的な考え方は、バージョン管理システムにドットファイルを保持し、実際のパスからそれらにシンボリックリンクを張ることです。このように、リポジトリはホームディレクトリから開始する必要がなく、追加したくない大量のファイルを含める必要がありません。
sshrc この問題を解決します。 .vimrcを〜/ .sshrc.d /に置き、次にexport VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC"
を `/.sshrcに追加します。
私は、SSHdの組み込み構成オプションを非標準的な方法で使用することにより、sshのたびに.vimrcファイルをネイティブに転送できるようにするための簡単なツールを作成しました。
追加なしsvn
、scp
、copy/paste
などが必要です。
これはシンプルで軽量で、これまでにテストしたすべてのサーバー構成でデフォルトで機能します。
私がログオンするすべてのサーバーのリストが含まれているmakefileを使用し、ローカルマシンで変更を行うと、すべてのサーバーを変更またはプラグインで更新するmakefileを使用して「make」が自動的に実行されます。
私のようで、さまざまな理由で多くの開発マシン(仮想マシンも)を持っている場合は、sshキー、スマートbash_profile、および任意のRCSを組み合わせることができます。
次にnfs/samaba/sshfsを使用します。 1つの欠点は、常にネットワークにアクセスできないと、必要なもの(飛行、Wi-Fiなし、ファイアウォール、ルーティングの問題など)にアクセスできないことです。同期しているマシンのすべてに同時に到達できるわけではありませんが、それらの間で情報を共有したいと考えています。
以下は私がインターネットから多くのアイデアを借りてそれをどのように進めたかです。
.bash_profileは次のようになります
$HOME/bin/Shell_ssh_agent
私はこれをいくつかの場所から入手しましたが、現在それへのリンクを見つけることができません。 Shell_ssh_agentファイル:
#!/bin/bash
SSH_ENV=$HOME/.ssh/environment
#echo "starting"
function start_agent {
#echo "reaping agents"
killall ssh-agent
#echo "Initialising new SSH agent..."
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
#echo succeeded
chmod 600 ${SSH_ENV}
. ${SSH_ENV}
/usr/bin/ssh-add;
}
# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
. ${SSH_ENV}
#echo "sourced ssh env"
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent > /dev/null || { start_agent; }
else
start_agent;
fi
ここで、最初のログイン時にキーを設定します。ログアウトしてログインすれば、生活が楽になります。
すべてのスクリプトをRCSに配置すると、開発マシンの同期を簡単に保つことができます。私はgitを使用します。 gitによる認証はsshを介して行われるため、sshキーもここで役立ちます。この時点で、nfsのようなものを使用できたことに注意してください。以下に述べる理由により、私はまだRCSのファンです。
ユースケースは
次に試したいのは、最初のログイン/セットアップを、新しいマシンにコピーするメイクファイルにラップすることです。その後、makefileは、キー、RCSなどを設定するジョブを実行できます。明らかに、ここにはいくつかのオーバーヘッドがありますが、多くのマシンを設定することになると、次のようになります。
特定のキーストロークを押したときにパスと環境(EXRC変数など)を設定できるEXPECTスクリプトを検討する場合があります。誰かが同様のスクリプトを投稿する前に、長すぎてはいけません。
サーバーファームの数が数十(数千と考えてください)を超える場合、「新しい」ボックスで環境を簡単にセットアップすることは、実際の命の恩人です
多くの場合、ボックスにログインすると、初めてホームディレクトリが作成されます。
変数VIMINITの使用:
export VIMINIT='set number'
そしてそれをリモートサーバーに転送します:
ssh remoteuser@remoteserver -o SendEnv=LC_VIMINIT -t 'export VIMINIT=$LC_VIMINIT && bash'
.bash_profilesまたは.bashrcを使用すると簡単です
export VIMINIT='
set number
'
export LC_VIMINIT=$VIMINIT
sshh (){
ssh -o SendEnv=LC_VIMINIT $1 -t 'export VIMINIT=$LC_VIMINIT && bash'
接続にsshhを使用して、リモートサーバーでvimを実行してみます。
sshh remoteuser@remoteserver
必要に応じて、プラグインをリモートサーバーに取り込むこともできます。
export LC_VIMINIT="
set number
set nocompatible
filetype off
set rtp+=~/.[USER]_vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
set Shell=/bin/bash
call vundle#end()
filetype plugin indent on
"
export VIMINIT=$LC_VIMINIT
sshh (){
if [[ $1 ]]; then
ssh-copy-id $1 &>/dev/null &&
rsync -lzr --partial --del ~/.[USER]_vim ${1}: &&
ssh -o SendEnv=LC_VIMINIT $1 -t 'export VIMINIT=$LC_VIMINIT && bash';
else
echo "Provide remote user@Host";
fi
}
私も同じ状況ですが、「.vimrc
"。私も
私の解決策(もともと「dist」で30年前に開始されました!)は、夜間cronをセットアップして、作業中のすべてのマシンに最小限のホーム構成をrsyncして、毎晩更新されるようにすることです。
そうすれば、私が使用している他のすべてのマシンが最新の状態に保たれます。新しいマシンを「アカウント」リストに追加するだけで、1台のマシンを配布して起動できます。
それほど大きくする必要はありません。小さなものから始めて、それをより複雑にすることができます。 30年後に想像できるように、私のディストリビューションはかなり複雑になっているので、ここでは説明しません。言うまでもなく、一部のネットワークで一部の構成を他のネットワークにスワップアウトしたり、ホームクリーンアップ(ゴミ箱、キャッシュファイルなど)を行ったり、ホームの権限がすべて正しいことを確認したりするなどの処理も行います。
注1つの「ホーム」マシンから残りのすべてのマシンへのパスワードなしのsshログインのみを許可します。二度と戻ることはできません!クロスsshはすべてパスワードで保護されています。