我有以下 lua 函数用于在 neovim 中映射键
local M = {}
function M.map(mode, lhs, rhs, opts)
-- default options
local options = { noremap = true }
if opts then
options = vim.tbl_extend("force", options, opts)
end
vim.api.nvim_set_keymap(mode, lhs, rhs, options)
end
return M
并将其用于键映射,如下所示:
map("", "<Leader>f", ":CocCommand prettier.forceFormatDocument<CR>")
map("", "<Leader>f", ":RustFmt<CR>")
我只想对
:RustFmt
文件使用 .rs
,对所有其他文件使用 :CocCommand prettier.forceFormatDocument
。
这可以用
vim.api.nvim_set_keymap
来做吗?如果可以的话我该怎么做?
感谢@DoktorOSwaldo 和@UnrealApex,我能够使用
ftplugin
解决问题。
步骤:
ftplugin
内创建~/.config/nvim
目录。ftplugin
目录中创建一个文件rust.lua
。rust.lua
内导入 map
util 并定义键映射。local map = require("utils").map
-- Format document
map("", "<Leader>f", ":RustFmt<CR>")
对于 Rust 以外的语言,请使用以下命令获取可能文件名的完整列表(
.vim
可以切换为 .lua
):
:exe 'Lexplore ' . expand('$VIMRUNTIME') . '/syntax'
您可以在
format
配置文件中创建 utils.lua
函数:
function M.format()
if vim.bo.filetype == 'rust' then
vim.cmd('RustFmt')
else
vim.cmd('CocCommand prettier.forceFormatDocument')
end
并像这样定义你的键映射:
map("", "<Leader>f", "<cmd>:lua require('utils').format<CR>")
我认为当前的解决方案存在一个问题,即更改为新文件类型时所需的映射不会卸载?因此,一旦加载 rust 文件,它将加载所需的映射,但如果您移动到不同的文件类型,您仍然会将
RustFmt
绑定到 <leader>f
?
我是如何做到的,在 lsp 配置中;通过检查 rust 的 lsp 服务器在当前缓冲区中是否处于活动状态(仅适用于 rust 文件),如果是,则加载特定的键盘映射。
下面,如果有服务器提供格式化功能并且客户端不在列表中,则使用
lsp.buf.format
。否则,使用 :Format<cr>
(formatter.nvim 插件)
local lsp_attach = function(client, bufnr)
local bufopts = { noremap = true, silent = true, buffer = bufnr }
local force_formatter = client.name == "lua_ls"
or client.name == "tsserver"
or client.name == "pyright"
or client.name == "bashls"
client.server_capabilities.document_formatting = true
-- if lsp does not provide formatting (or has been set false, above), use formatter.nvim
if client.server_capabilities.documentFormattingProvider and not force_formatter then
vim.keymap.set({ "v", "n" }, "<leader>f", vim.lsp.buf.format, bufopts)
else
vim.keymap.set("n", "<leader>f", ":Format<cr>", bufopts)
end
lsp_keymaps(client, bufnr)
require("cmp_nvim_lsp").default_capabilities()
client.server_capabilities.semanticTokensProvider = nil
end
因此,在您的情况下,您可以添加额外的
if
语句,以检查 rust-analyzer
/其他 lsp client
是否处于活动状态,如果是,则加载 RustFmt
的键盘映射。
这是有效的,因为每次缓冲区附加到新文件时都会调用
on_attach
。