diff --git a/home-manager/home.nix b/home-manager/home.nix index cb9baad..13b676a 100644 --- a/home-manager/home.nix +++ b/home-manager/home.nix @@ -240,7 +240,6 @@ withPython3 = true; extraLuaConfig = builtins.replaceStrings ["%PYTHONENV%"] ["${pythonEnv}"] (builtins.readFile ./nvim/init.lua); - extraConfig = builtins.readFile ./nvim/init.vim; }; programs.direnv = { @@ -308,6 +307,7 @@ nixpkgs.bat nixpkgs.pandoc nixpkgs.fd + nixpkgs.sumneko-lua-language-server (nixpkgs.nerdfonts.override {fonts = ["FiraCode" "DroidSansMono"];}) ]; diff --git a/home-manager/nvim/init.lua b/home-manager/nvim/init.lua index 09e1106..a41ffd3 100644 --- a/home-manager/nvim/init.lua +++ b/home-manager/nvim/init.lua @@ -3,8 +3,33 @@ vim.opt.mouse = "" vim.opt.history = 500 vim.opt.background = "dark" +vim.opt.wildmenu = true +vim.opt.wildignore = vim.opt.wildignore + { "*/.git/*", "*/.hg/*", "*/.svn/*", "*/.DS_Store" } + +vim.opt.ignorecase = true +vim.opt.smartcase = true +vim.opt.incsearch = true +vim.opt.magic = true +vim.opt.hlsearch = true + +vim.opt.autoindent = true +vim.opt.smartindent = true + +vim.opt.wrap = true +vim.opt.linebreak = true +vim.opt.textwidth = 500 + +vim.opt.switchbuf = "useopen" + +vim.opt.laststatus = 2 +-- I don't use tabs, but one day I might! +vim.opt.showtabline = 2 + vim.opt.langmenu = "en" +vim.opt.ffs = "unix" +vim.opt.encoding = "utf8" + -- Always show current position vim.opt.ruler = true vim.opt.number = true @@ -14,17 +39,17 @@ vim.opt.foldcolumn = "1" vim.opt.autoread = true vim.opt.backup = false +vim.opt.writebackup = true vim.opt.swapfile = false +vim.opt.cmdheight = 2 + -- Use spaces instead of tabs vim.opt.expandtab = true vim.opt.smarttab = true vim.opt.shiftwidth = 4 vim.opt.tabstop = 4 -vim.opt.hlsearch = true - --- Don't redraw while executing macros vim.opt.lazyredraw = true -- Show matching brackets when text indicator is on one of them @@ -35,6 +60,49 @@ vim.opt.mat = 2 vim.opt.errorbells = false vim.opt.visualbell = false +vim.opt.timeoutlen = 500 + +vim.opt.scrolloff = 2 + +-- Return to last edit position when opening files +vim.api.nvim_create_autocmd("BufReadPost", { + pattern = "*", + callback = function() + local line = vim.fn.line + local last_pos = line("'\"") + if last_pos > 1 and last_pos <= line("$") then + vim.cmd("normal! g'\"") + end + end, +}) + +-- Trim trailing whitespace on save +function CleanExtraSpaces() + local save_cursor = vim.api.nvim.win_get_cursor(0) + local old_query = vim.fn.getreg('/') + vim.cmd('%s/\\s\\+$//e') + vim.api.nvim_win_set_cursor(0, save_cursor) + vim.fn.setreg('/', old_query) +end +vim.api.nvim_create_autocmd("BufWritePre", { + pattern = {"*.fs", "*.fsi", "*.txt", "*.js", "*.py", "*.wiki", "*.sh", "*.coffee"}, + callback = CleanExtraSpaces, +}) + +-- Status line + +-- Returns true if paste mode is enabled +function HasPaste() + if vim.opt.paste:get() then + return 'PASTE MODE ' + end + return '' +end + +vim.o.statusline = vim.o.statusline .. "%{v:lua.HasPaste()}%F%m%r%h %w CWD: %r%{getcwd()}%h Line: %l Column: %c" + +-------------------------------------------------------------- + vim.api.nvim_set_keymap('n', ';', '', { noremap = true }) vim.api.nvim_set_var("maplocalleader", ";") @@ -77,7 +145,6 @@ end local status, whichkey = pcall(require, "which-key") if status then - local telescope = require('telescope') local pickers = require('telescope.pickers') local action_state = require('telescope.actions.state') local actions = require('telescope.actions') @@ -124,7 +191,11 @@ if status then }):find() end - vim.api.nvim_set_keymap('n', 's', ':lua DisplayAllMappingsWithTelescope()', {}) + function ToggleSpell() + vim.cmd('setlocal spell!') + end + + vim.api.nvim_set_keymap('n', '', ':lua DisplayAllMappingsWithTelescope()', {}) whichkey.register({ ["mp"] = { MarkdownPreview, "Preview Markdown in Lynx" @@ -140,9 +211,12 @@ if status then }, -- For some reason the command doesn't work at all if I map it in here, -- whereas if we map it separately and *document* it in here then only the documentation doesn't work. - ["s"] = { + [vim.api.nvim_get_var("maplocalleader")] = { "View all mappings" }, + ["ss"] = { + ToggleSpell, "Toggle spell-checker on or off" + }, }, { prefix = vim.api.nvim_get_var("maplocalleader") }) else vim.api.nvim_set_keymap('n', 'mp', ':lua MarkdownPreview()', { noremap = true, silent = true }) diff --git a/home-manager/nvim/init.vim b/home-manager/nvim/init.vim deleted file mode 100644 index c385fe4..0000000 --- a/home-manager/nvim/init.vim +++ /dev/null @@ -1,242 +0,0 @@ -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" Maintainer: -" Amir Salihefendic — @amix3k -" -" Awesome_version: -" Get this config, nice color schemes and lots of plugins! -" -" Install the awesome version from: -" -" https://github.com/amix/vimrc -" -" Sections: -" -> General -" -> VIM user interface -" -> Colors and Fonts -" -> Files and backups -" -> Text, tab and indent related -" -> Visual mode related -" -> Moving around, tabs and buffers -" -> Status line -" -> Editing mappings -" -> vimgrep searching and cope displaying -" -> Spell checking -" -> Misc -" -> Helper functions -" -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" - - -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" => General -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" Enable filetype plugins -filetype plugin on -filetype indent on - -" With a map leader it's possible to do extra key combinations -" like w saves the current file -let mapleader = "`" - -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" => VIM user interface -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" Set 7 lines to the cursor - when moving vertically using j/k -set so=7 - -" Avoid garbled characters in Chinese language windows OS -let $LANG='en' -set langmenu=en -" source $VIMRUNTIME/delmenu.vim -" source $VIMRUNTIME/menu.vim - -" Turn on the Wild menu -set wildmenu - -" Ignore compiled files -set wildignore=*.o,*~,*.pyc -if has("win16") || has("win32") - set wildignore+=.git\*,.hg\*,.svn\* -else - set wildignore+=*/.git/*,*/.hg/*,*/.svn/*,*/.DS_Store -endif - -" Height of the command bar -set cmdheight=2 - -" A buffer becomes hidden when it is abandoned -set hid - -" Ignore case when searching -set ignorecase - -" When searching try to be smart about cases -set smartcase - -" Makes search act like search in modern browsers -set incsearch - -" For regular expressions turn magic on -set magic - -" No annoying sound on errors -set tm=500 - -" Properly disable sound on errors on MacVim -if has("gui_macvim") - autocmd GUIEnter * set vb t_vb= -endif - -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" => Colors and Fonts -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" Enable syntax highlighting -syntax enable - -" Enable 256 colors palette in Gnome Terminal -if $COLORTERM == 'gnome-terminal' - set t_Co=256 -endif - -" Set extra options when running in GUI mode -if has("gui_running") - set guioptions-=T - set guioptions-=e - set t_Co=256 - set guitablabel=%M\ %t -endif - -" Set utf8 as standard encoding and en_US as the standard language -set encoding=utf8 - -" Use Unix as the standard file type -set ffs=unix - - -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" => Files, backups and undo -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -set nowb - -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" => Text, tab and indent related -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" Linebreak on 500 characters -set lbr -set tw=500 - -set ai "Auto indent -set si "Smart indent -set wrap "Wrap lines - -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" => Moving around, tabs, windows and buffers -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" - -" Specify the behavior when switching between buffers -try - set switchbuf=useopen,usetab,newtab - set stal=2 -catch -endtry - -" Return to last edit position when opening files (You want this!) -au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif - - -"""""""""""""""""""""""""""""" -" => Status line -"""""""""""""""""""""""""""""" -" Always show the status line -set laststatus=2 - - - -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" => Editing mappings -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" - -" Delete trailing white space on save, useful for some filetypes ;) -fun! CleanExtraSpaces() - let save_cursor = getpos(".") - let old_query = getreg('/') - silent! %s/\s\+$//e - call setpos('.', save_cursor) - call setreg('/', old_query) -endfun - -if has("autocmd") - autocmd BufWritePre *.fs,*.fsi,*.txt,*.js,*.py,*.wiki,*.sh,*.coffee :call CleanExtraSpaces() -endif - - -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" => Spell checking -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" Pressing ,ss will toggle and untoggle spell checking -map ss :setlocal spell! - -" Shortcuts using -map sn ]s -map sp [s -map sa zg -map s? z= - -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" => Helper functions -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" Returns true if paste mode is enabled -function! HasPaste() - if &paste - return 'PASTE MODE ' - endif - return '' -endfunction - -" Don't close window, when deleting a buffer -command! Bclose call BufcloseCloseIt() -function! BufcloseCloseIt() - let l:currentBufNum = bufnr("%") - let l:alternateBufNum = bufnr("#") - - if buflisted(l:alternateBufNum) - buffer # - else - bnext - endif - - if bufnr("%") == l:currentBufNum - new - endif - - if buflisted(l:currentBufNum) - execute("bdelete! ".l:currentBufNum) - endif -endfunction - -function! CmdLine(str) - call feedkeys(":" . a:str) -endfunction - -function! VisualSelection(direction, extra_filter) range - let l:saved_reg = @" - execute "normal! vgvy" - - let l:pattern = escape(@", "\\/.*'$^~[]") - let l:pattern = substitute(l:pattern, "\n$", "", "") - - if a:direction == 'gv' - call CmdLine("Ack '" . l:pattern . "' " ) - elseif a:direction == 'replace' - call CmdLine("%s" . '/'. l:pattern . '/') - endif - - let @/ = l:pattern - let @" = l:saved_reg -endfunction - -set statusline+=%#warningmsg# -set statusline+=%{SyntasticStatuslineFlag()} -set statusline+=%* -" Format the status line -set statusline=\ %{HasPaste()}%F%m%r%h\ %w\ \ CWD:\ %r%{getcwd()}%h\ \ \ Line:\ %l\ \ Column:\ %c diff --git a/home-manager/nvim/lspconfig.lua b/home-manager/nvim/lspconfig.lua index 6dc3dc0..45e20ff 100644 --- a/home-manager/nvim/lspconfig.lua +++ b/home-manager/nvim/lspconfig.lua @@ -1,5 +1,37 @@ local coq = require('coq') +require('lspconfig')['lua_ls'].setup({ +on_init = function(client) + local path = client.workspace_folders[1].name + if vim.loop.fs_stat(path..'/.luarc.json') or vim.loop.fs_stat(path..'/.luarc.jsonc') then + return + end + + client.config.settings.Lua = vim.tbl_deep_extend('force', client.config.settings.Lua, { + runtime = { + -- Tell the language server which version of Lua you're using + -- (most likely LuaJIT in the case of Neovim) + version = 'LuaJIT' + }, + -- Make the server aware of Neovim runtime files + workspace = { + checkThirdParty = false, + library = { + vim.env.VIMRUNTIME + -- Depending on the usage, you might want to add additional paths here. + -- "${3rd}/luv/library" + -- "${3rd}/busted/library", + } + -- or pull in all of 'runtimepath'. NOTE: this is a lot slower + -- library = vim.api.nvim_get_runtime_file("", true) + } + }) + end, + settings = { + Lua = {} + } +}) + require('lspconfig').pyright.setup(coq.lsp_ensure_capabilities({ handlers = { ["textDocument/publishDiagnostics"] = function(...)