내 작업은 SSH를 사용하여 다양한 시스템에 연결 한 다음 vim을 사용하여 해당 시스템의 파일을 편집하는 경향이 있습니다. 문제는 .vimrc 파일을 지속적으로 복사해야한다는 것입니다. vim을 열고 설정을하지 않는 것은 매우 성가신 일입니다. 어디서나 수동으로 복사하지 않고 vim 설정을 기계에서 기계로 옮기는 것이 가능합니까?
내 작업은 SSH를 사용하여 다양한 시스템에 연결 한 다음 vim을 사용하여 해당 시스템의 파일을 편집하는 경향이 있습니다. 문제는 .vimrc 파일을 지속적으로 복사해야한다는 것입니다. vim을 열고 설정을하지 않는 것은 매우 성가신 일입니다. 어디서나 수동으로 복사하지 않고 vim 설정을 기계에서 기계로 옮기는 것이 가능합니까?
답변:
네 아픔이 느껴져. 버전 제어 (Subversion)에서 ~ /.* rc 파일을 모두 가지고 있으며 CVS를 사용하여 1998 년 시작한 이래로 훌륭하게 작동했습니다. 이를 수행하는 한 가지 방법은 홈 디렉토리에 서있을 때 이와 같은 모든 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://remoteuser@server.tld//path/to/document
또는 다음과 같이 vim을 시작하십시오.
vim scp://remoteuser@server.tld//path/to/document
그러면 파일이 이음새없이 제자리에 열리고 (실제로는 로컬로 파일이 복사 됨) 저장하면 편집 된 파일이 서버로 다시 전송됩니다.
ssh 비밀번호를 요청하지만 ssh 키를 통해 간소화 할 수 있습니다.
다른 사람들이 언급 했듯이이 방법의 유일한 단점은 컴퓨터에서 직접 작업 할 때와 같이 경로 / 파일 구성을 얻지 못한다는 것입니다.
자세한 내용 은 다음 자습서를 확인하십시오 .
다음과 같이 로그인 할 때마다 bash 스크립트를 자동으로 복사하도록 만들 수 있습니다.
#!/usr/bin/env bash
scp ~/.vimrc $1:
ssh $1
예를 들어 ssh_vim이라고 부를 수 있습니다. 이상적인 솔루션은 아니지만 문제를 해결할 것입니다.
이미 있는지 먼저 확인하도록 개선 할 수 있습니다. 동일한 시스템에서 ssh를 항상 실행하지 않는 경우 다른 시스템의 scp에서 파일을 가져 오도록 스크립트를 변경할 수 있습니다.
편집 1
관련 참고 사항에서 sshfs를 사용하여 원격 시스템의 파일 시스템을 마운트 할 수도 있습니다. 그렇게하면 환경과 도구 (.vimrc뿐만 아니라)의 이점을 얻고 쉘 완료 (scp : //를 사용하지 않는)가 있습니다.
편집 2
방금 scp : //를 사용하여 .vimrc 파일을 소스로 사용할 수 있음을 알았습니다.
:source scp://you@your_computer//yourpath/.vimrc
이것은 vim 명령 줄에서 작동하지만 현재 자동화 방법을 모르겠습니다. '-u'스위치 나 .vimrc 또는 $ VIMINIT에서는 작동하지 않는 것 같습니다.
편집 3
찾았어요! 이 작업을 수행하여 참조 호스트에서 가져온 .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
명령 의 호출을 엉망으로 만들지 않기 때문에 위에서 제안한 스크립트 트릭보다 낫습니다 (추가 매개 변수 등을 지정할 때 등).
%u@%n:
해야했습니다%r@%n:
몇 가지 솔루션 :
1) 홈 폴더의 NFS 공유를 생성하고 여러 위치에 매핑합니다.
2) 작은 스크립트를 작성하여 .vimrc를 ID / 키 파일로 연결중인 서버로 푸시하십시오. 다음과 같이 보일 수 있습니다 (의사 코드).
connectString = arg0 #username@ipaddress
scp -i ~/.ssh/indentity connectString:~/ ~/.vimrc
ssh -i ~/.ssh/indentity connectString
sunny256과 정확히 동일하지만 SubVersion 대신 git을 사용하십시오.
모든 컴퓨터에 공통 인 파일로 하나의 기본 분기를 유지하고 새 컴퓨터마다 하나의 분기를 갖습니다.
그렇게하면 대부분의 컴퓨터에서 거의 같은 파일을 가질 수 있지만 여전히 혼란스럽지 않습니다.
https://github.com/andsens/homeshick 을 사용하여 내 도트 파일을 관리하고 github에 저장하고 있습니다.
Homeshick은 100 % bash로 작성되었으며, / home / 디렉토리를 포함하는 git repos 인 "castles"를 관리하는 데 도움이됩니다. 기존 도트 파일을 리포지토리로 이동하고 심볼릭 링크로 바꾸라는 명령이 있습니다. 리포지토리의 모든 파일을 새 컴퓨터의 홈 디렉토리로 심볼릭 링크합니다.
따라서 일반적인 아이디어는 도트 파일을 버전 제어 시스템에 유지하고 실제 경로에서 심볼 파일과 심볼 링크합니다. 이렇게하면 리포지토리를 홈 디렉토리에서 시작할 필요가 없으며 추가하고 싶지 않은 많은 파일이 포함됩니다.
나와 같은데 여러 가지 이유로 개발 머신 (가상 머신도 포함)이 많은 경우 ssh 키, 스마트 bash_profile 및 선택한 RCS를 결합 할 수 있습니다.
두 번째로 nfs / samaba / sshfs를 사용합니다. 한 가지 단점은 항상 네트워크에 액세스 할 수없는 경우 필요한 항목 (비행, 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을 통한 인증은 ssh를 통해 이루어 지므로 ssh 키도 여기에서 도움이됩니다. 이 시점에서 nfs와 같은 것을 사용할 수 있습니다. 아래에 언급 한 이유로 여전히 RCS의 팬이 될 것입니다.
유스 케이스는
다음에 시도하고 싶은 것은 초기 로그인 / 설정을 새 컴퓨터에 복사 한 makefile에 래핑하는 것입니다. 그런 다음 makefile은 키, RCS 등을 설정하는 작업을 수행 할 수 있습니다. 여기에는 약간의 오버 헤드가 있지만 많은 기계를 설정하면 다음과 같습니다.
SSHd 내장 구성 옵션을 비표준 방식으로 사용하여 ssh 때마다 .vimrc 파일 을 기본적으로 전송할 수있는 간단한 도구를 작성했습니다 .
추가 svn
, scp
, copy/paste
, 등이 필요하지 않습니다.
간단하고 가벼우 며 지금까지 테스트 한 모든 서버 구성에서 기본적으로 작동합니다.
변수 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 년 전)은 야간 크론을 설정하여 내가 작업하는 모든 컴퓨터에 최소 홈 구성을 재 동기화하여 야간 업데이트되도록합니다.
그렇게하면 내가 작업하는 다른 모든 컴퓨터가 최신 상태로 유지됩니다! '계정'목록에 새 컴퓨터를 추가하고 단일 컴퓨터 배포를 수행하여 시작할 수 있습니다.
많을 필요는 없으며 작게 시작하여 갈수록 복잡해집니다. 당신이 30 년 후에 상상할 수 있듯이 나의 배포는 이제 다소 복잡하므로 여기서는 다루지 않겠습니다. 말할 필요도없이 일부 네트워크의 다른 구성, 홈 정리 (예 : 휴지통, 캐시 파일), 홈 권한이 모두 올바른지 등을 위해 다른 구성을 교체하는 등의 작업을 수행 할 수 있습니다.
참고 하나의 '홈'컴퓨터에서 나머지 모든 컴퓨터로 암호가없는 ssh 로그인 만 허용하며 다시는 다시는 허용되지 않습니다! 모든 크로스 ssh는 비밀번호로 보호됩니다.
특정 키를 누를 때 EXRC 변수와 같은 경로와 환경을 설정할 수있는 EXPECT 스크립트를 고려할 수 있습니다. 누군가 비슷한 스크립트를 게시하기 전에 너무 오래 걸리지 않아야합니다.
서버 팜이 수십 개 (수천 개 이상) 이상인 경우 '처녀'상자에 환경을 쉽게 설정하는 것은 진정한 생명의 은인입니다.
상자에 로그인하면 처음으로 홈 디렉토리가 생성됩니다!
다음과 같은 bash oneliner로 실현되었습니다. 프로세스 대체로 수행되므로 임시 파일이 작성되지 않습니다.
ssh -t user@host '
bash --rcfile <(
echo -e ' $(cat <(echo "function lvim() { vim -u <(echo "$(cat ~/.vimrc|base64)"|base64 -d) \$@ ; }") \
~/dotfiles/{.bashrc,sh_function,sh_alias,bash_prompt} \
<(echo -e alias vim=lvim) | \
base64
) ' \
|base64 -d)'
https://gist.github.com/blacknon/a47083f3bbbd0374998bdf7e3b3396cc
set background=dark
또는 리눅스 배포판에 닿지 않고 사용자에게 전혀 방해 가 되지 않는set background=light
무언가 . </ sarcasm>