diff --git a/.alacritty.toml b/.alacritty.toml index 0cb7724..511d970 100644 --- a/.alacritty.toml +++ b/.alacritty.toml @@ -28,6 +28,32 @@ foreground = "0xe0e0e0" [colors.vi_mode_cursor] cursor = "0x00ff00" +# [colors.primary] +# background = '#2d353b' +# foreground = '#d3c6aa' +# +# # Normal colors +# [colors.normal] +# black = '#475258' +# red = '#e67e80' +# green = '#a7c080' +# yellow = '#dbbc7f' +# blue = '#7fbbb3' +# magenta = '#d699b6' +# cyan = '#83c092' +# white = '#d3c6aa' +# +# # Bright colors +# [colors.bright] +# black = '#475258' +# red = '#e67e80' +# green = '#a7c080' +# yellow = '#dbbc7f' +# blue = '#7fbbb3' +# magenta = '#d699b6' +# cyan = '#83c092' +# white = '#d3c6aa' + [cursor] blink_interval = 470 unfocused_hollow = false diff --git a/dotfiles b/dotfiles new file mode 100644 index 0000000..4c47fab --- /dev/null +++ b/dotfiles @@ -0,0 +1,1022 @@ +----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 = 0 +opt.winblend = 0 +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']") +vim.keymap.set("v", "i", "iW") +vim.keymap.set("o", "i", "iW") +vim.keymap.set("n", "U", "") +vim.keymap.set("i", "", "gUiwgi") +vim.keymap.set("i", "", "guiwgi") +vim.keymap.set("i", "", "bgUlgi") +vim.keymap.set("n", "i", function() + return vim.fn.empty(vim.fn.getline(".")) == 1 and '"_cc' or "i" +end, { expr = true, noremap = true }) +vim.keymap.set("n", "A", function() + return vim.fn.empty(vim.fn.getline(".")) == 1 and '"_cc' or "A" +end, { expr = true, noremap = true }) +vim.keymap.set("n", "", function() + return string.format("move-1-%d=l", vim.v.count1) +end, { expr = true, noremap = true }) +vim.keymap.set("n", "", function() + return string.format("move+%d=l", vim.v.count1) +end, { expr = true, noremap = true }) +vim.keymap.set("v", "", ":move'<-2gv=gv") +vim.keymap.set("v", "", ":move'>+1gv=gv") + +--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", "X", '"_D') +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") +vim.keymap.set("n", "m", "(matchup-%)") + +--COPY +vim.keymap.set("n", "p", "]p") +vim.keymap.set("n", "P", "]P") +vim.keymap.set("v", "p", "P") +vim.keymap.set("v", "y", "mzy`z") +vim.keymap.set("n", "o", "copy.") +vim.keymap.set("n", "O", "copy-1") +vim.keymap.set("v", "o", ":copy'<-1gv") +vim.keymap.set("v", "O", ":copy'>+0gv") + +----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 = "UIEnter" }, + { "nvim-telescope/telescope.nvim", cmd = "Telescope" }, + { + "nvim-telescope/telescope-fzf-native.nvim", + build = "cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build", + cmd = "Telescope", + }, + { "nvim-telescope/telescope-file-browser.nvim", cmd = "Telescope file_browser" }, + { "lewis6991/gitsigns.nvim", config = true, event = "BufReadPre" }, + { "ryanoasis/vim-devicons", event = "UIEnter" }, + { "nvim-tree/nvim-web-devicons", event = "UIEnter" }, + { "williamboman/mason.nvim", event = "BufRead", cmd = { "Mason", "MasonInstall" } }, + { "williamboman/mason-lspconfig.nvim", event = "BufReadPre" }, + { "jay-babu/mason-null-ls.nvim", event = "LspAttach" }, + { "jay-babu/mason-nvim-dap.nvim", event = "LspAttach" }, + { "neovim/nvim-lspconfig", event = "BufReadPre" }, + { "nvimtools/none-ls.nvim", event = "LspAttach" }, + { "mfussenegger/nvim-dap", event = "LspAttach" }, + { "rcarriga/nvim-dap-ui", event = "LspAttach" }, + { "nvim-neotest/nvim-nio", event = "LspAttach" }, + { "theHamsta/nvim-dap-virtual-text", config = true, event = "LspAttach" }, + { "suketa/nvim-dap-ruby", config = true, ft = "ruby" }, + { "leoluz/nvim-dap-go", ft = "go" }, + { "mxsdev/nvim-dap-vscode-js", ft = "javascript" }, + { "nvimdev/lspsaga.nvim", event = "LspAttach" }, + { "Wansmer/treesj", event = "LspAttach" }, + { "is0n/jaq-nvim", event = "LspAttach" }, + { "j-hui/fidget.nvim", config = true, event = "LspAttach" }, + { "sainnhe/edge", event = "VeryLazy" }, + { + "sainnhe/everforest", + event = "VeryLazy", + config = function() + vim.g.everforest_background = 'hard' + end, + }, + { "nvim-lua/plenary.nvim", event = "VeryLazy" }, + { "stevearc/dressing.nvim", event = "VeryLazy" }, + { "hrsh7th/nvim-cmp", event = "VeryLazy" }, + { "hrsh7th/cmp-nvim-lsp", event = "LspAttach" }, + { "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 = "LspAttach" }, + { "hrsh7th/cmp-nvim-lsp-document-symbol", event = "LspAttach" }, + { "onsails/lspkind.nvim", event = "LspAttach" }, + { "hrsh7th/vim-vsnip", event = "InsertEnter" }, + { "hrsh7th/vim-vsnip-integ", event = "InsertEnter" }, + { "rafamadriz/friendly-snippets", event = "InsertEnter" }, + { "zbirenbaum/copilot-cmp", config = true, event = "InsertEnter" }, + { "nvim-treesitter/nvim-treesitter", event = { "BufReadPost", "BufNewFile" } }, + { "nvim-treesitter/nvim-treesitter-refactor", event = "BufRead" }, + { "yioneko/nvim-yati", event = "BufRead" }, + { "windwp/nvim-autopairs", config = true, event = "InsertEnter" }, + { "windwp/nvim-ts-autotag", config = true, event = "InsertEnter" }, + { "HiPhish/rainbow-delimiters.nvim", event = "VeryLazy" }, + { "andymass/vim-matchup", event = "BufRead" }, + { "lambdalisue/suda.vim", cmd = { "SudaWrite", "SudaRead" } }, + { "jghauser/mkdir.nvim", event = "ModeChanged" }, + { "shellRaining/hlchunk.nvim", config = true, event = "BufReadPost" }, + { "kevinhwang91/nvim-hlslens", event = "VeryLazy" }, + { "akinsho/git-conflict.nvim", version = "*", config = true, cmd = "GitConflictListQf" }, + { "numToStr/Comment.nvim", config = true, event = "VeryLazy" }, + { "rhysd/clever-f.vim", keys = { "f", "F", "t", "T" } }, + { "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" }, + { "kevinhwang91/nvim-bqf", ft = "qf" }, + { "vim-jp/vimdoc-ja", ft = "help" }, + { "zbirenbaum/copilot.lua", cmd = "Copilot" }, + { "CopilotC-Nvim/CopilotChat.nvim", build = "make tiktoken" }, + + --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", 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 = { + preview = { + treesitter = false, + }, + borderchars = { "─", "│", "─", "│", "┌", "┐", "┘", "└" }, + color_devicons = true, + file_ignore_patterns = { "node_modules", ".git", ".cache", ".svg", ".npm", "go" }, + mappings = { + i = { + [""] = require("telescope.actions").close, + }, + }, + }, + + vimgrep_arguments = { + "rg", + "--color=never", + "--no-heading", + "--smart-case", + "-uu", + }, + + extensions = { + fzf = { + fuzzy = true, + override_generic_sorter = true, + override_file_sorter = true, + case_mode = "smart_case", + }, + }, +}) + +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", "b", "Telescope buffers") +vim.keymap.set("n", "h", "Telescope help_tags") +vim.keymap.set("n", "y", "Telescope registers") +vim.keymap.set("n", "n", "Telescope lsp_references") +vim.keymap.set("n", "j", "Telescope diagnostics") +vim.keymap.set("n", "s", "Telescope lsp_document_symbols") +vim.keymap.set("n", "f", "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 +require("lspsaga").setup({ + symbol_in_winbar = { + enable = true, + }, + ui = { + border = "single", + title = false, + }, + lightbulb = { + enable = false, + }, + diagnostic = { + diagnostic_only_current = false, + }, +}) + +local on_attach = function(client, bufnr) + client.server_capabilities.documentFormattingProvider = false + local set = vim.keymap.set + set("n", "K", "Lspsaga hover_doc") + set("n", "r", "Lspsaga rename") + set("n", "c", "Lspsaga code_action") + set("n", "e", "Lspsaga show_line_diagnostics") + set("n", "[", "Lspsaga diagnostic_jump_prev") + set("n", "]", "Lspsaga diagnostic_jump_next") +end +vim.diagnostic.config({ virtual_text = false }) +local capabilities = vim.lsp.protocol.make_client_capabilities() +capabilities.textDocument.completion.completionItem.snippetSupport = true +require("mason").setup() +require("mason-null-ls").setup({ + ensure_installed = { "prettierd", "rubocop", "stylua", "shfmt" }, + handlers = {}, +}) +require("mason-nvim-dap").setup({ + ensure_installed = {}, + 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() +vim.keymap.set("n", "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", "1", ":lua require'dap'.continue()", { silent = true }) +map("n", "2", ":lua require'dap'.step_over()", { silent = true }) +map("n", "3", ":lua require'dap'.step_into()", { silent = true }) +map("n", "4", ":lua require'dap'.step_out()", { silent = true }) +map("n", ";", ":lua require'dap'.toggle_breakpoint()", { silent = true }) +map("n", "'", ":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 = { + sh = "sh %", + ruby = "ruby %", + go = "go run %", + javascript = "node %", + }, + }, + + 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", "x", ":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 = "none", + }), + documentation = cmp.config.window.bordered({ + border = "none", + }), + }, + + 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 = "...", + symbol_map = { Copilot = "" }, + }), + }, + + sources = cmp.config.sources({ + { name = "nvim_lsp", max_item_count = 15, keyword_length = 2 }, + { name = "vsnip", max_item_count = 15, keyword_length = 2 }, + { name = "copilot", max_item_count = 15, keyword_length = 2 }, + { name = "nvim_lsp_signature_help" }, + { name = "buffer", max_item_count = 15, 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 = {}") + +local has_words_before = function() + if vim.api.nvim_buf_get_option(0, "buftype") == "prompt" then + return false + end + local line, col = unpack(vim.api.nvim_win_get_cursor(0)) + return col ~= 0 and vim.api.nvim_buf_get_text(0, line - 1, 0, line - 1, col, {})[1]:match("^%s*$") == nil +end +cmp.setup({ + mapping = { + [""] = vim.schedule_wrap(function(fallback) + if cmp.visible() and has_words_before() then + cmp.select_next_item({ behavior = cmp.SelectBehavior.Select }) + else + fallback() + end + end), + }, +}) + +--nvim-treesitter +require("nvim-treesitter.configs").setup({ + highlight = { + enable = true, + disable = { "help", "markdown", "toml" }, + }, + refactor = { + highlight_defintions = { + enable = true, + }, + }, + indent = { + enable = true, + }, + yati = { + enable = false, + }, + matchup = { + enable = true, + enable_quotes = true, + }, + ensure_installed = "all", +}) + +--nvim-ts-autotag +require("nvim-ts-autotag").setup() +vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, { + underline = true, + update_in_insert = true, +}) + +--treesj +local tsj = require("treesj") +tsj.setup({ + use_default_keymaps = false, +}) +vim.keymap.set("n", "z", require("treesj").toggle) + +--rainbow-delimiters +require("rainbow-delimiters.setup").setup() + +--hlchunk +require("hlchunk").setup({ + chunk = { + enable = true, + }, + indent = { + enable = true, + }, +}) + +--nvim-bqf +require("bqf").setup({ + preview = { + border = "single", + }, +}) + +vim.keymap.set("n", "5", [[:vimgrep /\w\+/j % | copen]], { noremap = true, silent = true }) + +--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-highlight-colors +require("nvim-highlight-colors").setup({ + render = "background", + enable_named_colors = false, + enable_tailwind = true, +}) + +--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, + }, +}) + +--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") + +--copilot +local select = require("CopilotChat.select") + +require("copilot").setup({ + suggestion = { enabled = false }, + panel = { enabled = false }, + filetypes = { + markdown = false, + text = false, + }, +}) + +require("CopilotChat").setup({ + debug = true, + + window = { + layout = "float", + relative = "editor", + }, + prompts = { + Explain = { + prompt = "/COPILOT_EXPLAIN 選択されたコードの説明を段落をつけて書いてください。", + }, + Review = { + prompt = "/COPILOT_REVIEW 選択されたコードをレビューしてください。", + callback = function(response, source) end, + }, + Fix = { + prompt = "/COPILOT_FIX このコードには問題があります。バグを修正したコードに書き直してください。", + }, + Optimize = { + prompt = "/COPILOT_REFACTOR 選択されたコードを最適化してパフォーマンスと可読性を向上させてください。", + }, + Docs = { + prompt = "/COPILOT_DOCS 選択されたコードに対してドキュメンテーションコメントを追加してください。", + }, + Tests = { + prompt = "/COPILOT_TESTS 選択されたコードの詳細な単体テスト関数を書いてください。", + }, + FixDiagnostic = { + prompt = "ファイル内の次のような診断上の問題を解決してください:", + selection = select.diagnostics, + }, + }, +}) + +function CopilotChatBuffer() + local input = vim.fn.input("Quick Chat: ") + if input ~= "" then + require("CopilotChat").ask(input, { selection = require("CopilotChat.select").buffer }) + end +end + +vim.api.nvim_set_keymap("n", "9", "lua CopilotChatBuffer()", { noremap = true, silent = true }) + +function ShowCopilotChatActionPrompt() + local actions = require("CopilotChat.actions") + require("CopilotChat.integrations.telescope").pick(actions.prompt_actions()) +end + +vim.api.nvim_set_keymap( + "n", + "0", + "lua ShowCopilotChatActionPrompt()", + { noremap = true, silent = true } +) + +--OTHER SETTINGS +vim.cmd("colorscheme edge") diff --git a/init.lua b/init.lua index 5384349..4c47fab 100644 --- a/init.lua +++ b/init.lua @@ -188,6 +188,13 @@ require("lazy").setup({ { "is0n/jaq-nvim", event = "LspAttach" }, { "j-hui/fidget.nvim", config = true, event = "LspAttach" }, { "sainnhe/edge", event = "VeryLazy" }, + { + "sainnhe/everforest", + event = "VeryLazy", + config = function() + vim.g.everforest_background = 'hard' + end, + }, { "nvim-lua/plenary.nvim", event = "VeryLazy" }, { "stevearc/dressing.nvim", event = "VeryLazy" }, { "hrsh7th/nvim-cmp", event = "VeryLazy" },