--[[ tricks ]] -- TODO: set up diagnostics based on https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md#sumneko_lua local vim = vim -- minimize LSP warning --[[ options ]] -- signcolumn vim.opt.signcolumn = 'yes' vim.opt.relativenumber = true vim.opt.number = true -- window vim.opt.splitright = true vim.opt.splitbelow = true vim.opt.backspace = {'indent', 'eol', 'start'} -- buffer vim.opt.autoread = true vim.opt.matchtime = 1 vim.opt.mouse = 'a' vim.opt.pumheight = 10 vim.opt.termguicolors = true vim.opt.updatetime = 300 -- recommended by vgit -- search vim.opt.hlsearch = true vim.opt.showmatch = true vim.opt.incsearch = true -- false reccomended by vgit -- tab and indent vim.opt.softtabstop = 2 vim.opt.shiftwidth = 2 vim.opt.expandtab = true vim.opt.autoindent = true vim.opt.smartindent = true -- others vim.opt.shell = 'zsh' --[[ mappings ]] local function set_keymap(lhs, rhs, cmd, opts) opts = opts or {} opts.desc = nil -- desc breaks Fern actions vim.keymap.set(lhs, rhs, cmd, opts) end vim.g.mapleader = ' ' set_keymap('n', '', ':nohlsearch') set_keymap('n', 'x', '"_x') set_keymap('n', 'X', '"_X') set_keymap('n', 'gf', 'gF') set_keymap({'n', 'v'}, 'gy', '"+y') set_keymap({'n', 'v'}, 'gY', '"+Y') set_keymap('c', '', '') set_keymap('c', '', '') set_keymap('t', '', "'wincmd ' .. getcharstr() .. ''", {expr = true}) --[[ personal utilities ]] -- Apply MYVIMRC vim.api.nvim_create_user_command( 'ApplyMYVIMRC', function() vim.cmd('!chezmoi apply') vim.cmd('source $MYVIMRC') end, {} ) -- nvim-remote for edit-commandline zle -- bd will update, wipe buffer, and go back to the caller terminal if vim.fn.executable('nvr') == 1 then vim.env.EDITOR_CMD = 'nvr -cc "below 5split" -c "set filetype=zsh_cmdline" --remote-wait-silent' vim.api.nvim_create_augroup('zsh-cmdline', {}) vim.api.nvim_create_autocmd( 'Filetype', { pattern = 'zsh_cmdline', group = 'zsh-cmdline', callback = function() vim.opt.filetype = 'zsh' set_keymap( 'n', 'bd', 'w | bw | ' .. vim.fn.winnr('#') .. 'wincmd w | startinsert', {buffer = true} ) end } ) end --[[ PLUGIN SETTINGS ]] if vim.fn.empty(vim.fn.glob(vim.fn.stdpath('data') .. '/site/autoload/jetpack.vim')) == 1 then vim.api.nvim_exec([[ let jetpack = stdpath('data') . '/site/autoload/jetpack.vim' autocmd VimEnter * JetpackSync | source $MYVIMRC silent execute '!curl -fLo '.jetpack.' --create-dirs https://raw.githubusercontent.com/tani/vim-jetpack/master/autoload/jetpack.vim' silent execute '!curl -fLo "$HOME/.config/nvim/lua/jetpack.lua" --create-dirs https://raw.githubusercontent.com/tani/vim-jetpack/master/lua/jetpack.lua' ]], false) end require'jetpack'.startup(function(use) -- basic dependencies use 'tpope/vim-repeat' use 'kyazdani42/nvim-web-devicons' -- for lualine use 'nvim-lua/plenary.nvim' -- for gitsigns, vgit use 'tami5/sqlite.lua' -- for telescope-frecency use 'vim-denops/denops.vim' -- utils use 'tpope/vim-commentary' use 'nathom/filetype.nvim' use 'lambdalisue/fern.vim' use 'segeljakt/vim-silicon' -- pacman -S silicon -- windows and buffers use 'simeji/winresizer' use 'tkmpypy/chowcho.nvim' use 'moll/vim-bbye' use 'AndrewRadev/bufferize.vim' -- better something use 'wsdjeg/vim-fetch' -- :e with linenumber use 'jghauser/mkdir.nvim' -- :w with mkdir use 'haya14busa/vim-asterisk' -- * -- colorscheme use '4513ECHO/vim-colors-hatsunemiku' use 'morhetz/gruvbox' -- highlight use 'RRethy/vim-illuminate' use 'norcalli/nvim-colorizer.lua' -- statusline use 'nvim-lualine/lualine.nvim' -- motion use 'haya14busa/vim-edgemotion' use 'phaazon/hop.nvim' use 'unblevable/quick-scope' -- fuzzy finder use 'ctrlpvim/ctrlp.vim' use 'nvim-telescope/telescope.nvim' use 'nvim-telescope/telescope-frecency.nvim' use {'nvim-telescope/telescope-fzf-native.nvim', run = 'make'} -- git use 'knsh14/vim-github-link' use 'lambdalisue/gin.vim' use 'tanvirtin/vgit.nvim' -- treesitter use {'nvim-treesitter/nvim-treesitter', commit = '6a437db0124823f9fe89c1de9a3b536ce1f103f3'} use 'yioneko/nvim-yati' use 'haringsrob/nvim_context_vt' use 'm-demare/hlargs.nvim' use 'romgrk/nvim-treesitter-context' use 'mfussenegger/nvim-treehopper' use 'David-Kunz/treesitter-unit' use 'JoosepAlviste/nvim-ts-context-commentstring' -- text object use 'machakann/vim-sandwich' -- terminal use 'akinsho/toggleterm.nvim' -- lsp use 'neovim/nvim-lspconfig' use 'williamboman/nvim-lsp-installer' use 'folke/lsp-colors.nvim' use 'tamago324/nlsp-settings.nvim' -- ddc use 'Shougo/ddc.vim' use 'Shougo/ddc-around' use 'Shougo/ddc-cmdline' use 'Shougo/ddc-cmdline-history' use 'Shougo/ddc-matcher_head' -- 入力中の単語を補完 use 'Shougo/ddc-nvim-lsp' -- 入力中の単語を補完 use 'LumaKernel/ddc-file' -- Suggest file paths use 'Shougo/ddc-converter_remove_overlap' -- remove duplicates use 'Shougo/ddc-sorter_rank' -- Sort suggestions use 'Shougo/pum.vim' -- Show popup window use 'matsui54/denops-signature_help' use 'matsui54/denops-popup-preview.vim' end) --[[ colorscheme/highlight ]] -- params vim.g.illuminate_ftblacklist = {'fern'} local DEFAULT_COLORSCHEME = 'hatsunemiku' local ALTERNATIVE_COLORSCHEME = 'gruvbox' local CMD_ILLUMINATION = 'hi illuminatedWord guibg=#383D47' -- set colorscheme local setup_hlargs = require'hlargs'.setup local setup_colorizer = require'colorizer'.setup local setup_lsp_colors = require'lsp-colors'.setup local function set_colorscheme(nm) vim.cmd('colorscheme ' .. nm) setup_hlargs() setup_colorizer() setup_lsp_colors() vim.cmd(CMD_ILLUMINATION) vim.api.nvim_exec([[ hi link LspReferenceText illuminatedWord hi link LspReferenceWrite illuminatedWord hi link LspReferenceRead illuminatedWord ]], false) end set_colorscheme(DEFAULT_COLORSCHEME) -- illumination for modes other than ivV vim.api.nvim_create_augroup('illumination-by-mode', {}) vim.api.nvim_create_autocmd( 'ModeChanged', { pattern = '*:[ivV\x16]*', group = 'illumination-by-mode', command = 'hi clear illuminatedWord' } ) vim.api.nvim_create_autocmd( 'ModeChanged', { pattern = '[ivV\x16]*:*', group = 'illumination-by-mode', command = CMD_ILLUMINATION } ) -- Update colorscheme when buffer is outside of cwd vim.api.nvim_create_augroup('theme-by-buffer', {}) vim.api.nvim_create_autocmd( 'BufEnter', { pattern = '*', group = 'theme-by-buffer', nested = true, desc = 'Change theme by the path of the current buffer.', callback = function(args) local FILE = args.file -- Do nothing if unneeded if ( (FILE == '') or (vim.api.nvim_exec('echo &buftype', true) ~= '') ) then return nil end -- Determine colorscheme local CWD = vim.fn.getcwd() local COLORSCHEME = CWD == string.sub(FILE, 1, string.len(CWD)) and DEFAULT_COLORSCHEME or ALTERNATIVE_COLORSCHEME -- Apply colorscheme and some highlight settings if COLORSCHEME ~= vim.api.nvim_exec('colorscheme', true) then set_colorscheme(COLORSCHEME) end end } ) --[[ window settings ]] -- chowcho set_keymap({'', 't'}, '', function() if vim.fn.winnr('$') > 2 then require'chowcho'.run() else vim.cmd('wincmd w') end end) --[[ buffer settings ]] -- Bbye set_keymap('n', 'bd', ':up | Bdelete') set_keymap('n', 'bD', ':Bdelete!') -- asterisk set_keymap('n', '*', '(asterisk-z*)') set_keymap('v', '*', '(asterisk-gz*)') --[[ textobj settings ]] -- sandwich vim.g['sandwich#recipes'] = vim.deepcopy(vim.g['sandwich#default_recipes']) --[[ motion settings ]] -- quick-scope -- TODO: improve visibility by clearing highlight from the current line vim.g.qs_highlight_on_keys = {'f', 'F', 't', 'T'} -- hop local Hop = require'hop' Hop.setup() local function hopper(direction) local hint_char1 = Hop.hint_char1 local hint_direction = require'hop.hint'.HintDirection[direction] return function() hint_char1({direction = hint_direction, current_line_only = true}) end end set_keymap('', 'f', hopper('AFTER_CURSOR'), {desc = 'Hop after'}) set_keymap('', 'F', hopper('BEFORE_CURSOR'), {desc = 'Hop before'}) -- edgemotion set_keymap('', ']', '(edgemotion-j)', {}) set_keymap('', '[', '(edgemotion-k)', {}) --[[ statusline settings ]] -- lualine require'lualine'.setup { options = {theme = 'nord', component_separators = ''}, sections = { lualine_a = {}, lualine_b = {}, lualine_c = {{'filetype', icon_only = true}, 'filename'}, lualine_x = {'location'}, lualine_y = {}, lualine_z = {}, }, inactive_sections = { lualine_a = {}, lualine_b = {}, lualine_c = {{'filetype', icon_only = true}, 'filename'}, lualine_x = {}, lualine_y = {}, lualine_z = {}, }, tabline = { lualine_a = {'mode'}, lualine_b = {}, lualine_c = {}, lualine_x = {}, lualine_y = {'diagnostics', 'branch', 'diff'}, lualine_z = {'tabs'}, }, extensions = {'fern', 'toggleterm'} } --[[ filer settings ]] -- fern -- TODO: using nvim api currently fails to show file list set_keymap('n', '', ':Fern . -drawer -reveal=%') vim.api.nvim_exec([[ function! s:init_fern() abort setlocal nornu nonu cursorline signcolumn=auto nnoremap p endfunction augroup fern-custom autocmd! * autocmd FileType fern call s:init_fern() augroup END ]], false) --[[ treesitter settings ]] require'nvim-treesitter.configs'.setup { ensure_installed = { 'bash', 'bibtex', 'c', 'c_sharp', 'cmake', 'cpp', 'css', 'dockerfile', 'dot', 'go', 'gomod', 'gowork', 'graphql', 'haskell', 'help', 'html', 'http', 'java', 'javascript', 'json', 'json5', 'julia', 'latex', 'lua', 'make', 'markdown', 'ninja', 'nix', 'python', 'r', 'regex', 'ruby', 'rust', 'scss', 'teal', 'toml', 'tsx', 'typescript', 'vala', 'vim', 'vue', 'yaml' }, context_commentstring = {enable = true}, highlight = {enable = true}, indent = {enable = true}, yati = {enable = true}, } local ft_to_parser = require'nvim-treesitter.parsers'.filetype_to_parsername ft_to_parser.zsh = 'bash' require'nvim_context_vt'.setup {enabled = true} require'treesitter-context'.setup() set_keymap('o', 'm', ':lua require"tsht".nodes()', {silent = true}) set_keymap('v', 'm', ':lua require"tsht".nodes()', {silent = true}) set_keymap('x', 'iu', ':lua require"treesitter-unit".select()') set_keymap('x', 'au', ':lua require"treesitter-unit".select(true)') set_keymap('o', 'iu', ':lua require"treesitter-unit".select()') set_keymap('o', 'au', ':lua require"treesitter-unit".select(true)') --[[ git settings ]] -- vgit local Vgit = require'vgit' Vgit.setup { keymaps = { ['n gj'] = 'hunk_down', ['n gk'] = 'hunk_up', ['n gs'] = 'buffer_hunk_stage', ['n gr'] = 'buffer_hunk_reset', }, settings = { live_blame = { enabled = false } } } vim.api.nvim_create_user_command('ToggleBlame', Vgit.toggle_live_blame, {}) --[[ terminal settings ]] vim.api.nvim_create_augroup('termopen', {}) vim.api.nvim_create_autocmd( 'TermOpen', {pattern = '*', group = 'termopen', command = 'startinsert'} ) -- toggleterm:general require'toggleterm'.setup { open_mapping = '', insert_mappings = false, } local function _toggleterm_run() local winnr = vim.fn.winnr() vim.cmd('ToggleTermSendCurrentLine') vim.cmd(winnr .. 'wincmd w') end set_keymap('n', 'j', _toggleterm_run, {desc = 'ToggleTermSendCurrentLine'}) -- toggleterm:lazygit local lazygit = require'toggleterm.terminal'.Terminal:new { cmd = 'lazygit', hidden = true, direction = 'float' } local function lazygit_toggle() lazygit:toggle() end set_keymap( 'n', 'gl', lazygit_toggle, {desc = 'lazygit', silent = true} ) --[[ fuzzyfinder settings ]] -- telescope local Telescope = require'telescope' local TelescopeBuiltin = require'telescope.builtin' Telescope.setup() Telescope.load_extension('frecency') Telescope.load_extension('fzf') for key, callback in pairs { ab = {'buffers'}, b = {'buffers'}, ac = {'commands'}, af = {'find_files'}, ag = {'live_grep'}, ah = {'help_tags'}, ak = {'keymaps'}, am = {'frecency', Telescope.extensions.frecency}, ap = {'registers'}, p = {'registers'}, ar = {'lsp_references'}, at = {'treesitter'}, ['a/'] = {'current_buffer_fuzzy_find'}, ['/'] = {'current_buffer_fuzzy_find'}, } do set_keymap( 'n', '' .. key, (callback[2] or TelescopeBuiltin)[callback[1]], {desc = 'telescope ' .. callback[1]} ) end --[[ LSP settings ]] -- Mappings. See `:help vim.diagnostic.*` for documentation on any of the below functions local Illuminate = require'illuminate' set_keymap('n', 'e', vim.diagnostic.open_float, {silent = true, desc = 'float diagnostic'}) set_keymap('n', '[d', vim.diagnostic.goto_prev, {silent = true, desc = 'previous diagnostic'}) set_keymap('n', ']d', vim.diagnostic.goto_next, {silent = true, desc = 'next diagnositc'}) set_keymap('n', 'q', vim.diagnostic.setloclist, {silent = true, desc = 'add buffer diagnositcs to the location list'}) set_keymap('n', '', function() Illuminate.next_reference({reverse=true, wrap=true}) end, {desc = 'previous references'}) set_keymap('n', '', function() Illuminate.next_reference({wrap=true}) end, {desc = 'next reference'}) -- Use an on_attach function to only map the following keys -- after the language server attaches to the current buffer local on_attach = function(client, bufnr) -- Enable completion triggered by vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') -- Mappings. -- See `:help vim.lsp.*` for documentation on any of the below functions local OPTS = {silent = true, buffer = bufnr} set_keymap('n', 'gD', 'lua vim.lsp.buf.declaration()', OPTS) set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', OPTS) set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', OPTS) set_keymap('n', 'gi', 'lua vim.lsp.buf.implementation()', OPTS) set_keymap('n', '', 'lua vim.lsp.buf.signature_help()', OPTS) set_keymap('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', OPTS) set_keymap('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', OPTS) set_keymap('n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', OPTS) set_keymap('n', 'D', 'lua vim.lsp.buf.type_definition()', OPTS) set_keymap('n', 'rn', 'lua vim.lsp.buf.rename()', OPTS) set_keymap('n', 'ca', 'lua vim.lsp.buf.code_action()', OPTS) set_keymap('n', 'gr', 'lua vim.lsp.buf.references()', OPTS) set_keymap('n', 'lf', 'lua vim.lsp.buf.formatting()', OPTS) -- Highlighting Illuminate.on_attach(client) end local Lspconfig = require'lspconfig' local function setup_lsp(lsp, config) local config2 = {on_attach = on_attach, flags = {debounce_text_changes = 150}} for k, v in pairs(config or {}) do config2[k] = v end Lspconfig[lsp].setup(config2) end for lsp, config in pairs{ pyright = {}, -- pip install --user pyright r_language_server = {}, -- R -e "remotes::install_github('languageservre')" tsserver = {}, bashls = {filetypes = {'sh', 'bash', 'zsh'}}, -- npm i -g bash-language-server sumneko_lua = {}, -- pacman -S lua-language-server } do setup_lsp(lsp, config) end --[[ autocompletion settings ]] -- ddc vim.cmd('source ' .. vim.fn.stdpath('config') .. '/ddc.vim')