-- Use double backslashes vim.api.nvim_set_hl(0, 'InvisibleChar', { bg = '#ff0000', fg = '#ffffff' }) vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'TextChanged', 'InsertLeave' }, { group = vim.api.nvim_create_augroup('InvisibleChars', { clear = true }), callback = function() vim.fn.clearmatches() vim.fn.matchadd('InvisibleChar', '\\%u2028\\|\\%u200b\\|\\%u200c\\|\\%u200d\\|\\%u2029\\|\\%ufeff') end }) vim.api.nvim_create_autocmd({ 'FileType' }, { group = vim.api.nvim_create_augroup('TabWidth', { clear = true }), pattern = "html,dart,vue,javascript,typescript,typescriptreact,json,markdown,css,sass", callback = function() vim.opt_local.tabstop = 2 vim.opt_local.softtabstop = 2 vim.opt_local.shiftwidth = 2 end, }) vim.api.nvim_create_autocmd({ 'FileType' }, { group = vim.api.nvim_create_augroup('DartCommentString', { clear = true }), pattern = 'dart', callback = function() vim.bo.commentstring = '// %s' end }) vim.api.nvim_create_autocmd({ 'FileType' }, { group = vim.api.nvim_create_augroup('PhpIndent', { clear = true }), pattern = 'php', callback = function() vim.opt_local.smartindent = false vim.opt_local.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" end }) vim.api.nvim_create_autocmd({ 'BufWritePre' }, { group = vim.api.nvim_create_augroup('RemoveTrailingWhitespace', { clear = true }), command = [[%s/\s\+$//e]], }) vim.api.nvim_create_autocmd({ 'BufRead', 'BufNewFile' }, { group = vim.api.nvim_create_augroup('DockerExtensionFiletype', { clear = true }), pattern = { '*.docker' }, callback = function() vim.opt_local.syntax = 'dockerfile' end }) vim.api.nvim_create_autocmd({ 'BufReadPost' }, { group = vim.api.nvim_create_augroup('LastCursorPosition', { clear = true }), callback = function(event) local exclude = { 'gitcommit', 'commit', 'gitrebase' } local buf = event.buf if vim.tbl_contains(exclude, vim.bo[buf].filetype) or vim.b[buf].last_loc then return end vim.b[buf].last_loc = true local mark = vim.api.nvim_buf_get_mark(buf, '"') local lcount = vim.api.nvim_buf_line_count(buf) if mark[1] > 0 and mark[1] <= lcount then pcall(vim.api.nvim_win_set_cursor, 0, mark) end end, }) vim.api.nvim_create_autocmd({ 'TextYankPost' }, { group = vim.api.nvim_create_augroup('YankHighlight', { clear = true }), callback = function() vim.hl.on_yank({ timeout = 250 }) end }) vim.api.nvim_create_autocmd('BufWritePre', { callback = function() local dir = vim.fn.expand(':p:h') if vim.fn.isdirectory(dir) == 0 then vim.fn.mkdir(dir, 'p') end end, }) -- Better indentation for PHP arrays vim.api.nvim_create_autocmd('FileType', { pattern = 'php', callback = function() vim.opt_local.indentkeys:remove('0#') end, }) -- Enable spell check for markdown and git commits vim.api.nvim_create_autocmd('FileType', { pattern = {'markdown', 'gitcommit'}, callback = function() vim.opt_local.spell = true vim.opt_local.spelllang = 'en_us' end, }) -- Auto-close unused buffers after 20 minutes vim.api.nvim_create_autocmd('BufHidden', { callback = function(event) if vim.bo[event.buf].buftype == '' then vim.defer_fn(function() if vim.api.nvim_buf_is_valid(event.buf) and not vim.api.nvim_buf_is_loaded(event.buf) then vim.api.nvim_buf_delete(event.buf, { force = false }) end end, 1200000) -- 20 minutes end end, })