configure nvim via nix
This commit is contained in:
parent
a59f68122f
commit
da4f05613c
9 changed files with 309 additions and 38 deletions
|
@ -10,7 +10,7 @@ in
|
||||||
./progs/git.nix
|
./progs/git.nix
|
||||||
./progs/pass.nix
|
./progs/pass.nix
|
||||||
./progs/himalaya.nix
|
./progs/himalaya.nix
|
||||||
./progs/nvim.nix
|
./progs/nvim
|
||||||
./progs/exa.nix
|
./progs/exa.nix
|
||||||
./progs/zoxide.nix
|
./progs/zoxide.nix
|
||||||
./progs/hledger.nix
|
./progs/hledger.nix
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
{ lib, config, pkgs, ... }:
|
|
||||||
|
|
||||||
with lib;
|
|
||||||
|
|
||||||
let
|
|
||||||
cfg = config.progs.nvim;
|
|
||||||
bin = "nvim";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options.progs.nvim = {
|
|
||||||
enable = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = false;
|
|
||||||
description = "Add and configure exa, a modern replacement for ls";
|
|
||||||
};
|
|
||||||
|
|
||||||
default = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = false;
|
|
||||||
description = "Set neovim as default editor";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
|
||||||
# TODO: install and configure neovim from home-manager
|
|
||||||
|
|
||||||
home.sessionVariables = mkIf cfg.default {
|
|
||||||
EDITOR = bin;
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.zsh.shellAliases = mkIf config.shell.zsh.enable {
|
|
||||||
vi = bin;
|
|
||||||
vim = bin;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
42
nix/progs/nvim/coc.vim
Normal file
42
nix/progs/nvim/coc.vim
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
" Smaller updatetime for CursorHold & CursorHoldI
|
||||||
|
set updatetime=300
|
||||||
|
|
||||||
|
" don't give |ins-completion-menu| messages.
|
||||||
|
set shortmess+=c
|
||||||
|
|
||||||
|
" always show signcolumns
|
||||||
|
set signcolumn=yes
|
||||||
|
|
||||||
|
" Some server have issues with backup files, see coc#649
|
||||||
|
set nobackup
|
||||||
|
set nowritebackup
|
||||||
|
|
||||||
|
" Better display for messages
|
||||||
|
set cmdheight=2
|
||||||
|
|
||||||
|
" Use <c-space> for trigger completion.
|
||||||
|
inoremap <silent><expr> <c-space> coc#refresh()
|
||||||
|
|
||||||
|
" Use <cr> for confirm completion, `<C-g>u` means break undo chain at current
|
||||||
|
" position. Coc only does snippet and additional edit on confirm.
|
||||||
|
inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
|
||||||
|
|
||||||
|
" Use `[g` and `]g` for navigate diagnostics
|
||||||
|
nmap <silent> [g <Plug>(coc-diagnostic-prev)
|
||||||
|
nmap <silent> ]g <Plug>(coc-diagnostic-next)
|
||||||
|
|
||||||
|
" Remap keys for gotos
|
||||||
|
nmap <silent> gd <Plug>(coc-definition)
|
||||||
|
nmap <silent> gt <Plug>(coc-type-definition)
|
||||||
|
nmap <silent> gi <Plug>(coc-implementation)
|
||||||
|
nmap <silent> gr <Plug>(coc-references)
|
||||||
|
|
||||||
|
" Remap for do code action of current line
|
||||||
|
nmap <leader>la <Plug>(coc-codeaction)
|
||||||
|
|
||||||
|
" Remap for rename current word
|
||||||
|
nmap <leader>ln <Plug>(coc-rename)
|
||||||
|
|
||||||
|
" Remap for do action format
|
||||||
|
nnoremap <silent> F :call CocAction('format')<CR>
|
||||||
|
|
24
nix/progs/nvim/coc_settings.nix
Normal file
24
nix/progs/nvim/coc_settings.nix
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
languageserver = {
|
||||||
|
nix = {
|
||||||
|
command = "rnix-lsp";
|
||||||
|
filetypes = ["nix"];
|
||||||
|
};
|
||||||
|
|
||||||
|
haskell = {
|
||||||
|
command = "haskell-language-server-wrapper";
|
||||||
|
args = ["--lsp"];
|
||||||
|
rootPatterns = [
|
||||||
|
"stack.yaml"
|
||||||
|
".cabal"
|
||||||
|
"cabal.project"
|
||||||
|
"package.yaml"
|
||||||
|
];
|
||||||
|
filetypes = [
|
||||||
|
"hs"
|
||||||
|
"lhs"
|
||||||
|
"haskell"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
99
nix/progs/nvim/config.vim
Normal file
99
nix/progs/nvim/config.vim
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
" Basic settings {{{
|
||||||
|
filetype off
|
||||||
|
|
||||||
|
" Leaders
|
||||||
|
let g:mapleader = ','
|
||||||
|
let g:maplocalleader = '-'
|
||||||
|
|
||||||
|
" Better Unix support
|
||||||
|
set viewoptions=folds,options,cursor,unix,slash
|
||||||
|
set encoding=utf-8
|
||||||
|
|
||||||
|
" True color support
|
||||||
|
set termguicolors
|
||||||
|
|
||||||
|
" Theme (required plugin 'material-vim')
|
||||||
|
"let g:material_theme_style = 'default' | 'palenight' | 'ocean' | 'lighter' | 'darker' | 'default-community' | 'palenight-community' | 'ocean-community' | 'lighter-community' | 'darker-community'
|
||||||
|
let g:material_theme_style = 'ocean-community'
|
||||||
|
let g:lightline = { 'colorscheme': 'material_vim' }
|
||||||
|
colorscheme material
|
||||||
|
|
||||||
|
" Other options
|
||||||
|
syntax on
|
||||||
|
set backspace=2
|
||||||
|
set laststatus=2
|
||||||
|
set noshowmode
|
||||||
|
|
||||||
|
" Tabs as spaces
|
||||||
|
set expandtab
|
||||||
|
set tabstop=2
|
||||||
|
set softtabstop=2
|
||||||
|
set shiftwidth=2
|
||||||
|
|
||||||
|
" Clear search highlighting
|
||||||
|
nnoremap <C-z> :nohlsearch<CR>
|
||||||
|
|
||||||
|
" Fixes broken cursor on Linux
|
||||||
|
set guicursor=
|
||||||
|
|
||||||
|
" General editor options
|
||||||
|
set hidden " Hide files when leaving them.
|
||||||
|
set number " Show line numbers.
|
||||||
|
set numberwidth=1 " Minimum line number column width.
|
||||||
|
set cmdheight=2 " Number of screen lines to use for the commandline.
|
||||||
|
set textwidth=0 " Lines length limit (0 if no limit).
|
||||||
|
set linebreak " Don't cut lines in the middle of a work.
|
||||||
|
set showmatch " Show matching parenthesis.
|
||||||
|
set matchtime=2 " Time during which the matching parenthesis is shown.
|
||||||
|
set formatoptions=jtcrq " Sensible default line auto cutting and formatting.
|
||||||
|
set listchars=tab:▸\ ,eol:¬ " Invisible characters representation when :set list.
|
||||||
|
set clipboard=unnamedplus " Copy/Past to/from clipboard
|
||||||
|
set cursorline " Highlight line cursor is currently on
|
||||||
|
set completeopt+=noinsert " Select the first item of popup menu automatically without inserting it
|
||||||
|
|
||||||
|
" Search
|
||||||
|
set incsearch " Incremental search.
|
||||||
|
set ignorecase " Case insensitive.
|
||||||
|
set smartcase " Case insensitive if no uppercase letter in pattern, case sensitive otherwise
|
||||||
|
|
||||||
|
" Spell check for markdown files
|
||||||
|
au BufNewFile,BufRead *.md set spell
|
||||||
|
|
||||||
|
" Disable arrow keys and page up / down
|
||||||
|
noremap <Up> <nop>
|
||||||
|
noremap <Down> <nop>
|
||||||
|
noremap <Left> <nop>
|
||||||
|
noremap <Right> <nop>
|
||||||
|
inoremap <Up> <nop>
|
||||||
|
inoremap <Down> <nop>
|
||||||
|
inoremap <Left> <nop>
|
||||||
|
inoremap <Right> <nop>
|
||||||
|
vnoremap <Up> <nop>
|
||||||
|
vnoremap <Down> <nop>
|
||||||
|
vnoremap <Left> <nop>
|
||||||
|
vnoremap <Right> <nop>
|
||||||
|
noremap <PageUp> <nop>
|
||||||
|
inoremap <PageUp> <nop>
|
||||||
|
vnoremap <PageUp> <nop>
|
||||||
|
noremap <PageDown> <nop>
|
||||||
|
inoremap <PageDown> <nop>
|
||||||
|
vnoremap <PageDown> <nop>
|
||||||
|
|
||||||
|
" Disable mouse / touchpad (only in vim)
|
||||||
|
set mouse=nicr
|
||||||
|
inoremap <ScrollWheelUp> <nop>
|
||||||
|
inoremap <S-ScrollWheelUp> <nop>
|
||||||
|
inoremap <C-ScrollWheelUp> <nop>
|
||||||
|
inoremap <ScrollWheelDown> <nop>
|
||||||
|
inoremap <S-ScrollWheelDown> <nop>
|
||||||
|
inoremap <C-ScrollWheelDown> <nop>
|
||||||
|
inoremap <ScrollWheelLeft> <nop>
|
||||||
|
inoremap <S-ScrollWheelLeft> <nop>
|
||||||
|
inoremap <C-ScrollWheelLeft> <nop>
|
||||||
|
inoremap <ScrollWheelRight> <nop>
|
||||||
|
inoremap <S-ScrollWheelRight> <nop>
|
||||||
|
inoremap <C-ScrollWheelRight> <nop>
|
||||||
|
|
||||||
|
" Incremental substitutin
|
||||||
|
set inccommand=split
|
||||||
|
|
12
nix/progs/nvim/custom_plugins.nix
Normal file
12
nix/progs/nvim/custom_plugins.nix
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{ buildVimPlugin }:
|
||||||
|
|
||||||
|
{
|
||||||
|
material-vim = buildVimPlugin {
|
||||||
|
name = "material-vim";
|
||||||
|
src = builtins.fetchTarball {
|
||||||
|
name = "material-vim-2021-12-10";
|
||||||
|
url = "https://github.com/kaicataldo/material.vim/archive/445534b2db7f7ec3dc088eae21c86ff0e9bb19de.tar.gz";
|
||||||
|
sha256 = "1lwlr6haj1damzmk6i6a1la7vql4y1wmb62iqvm6xgy2svr0s36i";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
82
nix/progs/nvim/default.nix
Normal file
82
nix/progs/nvim/default.nix
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
{ lib, config, pkgs, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.progs.nvim;
|
||||||
|
|
||||||
|
customPlugins = pkgs.callPackage ./custom_plugins.nix {
|
||||||
|
inherit (pkgs.vimUtils) buildVimPlugin;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugins = pkgs.vimPlugins // customPlugins;
|
||||||
|
|
||||||
|
myVimPlugins = with plugins; [
|
||||||
|
coc-nvim # LSP client + autocompletion plugin
|
||||||
|
coc-tsserver # typescript LSP
|
||||||
|
coc-eslint # eslint LSP
|
||||||
|
|
||||||
|
editorconfig-vim # use project .editorconfig to configure editor
|
||||||
|
lightline-vim # configurable status line
|
||||||
|
material-vim # modern theme with true colors support
|
||||||
|
vim-nix # nix support
|
||||||
|
vim-easymotion # highlights keys to move quickly
|
||||||
|
nerdtree # tree explorer
|
||||||
|
nerdtree-git-plugin # shows files git status on the NerdTree
|
||||||
|
neoformat # formating code
|
||||||
|
nvim-treesitter # treesitter configurations and abstraction layer
|
||||||
|
];
|
||||||
|
|
||||||
|
# Additional language servers that we should install mannually
|
||||||
|
lspPackages = with pkgs; [
|
||||||
|
rnix-lsp
|
||||||
|
];
|
||||||
|
|
||||||
|
baseConfig = builtins.readFile ./config.vim;
|
||||||
|
pluginsConfig = builtins.readFile ./plugins.vim;
|
||||||
|
cocConfig = builtins.readFile ./coc.vim;
|
||||||
|
cocSettings = builtins.toJSON (import ./coc_settings.nix);
|
||||||
|
|
||||||
|
vimConfig = baseConfig + pluginsConfig + cocConfig;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.progs.nvim = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Add and configure exa, a modern replacement for ls";
|
||||||
|
};
|
||||||
|
|
||||||
|
default = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Set neovim as default editor";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
home.packages = lspPackages;
|
||||||
|
|
||||||
|
programs.neovim = {
|
||||||
|
enable = true;
|
||||||
|
extraConfig = vimConfig;
|
||||||
|
plugins = myVimPlugins;
|
||||||
|
viAlias = true;
|
||||||
|
vimAlias = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.configFile = {
|
||||||
|
"nvim/coc-settings.json".text = cocSettings;
|
||||||
|
};
|
||||||
|
|
||||||
|
# home.sessionVariables = mkIf cfg.default {
|
||||||
|
# EDITOR = bin;
|
||||||
|
# };
|
||||||
|
|
||||||
|
# programs.zsh.shellAliases = mkIf config.shell.zsh.enable {
|
||||||
|
# vi = bin;
|
||||||
|
# vim = bin;
|
||||||
|
# };
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
17
nix/progs/nvim/nvim_nightly.nix
Normal file
17
nix/progs/nvim/nvim_nightly.nix
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{ pkgs }:
|
||||||
|
|
||||||
|
pkgs.neovim-unwrapped.overrideAttrs (
|
||||||
|
old: {
|
||||||
|
name = "neovim-nightly";
|
||||||
|
version = "nightly";
|
||||||
|
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "neovim";
|
||||||
|
repo = "neovim";
|
||||||
|
rev = "f17d88c47a6a647f2230a61e7cd952926abc4473";
|
||||||
|
sha256 = "0lgbf90sbachdag1zm9pmnlbn35964l3khs27qy4462qzpqyi9fi";
|
||||||
|
};
|
||||||
|
|
||||||
|
buildInputs = old.buildInputs ++ [ pkgs.tree-sitter ];
|
||||||
|
}
|
||||||
|
)
|
32
nix/progs/nvim/plugins.vim
Normal file
32
nix/progs/nvim/plugins.vim
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
" Nerdtree
|
||||||
|
|
||||||
|
noremap <leader>nt :NERDTreeToggle<CR>
|
||||||
|
noremap <leader>nf :NERDTreeFind<CR>
|
||||||
|
|
||||||
|
let g:NERDTreeDirArrowExpandable = '▸'
|
||||||
|
let g:NERDTreeDriArrowCollapsible = '▾'
|
||||||
|
|
||||||
|
let g:NERDTreeMiniamlUI = 1
|
||||||
|
let g:NERDTreeDirArrows = 1
|
||||||
|
|
||||||
|
" Nerdtree git plugin symbols
|
||||||
|
let g:NERDTreeGitStatusIndicatorMapCustom = {
|
||||||
|
\ "Modified" : "ᵐ",
|
||||||
|
\ "Staged" : "ˢ",
|
||||||
|
\ "Untracked" : "ᵘ",
|
||||||
|
\ "Renamed" : "ʳ",
|
||||||
|
\ "Unmerged" : "ᶴ",
|
||||||
|
\ "Deleted" : "ˣ",
|
||||||
|
\ "Dirty" : "˜",
|
||||||
|
\ "Clean" : "ᵅ",
|
||||||
|
\ "Unknown" : "?"
|
||||||
|
\ }
|
||||||
|
|
||||||
|
" NeoFormat
|
||||||
|
let g:neoformat_try_node_exe = 1
|
||||||
|
let g:neoformat_only_msg_on_error = 1
|
||||||
|
let g:neoformat_enabled_markdown = ["denofmt"]
|
||||||
|
aug fmt
|
||||||
|
au!
|
||||||
|
au BufWritePre * try | undojoin | Neoformat | catch /E790/ | Neoformat | endtry
|
||||||
|
aug END
|
Loading…
Reference in a new issue