一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
个别快捷键会有些不一样请根据自身情况更改(以Mac为例,与Win下差别不大)
normal模式下
移动/编辑相关
快捷键 | 作用 |
---|
h | 左 |
j | 下 |
k | 上 |
l | 右 |
ctrl + j/k | 上下跳4行 |
ctrl + u/d | 上下9行 |
i | 在光标前插入 |
a | 在光标后插入 |
A | 到末尾插入 |
I | 到首插入 |
s | 删当前字符并进入插入模式 |
zc | 折叠代码 |
zo | 打开折叠 |
u | 撤销上一次代码修改/undo |
ctrl + r | 与u相反/redo |
tab/buffer/标签相关(按vim的用法来说应该叫buffer)
快捷键 | 作用 |
---|
ctrl + h/l | 左右切换tab |
ctrl + w | 关闭当前tab |
<leader> bl | 关闭右边所有tab |
<leader> bh | 关闭左边所有tab |
<leader> bc | 选择关闭tab |
窗口相关
快捷键 | 作用 |
---|
option + h/j/k/l | 左下上右切换窗口 |
sv | 左右分屏 |
sh | 上下分屏 |
sc | 关闭当前窗口 |
<leader> + t | 底部打开terminal |
<leader> + vt | 侧边打开terminal |
s, | 当前窗口左右比例缩小 |
s. | 当前窗口左右比例放大 |
sj | 当前窗口上下比例放大 |
sk | 当前窗口上下比例缩小 |
tree(侧边栏)相关
快捷键 | 作用 |
---|
ctrl + m | 隐藏与显示tree |
Enter | 打开tree中选中的文件 |
v | 左右分屏打开 |
h | 上下分屏 |
i | 忽略node_modules |
. | 显示与隐藏隐藏文件 |
F5 | refresh file |
a | create file |
d | remove file |
r | rename file |
x | cut file |
c | copy file |
p | paste file |
s | system_open file |
o | open file |
telescope搜索相关
快捷键 | 作用 |
---|
ctrl + p | 搜索文件 |
ctrl + f | 全局搜索 |
# 以下命令是在👆的命令后使用 | |
ctrl + j | 向下移动选择文件 |
ctrl + k | 向上移动选择文件 |
ctrl + n | 历史搜索下一个 |
ctrl + p | 历史搜索上一个 |
ctrl + c | 关闭搜索页面 |
ctrl + u | 预览上滚 |
ctrl + d | 预览下滚 |
LSP相关
快捷键 | 作用 |
---|
gd | 跳到变量的定义处 |
gh | 悬浮显示当前变量的信息 |
gp | 显示当前文件的错误的代码信息 |
gj | 跳到下一个错误代码的地方 |
gk | 跳到上一个错误代码的地方 |
<leader> + f | 格式化代码 |
ctrl + j/n | 选择下一个提示 |
ctrl + k/p | 选择上一个提示 |
Enter | 确认选择 |
<leader> + rn | 重命名变量名 |
退出
Inser模式下
移动/编辑相关
快捷键 | 作用 |
---|
option + h/j/k/l | 左下上右移动 |
ctrl + b | 到末尾 |
ctrl + e | 到首 |
ctrl + j | 开辟新行 |
Visual模式下
移动相关
快捷键 | 作用 |
---|
j | 向下移动代码 |
k | 向上移动选中的代码 |
< | 左缩进代码 |
右缩进代码 |
= | 选中代码后格式化代码 |
常用命令
命令 | 作用 |
---|
:q | 退出 |
:q! | 强制退出 |
:w | 保存 |
:qa | 退出并关闭 |
:qa! | 强制退出并关闭 |
:wq | 保存并退出 |
:PackerCompile | 每次改变插件配置时,必须运行此命令或 PackerSync , 重新生成编译的加载文件 |
:PackerClean | 清除所有不用的插件 |
:PackerInstall | 清除,然后安装缺失的插件 |
:PackerUpdate | 清除,然后更新并安装插件 |
:PackerSync(最常使用) | 执行 PackerUpdate 后,再执行 PackerCompile |
:h base-directories | 查看详细文档 |
:echo stdpath("data") | 查看你系统下Neovim的数据存储在标准数据目录的实际路径 |
:colorscheme Tab键 | 查看内置主题色 |
:echo $VIMRUNTIME | 查看$VIMRUNTIME` 具体的路径 |
:h nvim-tree.setup | 查看nvim-tree的帮助文档 |
:NvimTreeToggle | 再按Enter即可打开或关闭侧边栏 |
:checkhealth telescope | 检查telescope依赖情况 |
:Telescope find_files | 打开搜索文件窗口,快速打开文件 |
:Telescope live_grep | 可以打开搜索窗口,输入内容后,结果会实时显示 |
:Telescope buffers | 命令可以列出打开的 buffers |
:Telescope git_files | 列出 git 文件 |
:Telescope man_pages | 列出帮助 |
:Telescope env | 打开环境变量列表 |
Telescope colorscheme | 换肤功能 |
| |
:TSInstallInfo | 命令查看 language parsers 列表与安装状态 |
:TSInstall <language_to_install> | 安装指定的 Language parser 例如:TSInstall javascript |
:TSModuleInfo | 查看你的模块是否开启成功 |
| |
LSP相关命令 | |
:h lsp | 查看 LSP 文档 |
:LspInstallInfo | 安装 LSP Servers的图形化界面 |
j/k | 移动光标到你要安装的 server |
i | 安装server |
X | 卸载该 server |
u | 更新 server |
U | 更新所有 servers |
c | 检查 server 新版本 |
C | 检查所有 servers 的新版本 |
Esc | 关闭窗口 |
? | 显示其他帮助信息 |
| |
:LspInfo | 查看绑定的 Language Server 信息 |
:NullLsInfo | 查看源的激活情况 |
:lua vim.lsp.buf.formatting_sync() | 格式化代码 |
:lua vim.lsp.buf.formatting_sync(nil, 9999) | 不加参数可能会报Time out |
echo executable('xxx') | 查看某个命令是否可用 例如echo executable('rubocop')查看rubocop是否可用,一般用来排查格式化代码时需要的命令是否已安装 |
我的相关配置文件
lua/keybindings.lua
vim.g.mapleader = ","
vim.g.maplocalleader = ","
local map = vim.api.nvim_set_keymap
local opt = { noremap = true, silent = true }
map("n", "<C-[>", "Esc", opt)
map("n", "sv", ":vsp<CR>", opt)
map("n", "sh", ":sp<CR>", opt)
map("n", "sc", "<C-w>c", opt)
map("n", "so", "<C-w>o", opt)
map("n", "∑", "<C-w>w", opt)
map("n", "˙", "<C-w>h", opt)
map("n", "∆", "<C-w>j", opt)
map("n", "˚", "<C-w>k", opt)
map("n", "¬", "<C-w>l", opt)
map("i", "˙", "<Left>", opt)
map("i", "∆", "<Down>", opt)
map("i", "˚", "<Up>", opt)
map("i", "¬", "<Right>", opt)
map("n", "s,", ":vertical resize -20<CR>", opt)
map("n", "s.", ":vertical resize +20<CR>", opt)
map("n", "sj", ":resize +10<CR>", opt)
map("n", "sk", ":resize -10<CR>", opt)
map("n", "s=", "<C-w>=", opt)
map("n", "<leader>t", ":sp | terminal<CR>", opt)
map("n", "<leader>vt", ":vsp | terminal<CR>", opt)
map("t", "<Esc>", "<C-\\><C-n>", opt)
map("v", "<", "<gv", opt)
map("v", ">", ">gv", opt)
map("v", "J", ":move '>+1<CR>gv-gv", opt)
map("v", "K", ":move '<-2<CR>gv-gv", opt)
map("n", "<C-j>", "4j", opt)
map("n", "<C-k>", "4k", opt)
map("n", "<C-u>", "9k", opt)
map("n", "<C-d>", "9j", opt)
map("v", "p", '"_dP', opt)
map("n", "q", ":qa<CR>", opt)
map("n", "qq", ":q!<CR>", opt)
map("n", "ww", ":w<CR>", opt)
map("n", "Q", ":qa!<CR>", opt)
map("i", "<C-b>", "<ESC>I", opt)
map("i", "<C-e>", "<ESC>A", opt)
map("n", "<C-h>", ":BufferLineCyclePrev<CR>", opt)
map("n", "<C-l>", ":BufferLineCycleNext<CR>", opt)
map("n", "<C-w>", ":Bdelete!<CR>", opt)
map("n", "<leader>bl", ":BufferLineCloseRight<CR>", opt)
map("n", "<leader>bh", ":BufferLineCloseLeft<CR>", opt)
map("n", "<leader>bc", ":BufferLinePickClose<CR>", opt)
map("n", "<C-p>", ":Telescope find_files<CR>", opt)
map("n", "<C-f>", ":Telescope live_grep<CR>", opt)
map("n", "<leadner>fm", "gg=G<C-o>", opt)
local pluginKeys = {}
map("n", "<C-m>", ":NvimTreeToggle<CR>", opt)
pluginKeys.nvimTreeList = {
{ key = { "<CR>", "o", "<2-LeftMouse>" }, action = "edit" },
{ key = "v", action = "vsplit" },
{ key = "h", action = "split" },
{ key = "i", action = "toggle_ignored" },
{ key = ".", action = "toggle_dotfiles" },
{ key = "<F5>", action = "refresh" },
{ key = "a", action = "create" },
{ key = "d", action = "remove" },
{ key = "r", action = "rename" },
{ key = "x", action = "cut" },
{ key = "c", action = "copy" },
{ key = "p", action = "paste" },
{ key = "s", action = "system_open" },
}
pluginKeys.telescopeList = {
i = {
["<C-j>"] = "move_selection_next",
["<C-k>"] = "move_selection_previous",
["<Down>"] = "move_selection_next",
["<Up>"] = "move_selection_previous",
["<C-n>"] = "cycle_history_next",
["<C-p>"] = "cycle_history_prev",
["<C-c>"] = "close",
["<C-u>"] = "preview_scrolling_up",
["<C-d>"] = "preview_scrolling_down",
},
}
pluginKeys.mapLSP = function(mapbuf)
mapbuf("n", "<leader>rn", "<cmd>Lspsaga rename<CR>", opt)
mapbuf("n", "<leader>ca", "<cmd>Lspsaga code_action<CR>", opt)
mapbuf("n", "gd", "<cmd>lua vim.lsp.buf.definition()<CR>", opt)
mapbuf("n", "gh", "<cmd>Lspsaga hover_doc<cr>", opt)
mapbuf("n", "gr", "<cmd>Lspsaga lsp_finder<CR>", opt)
mapbuf("n", "gp", "<cmd>Lspsaga show_line_diagnostics<CR>", opt)
mapbuf("n", "gj", "<cmd>Lspsaga diagnostic_jump_next<cr>", opt)
mapbuf("n", "gk", "<cmd>Lspsaga diagnostic_jump_prev<cr>", opt)
mapbuf("n", "<leader>f", "<cmd>lua vim.lsp.buf.formatting_sync(nil, 9999)<CR>", opt)
end
pluginKeys.cmp = function(cmp)
local feedkey = function(key, mode)
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(key, true, true, true), mode, true)
end
local has_words_before = function()
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
end
return {
["<C-.>"] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }),
["<C-,>"] = cmp.mapping({
i = cmp.mapping.abort(),
c = cmp.mapping.close(),
}),
["<C-k>"] = cmp.mapping.select_prev_item(),
["<C-j>"] = cmp.mapping.select_next_item(),
["<CR>"] = cmp.mapping.confirm({
select = true,
behavior = cmp.ConfirmBehavior.Replace,
}),
["<C-u>"] = cmp.mapping(cmp.mapping.scroll_docs(-4), { "i", "c" }),
["<C-d>"] = cmp.mapping(cmp.mapping.scroll_docs(4), { "i", "c" }),
["<C-l>"] = cmp.mapping(function(_)
if vim.fn["vsnip#available"](1) == 1 then
feedkey("<Plug>(vsnip-expand-or-jump)", "")
end
end, { "i", "s" }),
["<C-h>"] = cmp.mapping(function()
if vim.fn["vsnip#jumpable"](-1) == 1 then
feedkey("<Plug>(vsnip-jump-prev)", "")
end
end, { "i", "s" }),
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif vim.fn["vsnip#available"](1) == 1 then
feedkey("<Plug>(vsnip-expand-or-jump)", "")
elseif has_words_before() then
cmp.complete()
else
fallback()
end
end, { "i", "s" }),
["<S-Tab>"] = cmp.mapping(function()
if cmp.visible() then
cmp.select_prev_item()
elseif vim.fn["vsnip#jumpable"](-1) == 1 then
feedkey("<Plug>(vsnip-jump-prev)", "")
end
end, { "i", "s" }),
}
end
return pluginKeys
lua/plugins.lua
local packer = require("packer")
packer.startup({
function(use)
use 'wbthomason/packer.nvim'
use 'tamelion/neovim-molokai'
use("folke/tokyonight.nvim")
use({ "kyazdani42/nvim-tree.lua", requires = "kyazdani42/nvim-web-devicons" })
use({ "akinsho/bufferline.nvim", requires = { "kyazdani42/nvim-web-devicons", "moll/vim-bbye" }})
use({ "nvim-lualine/lualine.nvim", requires = { "kyazdani42/nvim-web-devicons" } })
use("arkav/lualine-lsp-progress")
use { 'nvim-telescope/telescope.nvim', requires = { "nvim-lua/plenary.nvim" } }
use "LinArcX/telescope-env.nvim"
use("glepnir/dashboard-nvim")
use("ahmedkhalf/project.nvim")
use({ "nvim-treesitter/nvim-treesitter", run = ":TSUpdate" })
use({ "neovim/nvim-lspconfig", "williamboman/nvim-lsp-installer" })
use("hrsh7th/nvim-cmp")
use("hrsh7th/vim-vsnip")
use("rafamadriz/friendly-snippets")
use("hrsh7th/cmp-vsnip")
use("hrsh7th/cmp-nvim-lsp")
use("hrsh7th/cmp-buffer")
use("hrsh7th/cmp-path")
use("hrsh7th/cmp-cmdline")
use("rafamadriz/friendly-snippets")
use("onsails/lspkind-nvim")
use("tami5/lspsaga.nvim" )
use("lukas-reineke/indent-blankline.nvim")
use({ "jose-elias-alvarez/null-ls.nvim", requires = "nvim-lua/plenary.nvim" })
end,
config = {
display = {
open_fn = function()
return require("packer.util").float({ border = "single" })
end,
},
max_jobs = 16,
git = {
},
},
})
pcall(
vim.cmd,
[[
augroup packer_user_config
autocmd!
autocmd BufWritePost plugins.lua source <afile> | PackerSync
augroup end
]]
)
可能用到的资源