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

如何提升 Vim 技巧?

  •  
  •   FaiChou ·
    FaiChou · 47 天前 · 4622 次点击
    这是一个创建于 47 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    然后了解一下上限


    然后你会发现,还是 pycharm 好用。
    rationa1cuzz
        13
    rationa1cuzz   47 天前
    还是要多用,多搜
    rainfd
        14
    rainfd   47 天前
    看书《 Vim 实用技巧》,看 vim 相关的博客,自己研究太慢了,不如别人总结
    FaiChou
        15
    FaiChou   47 天前
    @northisland #12 谢谢, vim 的 chectsheet 太多了 感谢再提供一个
    unicloud
        16
    unicloud   47 天前
    除了多用、多总结,真的没有什么捷径;即便有一百个人告诉你如何如何,还是得自己练习。
    itgoyo
        17
    itgoyo   47 天前
    Vim 更多的是肌肉记忆,关于技巧啥的《 Vim 使用技巧》书里面的操作过一遍即便足够了解 Vim 的基本操作了,后面更多的就是看你用不用到所谓的 Vim 插件了,但是很多 vim 的插件,IDE 要么有类似的功能,要么已经有 dalao 移植了 vim 的功能过来,根据实际情况来吧,如果是 C,Python 、Go 这种确实 vim 也可以,但是你让我来写前端代码,对不起我还是选择 VSCode 或者是 Atom 、Sublime Text
    AmoreLee
        18
    AmoreLee   47 天前
    1. 看书:vim 实用技巧
    2. 安装插件,https://github.com/amix/vimrc 推荐这套配置
    3. 不断的实践
    Qcui
        19
    Qcui   47 天前   ❤️ 1
    上面大佬说到了 cc,让我想起,一个单词重复两次就是针对一行操作的这句话,比如:
    y: 复制,yy: 复制一行
    d: 删除,dd: 删除一行
    c: 修改,cc: 修改一行
    其它的有大佬补充没?
    cmdOptionKana
        20
    cmdOptionKana   47 天前
    终极技巧:IDEA 或 VScode + vim 插件。
    flashlight
        21
    flashlight   47 天前
    用起来,发现自己做什么操作“麻烦”的适合就去查一下怎么能不麻烦的做这个操作
    Nimrod
        22
    Nimrod   47 天前
    补充一个实用性没有那么强的网站 http://vimgolf.com/ ,用尽可能少的 keystroke 来完成目标
    Meltdown
        23
    Meltdown   47 天前 via Android
    玩游戏 vimadventure
    Leviathann
        24
    Leviathann   47 天前 via iPhone
    有个把函数参数作为文本对象的插件
    daa 就是 delete a argument
    fn(a1, |a2)
    假设|是光标,daa 就会只剩下 fn(a1),
    dia 就是 fn(a1, )
    wuwukai007
        25
    wuwukai007   47 天前 via Android   ❤️ 1
    ciw,在单词任意位置删除整个单词
    FaiChou
        26
    FaiChou   47 天前
    @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   47 天前
    我记得某一本关于如何使用 Vim 的书里有说,Vim 里每种操作都有很多种方法,找一个自己习惯的就行了,不用拘泥于哪个最简便哪个最好。
    有人喜欢 easymotion 快速移动,我喜欢 hjkl 慢慢移动,移动的过程中可以思考准备做什么或者之前写的有没有问题。
    如果不熟就多用多练。
    lululau
        28
    lululau   47 天前
    基本操作练练熟,看 :help vim,然后自己写个插件,Vim / Emacs 看不懂别人写的扩展,不会修改,自己不会写扩展的话,算不上会用
    FaiChou
        29
    FaiChou   47 天前
    @gdtdpt #27 的确, 写了几年代码现在反思下, 用像 VSCode 等编辑器, 很多操作都是浪费时间的, 但浪费的时间刚好用来思考如何进行下一步代码的操作, 也就是说, 习惯了普通编辑器, 手速是超前脑速的, 手会经常停下来等待大脑.

    而现在使用 Vim 就不一样了, 手就慢了下来, 因为生疏, 需要大脑去教手指去操作. 所以希望能练就「无他, 唯手熟尔」的境界.
    guhuisec
        30
    guhuisec   47 天前
    我个人感觉自己用的最多的如下:
    打开: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   47 天前
    还有几个补充下:
    esc 模式:按 d 或者 dd 剪切当前行;按 p 粘贴剪切的行。
    Lumuy
        32
    Lumuy   47 天前
    https://thoughtbot.com/upcase/onramp-to-vim


    现看一遍,再用用,过段时间再回来看一遍,周而复始。
    用长了,所有编辑模式你都想切换为 vim 模式
    xpresslink
        33
    xpresslink   46 天前
    VIM 在编辑文本上提供那些强大功能都要靠反直觉消耗脑力得到的。
    但毕竟写代码时,Ctrl+C 、Ctrl+V 用得最多。
    我觉得如果要是写代码还是用专用的 IDE 效率更高,用 VIM 写码不论你怎么配置做大项目的时候都很难受。
    FaiChou
        34
    FaiChou   46 天前
    @guhuisec #31 你说的这些都是基础用法, cheatsheet 都能 cover 不过还是感谢回复
    FaiChou
        35
    FaiChou   46 天前
    @xpresslink #33 IDE 用的通用习惯, 容易上手, 再加上 Emacs 的一些快捷键( ctrl+a 到行首, ctrl+e 到行尾, ctrl+k 删除至行尾, meta+b 退一个单词等)是挺有效率的, 但回想下, 这一套内容也是需要经过学习得来的, 比如 VSCode 里 option+下, 可以移动一行到下面, shift+option+下, 复制当前行.. Vim 也是学习, 相信经过练习任何人都能做到不用消耗脑力来驱使手指按键, 你懂的, 有些人就喜欢效率的工具.
    ediron
        36
    ediron   46 天前
    推荐几个工具
    一个可以直接内置到 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   46 天前
    放弃吧,编程不合适
    vigack
        38
    vigack   46 天前
    @guhuisec 可以用 ZZ 替代 :wq, 节省一次按键:doge
    huangmingyou
        39
    huangmingyou   46 天前
    不常用的技巧学了也没用,两周就忘记了。
    tiedan
        40
    tiedan   46 天前
    个人比较喜欢的 -

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

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

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

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

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

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

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

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