----GENERAL SETTINGS local opt = vim.opt vim.g.mapleader = ' ' opt.helplang = 'ja', 'en' opt.tabstop = 2 opt.shiftwidth = 2 opt.expandtab = true opt.list = true opt.listchars = {tab='»-', trail='-', eol='↲', extends='»', precedes='«', nbsp='%'} opt.wrap = true opt.signcolumn = 'yes' opt.smartcase = true opt.ignorecase = true opt.wrapscan = true opt.hidden = true opt.startofline = false opt.showmatch = true opt.matchtime = 1 opt.guicursor = '' opt.cursorline = true opt.wildmenu = true opt.number = true opt.showcmd = true opt.autoread = true opt.hlsearch = true opt.backspace:append{'indent', 'eol', 'start'} opt.showtabline = 1 opt.laststatus = 3 opt.ambiwidth = 'single' opt.confirm = true opt.pumblend = 15 opt.winblend = 15 opt.mouse = 'a' opt.cmdheight = 2 opt.timeout = true opt.ttimeout = true opt.ttimeoutlen = 10 opt.clipboard:append{'unnamedplus'} opt.termguicolors = true opt.showmode = false opt.completeopt:append{'menuone', 'noinsert'} opt.backup = false opt.swapfile = false opt.encoding = 'utf-8' opt.fileencodings = {'utf-8', 'iso-2022-jp', 'cp932', 'euc-jp', 'sjis'} vim.opt.shortmess:append('I') vim.cmd('set completeopt-=preview') ----ADVANCED SETTINGS --KEEP CURSOR vim.api.nvim_create_autocmd({ 'BufReadPost' }, { pattern = { '*' }, callback = function() vim.api.nvim_exec('silent! normal! g`"zv', false) end, }) ----KEY MAPPING --EDIT vim.keymap.set('n', 'ew', ':w') vim.keymap.set('n', 'eq', ':wq') vim.keymap.set('n', 'Q', ':quit!') vim.keymap.set('n', 'q', ':bd') vim.keymap.set('n', '', ':%s///cg') vim.keymap.set('n', '', ":echo wordcount()['chars']") --TAB vim.keymap.set('n', '', ':bprev', {silent = true}) vim.keymap.set('n', 't', ':tabclose', {silent = true}) vim.keymap.set('n', ']b', ':bnext', {silent =true}) --SPLIT vim.keymap.set('n', 'sv', ':vsplit', {silent = true}) vim.keymap.set('n', 'sp', ':split', {silent =true}) --NOP vim.keymap.set('n', '', '') vim.keymap.set('n', '<2-MiddleMouse>', '') vim.keymap.set('n', '<3-MiddleMouse>', '') vim.keymap.set('n', '<4-MiddleMouse>', '') vim.keymap.set('i', '<1-MiddleMouse>', '') vim.keymap.set('i', '<2-MiddleMouse>', '') vim.keymap.set('i', '<3-MiddleMouse>', '') vim.keymap.set('i', '<4-MiddleMouse>', '') vim.keymap.set('n', 'qq', '') vim.keymap.set('v', 'qq', '') vim.keymap.set('n', 'ZZ', '') vim.keymap.set('n', 'ZQ', '') vim.keymap.set('n', '', '') vim.keymap.set('n', '', '') vim.keymap.set('n', 'x', '"_x') vim.keymap.set('v', 'x', '"_x') vim.keymap.set('n', 's', '"_s') --MOVE vim.keymap.set('n', 'k', 'gk') vim.keymap.set('n', 'j', 'gj') vim.keymap.set('n', '', 'gk') vim.keymap.set('n', '', 'gj') vim.keymap.set('n', 'O', ":call append(expand('.'), '')j") vim.keymap.set('n', 'sh', 'h') vim.keymap.set('n', 'sj', 'j') vim.keymap.set('n', 'sk', 'k') vim.keymap.set('n', 'sl', 'l') vim.keymap.set('n', 'sH', 'H') vim.keymap.set('n', 'sJ', 'J') vim.keymap.set('n', 'sK', 'K') vim.keymap.set('n', 'sL', 'L') --COPY vim.keymap.set('n', 'p', ']p') vim.keymap.set('n', 'P', ']P') vim.keymap.set('n', ']p', 'p') vim.keymap.set('n', ']P', 'P') ----PLUGINS --MANAGER local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim' if not vim.loop.fs_stat(lazypath) then vim.fn.system({ 'git', 'clone', '--filter=blob:none', 'https://github.com/folke/lazy.nvim.git', '--branch=stable', lazypath, }) end vim.opt.rtp:prepend(lazypath) require('lazy').setup({ defaults = {lazy = true}, {'nvim-lualine/lualine.nvim', event = 'VeryLazy'}, {'nvim-telescope/telescope.nvim', cmd = 'Telescope'}, {'nvim-telescope/telescope-file-browser.nvim', event = 'VeryLazy'}, {'lewis6991/gitsigns.nvim', config = true, event = 'VeryLazy'}, {'ryanoasis/vim-devicons', event = 'VeryLazy'}, {'nvim-tree/nvim-web-devicons', event = 'VeryLazy'}, {'williamboman/mason.nvim', event = 'BufRead', cmd = {'Mason', 'MasonInstall'}, }, {'neovim/nvim-lspconfig', event = 'LspAttach'}, {'williamboman/mason-lspconfig.nvim', event = 'LspAttach'}, {'jay-babu/mason-null-ls.nvim', event = 'LspAttach'}, {'nvimtools/none-ls.nvim', event = 'LspAttach'}, {'mfussenegger/nvim-dap', event = 'LspAttach'}, {'rcarriga/nvim-dap-ui', event = 'LspAttach'}, {'suketa/nvim-dap-ruby', config = true, event = 'LspAttach'}, {'is0n/jaq-nvim', event = 'LspAttach'}, {'j-hui/fidget.nvim', config = true, event = 'LspAttach'}, {'sainnhe/edge', event = 'VeryLazy'}, {'nvim-lua/plenary.nvim', event = 'VeryLazy'}, {'stevearc/dressing.nvim', event = 'VeryLazy'}, {'hrsh7th/nvim-cmp', event = 'VeryLazy'}, {'hrsh7th/cmp-nvim-lsp', event = 'InsertEnter'}, {'hrsh7th/cmp-buffer', event = 'InsertEnter'}, {'hrsh7th/cmp-path', event = 'InsertEnter'}, {'hrsh7th/cmp-vsnip', event = 'InsertEnter'}, {'hrsh7th/cmp-cmdline', event = 'ModeChanged'}, {'hrsh7th/cmp-nvim-lsp-signature-help', event = 'InsertEnter'}, {'hrsh7th/cmp-nvim-lsp-document-symbol', event = 'InsertEnter'}, {'hrsh7th/cmp-calc', event = 'InsertEnter'}, {'onsails/lspkind.nvim', event = 'InsertEnter'}, {'hrsh7th/vim-vsnip', event = 'InsertEnter'}, {'hrsh7th/vim-vsnip-integ', event = 'InsertEnter'}, {'rafamadriz/friendly-snippets', event = 'InsertEnter'}, {'nvim-treesitter/nvim-treesitter', event = 'VeryLazy'}, {'yioneko/nvim-yati', event = 'VeryLazy'}, {'windwp/nvim-autopairs', config = true, event = 'InsertEnter'}, {'andymass/vim-matchup', event = 'VeryLazy'}, {'Maan2003/lsp_lines.nvim', config = true, event = 'VeryLazy'}, {'lambdalisue/suda.vim', cmd = {'SudaWrite', 'SudaRead'},}, {'lukas-reineke/indent-blankline.nvim', main = 'ibl', opts = {}, event = 'VeryLazy'}, {'kevinhwang91/nvim-hlslens', event = 'VeryLazy'}, {'numToStr/Comment.nvim', config = true, event = 'VeryLazy'}, {'rhysd/clever-f.vim', event = 'VeryLazy'}, {'luochen1990/rainbow', event = 'VeryLazy'}, {'echasnovski/mini.surround', event = 'ModeChanged'}, {'echasnovski/mini.ai', event = 'ModeChanged'}, {'mvllow/modes.nvim', event = 'VeryLazy'}, {'monaqa/dial.nvim', event = 'VeryLazy'}, {'tpope/vim-repeat', event = 'VeryLazy'}, {'nvim-zh/colorful-winsep.nvim', config = true, event = 'WinNew'}, {'vim-jp/vimdoc-ja', ft = 'help'}, --non-lazy {'vim-denops/denops.vim', lazy = false}, {'yuki-yano/fuzzy-motion.vim', lazy = false}, {'lambdalisue/gin.vim', lazy = false}, {'rbtnn/vim-ambiwidth', lazy = false}, {'lambdalisue/kensaku-search.vim', lazy = false}, {'lambdalisue/kensaku.vim', lazy = false}, {'brenoprata10/nvim-highlight-colors', config = true, lazy = false}, --disable default plugins performance = { rtp = { disable_plugins = { 'netrw', 'netrwPlugin', 'netrwSettings', 'netrwFileHandlers', 'gzip', 'zip', 'zipPlugin', 'tar', 'tarPlugin', 'getscript', 'getscriptPlugin', 'vimball', 'vimballPlugin', '2html_plugin', 'logipat', 'rrhelper', 'spellfile_plugin', 'sql_completion', }, }, }, }) --lualine require('lualine').setup { options = { icons_enabled = true, component_separators = { left = '', right = ''}, section_separators = { left = '', right = ''}, disabled_filetypes = {'TelescopePrompt'}, always_divide_middle = true, colored = false, globalstatus = true, }, sections = { lualine_a = {''}, lualine_b = {'branch', 'diff'}, lualine_c = { { 'filename', path = 1, file_status = true, shorting_target = 40, symbols = { modified = '[+]', readonly = '[RO]', unnamed = 'Untitled', } } }, lualine_x = {'filetype'}, lualine_y = { { 'diagnostics', source = {'nvim-lsp'}, }, {'progress'}, {'location'} }, lualine_z = {''} }, inactive_sections = { lualine_a = {}, lualine_b = {}, lualine_c = {'filename'}, lualine_x = {'location'}, lualine_y = {}, lualine_z = {} }, tabline = {}, extensions = {} } --telescope require('telescope').setup({ defaults = { borderchars = { '─', '│', '─', '│', '┌', '┐', '┘', '└' }, color_devicons = true, file_ignore_patterns = { 'node_modules', '.git', '.svg', '.npm', 'go' }, mappings = { i = { [''] = require('telescope.actions').close, }, }, }, }) vim.keymap.set('n', '.', 'Telescope find_files hidden=true') vim.keymap.set('n', ',', 'Telescope oldfiles') vim.keymap.set('n', 'l', 'Telescope live_grep grep_open_files=true') vim.keymap.set('n', 'k', 'Telescope live_grep') vim.keymap.set('n', 'f', 'Telescope buffers') vim.keymap.set('n', 'h', 'Telescope help_tags') vim.keymap.set('n', 'y', 'Telescope registers') vim.keymap.set('n', 'gd', 'Telescope lsp_definitions') vim.keymap.set('n', 'gr', 'Telescope lsp_references') vim.keymap.set('n', 'gi', 'Telescope lsp_implementations') vim.keymap.set('n', 'gx', 'Telescope diagnostics') vim.keymap.set('n', 'e', 'Telescope file_browser') local fb_actions = require 'telescope'.extensions.file_browser.actions local previewers = require('telescope.previewers') local Job = require('plenary.job') local new_maker = function(filepath, bufnr, opts) filepath = vim.fn.expand(filepath) Job:new({ command = 'file', args = { '--mime-type', '-b', filepath }, on_exit = function(j) local mime_type = vim.split(j:result()[1], '/')[1] if mime_type == 'text' then previewers.buffer_previewer_maker(filepath, bufnr, opts) else vim.schedule(function() vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, { 'BINARY' }) end) end end }):sync() end --LSP local on_attach = function(client, bufnr) client.server_capabilities.documentFormattingProvider = false local set = vim.keymap.set set('n', 'K', 'lua vim.lsp.buf.hover()') set('n', '1', 'lua vim.lsp.buf.signature_help()') set('n', '2', 'lua vim.lsp.buf.rename()') set('n', '3', 'lua vim.lsp.buf.code_action()') set('n', '[', 'lua vim.lsp.diagnostic.goto_prev()') set('n', ']', 'lua vim.lsp.diagnostic.goto_next()') set('n', '4', 'lua vim.lsp.buf.format {async = true}') end vim.lsp.handlers['textDocument/publishDiagnostics'] = vim.lsp.with( vim.lsp.diagnostic.on_publish_diagnostics, { virtual_text = false }) require('mason').setup() require("mason-null-ls").setup({ ensure_installed = { 'prettierd', 'rubocop', 'black', 'goimports' }, handlers = {}, }) require('mason-lspconfig').setup() require('mason-lspconfig').setup_handlers { function(server_name) require('lspconfig')[server_name].setup { on_attach = on_attach, capabilities = capabilities, } end } --none-ls local status, null_ls = pcall(require, 'null-ls') if (not status) then return end null_ls.setup({ sources = { null_ls.builtins.formatting.prettierd, null_ls.builtins.diagnostics.rubocop, null_ls.builtins.formatting.rubocop, null_ls.builtins.formatting.black, null_ls.builtins.formatting.goimports, }, debug = false, }) vim.keymap.set('n', 'p', function() vim.lsp.buf.format { async = true } end) vim.keymap.set('v', 'p', function() vim.lsp.buf.format { async = true } end) --DAP local function map(mode, lhs, rhs, opts) local options = {noremap = true} if opts then options = vim.tbl_extend('force', options, opts) end vim.api.nvim_set_keymap(mode, lhs, rhs, options) end map("n", "5", ":lua require'dap'.continue()", { silent = true}) map("n", "6", ":lua require'dap'.step_over()", { silent = true}) map("n", "7", ":lua require'dap'.step_into()", { silent = true}) map("n", "8", ":lua require'dap'.step_out()", { silent = true}) map("n", "b", ":lua require'dap'.toggle_breakpoint()", { silent = true}) map("n", "c", ":lua require'dap'.set_breakpoint(vim.fn.input('Breakpoint condition: '))", { silent = true}) map("n", "i", ":lua require'dap'.set_breakpoint(nil, nil, vim.fn.input('Log point message: '))", { silent = true}) map("n", "d", ":lua require'dapui'.toggle()", { silent = true}) map("n", "d", ":lua require'dapui'.eval()", { silent = true}) ---DAP-UI require('dapui').setup({ icons = { expanded = '▾', collapsed = '▸', current_frame = '▸' }, mappings = { expand = { '', '<2-LeftMouse>' }, open = 'o', remove = 'd', edit = 'e', repl = 'r', toggle = 't', }, expand_lines = vim.fn.has('nvim-0.7') == 1, layouts = { { elements = { { id = 'scopes', size = 0.25 }, 'breakpoints', 'stacks', 'watches', }, size = 40, position = 'left', }, { elements = { 'repl', }, size = 0.25, position = 'bottom', }, }, controls = { enabled = true, element = 'repl', icons = { pause = '', play = '', step_into = '', step_over = '', step_out = '', step_back = '', run_last = '↻', terminate = '□', }, }, floating = { max_height = nil, max_width = nil, border = 'single', mappings = { close = { 'q', '' }, }, }, windows = { indent = 1 }, render = { max_type_length = nil, max_value_lines = 100, } }) ---jaq-nvim require('jaq-nvim').setup{ cmds = { internal = { lua = 'luafile %', vim = 'source %' }, external = { markdown = 'glow %', python = 'python3 %', go = 'go run %', sh = 'sh %', ruby = 'ruby %', java = 'java %', } }, behavior = { default = 'float', startinsert = false, wincmd = false, autosave = false }, ui = { float = { border = 'none', winhl = 'Normal', borderhl = 'FloatBorder', winblend = 0, height = 0.8, width = 0.8, x = 0.5, y = 0.5 }, terminal = { position = 'bot', size = 10, line_no = false }, quickfix = { position = 'bot', size = 10 } } } vim.keymap.set('n', 'j', ':Jaq', { silent = true}) --nvim-cmp local cmp = require('cmp') local lspkind = require('lspkind') cmp.setup({ snippet = { expand = function(args) vim.fn['vsnip#anonymous'](args.body) end }, window = { completion = cmp.config.window.bordered({ border = 'single' }), documentation = cmp.config.window.bordered({ border = 'single' }), }, mapping = cmp.mapping.preset.insert({ [''] = cmp.mapping.select_next_item(), [''] = cmp.mapping.select_prev_item(), [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete(), [''] = cmp.mapping.abort(), [''] = cmp.mapping.confirm({ select = true }), }), formatting = { format = lspkind.cmp_format({ mode = 'symbol', maxwidth = 50, ellipsis_char = '...', }) }, sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'vsnip' }, { name = 'nvim_lsp_signature_help' }, { name = 'calc' }, }, { { name = 'buffer', keyword_length = 2 }, }) }) cmp.setup.cmdline({ '/', '?' }, { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'nvim_lsp_document_symbol' } }, { { name = 'buffer' } }) }) cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline', keyword_length = 2 } }) }) local capabilities = require('cmp_nvim_lsp').default_capabilities() vim.cmd('let g:vsnip_filetypes = {}') --nvim-treesitter require'nvim-treesitter.configs'.setup { highlight = { enable = true, disable = {'help', 'markdown', 'toml'}, }, refactor = { highlight_defintions = { enable = true, }, }, yati = { enable = true, }, matchup = { enable = true, enable_quotes = true, }, ensure_installed = 'all' } --dressing require('dressing').setup({ input = { border = 'single', }, builtin = { border = 'single', }, }) --modes require('modes').setup({ colors = { copy = '#FFEE55', delete = '#DC669B', insert = '#55AAEE', visual = '#DD5522', }, }) --colorful-winsep require('colorful-winsep').setup({ highlight = { bg = '', fg = '#E8AEAA', }, }) --nvim-hlslens require('hlslens').setup() local kopts = {noremap = true, silent = true} vim.keymap.set('n', 'n', [[execute('normal! ' . v:count1 . 'n')lua require('hlslens').start()]], kopts) vim.keymap.set('n', 'N', [[execute('normal! ' . v:count1 . 'N')lua require('hlslens').start()]], kopts) vim.keymap.set('n', '*', [[*lua require('hlslens').start()]], kopts) vim.keymap.set('n', '#', [[#lua require('hlslens').start()]], kopts) vim.keymap.set('n', 'g*', [[g*lua require('hlslens').start()]], kopts) vim.keymap.set('n', 'g#', [[g#lua require('hlslens').start()]], kopts) vim.keymap.set('n', '', ':nohl', kopts) --fuzzy-motion vim.keymap.set('n', 'S', 'FuzzyMotion') vim.cmd("let g:fuzzy_motion_matchers = ['kensaku', 'fzf']") --kensaku-search vim.keymap.set('c', '', '(kensaku-search-replace)') --clever-f vim.cmd('let g:clever_f_across_no_line = 1') vim.cmd('let g:clever_f_ignore_case = 1') vim.cmd('let g:clever_f_smart_case = 1') vim.cmd("let g:clever_f_chars_match_any_signs = ';'") vim.cmd('let g:clever_f_use_migemo = 1') --mini.surround require('mini.surround').setup({ mappings = { highlight = 'sx', }, custom_surroundings = { ['{'] = { input = { '%b{}', '^.().*().$' }, output = { left = '{', right = '}' }, }, ['}'] = { input = { '%b{}', '^.%{().*()%}.$' }, output = { left = '{{', right = '}}' }, }, ['('] = { input = { '%b()', '^.().*().$' }, output = { left = '(', right = ')' }, }, [')'] = { input = { '%b()', '^.%(().*()%).$' }, output = { left = '((', right = '))' }, }, ['['] = { input = { '%b[]', '^.().*().$' }, output = { left = '[', right = ']' }, }, [']'] = { input = { '%b[]', '^.%[().*()%].$' }, output = { left = '[[', right = ']]' }, }, ['<'] = { input = { '%b<>', '^.().*().$' }, output = { left = '<', right = '>' }, }, ['>'] = { input = { '%b[]', '^.<().*()>.$' }, output = { left = '<<', right = '>>' }, }, ['j'] = { input = function() local ok, val = pcall(vim.fn.getchar) if not ok then return end local char = vim.fn.nr2char(val) local dict = { ['('] = { '(().-())' }, ['{'] = { '{().-()}' }, ['['] = { '「().-()」' }, [']'] = { '『().-()』' }, ['<'] = { '<().-()>' }, ['"'] = { '”().-()”' }, } if char == 'b' then local ret = {} for _, v in pairs(dict) do table.insert(ret, v) end return { ret } end if dict[char] then return dict[char] end error('%s is unsupported surroundings in Japanese') end, output = function() local ok, val = pcall(vim.fn.getchar) if not ok then return end local char = vim.fn.nr2char(val) local dict = { ['('] = { left = '(', right = ')' }, ['{'] = { left = '{', right = '}' }, ['['] = { left = '「', right = '」' }, [']'] = { left = '『', right = '』' }, ['<'] = { left = '<', right = '>' }, ['"'] = { left = '”', right = '”' }, } if not dict[char] then error('%s is unsupported surroundings in Japanese') end return dict[char] end } }, }) --mini.ai require('mini.ai').setup({ custom_textobjects = { ['{'] = { '%b{}', '^.().*().$' }, ['}'] = { '%b{}', '^.%{().*()%}.$' }, ['('] = { '%b()', '^.().*().$' }, [')'] = { '%b()', '^.%(().*()%).$' }, ['['] = { '%b[]', '^.().*().$' }, [']'] = { '%b[]', '^.%[().*()%].$' }, [''] = { '%b<', '^.().*().$' }, ['>'] = { '%b', '^.().*().$' }, ['j'] = function() local ok, val = pcall(vim.fn.getchar) if not ok then return end local char = vim.fn.nr2char(val) local dict = { ['('] = { '(().-())' }, ['{'] = { '{().-()}' }, ['['] = { '「().-()」' }, [']'] = { '『().-()』' }, ['<'] = { '<().-()>' }, ['"'] = { '”().-()”' }, } if char == 'b' then local ret = {} for _, v in pairs(dict) do table.insert(ret, v) end return { ret } end if dict[char] then return dict[char] end error('%s is unsupported textobjects in Japanese') end } }) --rainbow vim.cmd('let g:rainbow_active = 1') vim.cmd("let g:indent_guides_exclude_filetypes = ['help']") --dial vim.keymap.set('n', '', require('dial.map').inc_normal(), {noremap = true}) vim.keymap.set('n', '', require('dial.map').dec_normal(), {noremap = true}) vim.keymap.set('v', '', require('dial.map').inc_visual(), {noremap = true}) vim.keymap.set('v', '', require('dial.map').dec_visual(), {noremap = true}) vim.keymap.set('v', 'g', require('dial.map').inc_gvisual(), {noremap = true}) vim.keymap.set('v', 'g', require('dial.map').dec_gvisual(), {noremap = true}) --gin vim.keymap.set('n', 'gs', ':GitStatus', {silent = true}) vim.keymap.set('n', 'ga', ':Gin add .', {silent = true}) vim.keymap.set('n', 'gc', ":Gin commit -m ") vim.keymap.set('n', 'gp', ':Gin push') --OTHER SETTINGS vim.cmd('colorscheme edge')