V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ljmready
V2EX  ›  Vim

请教用 tmux+vim 是怎么进行跨文件复制的?

  •  
  •   ljmready · 2016-03-07 15:07:04 +08:00 · 11480 次点击
    这是一个创建于 2974 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在的开发环境是 centos server 版,习惯用 vim 做编辑器,
    为了分屏,用了 tmux ,然后发现要跨文件复制很麻烦。

    tmux 的 ctrl+a [ 空格,会将 vim 的行号甚至状态栏也复制进来

    vim 的"+y 复制方式,也无法成功,因为 centos 的 vim 没有+寄存器。

    至于 tmux 下用鼠标选择,会将两个竖屏的代码同时复制。。。

    好奇其它人怎么复制的?

    第 1 条附言  ·  2016-03-09 09:51:47 +08:00
    更新..用 vim 分屏似乎可以解决复制问题,一直以为 vim 只能对同一个文件进行切割分屏,然后就用了 tmux ……这么看来我走了歪路
    28 条回复    2016-11-15 07:30:35 +08:00
    ishamo
        1
    ishamo  
       2016-03-07 15:32:23 +08:00
    复制的时候把 vim 里的行号去掉再复制啊。 set nonu
    thwawar
        2
    thwawar  
       2016-03-07 16:14:11 +08:00
    vim 可以 set nonu
    tmux 可以 resize-pane -Z
    msg7086
        3
    msg7086  
       2016-03-07 16:18:05 +08:00
    我开个 vim 然后分屏,复制没压力啊。
    cxbig
        4
    cxbig  
       2016-03-07 16:22:32 +08:00
    - tmux 是借用了系统的剪贴板实现跨软件或编辑器复制
    - tmux 下用左右 panes 的时候 copy 东西需要通过 vertical-mode
    4679kun
        5
    4679kun  
       2016-03-07 16:23:22 +08:00
    看好行号 然后 cat+sed+重定向
    ETiV
        6
    ETiV  
       2016-03-07 16:26:09 +08:00
    我有复制需求的时候都是 :tabnew
    然后 yy, gt, p
    Epirus
        7
    Epirus  
       2016-03-07 16:27:50 +08:00
    ljmready
        8
    ljmready  
    OP
       2016-03-07 16:36:04 +08:00
    @ishamo 也有试过,觉得比较麻烦嘛
    ljmready
        9
    ljmready  
    OP
       2016-03-07 16:39:22 +08:00
    @Epirus 好像挺不错,先 star 为敬
    iamleung
        10
    iamleung  
       2016-03-07 16:41:19 +08:00
    分屏+1 ,然后继续 y 复制
    tracyone
        11
    tracyone  
       2016-03-07 16:44:24 +08:00
    ```
    # MSYS
    if-shell 'uname | grep -qi MSYS_NT' 'bind -t vi-copy y copy-pipe "cat > /dev/clipboard"'
    if-shell 'uname | grep -qi MSYS_NT' 'bind ] run "cat /dev/clipboard | tmux load-buffer - ; tmux paste-buffer"'

    # os x
    #if-shell 'uname | grep -qi Darwin' 'set-option -g default-command "reattach-to-user-namespace -l zsh"'
    if-shell 'uname | grep -qi Darwin' 'bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"'
    if-shell 'uname | grep -qi Darwin' 'bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"'
    if-shell 'uname | grep -qi Darwin' 'bind ] run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"'

    # Linux
    if-shell 'uname | grep -qi Linux' 'bind -t vi-copy y copy-pipe "xclip -sel clip -i"'

    ```
    ljmready
        12
    ljmready  
    OP
       2016-03-07 16:55:39 +08:00
    另外,用 tmux 复制时会复制少开头几个字。。
    zealot0630
        13
    zealot0630  
       2016-03-07 17:27:09 +08:00
    如果 vim 跑在本地的话:

    1. 按 v 选中想要复制的文本
    2. "*y 复制到本地 X 剪贴板
    3. 切换到要复制的 vim
    4. "*p 把 X 剪贴版的内容复制到 vim 中

    服务器开了 xforward 页可以用
    skydiver
        14
    skydiver  
       2016-03-07 17:31:16 +08:00
    先选中,然后:w /tmp/blablabla
    然后到另一个 vim :r /tmp/blablabla
    morefreeze
        15
    morefreeze  
       2016-03-07 17:33:58 +08:00
    " Allow to copy/paste between VIM instances
    "copy the current visual selection to ~/.vbuf
    vmap <leader>y :w! ~/.vbuf<cr>

    "copy the current line to the buffer file if no visual selection
    nmap <leader>y :.w! ~/.vbuf<cr>

    这样满足吗?
    gonglexin
        16
    gonglexin  
       2016-03-07 17:35:15 +08:00
    文件内容不多的时候,我一般用 r (:h read)
    ljmready
        17
    ljmready  
    OP
       2016-03-07 22:33:50 +08:00
    @skydiver 这神技,大道至简,学习了
    ljmready
        18
    ljmready  
    OP
       2016-03-07 22:35:05 +08:00
    @msg7086 用 VIM 自带的分屏?
    introom
        19
    introom  
       2016-03-08 01:32:17 +08:00 via Android   ❤️ 1
    通常就三种,
    一,利用 x 的 clipboard.但我不喜欢这种,一来 vim 的依赖变多,二来我 mac 上还得装 X 才能 xforward ,三来 tmux 下 display 变量更新有点麻烦。

    二,用 tmux 的 buffer ,局限是你必须得跑着 tmux

    三, clipper, 或者类似。我现在用的就是这个。谷歌 vim clipper 应该首页能出结果。
    tonghuashuai
        20
    tonghuashuai  
       2016-03-08 08:30:21 +08:00 via iPhone   ❤️ 1
    vim 同时打开两个文件就好了啊
    czb
        21
    czb  
       2016-03-08 09:03:14 +08:00 via Android   ❤️ 1
    先分屏 :sp / :vsp 然后在 yank 和 paste
    bramblex
        22
    bramblex  
       2016-03-08 09:16:17 +08:00   ❤️ 1
    我以前写过一个简单 vim 插件,用来在没有剪贴板的情况下在服务器跨 vim 进程复制粘贴……
    其实就是拿一个文件中转一下而已……
    jsonline
        23
    jsonline  
       2016-03-08 09:19:36 +08:00 via Android   ❤️ 1
    neovim
    Mush
        24
    Mush  
       2016-03-08 12:28:35 +08:00   ❤️ 1
    vim 开两个文件是个好方法, 如果用 tmux 分屏(或者两台机器)的话, 我都是`:! cat %`然后鼠标选中复制........
    pkking
        25
    pkking  
       2016-03-08 13:46:23 +08:00
    :vs
    vinceguo
        26
    vinceguo  
       2016-03-08 14:14:59 +08:00 via Android
    至于这么麻烦吗?鼠标选择之前按住 ctrl 就可以了
    Ubuntu 15.10 自带 terminal 亲测有效
    ljmready
        27
    ljmready  
    OP
       2016-03-09 09:49:07 +08:00
    @czb ..原来我走了邪路,一直以为 vim 只能对一个文件分屏
    Lordyung
        28
    Lordyung  
       2016-11-15 07:30:35 +08:00 via iPhone
    @morefreeze 原来可以这样,没想到
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4775 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 01:08 · PVG 09:08 · LAX 18:08 · JFK 21:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.