如何在函数内部创建一个 if 语句来检查 vimscript 中的文件类型?

How to create a if estatement inside a function to check file type in 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 。这就是我将其移至函数的原因。

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

如果我能理解清楚的话,你实际上是想从自动命令中提取文件类型检查,以便重新映射主键(<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,而只使用函数定义,这样一键就可以控制您的函数调用。 (当然,除非您决定也使用其他一些自动命令事件)