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

Vim 粘贴小问题

  •  
  •   tesorouo · 2020-05-28 09:21:35 +08:00 · 3895 次点击
    这是一个创建于 1670 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Vim 萌新一枚,想问:我默认 register 已经复制了一个单词,hello 。然后我在一段代码中看到有三个位置要替换成 hello 这个单词,且这三个位置是随机的,没办法用 regex 之类的其他替代操作实现。按照一般的逻辑我肯定是跳到第一个单词,例如这个单词是 Are,我可以在 visual 模式下 viw,然后 p,这样就能替换掉第一个单词,但是诡异的是这个操作以后 vim 的 register 会被替换成 Are (不再是 Hello ),这样我去第二个单词粘贴的时候就粘的不是 hello 了,像这种情景需要怎么解决呢?

    另外,从系统剪贴板复制除了用"+y 有没有别的更快的方式?谢谢大家。

    22 条回复    2020-05-29 12:33:25 +08:00
    MaxTan
        1
    MaxTan  
       2020-05-28 09:28:20 +08:00   ❤️ 1
    如果是 Linux 下用 fcitx 输入法的,可以用 fcitx 自带的剪贴板功能,ctrl+;
    StrayBugs
        2
    StrayBugs  
       2020-05-28 09:31:43 +08:00 via Android
    @MaxTan 原来是 fcitx 哈哈哈!一直以为是 KDE 的快捷键还纳闷怎么设置里找不到。
    lniwn
        3
    lniwn  
       2020-05-28 09:34:38 +08:00   ❤️ 1
    如果是 Windows10,启用系统的云剪切板之后,使用快捷键 Win + V
    lululau
        4
    lululau  
       2020-05-28 09:34:39 +08:00
    找找 vim 的 multiple cursor 插件
    tamlok
        5
    tamlok  
       2020-05-28 09:36:15 +08:00 via Android
    nnoremap 映射
    shawnbluce
        6
    shawnbluce  
       2020-05-28 09:36:59 +08:00   ❤️ 2
    这是 vim 的一个特性,搜索关键词:“vim 寄存器”就明白了。或者看下这个 https://blog.just666.com/2019/01/19/vim-register/
    igaozp
        7
    igaozp  
       2020-05-28 09:38:47 +08:00
    itskingname
        8
    itskingname  
       2020-05-28 09:42:35 +08:00
    不知道你是在哪个环境的 vim 。我用 macOS 上面的,normal 模式可以直接粘贴系统剪贴板。所以我可以直接:%s/Are/粘贴 /g
    lniwn
        9
    lniwn  
       2020-05-28 09:48:10 +08:00   ❤️ 1
    另外,从系统剪贴板复制除了用"+y 有没有别的更快的方式?
    > 两种解决方式,①设置快捷键;②设置共享系统剪切板

    " 复制选中区到系统剪切板中
    vnoremap <leader>y "+y
    " 共享系统粘贴板
    set clipboard=unnamed
    exiaoxing
        10
    exiaoxing  
       2020-05-28 10:13:24 +08:00
    xnoremap p "_dP
    ZhangGu
        11
    ZhangGu  
       2020-05-28 10:15:37 +08:00
    我怎么记得有一个:s 的功能呢
    Immortal
        12
    Immortal  
       2020-05-28 10:18:33 +08:00
    寄存器啊- -
    你可以用 :reg 命令看下寄存器内容
    Lime
        13
    Lime  
       2020-05-28 10:24:31 +08:00
    xnoremap p pgvy
    Volekingsg
        14
    Volekingsg  
       2020-05-28 10:44:46 +08:00
    :%s/word/newword/gc ?
    weixiangzhe
        16
    weixiangzhe  
       2020-05-28 10:51:56 +08:00   ❤️ 1
    vim 下有 cgn,貌似大部分编辑器里插件是不支持,真用 vim 的可以试试,

    比如这段,替换 xxx 为 yyy
    ```
    xxx dfsdfdsf
    sdfasdfasdf xxx
    dfsdfsdfsd xxx sdfsdf
    ```
    1. 在 xxx 处 normal mode 输入 cgn,xxx 会被删除,
    2. 然后输入 yyy
    3. 搞定后,normal 输入 n
    4, 想要替换为 yyy,normal 下输入 '.' (repeat), 不想替换就输入 n 找一个
    yincrow
        17
    yincrow  
       2020-05-28 13:12:11 +08:00
    用 sed 语法替换
    woncode
        18
    woncode  
       2020-05-28 13:26:44 +08:00 via Android   ❤️ 1
    因为 viw 相当于你先剪切了 Are,此时寄存器的第一个就变成了 Are,不再是原来的 hello
    zhuisui
        19
    zhuisui  
       2020-05-28 13:33:25 +08:00   ❤️ 1
    blessingsi
        20
    blessingsi  
       2020-05-28 20:33:28 +08:00   ❤️ 1
    先#选中词,然后 cw, 输入想要替换的词。之后 n 下一个,.重复操作
    MrUser
        21
    MrUser  
       2020-05-29 07:52:14 +08:00
    @blessingsi
    感觉 20 楼正解:先替换一次,然后搜索,用 n/p 切换下一个 /上一个,切到之后用 . 来重复最后一次操作(最后一次是替换)
    亲测完美!
    ilunny
        22
    ilunny  
       2020-05-29 12:33:25 +08:00   ❤️ 1
    前一个问题之前也遇到过,看了大家的回复感觉可以通过选择粘贴寄存器历史里的条目解决:
    viw "0p
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3062 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:50 · PVG 21:50 · LAX 05:50 · JFK 08:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.