Как создать объект if внутри функции для проверки типа файла в vimscript? - PullRequest
2 голосов
/ 02 августа 2020

Мне нужно проверить тип файла, который я открыл в Vim, чтобы выполнить то или иное действие внутри функции.

Вот как выглядит мой vimrc:

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

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

Рядом с <C-V>% будет больше инструкций, но сейчас это то, что я тестирую.

Моя функция должна определять файл, который у меня открыт, в зависимости от его типа делать то или иное. Я делаю это внутри функции, потому что в ближайшем будущем я перенесу это в отдельный плагин, но пока это мой файл vimrc.

Еще одна вещь, которую я уже пробовал, и я это знаю работает это

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

Если я перемещаю эти строки за пределы тела функции, я работаю. Но таким образом я не смог бы легко изменить <Leader> KEY, если бы сделал это плагином. Вот почему я переместил его в функцию.

Как я могу заставить мою функцию определять мои типы, чтобы моя функция работала?

1 Ответ

1 голос
/ 03 августа 2020

Если я могу ясно понять, вы действительно хотите вытащить проверку типа файла из автоматической команды, чтобы было легко переназначить основной ключ (<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 и go только с определением функции, чтобы одна клавиша могла управлять вашим вызовом функции. (Конечно, если вы не решите использовать и другие события autocmd)

...