常常需要在服務器上搗鼓東西,同時需要將內容復制到本地的需求。
1-內容是在遠程終端用vim打開,如何用vim的類似指令達到快速復制到本地呢?
假設待復制的內容:
#include <iostream>
#include <cstring>
using namespace std;const int N = 1e3 + 10;int v[N], w[N];
int f[N][N];
int n, m;
int main() {cin >> n >> m;for (int i = 1; i <= n; ++i) cin >> v[i] >> w[i];for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {f[i][j] = f[i-1][j];if (v[i] <= j)f[i][j] = max(f[i][j], f[i-1][j-v[i]] + w[i]);}}cout << f[n][m] << endl;return 0;
}
解決方案
配置vim
創建~/.vimrc并寫入如下內容后使其生效:source ~/.vimrc。完成后就可以在vim里用v
選擇,y
復制,然后本地正常粘貼即可。
syntax on "自動語法高亮
set number "顯示行號
set cindent
set tabstop=4 "tab鍵,vim顯示的空格數"
set shiftwidth=4 "縮進長度
set backspace=2 "允許退格鍵刪除
set smartindent "開啟新行時使用智能自動縮進
set showmatch "插入括號時,短暫地跳轉到匹配的對應括號
set ruler "打開狀態欄標尺
set mouse=a "在vim所有模式下開鼠標,復制文檔就可以不包含行號了
set nocompatible "不與vi兼容(采用vim自己的操作命令)"
set showmode "在底部顯示,當前處于命令模式還是插入模式"
set encoding=utf-8 "使用utf-8"" 函數:將寄存器內容發送到本地剪貼板
function! Osc52Yank()let buffer=system('base64 -w0', @0)let buffer=substitute(buffer, '\n$', '', '')let buffer='\e]52;c;'.buffer.'\a'silent call system('printf '.shellescape(buffer).' > /dev/tty')
endfunction" 自動在復制后調用
augroup Osc52Yankautocmd!autocmd TextYankPost * if v:event.operator ==# 'y' | call Osc52Yank() | endif
augroup END
這個方法成功的前提是你的本地終端工具要支持Osc52Yank以及允許終端應用訪問剪切板,支持的終端列表參考[1]。
2-想復制的是某個命令或輸出在終端上的內容,同時不想用鼠標?
假設在tmux里面,為了使得復制到本地的功能像上述般絲滑,需要配置tmux。
解決方案
配置tmux
創建 ~/.tmux.conf 并寫入下面內容[2]后使其生效 tmux source ~/.tmux.conf,然后就可以ctrl + b [
進入tmux選擇模式,后面和上述vim類型,v
選擇,y
復制退出選擇模式,然后無痛粘貼即可。
set -g mode-keys vi# 增加歷史緩沖區
set -g history-limit 100000# 進入copy-mode
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind-key -T copy-mode-vi Escape send-keys -X cancelbind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -selection clipboard"
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xclip -selection clipboard"set -g mouse on# 優化翻頁鍵
bind-key -T copy-mode-vi C-f send-keys -X page-down
bind-key -T copy-mode-vi C-b send-keys -X page-up
bind-key -T copy-mode-vi C-d send-keys -X halfpage-down
bind-key -T copy-mode-vi C-u send-keys -X halfpage-upset-option -g set-clipboard on
set-option -ga terminal-overrides ',xterm-*:clipboard'
這個方法成功的前提和上述類似。
參考
[1] https://github.com/ojroques/vim-oscyank
[2] 終端神器tmux:多任務管理大師