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

一起来分享一些曾让你茅塞顿开的 Vim 命令

  •  4
     
  •   akring · 2023-02-06 09:10:56 +08:00 · 7653 次点击
    这是一个创建于 437 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我先抛个砖,想看看大家的分享:

    ciw    (删除当前单词并进入编辑模式)
    
    
    ci{    (删除 {} 内的内容并进入编辑模式,同理可用于括号,双引号等,重写函数的时候非常好用)
    
    
    ctrl o (编辑模式下暂时切换到 normal 模式,可以执行一条非编辑模式下的命令)
    
    92 条回复    2023-07-25 13:20:32 +08:00
    EyebrowsWhite
        1
    EyebrowsWhite  
       2023-02-06 09:19:48 +08:00 via Android   ❤️ 11
    第二条的大括号可以用大写 B 代替,小括号可以用小写的 b 代替,按起来舒服些
    clecho
        2
    clecho  
       2023-02-06 09:23:25 +08:00   ❤️ 2
    ciw 我还真不知道,不过看见过 viw ,vi{。作用是选中单词,用法和你上面举例一样
    yzld2002
        3
    yzld2002  
       2023-02-06 09:26:18 +08:00
    @EyebrowsWhite #1 学到了,感谢!
    szyp
        4
    szyp  
       2023-02-06 09:29:22 +08:00   ❤️ 6
    :set paste 可以进入不丢失缩进的粘贴模式
    nba2k9
        5
    nba2k9  
       2023-02-06 09:34:57 +08:00
    :q! :wq
    记住这两个,别的什么都好说
    akring
        6
    akring  
    OP
       2023-02-06 09:37:02 +08:00
    @nba2k9 Vim 界的 rm -rf 是吧 😂
    HiHi
        7
    HiHi  
       2023-02-06 09:39:20 +08:00   ❤️ 7
    1. ga 查看字符编码
    2. <c-q> 输入编码得到字符
    3. c-a,c-x 实现数字简单++--,(win 下要注意 unmap 掉这两个快捷键,默认可能因为 behave win 变成了全选跟剪切)
    4. :e! 放弃修改重新加载文件
    zdt3476
        8
    zdt3476  
       2023-02-06 09:42:52 +08:00   ❤️ 1
    我习惯用 caw 从描述来看好像和 ciw 一样? 还有就是我比较喜欢用 ctrl+v 进行整列编辑
    jorneyr
        9
    jorneyr  
       2023-02-06 09:51:10 +08:00   ❤️ 3
    :x 保存退出
    jdhao
        10
    jdhao  
       2023-02-06 09:54:38 +08:00 via Android
    这个叫 text object ,非常有用,绝对是使用 vim 的 top 必备技能
    jdhao
        11
    jdhao  
       2023-02-06 09:55:48 +08:00 via Android   ❤️ 2
    @zdt3476 不一样,caw 会删除 word 周围的空格,ciw 不会
    cluulzz
        12
    cluulzz  
       2023-02-06 09:57:38 +08:00
    ggdG,ctrl v
    moreant
        13
    moreant  
       2023-02-06 10:00:25 +08:00   ❤️ 1
    前两个都属于文本对象的操作,有时候写 html 的时候可以 cit/cat 删除整个 tag ,挺方便的。

    就是一直想知道 vim 要如何实现类似 IDEA 里 <a-j> 的选中下一个单词(Select next occurrence)
    acoada
        14
    acoada  
       2023-02-06 10:02:48 +08:00   ❤️ 4
    normal mode:
    ctrl-a 让光标后面第一个数字 +1
    ctrl-x 让光标后面第一个数字 -1

    也可以通过 visual mode 控制操作的数字的范围
    akring
        15
    akring  
    OP
       2023-02-06 10:06:17 +08:00
    @cluulzz
    感谢分享,ggdG 应该是删除全文 ( gg + d + G 复合起来的),ctrl+v 是楼上 @zdt3476 提到的进行整列编辑

    大家分享命令的时候还是尽量带一下用法和作用吧,这样不熟悉 vim 的小伙伴也能看懂
    eaststarpen
        16
    eaststarpen  
       2023-02-06 10:07:23 +08:00   ❤️ 2
    dit, dat, cit, cat, di", ci" ......

    就像 @jdhao 说的, 很方便的 "modify" 特定范围的 "character sequences"

    `dit` means delete in tag(personaly)

    在修改 xml 和 html 时候很有用

    此外, di" 这种不一定要在引号中才能用, 他会自动向后寻找

    e.g. "this is <光标>a 'example'" 在 <光标> 处 ci' 会自动删除 example 并进入 insert mode

    for more: h text-objects
    Diphia
        17
    Diphia  
       2023-02-06 10:11:24 +08:00
    @moreant 不确定你要找的是不是 *
    leexiaolang
        18
    leexiaolang  
       2023-02-06 10:12:57 +08:00   ❤️ 1
    @acoada 多光标操作? 如果是这个需求的话可以插件 vim-visual-multi 实现
    nowto
        19
    nowto  
       2023-02-06 10:39:47 +08:00   ❤️ 1
    view xyz.txt (或者 vim -R xyz.txt)以只读模式打开文件,相当于 less xyz.txt 或 more xyz.txt
    但是 是用 vim 查看文件
    cassyfar
        20
    cassyfar  
       2023-02-06 10:46:11 +08:00   ❤️ 1
    :o 插入新的一行并编辑

    ctrl + v 进入视觉编辑模式
    windstill
        21
    windstill  
       2023-02-06 10:47:24 +08:00   ❤️ 1
    块操作: ^ <C-v> <C-d> I-- [ESC]

    ^ → 到行头
    <C-v> → 开始块操作
    <C-d> → 向下移动 (你也可以使用 hjkl 来移动光标,或是使用%,或是别的)
    I-- [ESC] → I 是插入,插入“--”,按 ESC 键来为每一行生效。

    引用自《简明 Vim 练级攻略 | 酷壳 - CoolShell.cn

    如果是在行尾添加的话,就在块操作之后,$到行尾,按 A 插入字符,然后 ESC 每行生效
    windstill
        22
    windstill  
       2023-02-06 10:48:58 +08:00   ❤️ 1
    还有个剪切板的操作

    "+yy // 复制当前行到剪切板
    "+p // 将剪切板内容粘贴到光标后面
    857681664
        23
    857681664  
       2023-02-06 10:49:21 +08:00   ❤️ 1
    : 1, 5 t .
    可以使用命令模式快速复制某个区域的文本到当前光标位置,可以非常方便地在不需要移动光标进行复制
    CL007
        24
    CL007  
       2023-02-06 11:13:26 +08:00   ❤️ 2
    <a href="https://sm.ms/image/V5ZhlyA4uafmv7x" target="_blank"><img src="https://s2.loli.net/2023/02/06/V5ZhlyA4uafmv7x.png" ></a> 这个图不错
    EyebrowsWhite
        25
    EyebrowsWhite  
       2023-02-06 11:16:38 +08:00   ❤️ 1
    还有个,如果你安装了 jq ,那么可以用 `:%!jq .` 来格式化 json 文件,参考自 https://www.putorius.net/format-json-file-in-vim.html
    xuminzhong
        26
    xuminzhong  
       2023-02-06 11:16:41 +08:00   ❤️ 1
    @akring 第一条 ciw ,平时都是用 cw ,两个好像没区别,都是会进入编辑模式。
    chuan0144
        27
    chuan0144  
       2023-02-06 11:18:32 +08:00   ❤️ 2
    上面好多回复都是很基础的操作,建议看看《 Vim 实用技巧》——Drew Neil 著
    JackieMe
        28
    JackieMe  
       2023-02-06 11:25:25 +08:00 via Android   ❤️ 1
    @xuminzhong 当你在一个单词中间的时候,cw 只会把光标后的部分删掉并进入编辑模式,ciw 会把整个单词删掉。
    JackieMe
        29
    JackieMe  
       2023-02-06 11:27:27 +08:00 via Android   ❤️ 1
    @zdt3476 caw 会在 ciw 的基础上删掉当前单词后面的空格
    z1645444
        30
    z1645444  
       2023-02-06 11:27:32 +08:00   ❤️ 1
    知道 leader 键以后,设置和使用各种舒畅。
    sadfQED2
        31
    sadfQED2  
       2023-02-06 11:33:14 +08:00 via Android   ❤️ 2
    %d
    清空全部内容。不知道这个命令之前我要按半小时删除键才能把内容删完😂
    fuwu1245
        32
    fuwu1245  
       2023-02-06 11:42:33 +08:00
    牛牛牛
    这快捷键好使,谢谢楼主
    mmcross
        33
    mmcross  
       2023-02-06 11:53:04 +08:00
    看完这个,关闭页面时,不由自主的输了个:
    Chaconne
        34
    Chaconne  
       2023-02-06 11:59:29 +08:00 via iPhone
    @nba2k9 老哥稳,我投给这个
    GiantHard
        35
    GiantHard  
       2023-02-06 12:21:11 +08:00 via Android   ❤️ 1
    cia, 依赖 text-obj-args 插件,删除当前参数并进入编辑模式,对于有类型标注的编程语言来说,比 ciw 效率高至少一倍
    Sainnhepark
        36
    Sainnhepark  
       2023-02-06 12:23:31 +08:00 via Android   ❤️ 1
    <C-v> 选中某一块文本,然后按 c ,效果是删除这一块文本,然后插入新文本,最重要的是新插入的字符会应用到每一列中,可以在一定情况下替代多光标插件。相比于多光标插件,这个特性是内置的,按的键也比多光标插件少,在某些情况下会非常方便,尤其是处理日志的时候。
    ETiV
        37
    ETiV  
       2023-02-06 12:26:18 +08:00 via iPhone   ❤️ 1
    normal mode 下的 %,可以跳到匹配的代码块的另一端,查看、复制整段代码什么的很有用
    JerBrains 里应该是 ctrl-m
    Sainnhepark
        38
    Sainnhepark  
       2023-02-06 12:27:49 +08:00 via Android   ❤️ 1
    顺便楼上提到的 text object ,其实可以装插件扩展,GitHub 上搜 textobj user ,有很多第三方 text object ,我最常用的三个是 text-obj-line 用来选中当前行,textobj-url 选中当前链接以及 textobj-entire 选中当前 buffer 的所有文本。
    cwcc
        39
    cwcc  
       2023-02-06 12:38:37 +08:00   ❤️ 1
    我现在就会用 : 加个数字挑行,? 加文字搜索,:wq 保存退出,ZZ 没修改看一眼的文件直接退出,:q! 修改了但不想保存并退出,dd 删掉一行,i 插入。写点简单的都够用了。

    对了,一旦某一天用 vim 用多了,我就习惯性地在 IDE 里先按下 Esc ,然后莫名在某个地方输入了 :wq ,之前老是保存这个东西。
    ETiV
        40
    ETiV  
       2023-02-06 12:52:57 +08:00 via iPhone
    哦对 GitHub 上可以搜到一个 server 用的 vimrc 配置文件,我现在在用这个(稍微改了一下)。

    里面预置了不少快捷键,比如可以在 input mode 用 F2 切换 :set paste 啥的,都是超级实用的东西
    ETiV
        41
    ETiV  
       2023-02-06 12:56:43 +08:00 via iPhone   ❤️ 1
    ChengLuffy
        42
    ChengLuffy  
       2023-02-06 13:02:57 +08:00   ❤️ 3
    set mouse=a

    在终端 vim 中使用鼠标
    geebos
        43
    geebos  
       2023-02-06 13:03:02 +08:00
    学到了,我一直是 b 移到头部再 cw
    guss0x625
        44
    guss0x625  
       2023-02-06 13:14:00 +08:00
    .......
    Longerrrr
        45
    Longerrrr  
       2023-02-06 13:22:13 +08:00   ❤️ 2
    ctrl + v 进入竖编辑模式

    选择一列数字

    ctrl + a

    选择的数字会递增
    Longerrrr
        46
    Longerrrr  
       2023-02-06 13:23:21 +08:00   ❤️ 1
    漏了个, 选中后按 g ( globaly) 再 ctrl + a
    654656413245
        47
    654656413245  
       2023-02-06 13:33:28 +08:00
    :wq 保存并退出,无论有无修改均更新时间戳
    :x 保存并退出,无修改时不更新时间戳
    derek80
        48
    derek80  
       2023-02-06 13:44:56 +08:00   ❤️ 1
    Ctrl + o 的确用的最多。楼上好多没用过的命令,大家有没有汇总的手册可以随时查的?
    lopda
        49
    lopda  
       2023-02-06 13:52:23 +08:00
    e~请查阅《 Vim 实用技巧》😂
    opengps
        50
    opengps  
       2023-02-06 14:28:42 +08:00
    不应该是 Ctrl+C ,Ctrl+Q 吗?从 win 过来的新人都会犯的错误
    akring
        51
    akring  
    OP
       2023-02-06 14:46:48 +08:00   ❤️ 1
    @derek80 一般也就是参考 Vim Cheat Sheet 之类的,但总会有一些没涉及到的奇技淫巧,所以想看看大家分享
    FaiChou
        52
    FaiChou  
       2023-02-06 15:06:42 +08:00   ❤️ 1
    cs"' change suround "" to ''
    windy0925
        53
    windy0925  
       2023-02-06 15:14:04 +08:00
    .
    Ingo
        54
    Ingo  
       2023-02-06 15:14:28 +08:00   ❤️ 1
    ZZ 保存并退出当前 buffer 。
    windy0925
        55
    windy0925  
       2023-02-06 15:14:46 +08:00
    敲错了直接发出去了。接上一条,就是.这个命令
    xuminzhong
        56
    xuminzhong  
       2023-02-06 15:17:44 +08:00
    @JackieMe 感谢,挺有用的,Got 。
    wangerka
        57
    wangerka  
       2023-02-06 15:18:08 +08:00   ❤️ 4
    record 做批量很好用
    ![]( )
    notgoda
        58
    notgoda  
       2023-02-06 16:50:24 +08:00 via iPhone
    @Sainnhepark 你好,请问 ctrl -c 是进入视觉编辑模式? 然后要怎么选中某一块文字呢?除了用鼠标之外
    notgoda
        59
    notgoda  
       2023-02-06 16:57:21 +08:00 via iPhone
    @Sainnhepark
    @akring 请问大家在 vim 怎么选中某一块文字?是先 CTRL-v 进入进入视觉编辑模式? 然后要怎么选中?除了用鼠标之外。复制是用什么快捷键呢? +yy 只能复制当前行
    xiaket
        60
    xiaket  
       2023-02-06 17:11:59 +08:00
    宏然后批量 apply
    lewis0xx001
        61
    lewis0xx001  
       2023-02-06 17:26:27 +08:00
    @szyp 66666~
    webcape233
        62
    webcape233  
       2023-02-06 17:32:36 +08:00 via iPhone
    进入 visual block 模式
    向下按多行
    键入 shift i
    增删一些东西
    按两下 esc

    完成了多行编辑
    testcase1
        63
    testcase1  
       2023-02-06 17:34:01 +08:00
    gv
    Sainnhepark
        64
    Sainnhepark  
       2023-02-06 17:35:57 +08:00 via Android
    @notgoda hjkl 或方向键呀,你怎么在 visual mode 选的就怎么选呗
    testcase1
        65
    testcase1  
       2023-02-06 17:36:01 +08:00
    help substitute
    testcase1
        66
    testcase1  
       2023-02-06 17:39:20 +08:00   ❤️ 1
    @moreant <a-n> <a-p>
    testcase1
        67
    testcase1  
       2023-02-06 17:41:12 +08:00
    vim.keymap.set("n", "j", "gj", opt)
    vim.keymap.set("n", "k", "gk", opt)
    testcase1
        68
    testcase1  
       2023-02-06 17:42:40 +08:00
    最后 最牛逼的 vim 命令 : nvim
    ljpCN
        69
    ljpCN  
       2023-02-06 17:53:10 +08:00
    参见 vim cheat sheet: https://www.vimcheatsheet.com/
    bjzhush
        70
    bjzhush  
       2023-02-06 18:08:09 +08:00
    说真的,现在看到这些命令都需要思考下才能明白了,但是我用起来一点问题没有,因为已经都是下意识操作了,十几年了
    superrichman
        71
    superrichman  
       2023-02-06 18:19:17 +08:00 via Android
    那一定是 ctrl q, 因为 vim 里习惯性按到 ctrl s 就死了 🐶
    mangoDB
        72
    mangoDB  
       2023-02-06 18:26:27 +08:00
    %s/foo/bar/g

    replace 功能
    simo
        73
    simo  
       2023-02-06 18:30:24 +08:00
    qa -> q -> n@a
    Al0rid4l
        74
    Al0rid4l  
       2023-02-06 19:30:59 +08:00
    gg=G
    kergee
        75
    kergee  
       2023-02-06 19:37:01 +08:00
    加密 :X(大写的 X)
    16 进制显示 :%!xxd
    techstay
        76
    techstay  
       2023-02-06 19:43:56 +08:00
    浏览器常驻页面,忘了什么就在点进去看看 https://github.com/techstay/awesome-cheatsheets/blob/master/editors/vim.txt
    gogorush
        77
    gogorush  
       2023-02-06 20:43:33 +08:00
    yi 某个符号或者 w 。
    w 代表当前的 word
    某个符号代表某个符号限定范围内,特别适合复制“”,‘’这个符号内的内容
    0xLittleFi
        78
    0xLittleFi  
       2023-02-06 20:46:44 +08:00   ❤️ 1
    viw 选中单词
    vi) 选中 '()'内的东西 同理:vi} 大括号

    f 搜索
    fb fa 选中右边第一个 b a 字母
    ; 重复执行之前输入过的流程

    比如 fb ; ; ; ;
    一直搜索后面的 b 字母
    dorothyREN
        79
    dorothyREN  
       2023-02-06 20:53:56 +08:00
    @jorneyr #9 我选择 SHIFT+ZZ
    macscsbf
        80
    macscsbf  
       2023-02-06 21:49:45 +08:00
    看《 vim 使用技巧》在学习中
    nag
        81
    nag  
       2023-02-06 22:44:14 +08:00
    分享下我的 vimrc 的几个配置

    直接在 Normal 和 Visual 模式下直接用 Tab 和 Shift-Tab 缩进,这样就不用先进入 Insert 模式再按 tab:
    nmap <tab> v>
    nmap <s-tab> v<
    vmap <tab> >gv
    vmap <s-tab> <gv

    按下 <leader>W 可以清除当前文件每一行中的最后的空格:
    nnoremap <leader>W :%s/\s\+$//<cr>:let @/=''<CR>
    ns09005264
        82
    ns09005264  
       2023-02-07 00:05:39 +08:00
    宏,vim 最强大的特性。
    sanebow
        83
    sanebow  
       2023-02-07 00:44:38 +08:00 via iPhone
    来说个简单好用的,xp ,当两个字符前后打反时可以调换过来,比如 mian -> main
    Jony4Fun
        84
    Jony4Fun  
       2023-02-07 09:39:51 +08:00
    @cluulzz 我一般用 ggcG ctrl v
    好像经常非编辑模式下粘贴会少掉点东西
    pooorguy
        85
    pooorguy  
       2023-02-07 09:52:38 +08:00
    @notgoda 在起始位置按 v ,接着按 hjklweb$^这些导航键选中,再按 y 复制,接 p 粘

    可以试试 neovim8.0 以上,默认可以鼠标操作复制粘贴
    gw4gw
        86
    gw4gw  
       2023-02-07 10:50:40 +08:00
    进来学技能
    xujiabin
        87
    xujiabin  
       2023-02-07 11:02:34 +08:00
    vep, 替换 word(从剪贴板)
    wisetc
        88
    wisetc  
       2023-02-07 12:54:08 +08:00
    :x close
    likeme
        89
    likeme  
       2023-02-07 18:21:15 +08:00
    很少用 vim 了。。改文件都是用 idea 打开再上传 hhh
    Bingchunmoli
        90
    Bingchunmoli  
       2023-02-07 18:58:21 +08:00 via Android
    只会 wq ! q 路过,说实话 open wrt 等各种奇怪设备有时 vim 有 bug 有时 nano 有 bug 换着用
    mangoDB
        91
    mangoDB  
       2023-03-09 19:53:39 +08:00
    :set nu # 显示行号
    :set nonu # 关闭行号
    :nohl # 关闭高亮
    / 查找
    ? 查找(反向)
    kingfire
        92
    kingfire  
       268 天前 via Android
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3414 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 11:28 · PVG 19:28 · LAX 04:28 · JFK 07:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.