vim
光标
h/j/k/l | 左下上右 |
b/e | 词首词尾 |
^/$ | 行首行尾 |
-/+ | 上一行行首、后一行行首 |
\{/} | 段首段尾 |
gg/G | 文首文尾 |
<Cf> | 向下一页(Forward) |
<cb> | 向上一页(Back) |
<cd> | 向下半页 |
<cu> | 向上半页 |
gg | 光标移动到文档开头 |
G | 光标移动到文档末尾 |
数字+方向 | 向某个方向移动指定行 |
字符操作
i/I | 插入、插入到行首 |
---|---|
a/A | 附加、附加到行尾 |
p/P | 后粘贴、前粘贴 |
d/D | 删除、删除到行尾 |
s/S | 删除并插入、删除到行尾并插入 |
r | 替换 |
f/F | 行内查找、行内前向查找 |
R | 进入 Replace/Insert 模式[1] |
:m +1 | 下移一行 |
:m -1 | 上移一行 |
列编辑
使用列编辑一共有三个步骤:
使用 <C-v> 进入列选择模式
使用 <I> 进入列前端插入模式,或者使用 <A> 进入列后端插入
完成编辑后使用 <ESC> 退出编辑模式
然后所有选择的列都会出现相同的内容
窗口管理
sp/vs | 分割窗口 |
<C-w>+方向键 | 在分割的窗口间切换 |
<C-w w> | 转到下一个窗口: |
<C-w +/→ | 调整窗口高度 |
<C-w </>> | 调整窗口宽度 |
<C-w ⇒ | 将所有窗口设置为相同尺寸 |
:[vertiacl] res | 调整窗口大小: |
close | 关闭当前窗口 |
qall | 退出所有窗口 |
qall! | 退出所有窗口而不保存 |
wqall | 退出所有窗口并保存 |
wall | 保存所有窗口 |
<C-w-w> 可以用来转到悬浮窗口[2] |
标签页:
tabe+file | 创建标签 |
tabc+n | 关闭标签 |
tabn/tabp | 切换标签 |
代码折叠
za | 切换折叠 |
zc | 折叠 |
zC | 对所在范围内所有嵌套的折叠点进行折叠 |
zo | 展开折叠 |
zO | 对所在范围内所有嵌套的折叠点展开 |
[z | 到当前打开的折叠的开始处 |
]z | 到当前打开的折叠的末尾处 |
zj | 向下移动。到达下一个折叠的开始处。关闭的折叠也被计入 |
zk | 向上移动到前一折叠的结束处。关闭的折叠也被计入 |
此外,还可能需要在配置文件中添加:
' 基于缩进进行代码折叠
set foldmethod=indent
' 启动 Vim 时关闭折叠
set nofoldenable
终端命令
:!+命令
同样的,在执行诸如 cd 的命令的时候可以按 tab 补全
切换工作区
cd | 改变vim的当前工作路径 |
lcd | 改变当前窗口的工作路径 |
pwd | 查看当前的工作路径 |
set autochdir | 自动设当前编辑的文件所在目录为当前工作路径 |
自动对齐
gg=G
键盘
<leader> 默认是 \\
映射时映射 Alt 这种键的时候需要写成 <M-..> 的形式 箭头键是 <Right>, <Left>, <Up>, <Down>
两者组合在一起就是 <M-Up>
内置终端
:term 或者 :term bash/zsh/…
使用 <C-\><C-n>
可以退出终端模式,更多请参阅 :help terminal-emulator
宏
宏算是一个比较高阶的功能了,用法是:
按下 qa 开始录制宏
对行进行操作
按 q 退出宏录制
按 [\d]@a 执行宏
尽管宏的用法比较简单,但是依然有一些需要注意的地方:
|
忽略大小写
要进行忽略大小写的搜索,有两种方法:
set ignorecase
/string\c
非贪婪匹配
非贪婪匹配使用 \{-}
二进制模式
使用 nvim -b 可以使用二进制编辑模式,另外,使用 :set display=uhex
可以将一些符号以二进制的形式显示,这在处理 Windows 下的文件时很好用
加快 nvim 的启动速度
首先看看怎么查找拖慢 nvim 启动速度的元凶。在使用 Packer 时,使用 :PackerCompile profile=true
然后重启一次,使用 :PackerProfile
查看最慢的插件
下面是几个我碰到的问题:
加载插件时禁用 GC:在`init.lua` 的起始和结尾处分别加上 :
collectgarbage('stop') collectgarbage('restart') 在 200ms 的启动速度上,大概能减少 50ms
使用 filetype.nvim 。默认的 filetype.vim 会在启动时创建非常多的 autocmd,这极大地降低了启动速度(大概 9ms,但是总体影响 20ms 左右)。filetype.vim 只创建一个 autocmd。对于版本高于 0.6 的 nvim,直接安装 nathom/filetype.nvim 即可
使用 impatient.nvim。impatient.nvim 通过对模块路径和模块进行缓存,极大地加快了加载速度。安装 impatient.nvim 后,在 init.lua 中所有加载模块的代码前面加上
require("impatient")
即可禁用内置插件:
-- 跳过 python provider 检测 vim.g.python_host_skip_check = 1 vim.g.python3_host_skip_check = 1 vim.g.python3_host_prog = '/usr/bin/python3' -- 禁用内置插件 vim.g.loaded_gzip = 1 vim.g.loaded_tar = 1 vim.g.loaded_tarPlugin = 1 vim.g.loaded_zip = 1 vim.g.loaded_zipPlugin = 1 vim.g.loaded_getscript = 1 vim.g.loaded_getscriptPlugin = 1 vim.g.loaded_vimball = 1 vim.g.loaded_vimballPlugin = 1 -- vim.g.loaded_matchit = 1 -- vim.g.loaded_matchparen = 1 vim.g.loaded_2html_plugin = 1 vim.g.loaded_logiPat = 1 vim.g.loaded_rrhelper = 1 vim.g.loaded_netrw = 1 vim.g.loaded_netrwPlugin = 1 vim.g.loaded_netrwSettings = 1 vim.g.loaded_netrwFileHandlers = 1 vim.g.loaded_remote_plugins = 1 vim.g.loaded_shada_plugin = 1 vim.g.loaded_fzf = 1
优化 lspconfig 的配置。仿照 filetype.nvim,我们可以只创建一个 autocmd 来完成对指定 lsp 配置的加载,而不是每次启动时加载所有配置文件。在 36ms 的配置中,优化到了 29ms:
M.resolve = function() if _G.loaded_server == nil then _G.loaded_server = {} end if _G.loaded_server[vim.o.ft] ~= nil then return end local lsps = load_module('plugins.lspconfig.lsps') local utils = load_module('plugins.lspconfig.utils') local on_attach = function(client, bufnr) vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') local set_keymap = load_module('keymap.lspconfig')(client, bufnr) end for _, lsp in pairs(utils.enabled_lsps) do local filetypes = utils:get_filetypes(lsp) for _, ft in pairs(filetypes) do if vim.o.ft == ft then _G.loaded_server[vim.o.ft] = true utils:setup_lsp(lsp, lsps[lsp], on_attach, utils.capabilities) break end end end return true end M.init = function() vim.cmd([[ au FileType * lua require('plugins.lspconfig').resolve() ]]) end
在使用 luasnip 加载 vsnip 时,使用 lazy_load 而不是 load。后者会导致将近 150ms 的延迟:
require('luasnip.loaders.from_vscode').lazy_load { paths = { '~/.local/share/nvim/site/pack/packer/start/friendly-snippets', vim.fn.stdpath('config') .. '/snippets', }, }
使用技巧
使用
:tab help <keyword>
可以用来在新标签中打开帮助使用
dip
可以用于删除大量连续空行使用
[{
和}]
可以在函数间快速移动插入模式下可以使用
^w
删除前一个单词插入模式下可以使用
X-F
补全当前目录的文件名插入模式下可以使用
^R=
执行简单的数学计算插入模式下可以用
^R<寄存器>
来插入寄存器中的内容搜索模式下可以使用
R-W
插入光标下的单词
替代品
下面的表格列出了一些 lua 方言和拓展品:
语言 | 类型 | 作用 |
---|---|---|
htts://github.com/terralang/terra[terra] | lua 拓展 | 加入了模板编程 |
复制当前文件路径到缓冲区[1]
:let @" = expand("%")
使用表达式寄存器生成序列
表达式寄存器可以用来计算表达式的值。在插入模式下,按下 \^r= 然后输入表达式,就会在光标处插入表达式的值。根据这个方法,可以借用表达式寄存器生成序列:
拷贝初始值
移动到下一个位置
按下 \^r= , Ctrl+0 , +1<Enter>
就会生成序列。
重复
命令 | 重复内容 |
---|---|
| 最后一次对文本更改的操作 |
| 最后一次执行的宏 |
| 最后一次在 cmdline 中执行的命令 |
| 最后一次替换 |
| 搜索 |