Как настроить 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
})