ssh远程如何复制vim中的文本

105 篇文章 33 订阅

对于vim(neovim)这个软件,我大部分时间是在远程机器上使用的。复制远程ssh中的文本到本地是很觉了的。如果复制内容少可以直接鼠标选中进行复制即可,缺点也比较显示:

  1. 复制下来的文本经常格式已经变化了,比如:增加了行号信息,换行的地方还需要调整。
  2. 超过一页的内容无法连续复制

以前遇到大文件的复制,我只好使用sftp下载下来在复制。但是这样操作太繁琐了。今天终于找到了比较好的解决办法。

先决条件

本地需要一个支持 OSC 52 的终端,很多终端都是支持的。

  • Linux 下的 xterm,设置 disallowedWindowOps: 20,21,SetXprop
  • Mac 下的 iterm2,勾选 Applications in terminal may access clipboard
    在这里插入图片描述
    我使用的是macOS下面的iterm2

配置

clipboard-provider放入path中

创建一个文件clipboard-provider,并写入以下内容。

#!/bin/bash
# Taken and modified from https://github.com/agriffis/skel/blob/master/neovim/bin/clipboard-provider
#
# clipboard provider for neovim
#
# :help provider-clipboard

#exec 2>> ~/clipboard-provider.out
#set -x

: ${COPY_PROVIDERS:=tmux pb xclip osc52 local}
: ${PASTE_PROVIDERS:=xclip pb tmux local}
: ${TTY:=`(tty || tty </proc/$PPID/fd/0) 2>/dev/null | grep /dev/`}

LOCAL_STORAGE=$HOME/.clipboard-provider.out

main() {
    declare buffer status=1

    case $1 in
        copy)
            buffer=$(base64 | tr -d '\n')
            internal() { base64 --decode <<<"$buffer"; }
            for p in $COPY_PROVIDERS; do
                internal | $p-provider copy && status=0
            done ;;
        paste)
            for p in $PASTE_PROVIDERS; do
                $p-provider paste && status=0 && break
            done ;;
    esac

    exit $status
}

is-copy() {
    if [[ "$1" == "copy" ]]; then return 0; else return 1; fi
}

tmux-provider() {
    [[ -n $TMUX ]] || return is-copy
    case $1 in
        copy) internal | tmux load-buffer - ;;
        paste) tmux save-buffer - ;;
    esac
}

pb-provider() {
    if ! command -v pbcopy &>/dev/null;then return $(is-copy $1); fi
    case $1 in
        copy) internal | pbcopy ;;
        paste) pbpaste ;;
    esac
}

osc52-provider() {
    # HACK: this ignores stdin and looks directly at the base64 buffer
    case $1 in
        copy) [[ -n "$TTY" ]] && printf $'\e]52;c;%s\a' "$buffer" > "$TTY" ;;
        paste) return 1 ;;
    esac
}

local-provider() {
    case $1 in
        copy) internal > $LOCAL_STORAGE ;;
        paste) cat $LOCAL_STORAGE && return 0;;
    esac
}

xclip-provider() {
    if ! command -v xclip &>/dev/null;then return $(is-copy $1); fi
    case $1 in
        copy) internal | xclip -i -selection clipboard;;
        paste) xclip -o -selection clipboard;;
    esac
}

main "$@"
# 设置可执行权限
chmod +x clipboard-provider
# 复制到path之中,放哪都行,只要在path中即可
cp clipboard-provider /usr/local/bin/

配置neovim的vimrc

我使用的是neovim,vim是否可以我没有测试。
编辑配置文件:

nvim ~/.config/nvim/init.vim

增加以下内容:

"ssh 远程粘贴板
if executable('clipboard-provider')
    let g:clipboard = {
          \ 'name': 'myClipboard',
          \     'copy': {
          \         '+': 'clipboard-provider copy',
          \         '*': 'env COPY_PROVIDERS=tmux clipboard-provider copy',
          \     },
          \     'paste': {
          \         '+': 'clipboard-provider paste',
          \         '*': 'env COPY_PROVIDERS=tmux clipboard-provider paste',
          \     },
          \ }
endif

配置完成后,重启nvim。v选中要复制的文本内容按"+y即可把内容复制到本地剪切板,非常的方便。

tmux

上面配置完成后,可以直接使用。但是发现在tmux中打开nvim无法把内容复制到本地剪切板。
解决办法:
编辑~/.tmux.conf增加下面一行:

set -g set-clipboard on

重新加载tmux配置
可以在tmux 模式下的命令行模式下执行 (进入命令行模式的命令 ctrl + b 然后再按个冒号: )

source-file ~/.tmux.conf

这样就可以了。如果你发现你的tmux中还是不行的话,可能是你的tmux的path中没有clipboard-provider
,新建一个窗口就可以了。

参考

https://lotabout.me/2019/Integrate-clipboard-with-SSH/

Ubuntu修改SSH远程登录的默认端口可以通过编辑SSH服务的配置文件来实现。通常,SSH服务使用的是22端口,出于安全考虑,可能需要更改为其他端口。以下是一个简单的步骤说明: 1. 打开终端。 2. 使用文本编辑器打开SSH的配置文件`sshd_config`。通常使用`nano`或`vim`编辑器,例如使用`nano`编辑器的命令如下: ``` sudo nano /etc/ssh/sshd_config ``` 如果你更喜欢使用`vim`,命令是: ``` sudo vim /etc/ssh/sshd_config ``` 3. 在`sshd_config`文件找到`Port 22`这一行。 4. 将`22`更改为你的自定义端口号,比如`12345`。确保新端口号没有被其他服务使用,并且不要使用低于1024的端口号,因为这些端口号通常需要管理员权限。 5. 保存并关闭文件。如果你使用的是`nano`,可以按`Ctrl+X`,然后按`Y`,最后按`Enter`确认保存;如果使用`vim`,可以按`Esc`键,输入`:wq`后按`Enter`保存并退出。 6. 重启SSH服务以使更改生效。可以使用以下命令: ``` sudo systemctl restart sshd ``` 或者在某些系统使用: ``` sudo service ssh restart ``` 7. 确认新端口是否启动并监听。可以使用如下命令查看: ``` netstat -tulpn | grep sshd ``` 或者 ``` sudo ss -tulpn | grep sshd ``` 在进行这些更改之后,当你想要通过SSH连接到Ubuntu服务器时,需要指定新的端口号。例如,如果你更改了端口为12345,那么连接的命令将会是: ``` ssh 用户名@服务器地址 -p 12345 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值