如何根据文件类型使用不同的映射?

问题描述 投票:0回答:3

我有以下 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
来做吗?如果可以的话我该怎么做?

lua neovim keymapping
3个回答
12
投票

感谢@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'

3
投票

您可以在

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>")

2
投票

我认为当前的解决方案存在一个问题,即更改为新文件类型时所需的映射不会卸载?因此,一旦加载 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

这是我上面的完整 lsp 配置。

© www.soinside.com 2019 - 2024. All rights reserved.