首页 > 解决方案 > 如何在函数内创建一个 if 属性以检查 vimscript 中的文件类型?

问题描述

我需要检查我在 Vim 中打开的文件类型,以便在函数中做一件事或另一件事。

这就是我的vimrc样子:

function! MyFunction()
    autocmd filetype typescript <C-V>%
    autocmd filetype go <C-V>%
endfunction

nnoremap <Leadar>f :call MyFunction()<CR>

接下来<C-V>%将是更多说明,但现在这是我正在测试的内容。

我的函数必须检测我有 openend 的文件,根据它的类型做一件事或另一件事。我在一个函数中执行此操作,因为在不久的将来我会将其移动到一个单独的插件中,但现在它是我的vimrc文件。

我已经尝试过并且我知道它有效的另一件事是

autocmd filetype typescript nnoremap <Leader>f <C-V>% DoTypescriptThings
autocmd filetype go nnoremap <Leader>f <C-V>% DoGolangThings

如果我将这条线移到函数体之外,我会工作。但是<Leader> KEY如果我把它做成一个插件,我就不能轻易改变。这就是为什么我把它移到一个函数中。

如何让我的函数检测我的类型以便我的函数工作?

标签: vimvim-pluginneovim

解决方案


如果我能清楚地理解,您实际上想从自动命令中提取文件类型检查,以便重新映射主键 ( <LEADER>f) 变得容易。

您可以使用&filetype. 您的函数将如下所示:

function! MyFunction()
    if &filetype ==# 'typescript'
        autocmd filetype typescript <C-V>%

        " Now you dont need autocmds here to be precise;
        " But you may consider some other autocmd-events in future
        " Until then a simple :execute or :execute "normal!..." should be sufficient instead

    elseif &filetype ==# 'go'
        autocmd filetype go <C-V>%
    endif
endfunction

nnoremap <Leadar>f :call MyFunction()<CR>

现在考虑到 autocmd 也做同样的事情(检查文件类型和应用映射),所以我猜你的主要动机不是使用 autocmd,而是能够<LEADER>f轻松地重新映射主键()。

因此,总而言之,我建议不要在此处使用 autocmd 并仅使用函数定义,以便一个键可以统治您的函数调用。(当然,除非您也决定使用其他一些 autocmd 事件)


推荐阅读