-- :RString Strip white psace from right of all lines, ranges supported vim.api.nvim_create_user_command('RStrip', function(opts) local pos = vim.fn.getcurpos(vim.api.nvim_get_current_win()) local range = opts.line1 .. ',' .. opts.line2 vim.cmd.execute("'" .. range .. 's/\\s\\+$//e' .. "'") vim.cmd.nohlsearch() vim.fn.setpos('.', pos) end, { range = '%' }) -- :TabWidth set the tab width for the current buffer vim.api.nvim_create_user_command('TabWidth', function(opts) -- Set the tab width for the current filetype -- FIXME: Doesn't seem to cover all bases in neovim when editorconfig is -- involved, specifically with pressing o/O in C++ from a line with a brace. -- This might be related to tree-sitter indentation? Or could be that I've -- not ported over all my filetype settings yet. local width = tonumber(opts.args) vim.opt.tabstop = width vim.opt.shiftwidth = width vim.opt.softtabstop = width end, { nargs = 1 }) -- :Remove the file associated with the current buffer, bang to delete buffer vim.api.nvim_create_user_command('Remove', function(opts) local path = vim.fn.expand('%:p') -- Using opts.bang in the callback can cause a SEGFAULT, instead use it -- before invoking the async unlink to select which callback should be called -- on completion. local callback = nil if opts.bang then -- Invoked as :Remove! so also delete the buffer. callback = function(err, success) if success then vim.schedule(function() vim.api.nvim_buf_delete(vim.api.nvim_get_current_buf(), {}) end) else error(err) end end else -- Invoked as :Remove so don't delete the buffer. callback = function(err, success) if not success then error(err) end end end -- Actually remove the file using the selecte callback. vim.loop.fs_unlink(path, callback) end, { bang = true }) -- TODO: :Move -- :Rename the file associated with current buffer vim.api.nvim_create_user_command('Rename', function(opts) local source = vim.fn.expand('%') local dest = nil local dir = vim.fn.expand('%:h') if dir == '.' then dest = opts.args else dest = vim.fn.resolve(dir .. '/' .. opts.args) end local buffer = vim.api.nvim_get_current_buf() vim.loop.fs_rename(source, dest, function(err, success) if not success then error(err) else vim.schedule(function() vim.cmd.edit(dest) vim.api.nvim_buf_delete(buffer, {}) end) end end) end, { nargs = 1, complete = function() return { vim.fn.expand('%:t') } end }) -- TODO: :Chmod -- TODO: :Mkdir -- :Rg grep for the string and fuzzy find the results, bang to enable -- regex in search term vim.api.nvim_create_user_command('Rg', function(opts) local grep_opts = { search = opts.args } if opts.bang then grep_opts['use_regex'] = true end require('telescope.builtin').grep_string(grep_opts) end, { bang = true, nargs = '*' })