为了轻松指定远程文件以使用 shell 进行编辑vim
或emacs
从 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
我破解了一些“滥用”可用的标准_scp
bash 完成功能来完成远程主机/路径/文件的功能。
然后,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 ption
或http://
路径即可。
但我不认为这好的解决方案/答案,并且不会接受它,因为我希望出现更好的解决方案/答案。
注意:我之前尝试过只使用修改了标准提供的 _known_hosts_real() 函数,找到了一种方法运行时修补它以支持更多选项,但随后无法快速将其包装到 中_vim()
,所以我只是忽略了使用 的轻微不便_scp()
,并开始使用它。