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

如何提升 Vim 技巧?

  •  
  •   FaiChou ·
    FaiChou · 2021-01-19 10:11:13 +08:00 · 5854 次点击
    这是一个创建于 577 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己已经不做互联网行业了, 但平时业余也写点脚本, 用 VSCode 感觉太重, 所以选择 Vim.

    因为知道 Vim 有很多奇技淫巧, 但平时使用还是习惯那几个快捷键. 比如想删除一行再进行编辑, 之前习惯 dd 再 insert, 其实有更简便的 S; 再比如 a = "xyz" 想更换双引号为单引号, 使用 r 来一个一个替代, 其实有更简便的: 光标在 xyz 中, cs"'(change surrounding " to ').

    尽管不知道这几个奇技淫巧也不耽误开发, 但学习了它会提升一定的效率. 自己闭门练习不会提升, 只会让效率低的快捷键成为码代码的习惯. 看他人使用 Vim 码代码会学习他人的 Vim 快捷键习惯. 除此之外 还有什么好的方法来学习这些奇技淫巧?

    第 1 条附言  ·  2021-01-19 13:47:19 +08:00
    记得几年前有一期 react hooks 的开发者大会, 有个哥们上去用 vim 撸代码, 感觉好有劲. 放慢播放速度跟着他的操作学习. 所以, 看大牛视频能有所提升, 当然那时候 Vim 对我来说是刚入门, 再后来, 我就学 emacs 了..
    61 条回复    2021-01-20 14:45:54 +08:00
    jdhao
        1
    jdhao  
       2021-01-19 10:14:19 +08:00
    编辑的时候,多想想有没有更快捷的方式,然后去搜索,八成是有比你现在编辑的方式更快的方案。
    nthhdy
        2
    nthhdy  
       2021-01-19 10:16:49 +08:00
    需求驱动。多用 vim 处理数据、做开发、读代码,这中间就会遇到各种需求的
    ysn2233
        3
    ysn2233  
       2021-01-19 10:17:50 +08:00
    多用就习惯了
    FaiChou
        4
    FaiChou  
    OP
       2021-01-19 10:19:45 +08:00
    @ysn2233 #3 多用就习惯了已经知道的快捷键, 我想学习更快捷的
    lbyo
        5
    lbyo  
       2021-01-19 10:22:18 +08:00
    学到了,VSCode + Vim 目前体验不错
    xubeiyan
        6
    xubeiyan  
       2021-01-19 10:22:20 +08:00 via Android   ❤️ 2
    有个 missing semester of computer science,你去搜一下。其中就有讲这个一节课
    perapera
        7
    perapera  
       2021-01-19 10:26:52 +08:00
    我自己的方法是拿张纸把自己的需求和相应的键位写下来,然后放在最显眼的地方,dd 用烦了就看一眼,一眼就能看到,久而久之就习惯了,要是一直不看就说明旧的键位也很顺手(不过楼主说的两个键位我从来没用过,学习了,哈哈
    jasonyang9
        8
    jasonyang9  
       2021-01-19 10:35:32 +08:00
    change surrounding 是不是需要插件的,我试了无效。
    anzu
        9
    anzu  
       2021-01-19 10:35:48 +08:00
    比起 S 更习惯用 cc,我觉得与其找两个键,不如一个键重复两次。推荐看《 vim 实用技巧》,当你从入门到熟练后,可以试着放慢编辑速度,稍微思考或查找是否有更高效的快捷键组合。有些人用了 vim 后感觉没有提高的原因之一就是,他们一直在使用低效的入门快捷键组合。
    Chingim
        10
    Chingim  
       2021-01-19 10:36:01 +08:00
    有本书可以翻翻 Practical Vim
    Chingim
        11
    Chingim  
       2021-01-19 10:36:54 +08:00   ❤️ 2
    @jasonyang9 tpope/vim-surround
    northisland
        12
    northisland  
       2021-01-19 10:40:22 +08:00   ❤️ 1
    vim cheat sheet : https://vim.rtorr.com/

    vim 周边插件(比如搞一下 nvim + pynvim )

    然后了解一下上限


    然后你会发现,还是 pycharm 好用。
    rationa1cuzz
        13
    rationa1cuzz  
       2021-01-19 10:41:15 +08:00
    还是要多用,多搜
    rainfd
        14
    rainfd  
       2021-01-19 10:48:50 +08:00
    看书《 Vim 实用技巧》,看 vim 相关的博客,自己研究太慢了,不如别人总结
    FaiChou
        15
    FaiChou  
    OP
       2021-01-19 10:52:25 +08:00
    @northisland #12 谢谢, vim 的 chectsheet 太多了 感谢再提供一个
    unicloud
        16
    unicloud  
       2021-01-19 11:03:31 +08:00
    除了多用、多总结,真的没有什么捷径;即便有一百个人告诉你如何如何,还是得自己练习。
    itgoyo
        17
    itgoyo  
       2021-01-19 11:20:29 +08:00
    Vim 更多的是肌肉记忆,关于技巧啥的《 Vim 使用技巧》书里面的操作过一遍即便足够了解 Vim 的基本操作了,后面更多的就是看你用不用到所谓的 Vim 插件了,但是很多 vim 的插件,IDE 要么有类似的功能,要么已经有 dalao 移植了 vim 的功能过来,根据实际情况来吧,如果是 C,Python 、Go 这种确实 vim 也可以,但是你让我来写前端代码,对不起我还是选择 VSCode 或者是 Atom 、Sublime Text
    AmoreLee
        18
    AmoreLee  
       2021-01-19 11:39:44 +08:00
    1. 看书:vim 实用技巧
    2. 安装插件,https://github.com/amix/vimrc 推荐这套配置
    3. 不断的实践
    Qcui
        19
    Qcui  
       2021-01-19 11:54:54 +08:00   ❤️ 1
    上面大佬说到了 cc,让我想起,一个单词重复两次就是针对一行操作的这句话,比如:
    y: 复制,yy: 复制一行
    d: 删除,dd: 删除一行
    c: 修改,cc: 修改一行
    其它的有大佬补充没?
    cmdOptionKana
        20
    cmdOptionKana  
       2021-01-19 12:13:24 +08:00
    终极技巧:IDEA 或 VScode + vim 插件。
    flashlight
        21
    flashlight  
       2021-01-19 12:21:35 +08:00
    用起来,发现自己做什么操作“麻烦”的适合就去查一下怎么能不麻烦的做这个操作
    Nimrod
        22
    Nimrod  
       2021-01-19 12:22:28 +08:00
    补充一个实用性没有那么强的网站 http://vimgolf.com/ ,用尽可能少的 keystroke 来完成目标
    Meltdown
        23
    Meltdown  
       2021-01-19 12:45:59 +08:00 via Android
    玩游戏 vimadventure
    Leviathann
        24
    Leviathann  
       2021-01-19 12:50:59 +08:00 via iPhone
    有个把函数参数作为文本对象的插件
    daa 就是 delete a argument
    fn(a1, |a2)
    假设|是光标,daa 就会只剩下 fn(a1),
    dia 就是 fn(a1, )
    wuwukai007
        25
    wuwukai007  
       2021-01-19 12:55:32 +08:00 via Android   ❤️ 1
    ciw,在单词任意位置删除整个单词
    FaiChou
        26
    FaiChou  
    OP
       2021-01-19 13:36:25 +08:00
    @wuwukai007 #25 ciw -> change inner word 也可以使用 caw -> change a word

    var x = 'https://xxx.|com', 光标在 | 位置, ci' -> 直接删除引号里面并插入.

    这里面的 c 可以换成其他动词: y (yank), d (delete) 等

    但我感觉这些知识都是入门级别的快捷键, 任何 cheatsheet 都会说. 所以 ..
    gdtdpt
        27
    gdtdpt  
       2021-01-19 13:40:06 +08:00
    我记得某一本关于如何使用 Vim 的书里有说,Vim 里每种操作都有很多种方法,找一个自己习惯的就行了,不用拘泥于哪个最简便哪个最好。
    有人喜欢 easymotion 快速移动,我喜欢 hjkl 慢慢移动,移动的过程中可以思考准备做什么或者之前写的有没有问题。
    如果不熟就多用多练。
    lululau
        28
    lululau  
       2021-01-19 13:52:51 +08:00
    基本操作练练熟,看 :help vim,然后自己写个插件,Vim / Emacs 看不懂别人写的扩展,不会修改,自己不会写扩展的话,算不上会用
    FaiChou
        29
    FaiChou  
    OP
       2021-01-19 13:55:04 +08:00
    @gdtdpt #27 的确, 写了几年代码现在反思下, 用像 VSCode 等编辑器, 很多操作都是浪费时间的, 但浪费的时间刚好用来思考如何进行下一步代码的操作, 也就是说, 习惯了普通编辑器, 手速是超前脑速的, 手会经常停下来等待大脑.

    而现在使用 Vim 就不一样了, 手就慢了下来, 因为生疏, 需要大脑去教手指去操作. 所以希望能练就「无他, 唯手熟尔」的境界.
    guhuisec
        30
    guhuisec  
       2021-01-19 14:35:29 +08:00
    我个人感觉自己用的最多的如下:
    打开:vim 文件名
    关闭:先按下 esc 键,进入 esc 模式,输入冒号,然后输入 w 就是保存;如果输入 wq 就保存退出;如果输入 q 就是退出。
    进入 esc 模式,定位到文件最开始:按 2 下 g (小写 g )
    进入 esc 模式,定位到文件最后:shift+g (大写的 G )
    进入 esc 模式,定位到一行最前面:按 0 键
    进入 esc 模式,定位到一行最后面:shift+4
    按 v 进入虚拟模式:按 v 即可
    格式化所选内容:先进入 v 虚拟模式进行内容选择,然后按=号即可,如果是格式化全部,先按 v 进入虚拟模式,按 2 下 g 进入文件最开始,然后 shift+g 定位到文件尾,然后按=号即可。比如你可以格式化 nginx.conf 这些文件或者其他的。
    guhuisec
        31
    guhuisec  
       2021-01-19 14:37:10 +08:00
    还有几个补充下:
    esc 模式:按 d 或者 dd 剪切当前行;按 p 粘贴剪切的行。
    Lumuy
        32
    Lumuy  
       2021-01-19 15:51:47 +08:00
    https://thoughtbot.com/upcase/onramp-to-vim


    现看一遍,再用用,过段时间再回来看一遍,周而复始。
    用长了,所有编辑模式你都想切换为 vim 模式
    xpresslink
        33
    xpresslink  
       2021-01-19 16:29:41 +08:00
    VIM 在编辑文本上提供那些强大功能都要靠反直觉消耗脑力得到的。
    但毕竟写代码时,Ctrl+C 、Ctrl+V 用得最多。
    我觉得如果要是写代码还是用专用的 IDE 效率更高,用 VIM 写码不论你怎么配置做大项目的时候都很难受。
    FaiChou
        34
    FaiChou  
    OP
       2021-01-19 16:30:58 +08:00
    @guhuisec #31 你说的这些都是基础用法, cheatsheet 都能 cover 不过还是感谢回复
    FaiChou
        35
    FaiChou  
    OP
       2021-01-19 16:37:09 +08:00
    @xpresslink #33 IDE 用的通用习惯, 容易上手, 再加上 Emacs 的一些快捷键( ctrl+a 到行首, ctrl+e 到行尾, ctrl+k 删除至行尾, meta+b 退一个单词等)是挺有效率的, 但回想下, 这一套内容也是需要经过学习得来的, 比如 VSCode 里 option+下, 可以移动一行到下面, shift+option+下, 复制当前行.. Vim 也是学习, 相信经过练习任何人都能做到不用消耗脑力来驱使手指按键, 你懂的, 有些人就喜欢效率的工具.
    ediron
        36
    ediron  
       2021-01-19 17:03:59 +08:00
    推荐几个工具
    一个可以直接内置到 Vim 中的 vim cheat,使用中可以随时查看快捷键:
    https://github.com/lifepillar/vim-cheat40

    一个中文的从入门到精通的 Vim 教程,很全面不止于使用层面,有高级的东西:
    https://github.com/wsdjeg/vim-galore-zh_cn

    其实 Vim 自带有入门教程的,命令行敲「 vimtutor 」就能进去,都是从很基础的开始一步步教学,不顾是原始是英文的,这里有一个项目,你按照教程 git clone 一下,就能把 Vim 官方文档汉化。再用「 vimtutor 」命令就可以查看中文教程:
    https://github.com/yianwillis/vimcdoc

    其实要想用的溜,除了多用还是要总结一套自己的键位习惯,可以多看看大佬们的 vimrc 文件都是怎么改的,觉得好的可以拿来用或者自己再改改。平时在用 Vim 时也可以利用多窗口,边用边记笔记。
    zyfsuzy
        37
    zyfsuzy  
       2021-01-19 17:13:24 +08:00
    放弃吧,编程不合适
    vigack
        38
    vigack  
       2021-01-19 17:21:17 +08:00
    @guhuisec 可以用 ZZ 替代 :wq, 节省一次按键:doge
    huangmingyou
        39
    huangmingyou  
       2021-01-19 17:24:05 +08:00
    不常用的技巧学了也没用,两周就忘记了。
    tiedan
        40
    tiedan  
       2021-01-19 17:39:46 +08:00
    个人比较喜欢的 -

    :x 保存退出
    f+要跳转的字母 行内跳转光标
    ca,ci 修改
    ctrl+f ctrl+b 翻页
    ( 向上跳转到空行和空行附近的一行
    ) 向下跳转到空行和空行附近的一行
    { } 和 ( ) 类似但不跳转空行的附近行
    ]] 跳转到下一个 {
    [[ 跳转到上一个 {
    ][ 跳转下一个 }
    [] 跳转到上一个 }
    % 跳转到另一个花括号或圆括号
    zhuangzhuang1988
        41
    zhuangzhuang1988  
       2021-01-19 17:54:58 +08:00 via Android
    放弃
    zeroDev
        42
    zeroDev  
       2021-01-19 17:57:29 +08:00 via Android
    用这个软件刷题: Vim Master
    iSecret
        43
    iSecret  
       2021-01-19 17:57:32 +08:00
    说一个大佬之前教我的一个命令,用得比较多,比如 a = "bcdef" 需要删除 "" 中的内容,命令是 di",同理还有 ' ( [ { 等等。
    moyupoi
        44
    moyupoi  
       2021-01-19 17:57:36 +08:00 via iPhone   ❤️ 1
    《穿越到异世界居然能用 vim 修改能力值》
    jswh
        45
    jswh  
       2021-01-19 18:10:06 +08:00
    用 vim 除了快捷键,主要还有宏录制
    blessingsi
        46
    blessingsi  
       2021-01-19 18:11:27 +08:00
    感觉日常使用是不够的,因为会自动用自己最熟悉的方式。需要看书,然后跟着练一练。这样下次用的时候才能想起来。
    NeezerGu
        47
    NeezerGu  
       2021-01-19 18:28:15 +08:00
    @moyupoi 尼玛。。。我还以为真有这么个游戏
    NeezerGu
        48
    NeezerGu  
       2021-01-19 18:30:31 +08:00
    放弃吧,我试过,最后发现就算看了也经常记不住。
    我已经算是比较频繁使用 vim 的人了。。。

    总归还是要需求驱动。就是当你使用个几个月甚至更久,突然感觉最近有个 xx 行为,感觉比较低效,但又应该可以用更快捷的办法来取代,这时候再去对这个行为进行搜索会更加有效一些。

    比如你说的 ddi 和 S 。 开玩笑说如果你 ddi 按的比 S 还快,你干嘛还要切换?
    zengming00
        49
    zengming00  
       2021-01-19 19:30:08 +08:00
    有些时候 vim 的宏用得相当爽
    FaiChou
        50
    FaiChou  
    OP
       2021-01-19 22:48:44 +08:00 via iPhone
    @NeezerGu 学习不就是这样的吗,比如 OC 里写代理模式比较快,但后来学习了 block 更便捷,所以要学习。虽然 S 可能最后真比三个键要慢,但就像 react hooks 那位老哥讲的: 老了,不喜欢敲那么多键(他在解释为什么用 let 而不是 const )
    bxqqq
        51
    bxqqq  
       2021-01-19 23:11:36 +08:00
    因为大部分人连 vimtutor 都没有过一遍,七零八碎不如直接看文档。
    R0ckyY2
        52
    R0ckyY2  
       2021-01-19 23:39:00 +08:00
    多用 + 遇到问题找 Google
    AnnatarHe
        53
    AnnatarHe  
       2021-01-19 23:45:57 +08:00
    经常看用 vim 的人写代码打字,可以的话找线下同事,不行只能找线上视频,youtube 有挺多.

    贡献一个 vim 技巧: early 10h 恢复到 10h 前的状态,常用来撤销操作
    namelosw
        54
    namelosw  
       2021-01-20 00:16:03 +08:00 via iPad
    我不用 S,我用 cc,感觉表达起来比较流畅,因为 c 的组合更多。感觉重要的不是奇技淫巧,而是能用按键组合流畅地表达,就跟描述需求一样,而不是机械地地挪动光标插入删除,这样手脑一致不会互相卡,专注的时候就会忘记自己在打字。

    很多东西能想到明确规则但不知道怎么按,比如给 text 外面加层 span tag,就会卡住一下,打断这种节奏。至于是 S 还是 cc 其实是完全无所谓的。

    不过看你已经比较熟悉 Vim 了,感觉其实比较适合找一些 casts 看,很多时候都是无意看别人用的时候才意识到还能这么用。好像有个 Vimcasts,不过我没看过,感兴趣可以试试。
    catcn
        55
    catcn  
       2021-01-20 00:19:09 +08:00
    VS 和 VS Code 都开启 VIM 模式,字体放得大大的。
    别人想过来我电脑敲代码,就像是开自动挡的老司机碰到了手动挡。
    马上不敢抢键盘了。
    booscopy
        56
    booscopy  
       2021-01-20 00:24:36 +08:00
    jupiter157
        57
    jupiter157  
       2021-01-20 05:45:12 +08:00
    inoremap jk <esc>
    用 jk 替换 esc,从此再也不需要按 esc 了
    byzf
        58
    byzf  
       2021-01-20 07:27:26 +08:00
    题外话,vim 说实话我现在很难去定义到底有没有带来什么实质上的便利,有很多人发表过高见说看不出来鼠标多点一下到底有什么损失。

    陆陆续续地从 syntastic 到 ycm,nvim,deoplete 帮他们测各种 bug,各个平台测 vim 的花式 gui 的 bug,体验各种轮子自带的 bug 以及任何新环境都想试试 vim 是个什么情况所花的时间,还有迁移到 vscode-vim,vs-vim, jetbrains-vim 里面各种配置和 bug 的时间,加起来至少有大几百小时,我很难说我省下来一点点效率能覆盖这些时间。

    这种学了之后不会更新的技巧其实没什么去快速学习的必要,每年偶尔看一遍有啥新功能有啥新插件就差不多了。
    micolore
        59
    micolore  
       2021-01-20 08:20:13 +08:00 via iPhone
    不用很难记住那么的快捷键,我也配置了很多插件,经常 idea 启动,然后就记不起来原来的配置了。
    eve1yb0dy
        60
    eve1yb0dy  
       2021-01-20 09:55:12 +08:00
    大 S 学习了
    ixx
        61
    ixx  
       2021-01-20 14:45:54 +08:00
    @eve1yb0dy #60 还有大 C,大 D ,大 ZZ
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2670 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 13:36 · PVG 21:36 · LAX 06:36 · JFK 09:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.