regular backup
- feat(home-manager): mount Dropbox on startup - feat(nvim): switch to nvim-lsp
This commit is contained in:
parent
88c8e77031
commit
11e10c3292
65
.vimrc
65
.vimrc
|
@ -105,12 +105,12 @@ endif
|
|||
Plug 'wakatime/vim-wakatime'
|
||||
Plug 'tpope/vim-surround'
|
||||
Plug 'tpope/vim-commentary'
|
||||
Plug 'arielherself/vim-lsp'
|
||||
Plug 'prabirshrestha/asyncomplete.vim'
|
||||
Plug 'prabirshrestha/asyncomplete-lsp.vim'
|
||||
" Plug 'arielherself/vim-lsp'
|
||||
" Plug 'prabirshrestha/asyncomplete.vim'
|
||||
" Plug 'prabirshrestha/asyncomplete-lsp.vim'
|
||||
" Plug 'Shougo/ddc.vim'
|
||||
" Plug 'shun/ddc-vim-lsp'
|
||||
Plug 'mattn/vim-lsp-settings'
|
||||
" Plug 'mattn/vim-lsp-settings'
|
||||
Plug 'jdhao/better-escape.vim'
|
||||
Plug 'jiangmiao/auto-pairs'
|
||||
Plug 'easymotion/vim-easymotion'
|
||||
|
@ -121,18 +121,45 @@ Plug 'ryanoasis/vim-devicons'
|
|||
" this plugin slows vim down when dealing
|
||||
" with large files, so I switch to the Nvim version
|
||||
" Plug 'airblade/vim-gitgutter'
|
||||
if has('nvim')
|
||||
Plug 'lewis6991/gitsigns.nvim'
|
||||
endif
|
||||
Plug 'tpope/vim-fugitive'
|
||||
Plug 'Yggdroot/indentLine'
|
||||
Plug '907th/vim-auto-save'
|
||||
Plug 'markonm/traces.vim'
|
||||
Plug 'stevearc/oil.nvim'
|
||||
Plug 'vim-scripts/LargeFile'
|
||||
Plug 'lambdalisue/vim-fern'
|
||||
Plug 'lambdalisue/vim-fern-git-status'
|
||||
Plug 'lambdalisue/vim-fern-renderer-nerdfont'
|
||||
Plug 'lambdalisue/nerdfont.vim'
|
||||
|
||||
" Use Neovim LSP
|
||||
Plug 'neovim/nvim-lspconfig'
|
||||
Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'}
|
||||
Plug 'hrsh7th/nvim-cmp'
|
||||
Plug 'hrsh7th/cmp-nvim-lsp'
|
||||
Plug 'hrsh7th/cmp-buffer'
|
||||
Plug 'hrsh7th/cmp-path'
|
||||
Plug 'hrsh7th/cmp-cmdline'
|
||||
Plug 'saadparwaiz1/cmp_luasnip'
|
||||
Plug 'L3MON4D3/LuaSnip'
|
||||
Plug 'hrsh7th/cmp-emoji'
|
||||
Plug 'chrisgrieser/cmp-nerdfont'
|
||||
Plug 'hrsh7th/cmp-calc'
|
||||
Plug 'arielherself/lspkind.nvim'
|
||||
Plug 'nvim-tree/nvim-web-devicons'
|
||||
Plug 'folke/trouble.nvim'
|
||||
Plug 'kevinhwang91/nvim-ufo'
|
||||
Plug 'kevinhwang91/promise-async'
|
||||
Plug 'rmagatti/goto-preview'
|
||||
|
||||
call plug#end()
|
||||
|
||||
" Why?!
|
||||
set noshowmode
|
||||
set showcmd
|
||||
|
||||
|
||||
" Color scheme
|
||||
set background=dark
|
||||
let g:embark_terminal_italics = 1
|
||||
|
@ -209,14 +236,15 @@ nnoremap <leader>w <Plug>(easymotion-bd-w)
|
|||
vnoremap <leader>w <Plug>(easymotion-bd-w)
|
||||
nnoremap <leader>o <Cmd>Files<CR>
|
||||
nnoremap <leader>g <Cmd>Rg<CR>
|
||||
nnoremap gpd <Cmd>LspPeekDefinition<CR>
|
||||
nnoremap gd <Cmd>LspDefinition<CR>
|
||||
nnoremap <leader>dd <Cmd>LspDocumentDiagnostics<CR>
|
||||
nnoremap <leader>dn <Cmd>LspNextDiagnostic<CR>
|
||||
nnoremap <leader>dp <Cmd>LspPreviousDiagnostic<CR>
|
||||
nnoremap grr <Cmd>LspRename<CR>
|
||||
nnoremap <leader>a <Cmd>LspCodeAction<CR>
|
||||
nnoremap K <Cmd>LspHover<CR>
|
||||
nnoremap <leader>. <Cmd>Fern . -drawer<CR>
|
||||
" nnoremap gpd <Cmd>LspPeekDefinition<CR>
|
||||
" nnoremap gd <Cmd>LspDefinition<CR>
|
||||
" nnoremap <leader>dd <Cmd>LspDocumentDiagnostics<CR>
|
||||
" nnoremap <leader>dn <Cmd>LspNextDiagnostic<CR>
|
||||
" nnoremap <leader>dp <Cmd>LspPreviousDiagnostic<CR>
|
||||
" nnoremap grr <Cmd>LspRename<CR>
|
||||
" nnoremap <leader>a <Cmd>LspCodeAction<CR>
|
||||
" nnoremap K <Cmd>LspHover<CR>
|
||||
nnoremap Q q
|
||||
nnoremap q <Nop>
|
||||
inoremap <C-e> {<ESC>A}<ESC>%li<CR><ESC>$i<CR><ESC>k^i
|
||||
|
@ -333,10 +361,17 @@ highlight VertSplit guifg=#585273
|
|||
|
||||
" airline styling
|
||||
" ref: https://github.com/vim-airline/vim-airline/issues/323#issuecomment-27336312
|
||||
if !exists('g:airline_symbols')
|
||||
let g:airline_symbols = {}
|
||||
endif
|
||||
let g:airline_left_sep = ''
|
||||
let g:airline_left_alt_sep = ''
|
||||
let g:airline_right_sep = ''
|
||||
let g:airline_right_alt_sep = ''
|
||||
let g:airline_symbols.notexists = ' '
|
||||
let g:airline_symbols.dirty = ' '
|
||||
|
||||
let g:fern#renderer = "nerdfont"
|
||||
|
||||
if has('nvim')
|
||||
lua require('local-highlight').setup { cw_hlgroup = 'LspReferenceText' }
|
||||
|
@ -347,5 +382,3 @@ endif
|
|||
" ref: https://github.com/tpope/vim-commentary/issues/15#issuecomment-23127749
|
||||
autocmd FileType c,cpp,cs,java setlocal commentstring=//\ %s
|
||||
|
||||
" Why?!
|
||||
set noshowmode
|
||||
|
|
|
@ -116,13 +116,7 @@ in {
|
|||
'';
|
||||
};
|
||||
"nvim/lua/config.lua" = {
|
||||
text = ''
|
||||
require('oil').setup {
|
||||
view_options = {
|
||||
show_hidden = true,
|
||||
},
|
||||
}
|
||||
'';
|
||||
source = config.lib.file.mkOutOfStoreSymlink ../nvim2/config.lua;
|
||||
};
|
||||
"nvim/ftplugin/java.lua" = {
|
||||
text = ''
|
||||
|
@ -316,6 +310,7 @@ in {
|
|||
# pkgs.screenkey
|
||||
pkgs.ipatool # Search and download IPAs
|
||||
unstable.open-webui
|
||||
pkgs.web-ext
|
||||
|
||||
# My version of BerkeleyMono NF is incomplete. Should add some fallback fonts.
|
||||
# (pkgs.nerdfonts.override { fonts = [
|
||||
|
@ -516,6 +511,23 @@ in {
|
|||
Restart = "always";
|
||||
};
|
||||
};
|
||||
rclone-dropbox = {
|
||||
Unit = {
|
||||
Description = "mount Dropbox.";
|
||||
After = [ "network-online.target" ];
|
||||
};
|
||||
Install = {
|
||||
WantedBy = [ "default.target" ];
|
||||
};
|
||||
Service = {
|
||||
Type = "forking";
|
||||
Environment = [ "PATH=/run/wrappers/bin/:$PATH" ];
|
||||
ExecStart = "${pkgs.rclone}/bin/rclone mount dropbox: /mnt/dropbox --copy-links --allow-other --allow-non-empty --umask 000 --daemon --vfs-cache-mode writes --buffer-size 10M";
|
||||
ExecStop = "fusermount -u /mnt/dropbox";
|
||||
Restart = "always";
|
||||
RestartSec = 10;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,289 @@
|
|||
# vim:foldmethod=marker:foldmarker={{{,}}}:
|
||||
|
||||
require('oil').setup {
|
||||
columns = {
|
||||
"icon",
|
||||
"permissions",
|
||||
"size",
|
||||
"mtime",
|
||||
},
|
||||
keymaps = {
|
||||
["<C-v>"] = { "actions.select", opts = { vertical = true } },
|
||||
["<C-x>"] = { "actions.select", opts = { horizontal = true } },
|
||||
},
|
||||
view_options = {
|
||||
show_hidden = true,
|
||||
},
|
||||
}
|
||||
|
||||
-- {{{ LSP Related
|
||||
vim.diagnostic.config({ virtual_text = false })
|
||||
|
||||
--- {{{ nvim-treesitter setup
|
||||
local config = require("nvim-treesitter.configs")
|
||||
config.setup {
|
||||
ensure_installed = {"lua", "cpp", "rust", "javascript", "python", "typescript", "html", "css", "scss"},
|
||||
auto_install = true,
|
||||
highlight = { enable = true},
|
||||
indent = { enable = true},
|
||||
}
|
||||
--- }}}
|
||||
|
||||
--- {{{ nvim-cmp setup
|
||||
local cmp_status, cmp = pcall(require, "cmp")
|
||||
if not cmp_status then
|
||||
return
|
||||
end
|
||||
|
||||
local luasnip_status, luasnip = pcall(require, "luasnip")
|
||||
if not luasnip_status then
|
||||
return
|
||||
end
|
||||
|
||||
vim.opt.completeopt = "menu,menuone,noselect"
|
||||
|
||||
local has_words_before = function()
|
||||
unpack = unpack or table.unpack
|
||||
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
|
||||
return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
|
||||
end
|
||||
|
||||
local is_empty_line = function()
|
||||
unpack = unpack or table.unpack
|
||||
local line, _ = unpack(vim.api.nvim_win_get_cursor(0))
|
||||
return vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:match("%S") == nil
|
||||
end
|
||||
|
||||
local feedkey = function(key, mode)
|
||||
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(key, true, true, true), mode, true)
|
||||
end
|
||||
|
||||
local lspkind = require('lspkind')
|
||||
|
||||
cmp.setup {
|
||||
snippet = {
|
||||
expand = function(args)
|
||||
luasnip.lsp_expand(args.body)
|
||||
end,
|
||||
},
|
||||
mapping = {
|
||||
["<Tab>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
if not is_empty_line() then
|
||||
cmp.confirm({ select = true })
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
elseif luasnip_status and luasnip.expand_or_jumpable() then
|
||||
luasnip.expand_or_jump()
|
||||
elseif has_words_before() then
|
||||
cmp.complete()
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, { "i", "s" }),
|
||||
|
||||
["<S-Tab>"] = cmp.mapping(function()
|
||||
if cmp.visible() then
|
||||
cmp.select_prev_item()
|
||||
elseif vim.fn["vsnip#jumpable"](-1) == 1 then
|
||||
feedkey("<Plug>(vsnip-jump-prev)", "")
|
||||
end
|
||||
end, { "i", "s" }),
|
||||
|
||||
['<C-k>'] = cmp.mapping.select_prev_item(),
|
||||
['<C-j>'] = cmp.mapping.select_next_item(),
|
||||
['<ESC>'] = cmp.mapping.abort(),
|
||||
},
|
||||
-- sources for autocompletion
|
||||
sources = cmp.config.sources({
|
||||
{ name = "cody" },
|
||||
{
|
||||
name = "nvim_lsp",
|
||||
option = {
|
||||
markdown_oxide = { keyword_pattern = [[\(\k\| \|\/\|#\)\+]] }
|
||||
}
|
||||
}, -- LSP
|
||||
{ name = "luasnip" }, -- snippets
|
||||
{ name = "buffer" }, -- text within the current buffer
|
||||
{ name = "path" }, -- file system paths
|
||||
{ name = "emoji" },
|
||||
{ name = "nerdfont" },
|
||||
{ name = "calc" },
|
||||
}),
|
||||
formatting = {
|
||||
fields = { cmp.ItemField.Abbr, cmp.ItemField.Kind, cmp.ItemField.Menu },
|
||||
format = lspkind.cmp_format({
|
||||
mode = 'symbol_text', -- show only symbol annotations
|
||||
maxwidth = 50, -- prevent the popup from showing more than provided characters (e.g 50 will not show more than 50 characters)
|
||||
-- can also be a function to dynamically calculate max width such as
|
||||
-- maxwidth = function() return math.floor(0.45 * vim.o.columns) end,
|
||||
ellipsis_char = '…', -- when popup menu exceed maxwidth, the truncated part would show ellipsis_char instead (must define maxwidth first)
|
||||
show_labelDetails = true, -- show labelDetails in menu. Disabled by default
|
||||
|
||||
-- The function below will be called before any actual modifications from lspkind
|
||||
-- so that you can provide more controls on popup customization. (See [#30](https://github.com/onsails/lspkind-nvim/pull/30))
|
||||
before = function (entry, vim_item)
|
||||
-- local word = entry:get_insert_text()
|
||||
-- if entry.completion_item.insertTextFormat == types.lsp.InsertTextFormat.Snippet then
|
||||
-- word = word
|
||||
-- -- word = vim.lsp.util.parse_snippet(word)
|
||||
-- end
|
||||
-- word = str.oneline(word)
|
||||
-- if entry.completion_item.insertTextFormat == types.lsp.InsertTextFormat.Snippet and string.sub(vim_item.abbr, -1, -1) == "~" then
|
||||
-- word = word .. "~"
|
||||
-- end
|
||||
-- vim_item.abbr = word
|
||||
return vim_item
|
||||
end
|
||||
})
|
||||
}
|
||||
}
|
||||
--- }}}
|
||||
|
||||
--- {{{ Configuration for specific LSPs
|
||||
local lspconfig = require('lspconfig')
|
||||
local capabilities = require('cmp_nvim_lsp').default_capabilities()
|
||||
-- local extended_caps = require('cmp_nvim_lsp').default_capabilities(vim.lsp.protocol.make_client_capabilities)
|
||||
-- lspconfig.svls.setup {
|
||||
-- capabilities = capabilities
|
||||
-- }
|
||||
lspconfig.clangd.setup {
|
||||
capabilities = capabilities,
|
||||
root_dir = function(fname)
|
||||
return lspconfig.util.root_pattern('compile_commands.json')(fname) or lspconfig.util.find_git_ancestor(fname) or vim.fn.getcwd()
|
||||
end,
|
||||
cmd = {
|
||||
"clangd",
|
||||
-- "--header-insertion=never",
|
||||
"--clang-tidy",
|
||||
"--clang-tidy-checks=*",
|
||||
}
|
||||
}
|
||||
lspconfig.pyright.setup {
|
||||
capabilities = capabilities
|
||||
}
|
||||
lspconfig.ts_ls.setup {
|
||||
capabilities = capabilities
|
||||
}
|
||||
lspconfig.rust_analyzer.setup {
|
||||
capabilities = capabilities,
|
||||
-- Server-specific settings. See `:help lspconfig-setup`
|
||||
settings = {
|
||||
['rust-analyzer'] = {
|
||||
checkOnSave = {
|
||||
command = 'clippy',
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
lspconfig.hls.setup {}
|
||||
lspconfig.lua_ls.setup {
|
||||
capabilities = capabilities
|
||||
}
|
||||
lspconfig.cmake.setup {}
|
||||
lspconfig.asm_lsp.setup {
|
||||
capabilities = capabilities
|
||||
}
|
||||
lspconfig.nil_ls.setup {
|
||||
capabilities = capabilities
|
||||
}
|
||||
lspconfig.mojo.setup {}
|
||||
lspconfig.nushell.setup {}
|
||||
--- }}}
|
||||
|
||||
--- {{{ Smart inlay hints
|
||||
vim.api.nvim_create_autocmd("LspAttach", {
|
||||
callback = function()
|
||||
vim.lsp.inlay_hint.enable(true)
|
||||
end,
|
||||
})
|
||||
|
||||
vim.api.nvim_create_autocmd('InsertEnter', {
|
||||
callback = function()
|
||||
vim.lsp.inlay_hint.enable(false)
|
||||
end
|
||||
})
|
||||
|
||||
vim.api.nvim_create_autocmd('InsertLeave', {
|
||||
callback = function()
|
||||
vim.lsp.inlay_hint.enable(true)
|
||||
end
|
||||
})
|
||||
--- }}}
|
||||
|
||||
--- {{{ trouble.nvim keybinds
|
||||
require('trouble').setup()
|
||||
vim.keymap.set('n', '<leader>dd', '<Cmd>Trouble diagnostics toggle focus=true filter.buf=0<CR>');
|
||||
vim.keymap.set('n', '<leader>dw', '<Cmd>Trouble diagnostics toggle focus=true<CR>');
|
||||
vim.keymap.set('n', '<leader>dq', '<Cmd>Trouble qflist toggle focus=true<CR>');
|
||||
vim.keymap.set('n', '<leader>w', '<Cmd>Trouble lsp toggle focus=true<CR>');
|
||||
--- }}}
|
||||
|
||||
--- {{{ Common diagnostics keybinds
|
||||
vim.keymap.set('n', 'qq', vim.diagnostic.open_float);
|
||||
vim.keymap.set('n', 'qn', vim.diagnostic.goto_next);
|
||||
vim.keymap.set('n', 'qp', vim.diagnostic.goto_prev);
|
||||
--- }}}
|
||||
|
||||
--- {{{ LSP keybinds
|
||||
vim.api.nvim_create_autocmd('LspAttach', {
|
||||
group = vim.api.nvim_create_augroup('UserLspConfig', {}),
|
||||
callback = function(ev)
|
||||
-- Enable completion triggered by <c-x><c-o>
|
||||
-- vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc'
|
||||
|
||||
-- Buffer local mappings.
|
||||
-- See `:help vim.lsp.*` for documentation on any of the below functions
|
||||
local opts = { buffer = ev.buf }
|
||||
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts)
|
||||
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts)
|
||||
vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts)
|
||||
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts)
|
||||
vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, opts)
|
||||
vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, opts)
|
||||
vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, opts)
|
||||
vim.keymap.set('n', '<space>wl', function()
|
||||
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
|
||||
end, opts)
|
||||
vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, opts)
|
||||
vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, opts)
|
||||
vim.keymap.set({ 'n', 'v' }, '<space>ca', vim.lsp.buf.code_action, opts)
|
||||
vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts)
|
||||
end,
|
||||
})
|
||||
--- }}}
|
||||
|
||||
require('goto-preview').setup {
|
||||
default_mappings = true
|
||||
}
|
||||
-- }}}
|
||||
|
||||
-- {{{ Fold Management
|
||||
vim.o.foldcolumn = '1' -- '0' is not bad
|
||||
vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value
|
||||
vim.o.foldlevelstart = 99
|
||||
vim.o.foldenable = true
|
||||
|
||||
-- Using ufo provider need remap `zR` and `zM`. If Neovim is 0.6.1, remap yourself
|
||||
vim.keymap.set('n', 'zR', require('ufo').openAllFolds)
|
||||
vim.keymap.set('n', 'zM', require('ufo').closeAllFolds)
|
||||
|
||||
-- Option 2: nvim lsp as LSP client
|
||||
-- Tell the server the capability of foldingRange,
|
||||
-- Neovim hasn't added foldingRange to default capabilities, users must add it manually
|
||||
local capabilities = vim.lsp.protocol.make_client_capabilities()
|
||||
capabilities.textDocument.foldingRange = {
|
||||
dynamicRegistration = false,
|
||||
lineFoldingOnly = true
|
||||
}
|
||||
local language_servers = require("lspconfig").util.available_servers() -- or list servers manually like {'gopls', 'clangd'}
|
||||
for _, ls in ipairs(language_servers) do
|
||||
require('lspconfig')[ls].setup({
|
||||
capabilities = capabilities
|
||||
-- you can add other fields for setting up lsp server in this table
|
||||
})
|
||||
end
|
||||
require('ufo').setup()
|
||||
|
||||
-- }}}
|
Loading…
Reference in New Issue