vim 및 emacs 'scp://' 원격 파일 경로에 대한 Bash 명령줄 완성 기능

vim 및 emacs 'scp://' 원격 파일 경로에 대한 Bash 명령줄 완성 기능

vim셸을 사용 하거나 emacs셸에서 편집할 원격 파일을 쉽게 지정하려면 scp.

scp원활하고 빠르게 작업을 완료할 수 있다면.ssh/config바르게 구성된.

vim그렇다면 , 및 기타 ssh유능한 편집자 에게 적합하지 않은 이유는 무엇입니까 ? 나는 표준 bash-completion패키지가 내가 아는 한 아직 공개적으로 존재하지 않는 ssh 인식 편집기를 위한 완성 기능의 이점을 누릴 수 있다고 생각합니다 .

afuse(사용할 수 있고 sshfs"해결 방법"으로 사용하는 환경에서는Shell init에서 생성된 사용자 수준 afuse sshfs자동 설치 프로그램 데몬주문형 백그라운드는 원격 파일 시스템을 하위 트리에 마운트합니다 ~/scp/. )

답변1

나는 당신의 솔루션을 시도했습니다. 이것은 홈브류를 사용하는 Mac OSX 10.11 시스템에서 더 잘 작동하도록 약간 수정된 버전입니다.

먼저 rvim_fun.sh 파일에서 다음을 정의합니다.

vi () {
  local params=();
  while [[ ! -z $1 ]]; do
    # test if arg begins a sequence S of characters
    #    - . A-Z a-z 0-9 @ _
    # followed by a colon,
    # if so, we replace S: by scp://S/ to match vim syntax

    if [[ "$1" =~ ^[-.A-Za-z0-9@_]*:.*$ ]]; then
      params=("scp://${1/://}" "${params[@]}");
    else
      params+=("$1");
    fi;
    shift;
  done;
  echo vi ${params[@]};
  $HOME/bin/vi ${params[@]};
}

나는 이것이 나에게 더 잘 작동한다고 생각합니다 (또한 MaxVim을 호출하는 ~/bin에 vi 프로그램이 설치되어 있습니다).

이제 Mac에서 homebrew를 통해 bash 완성 기능을 설치했습니다. 내가 해야 할 일은 다음을 .bashrc 파일에 넣는 것뿐이었습니다.

case "$-" in
*i*)    source rvim_func.sh 
        complete -F _scp -o nospace vi
        ;;
*)  ;;
esac

따라서 나는 홈브류와 관련된 것 외에는 직접적으로 아무것도 얻지 못합니다.

if [ -f $(brew --prefix)/etc/bash_completion ]; then
  . $(brew --prefix)/etc/bash_completion
fi

이것은 홈브류 토론 게시판에서 가져온 것입니다…

어쨌든, 이것은 지금 나에게 아주 잘 작동하고 있습니다... 감사합니다!

답변2

_scp나는 원격 호스트/경로/파일을 완성하는 데 사용할 수 있는 표준 bash 완성 기능을 "남용"하는 방법을 해킹했습니다 .

그런 다음 vim 래퍼 함수는 형식으로 반환된 경로를 ho.st:/fol/der/fi.levim이 예상하는 형식으로 변환합니다 scp://ho.st///fol/der/fi.le.

vim () {
  local params=();
  while [[ ! -z $1 ]]; do
    if [[ "$1" =~ ^[a-z0-9-]*:/.*$ ]]; then
      params=("scp://${1/:\//\/\//}" "${params[@]}");
    else
      params+=("$1");
    fi;
    shift;
  done;
  echo vim ${params[@]};
  /usr/bin/vim ${params[@]};
}
. /usr/share/bash-completion/completions/scp
complete -F _scp -o nospace vim

Emacs의 경우 다음을 사용하십시오.params=("/scp:$1" "${params[@]}");

그러나 이 설정이 더 잘 작동할 수 있습니다. 현재 이 접근 방식에는 몇 가지 사소한 단점이 있습니다.

  • vim 전체를 탭할 수 없습니다 -o ptions. 하지만 어쨌든 나는 거의 사용하지 않습니다.
  • 옵션은 scp여전히 ​​존재합니다(그러나 저는 결코바라보다그들을)
  • scp:// 경로에만 적용됩니다. 그러나 나는 rsync나 http와 같은 다른 것들은 거의 사용하지 않습니다.
  • 마지막 2줄 느낌최적이 아닌, 그리고 많은 도우미 기능으로 내 환경을 채우세요.

    나는 이것을 두 번째 줄로 사용해 보았지만 신뢰할 수 없는 것 같습니다.

    _completion_loader scp

    때로는 tmux가 아닌 경우 새 쉘을 생성하면 "_completion_loader not find" 오류가 발생합니다. 그러나 _completion_loader _scp이 셸을 실행하면 함수가 오류 없이 완료됩니다.

-o ption그냥 희귀성 이나 경로 에 들어갈 수 있기 때문에 이것은 나에게 충분히 잘 작동합니다 http://.

하지만 내 생각엔 이건 아닌 것 같아좋아요더 나은 솔루션/답변이 나오길 바라기 때문에 이를 받아들이지 않을 것입니다.

참고: 방금 사용하기 전에 시도해 보았습니다.표준에서 제공하는 _known_hosts_real() 함수를 수정했습니다., 방법을 찾았습니다더 많은 옵션을 지원하려면 런타임에 패치하세요., 하지만 빨리 포장할 수 없어서 _vim()사용에 대한 약간의 불편함은 무시 _scp()하고 사용하기 시작했습니다.

관련 정보