标签: vim

  • neovim 配置 Github Copilot

    Github Copilot 针对 neovim 开发了一款插件 Copilot.vim

    安装之前确保 neovim 的版本比较新,另外还需要安装 node.js

    Linux / macOS  安装命令:

    
    git clone https://github.com/github/copilot.vim.git \
      ~/.config/nvim/pack/github/start/copilot.vim
      

    下载完毕后,打开 nvim 执行 :Copilot setup 

    第一次使用需要 Github 授权,

    插件会自动生成 一个 6 位字符认证码,

    在浏览器中打开插件提示的 URL,

    在这个页面填写上面的代码,

    通过授权后即可使用。

    相关命令:

    :Copilot enable //激活Copilot

    :Copilot disable //关闭Copilot

    :Copilot status //查看Copilot 状态

    :help Copilot   // Copilot 帮助文档

    问题1:

    <Tab> map has been disabled or is claimed by another plugin

    解决办法:

    因为使用了 packer 作为 neovim 的插件管理,

    在文件 ~/.config/nvim/lua/user/options.lua 中添加下面配置即可。

    vim.g.copilot_assume_mapped = true

    问题相关链接:

    [https://www.reddit.com/r/neovim/comments/sk70rk/using_github_copilot_in_neovim_tab_map_has_been/]

    问题2:

    当选择 Copilot 给出的提示代码时按键是Tab

    自动完成(cmp.lua) 选择也是Tab

    解决此冲突,可以设置选择 Copilot 建议的按键为:Ctrl + J

    然后在 cmp.lua 的配置中禁用 <C+j> 按键映射

    在 init.lua 中添加下面的配置:

    vim.g.copilot_no_tab_map = true
    
    vim.api.nvim_set_keymap("i", "<C-J>", 'copilot#Accept("<CR>")', { silent = true, expr = true })

    参考链接:

    https://www.reddit.com/r/neovim/comments/sk70rk/using_github_copilot_in_neovim_tab_map_has_been/

  • vim 编辑器 列模式 visual block 操作指南

    https://www.bilibili.com/video/BV1mb4y1X7ys/

    可视模式下,
    你可以选择想操作的文件内容,
    选中的内容会高亮显示,
    类似于使用鼠标选择文本内容,
    然后就可以执行各种操作。

    vim 编辑器 可视模式 VISUAL MODE 有下面三种

    1. 字符模式 按键 v — VISUAL —
    2. 行模式 按键 shift + v — VISUAL LINE —
    3. 列模式 按键 ctrl + v — VISUAL BLOCK —

    其实就是3中选择内容的方式,

    字符模式和行模式比较常见,

    列模式基于列来选择内容,比较特殊,

    在某些场景,列模式很有用,

    本视频主要演示列模式的操作。

  • 使用 vimdiff 对比文件

    https://www.bilibili.com/video/BV1bA411M7c4

    如果想知道两个文件是否相同,
    可以使用哈希函数来计算文件的摘要,
    md5sum a b
    然后对比结果就知道;

    如果想知道具体内容有哪些差异,
    可以使用GNU diff 命令来对比差异,
    diff a b -y

    如果想对比的同时进行修改编辑,
    可以结合Vim来使用,
    这个命令叫做 vimdiff

    比如说现在要对比修改文件 a 和 b,
    使用命令

    vimdiff a b

    或者

    vim -d a b

    就可以以对比的模式打开,
    有差异的行会以不同背景颜色高亮显示,

    前后几行会展开显示,
    方便了解上下文;

    如果想在各个文件窗口之间切换,
    使用 ctrl+w h/j/k/l 命令。

    使用 [ c 或者 ] c在差异之间跳转;

    如果修改差异行的时候,
    想使用另外一个文件对应的行的内容,
    可以将光标定位到差异点,

    使用 :diffget 或者 do 命令,

    如果想用当前行的内容,

    替换另外一个文件对应的行,
    可以使用 :diffput 或者 dp 命令,

    dp 是 diffput  的缩写,

    do  是 diffget 的缩写,

    (没有使用 dg 是因为已经有个dgg 命令)

    do/dp操作针对的不是单行,

    而是一个差异点的所有行。

     

    还可以一次diffget或者diffput多个差异点,

    例如:
    :10,20diffget
    diffget的范围就是10到20行,

    修改完毕后使用:wqa保存并退出。

    如果已经打开了一个文件,
    然后想对比另外一个文件,

    可以使用下面的命令,
    :diffsplit file  水平切割窗口
    :vert diffsp file  垂直切割窗口

     

    如果已经有一个使用 diff 生成的补丁文件

    例如:
    diff a b > patch

    可以使用

    :diffpatch patch

    这个命令生成一个临时文件,

    内容是将这个补丁应用到当前编辑的文件中。

     

    vim 还可以同时对比多个文件,

    例如:
    vim -d a b c

    同时对比3个文件,
    但是这个时候就不能使用 do 和 dp 命令了,
    因为 vim 不知道 do 的来源文件和 dp 的目标文件。

  • 退出Vim编辑器的几种命令

    https://www.bilibili.com/video/BV18K4y1S7Rq/

     

    这是新手教程,

    针对初次使用 vim 的用户,

    介绍退出 vim 编辑器的几种命令。

    q/x/ZZ/ZQ/qa/cq/bd

  • vim 文本对象 text objects 操作介绍

    什么是vim文本对象

    一个单词,一个句子,一个段落,一对html标签,

    一对括号、引号里面的内容,

    都称作是文本对象,

    文本对象大概可以分为8种类型

    类型 缩写
    1.word w

    2.WORD W

    3.sentence s

    4.paragraph p

    5.tag t

    6.block b

    7.Block B

    8.symbol block “‘`([{<

    要对文本对象进行编辑操作,首先要选择这些对象,

    vim 使用 i 或 a 后面跟文本对象类型的缩写来选择文本对象

    这样就会有很多组合用来选择文本对象

    1.aw 2.iw 3.aW 4.iW 5.as 6.is 7.ap

    8.ip 9.at 10.it 11.ab 12.ib 13.aB 14.iB

    15.a] 16.a[ 17.i] 18.i[ 19.a) 20.a( 21.i)

    22.i( 23.a> 24.a< 25.i> 26.i< 27.a} 28.a{

    29.i} 30.i{ 31.a” 32.a’ 33.a` 34.i”

    35.i’ 36.i`

    i 和 a 的区别主要在于是否包含文本对象边界的空白字符

    在这些选择指令前面加上你要想的操作

    就能针对文本对象进行操作

    总结
    文本对象的操作其实很简单,
    没有什么难度,
    只要一次学会就很难忘记,
    使用的时候也会很自然地使用,
    是一项值得掌握的vim技巧。
    需要更加深入的学习
    可以使用 :h text-object 查看详细文档

    文本对象扩展插件
    https://github.com/wellle/targets.vim

  • 使用vim tab方式编辑文件

    https://www.bilibili.com/video/BV1mf4y1r7yE

    使用vim编辑多个文件的时候,
    可以使用参数o,
    将屏幕以水平方式切割为多个窗口,
    也可以使用大写O,
    以垂直方式切割屏幕为多个窗口,
    这样的优点是,

    编辑一个文件的同时可以参考其他文件,
    缺点是视窗界面偏小,

    如果想同时编辑多个文件,
    但是没有同屏显示的需求,
    可以使用vim 的 tab pages功能,
    比如说我同时编辑10个文件,
    vim -p $(seq 1 10)
    这样每个文件会以标签页的方式打开,
    每个标签占满整个视窗范围,
    相较于切割屏幕为多个窗口的方式,
    可视范围更大一些。

    标签页的切换

    下一个/N个标签
    tabnext/tabn/tabn N/gt/N gt

    上一个/N个标签
    tabprev/tabp/tabp N/gT/N gT

    第一个标签
    tabfirst/tabf

    最后一个标签
    tablast/tabl

    移动标签
    tabmove/tabm 1

    以tab标签方式打开 FILE
    tabedit FILE / tabe FILE / tab drop FILE

    关闭当前标签
    tabclose/tabc

    关闭其他所有标签,只保留当前标签

    tabonly/tabo

     

    使用 vim a b c d 打开的文件,

    可以使用 :tab ball 转换为tab编辑方式

     

    使用vim -o a b c d 打开的文件
    可以使用 <ctrl>+w+T 转换为tab编辑方式

     

    以tab 方式打开当前文件的一个镜像
    tab split

    打开文件时避免相同文件在多个tab中打开

    tab drop FILE

     

    打开光标所在位置的字符对应的文件使用gf
    加上前缀 ctrl+w 即

    ctrl + w + gf

    就会以tab方式打开光标位置下的单词对应的文件

     

  • 使用vim命令global删除多个空行

    https://www.bilibili.com/video/BV18U4y1s73n/

    当使用 vim 编辑文档的时候

    如果想一次删除多个空行

    可以使用 global 命令来达成

    global 命令的格式如下:

    :[range]g[lobal]/{pattern}/[cmd]

    [range] 设定要修改的范围,可以省略,默认是整个文档,

    可以使用 % 代表整个文档,使用1,10 代表仅修改第1到10行

    g  是 global 缩写,可以写为 global 或者 g

    {pattern} 匹配行的正则表达式,例如要匹配空白行,那么就是 /^$/

    [cmd] 代表匹配之后要执行的操作,默认是 print 即输出操作,

    如果是删除,使用 delele

    更为详细的功能,可以阅读vim手册,

    在vim中输入 :h global 即可

  • vimgolf一个练习vim操作的高尔夫球场

    www.vimgolf.com 提供了一个练习vim的场所,

    通过安装vimgolf,拉取练习实例,

    将原始文件编辑为目标文件,

    然后上传发布自己的操作步骤,

    同时,也可以借鉴其他人的操作。

    在这里,vim 高手如云,各种奇葩技巧一定会让你大开眼界。

    使用 vimgolf 需要先安装Ruby和Gem,

    然后得有 twitter 账号,用来登陆 vimgolf,否则没有办法获取key。

    然后执行下面的命令,

    [challenge ID] 是网站首页列出得训练编号,

    随便选择一个训练项目,在页面右侧就可以看到 challenge ID

    # gem install vimgolf
    $ vimgolf setup
    $ vimgolf put [challenge ID]

    以下是challenge ID为 56fb2e75ccffcc0009026473 的练习过程:

    dj:%s/,/\r/g<CR>:g/^$/d<CR>ZZ

  • vim编辑器宏的使用

    通过宏可以将一组操作指令以自动化的方式重复执行指定的次数,从而提高编辑效率。

    如果能够合理利用,这种批处理的方式在实际的编码过程中非常有用。

    下面介绍宏的基本使用方法:

    0)  定义宏

    命令格式    q<letter><commands>q

    q    标明开始录制宏;

    <letter>输入一个a到z的字母,设置将宏存储在哪个暂存器;

    <commands>输入要执行的操作;

    q   标明 结束录制宏;

    举例:qa0gUwjjq    定义个一个名称为a的宏,它的指令集是0gUwjj,这个操作会使隔行的字母全部转换为大写字母。

    vim宏定义

    1) 查看宏

    命令格式    :reg <letter>

    举例:要查看刚才定义的宏a,输入:reg a就可以查看宏a的命令序列。

    查看定义的宏
    查看定义的宏

    2)执行宏

    命令格式    <number>@<letter>

    <number> 调用宏的次数;

    @ 开始执行宏;

    <letter> 要执行的宏名称;

    举例:在命令模式下直接输入 5@a 将刚才录制的宏a重复执行5次。

    调用已经定义的宏
    调用已经定义的宏

    3)保存宏

    宏默认会临时保存到.viminfo文件,此文件一般位于目录~【家目录】如果指定的暂存器内容未被覆盖,即便退出vim, 下次打开也依然可以调用。

    如果想永久保存录制的宏,可以将宏的定义添加到~/.vimrc配置文件中。

    例如将刚才录制的宏永久保存,编辑.vimrc文件,添加下面的行

    let @a=’0gUwjj’

    这样任何时候使用@a就可以调用宏了。( 编辑模式下依次按键Ctrl-R Ctrl-R a可以快速输入暂存器里面的内容)

    vim宏保存

    4)编辑宏

    如果录制的宏需要做一些临时修改, 在当前文件中,输入

    :let @a=’

    再依次按键 Ctrl-R Ctrl-R a自动补全宏指令集

    :let @a=’0gUwjj

    做出对应的修改,然后补全最后面的单引号即可

    :let @a=’03xgUwjj’

    这样之前的宏就修改为,先删除行首3个字符,在转化大小写

    调用宏依然使用@a命令

    此时可以输入:reg a 发现宏的内容已经被修改了

    5)宏应用简单示例

    宏实现了编辑操作的模式接口,只要自己能抽象出操作的共同指令集,就可以实现快捷强大的编辑操作,从而提高工作效率。

    a) 给多个行末尾添加分号

    let @a=’0A;^[j0′

    b) 多行注释代码

    let @a=’0i#^[j’

    c) 删除不规则长度的字符串

    let @a=’0t)hdi’j0′