Как настроить autocmd, чтобы он действовал, когда тип файла отсутствует?

В Vim я хочу, чтобы определенный набор отображений был установлен только тогда и только тогда, когда типом файла является уценка, текст или нет (т. Е. NULL). Указание "нет" является сложной частью.

Команда ниже работает, если :set filetype? возвращается filetype=markdown или же filetype=text, Но если :set filetype? возвращается filetype= (показывает как none в моей статусной строке) не работает.

autocmd FileType markdown,text,none  nnoremap <leader>f :%! cat<CR>

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

NB: отображение придумано, потому что это не интересная часть вопроса.

3 ответа

Решение

Вот один из способов:

autocmd FileType markdown,text nnoremap <buffer> <leader>f :1,$! cat
autocmd BufNewFile,BufRead * if empty(&filetype) | execute 'nnoremap <buffer> <leader>f :1,$! cat' | endif

Как FileType Событие не вызывается, когда тип файла не обнаружен, необходимо использовать исходные события обнаружения типа файла и проверить наличие пустого типа файла. Поместите эти строки после :filetype on в вашем ~/.vimrc, так что порядок autocmd правильный.

Обратите внимание, что код в вашем вопросе по-прежнему определяет глобальные отображения (после загрузки одного из ваших типов файлов); вам нужно добавить <buffer> чтобы сделать эти отображения действительно локальными. (И для 100% правильного использования <LocalLeader>хотя для большинства пользователей для этого не определен отдельный ключ.)

Если вы хорошо справляетесь с глобальным сопоставлением, вы также можете избавиться от всех autocmds и просто выполнить проверку типов файлов (если это действительно необходимо; я не вижу плохого поведения с другими типами файлов для вашего примера) во время выполнения, например с :help :map-expr:

nnoremap <expr> <leader>f index(['markdown', 'text', ''], &filetype) == -1 ? '': ':1,$! cat')

постскриптум

  • Ваше отображение неполное, т.е. оно оставляет курсор в режиме командной строки; это предназначено? присоединять <CR> чтобы завершить это.
  • Вместо 1,$, вы можете использовать % спектр.

Как насчет этого?

autocmd BufEnter * :call SetFiletypeNewBuffer()
function! SetFiletypeNewBuffer()
  if @% == ""
    :set filetype=none
  endif
endfunction
autocmd FileType markdown,text,none  nnoremap <leader>f :1,$! cat

если кого-то интересовало аналогичное решение на Lua для Neovim

          vim.api.nvim_create_autocmd('BufEnter', {
    pattern = '*',
    callback = function ()
        if (vim.tbl_contains({'', 'text', 'markdown'}, vim.o.filetype)) then
            -- add your autocmd logic here
            vim.schedule(function() print('empty/text/markdown file type detected') end)
        end
    end
})




Другие вопросы по тегам