vim 和 emacs 'scp://' 远程文件路径的 Bash 命令行补全功能

vim 和 emacs 'scp://' 远程文件路径的 Bash 命令行补全功能

为了轻松指定远程文件以使用 shell 进行编辑vimemacs从 shell 进行编辑,我希望具有像可用于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[@]};
}

我发现这对我来说效果更好(另外,我在 ~/bin 中安装了一个调用 MaxVim 的程序 vi)。

现在,在我的 Mac 上,我通过自制程序安装了 bash-completion。我所要做的就是将以下内容放入我的 .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

我破解了一些“滥用”可用的标准_scpbash 完成功能来完成远程主机/路径/文件的功能。

然后,vim 包装函数将表单中返回的路径转换ho.st:/fol/der/fi.le为 ​​vim 预期的形式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 中,生成新的 shell 会导致“_completion_loader not find”错误。然而,_completion_loader _scp该 shell 的运行结果是功能完成且没有错误。

这对我来说足够有效,因为我只需输入稀有-o ptionhttp://路径即可。

但我不认为这好的解决方案/答案,并且不会接受它,因为我希望出现更好的解决方案/答案。

注意:我之前尝试过只使用修改了标准提供的 _known_hosts_real() 函数,找到了一种方法运行时修补它以支持更多选项,但随后无法快速将其包装到 中_vim(),所以我只是忽略了使用 的轻微不便_scp(),并开始使用它。

相关内容