Skip to content

Commit

Permalink
Neovim: Rewrite vimrc in Fennel
Browse files Browse the repository at this point in the history
  • Loading branch information
Grazfather committed Jul 26, 2021
1 parent b02f020 commit c6a44d2
Show file tree
Hide file tree
Showing 7 changed files with 470 additions and 50 deletions.
5 changes: 5 additions & 0 deletions .gitignore
@@ -1,3 +1,8 @@
*.sw[op]
.netrwhist
plugged/

# Ignore compiled lua from fennel
/nvim/lua/core/
# Ignore neovim's packer files
/nvim/plugin/
2 changes: 2 additions & 0 deletions bb.edn
Expand Up @@ -79,6 +79,8 @@
; Plugins may be vim or neovim specific, so we
; have to install using both
(shell "vim +'PlugInstall --sync' +qa")
(shell "nvim +'PackerCompile --sync' +qa")
(shell "nvim +'PackerInstall --sync' +qa")
(shell "nvim +'PlugInstall --sync' +qa"))
:depends [symlink]}

Expand Down
355 changes: 355 additions & 0 deletions nvim/fnl/core/init.fnl
@@ -0,0 +1,355 @@
(module core.init
{autoload {packer packer}
require-macros [core.macros]})

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PLUGINS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(packer.startup
(fn []
; Packer itself
(use "wbthomason/packer.nvim")
; Aniseed itself
(use "Olical/aniseed")

(use "itchyny/lightline.vim")
(use "bling/vim-bufferline")
(use "liuchengxu/vim-which-key")
; Navigation
(use {1 "junegunn/fzf" :run (fn [] (vim.fn "-> fzf#install()")) })
(use "junegunn/fzf.vim")
(use "edkolev/tmuxline.vim")
(use "scrooloose/nerdtree")
(use "tiagofumo/vim-nerdtree-syntax-highlight")
(use "ryanoasis/vim-devicons")
(use "junegunn/vim-peekaboo")
; Language specific
(use "neovim/nvim-lspconfig")
; -- Go
(use "fatih/vim-go")
; -- Markdown
(use "jtratner/vim-flavored-markdown")
; -- Clojure
; ---- Connection to nREPL
(use "guns/vim-sexp")
(use {1 "liquidz/vim-iced" :ft ["clojure"]})
; ---- Linting
(use "borkdude/clj-kondo")
; -- TOML
(use "cespare/vim-toml")
; -- Fennel
(use "bakpakin/fennel.vim")
; Git
(use "tpope/vim-fugitive")
; -- Adds :Gbrowse
(use "tpope/vim-rhubarb")
; -- Adds :GV to browse history
(use "junegunn/gv.vim")
; -- Adds changed lines in the gutter
(use "airblade/vim-gitgutter")
; Misc
(use "scrooloose/nerdcommenter")
; Themes
(use "morhetz/gruvbox")))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; THEMES/UI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Color scheme
(set! syntax "enable"
background "dark")
(vim.api.nvim_command "silent! colorscheme gruvbox")

; Tmuxline (Configures Tmux's statusbar)
(let! g/tmuxline_preset "powerline"
g/tmuxline_theme "zenburn")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; VISUAL/LAYOUT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Match weird white space:
; Lines ending with spaces:
; Mixed spaces and tabs (in either order):
;
;

; Highlight trailing whitespace and spaces touching tabs
(vim.api.nvim_command ":highlight TrailingWhitespace ctermbg=darkred guibg=darkred")
(vim.api.nvim_command ":let w:m2=matchadd('TrailingWhitespace', '\\s\\+$\\| \\+\\ze\\t\\|\\t\\+\\ze ')")

; Remap <leader>
; I tend to use leader a lot, so I try to namespace commands under leader
; using a simple mnemonic:
; <leader>e_ -> Edit stuff
; <leader>g_ -> Git stuff
; <leader>m_ -> 'localleader': Filetype specific stuff
; <leader>f_ -> File stuff, some [fuzzy] find stuff
; <leader>t_ -> Toggleable settings
; <leader>w_ -> Window stuff
; Though some that don't fit aren't yet put behind a namespace
(let! g/mapleader " "
g/maplocalleader " m")

; Use WhichKey to show my prefix mappings
(nmap! <leader> ":WhichKey '<Space>'<CR>")

; Allow filetype-specific plugins
:filetype plugin on

; Read configurations from files
(set-true! modeline)
(set! modelines 5)

; Setup tags file
(set! tags "./tags,tags;")

; Set path to include the cwd and everything underneath
(set! path "**3")
(set-true! wildmenu)

; Show the normal mode command as I type it
(set-true! showcmd)

; Lazily redraw: Make macros faster
(set-true! lazyredraw)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; NAVIGATION
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Jump to last cursor position unless it's invalid or in an event handler
;(vim.api.nvim_command "autocmd BufReadPost *
;\\ if line(\"'\\\"\") > 0 && line(\"'\\\"\") <= line(\"$\") |
;\\ exe \"normal g`\\\"\" |
;\\ endif")

; Disable arrow keys for navigation
(nnoremap! <up> "<nop>"
<down> "<nop>"
<left> "<nop>"
<right> "<nop>")

; Make j and k move up and down better for wrapped lines
(nnoremap! k "gk"
j "gj"
gk "k"
gj "j")

; Ctrl-<hjkl> to change splits
(map! "nv" <C-h> "<C-w>h"
"nv" <C-j> "<C-w>j"
"nv" <C-k> "<C-w>k"
"nv" <C-l> "<C-w>l")

; <Tab> to cycle through splits
(nnoremap! <Tab> "<C-w>w")

; Jumping between buffers
(nnoremap! <C-n> ":bnext<CR>"
<C-p> ":bprev<CR>"
<C-e> ":b#<CR>")

; Let <C-n> and <C-p> also filter through command history
(noremap! "c" <C-n> "<down>"
"c" <C-p> "<up>")

; Start scrolling before my cursor reaches the bottom of the screen
(set! scrolloff 4)
; Improve search
(set-true! ignorecase
smartcase
infercase
hlsearch)
(set-false! incsearch)

; Turn off swap files
(set-false! swapfile
backup
writebackup)

; Open new split panes to right and bottom
(set-true! splitbelow
splitright)

; Allow hidden buffers
(set-true! hidden)

; Always show the status bar
(set! laststatus 2)

; Hide mode so it shows on the statusbar only
(set-false! showmode)

; Short ttimeoutlen to lower latency to show current mode
(set! ttimeoutlen 50)

; Consistent backspace on all systems
(set! backspace "indent,eol,start")

; When tabbing on lines with extra spaces, round to the next tab barrier
(set-true! shiftround)

; Enable indent folding, but have it disabled by default
(set! foldmethod "indent"
foldlevel 99)

; Use braces to determine when to auto indent
(set-true! smartindent)

; Make Y act like D and C
(nnoremap! Y "y$")

; Unmap ex mode
(nnoremap! Q "<nop>")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; GLOBAL MAPPINGS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(nmap!
; Clear trailing whitespace
<leader>eW ":%s/\\s\\+$//<CR><C-o>"

; Convert tabs to spaces
<leader>eT ":%s/\t/ /g<CR>"

; Select whole buffer
vag "ggvGg_"

; Open commonly edited files
<leader>fev ":edit $MYVIMRC<CR>"
<leader>fet ":edit $HOME/.tmux.conf<CR>"
<leader>feb ":edit $HOME/.bash_aliases<CR>"
<leader>feg ":edit $HOME/.gitaliases<CR>"

; Reload vimrc
<leader>frv ":source $MYVIMRC<CR>"

; Close the current buffer
<leader>bd ":bp\\|bd #<CR>"

; Save
<leader>fs ":w<CR>"

; Quit
<leader>qq ":qa<CR>"

; Add 'DELETEME' comment using nerdcommenter
<leader>dm "mx<leader>cA DELETEME<ESC>`x"
; Delete all DELETEME lines
<leader>dd ":keepp :g/DELETEME/d<CR><C-o>"

; Toggle search highlighting
<leader>th ":set hlsearch!<CR>"

; Show relative line numbers
<leader>tl ":set number! relativenumber!<CR>"

; Toggle cursor highlighting
<leader>tx ":set cursorline! cursorcolumn!<CR>"

; Toggle paste
<leader>tp ":set paste!<CR>"

; Window (split) management
<leader>wv ":vsp<CR>"
<leader>ws ":sp<CR>"
<leader>wd "<C-W>c"

; NERDTree
<leader>ft ":NERDTreeToggle<CR>"

; Fugitive (git)
<leader>gb ":Git blame<CR>"
<leader>gd ":Git diff<CR>"
<leader>gs ":Git status<CR>"
<leader>gl ":GV<CR>"

; fzf.vim
<leader>ff ":FZF<CR>"
<leader>bb ":Buffers<CR>"
<leader>ss ":Lines<CR>"
<leader>f* ":Lines <C-r><C-w><CR>"
<leader>frg ":Rg<CR>")

; Toggle signcolumn (gutter) to make copy and paste easier
(global toggle_sign_column (fn []
(if (= (get? signcolumn) "yes")
(set! signcolumn "no")
(set! signcolumn "yes"))))
(nmap! "<leader>tg" ":lua toggle_sign_column()<CR>")

; Toggle showing listchars
(nnoremap! <leader>t<TAB> ":set list!<CR>")
(if (= (get? encoding) "utf-8")
(set! listchars "eol:\u{00ac},nbsp:\u{2423},conceal:\u{22ef},tab:\u{25b8}\u{2014},precedes:\u{2026},extends:\u{2026}")
(set! listchars "eol:$,conceal:+tab:>-,precedes:<,extends:\u{2026}"))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Specific language settings
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Special settings for some filetypes
(vim.api.nvim_command
":au Filetype ruby setl expandtab smarttab tabstop=4 shiftwidth=4 softtabstop=4
:au Filetype yaml setl expandtab smarttab tabstop=4 shiftwidth=4 softtabstop=4")

; Use github-flavored markdown
(vim.api.nvim_exec
":aug markdown
:au!
:au BufNewFile,BufRead *.md,*.markdown setlocal filetype=ghmarkdown
:aug END" false)

; vim-iced (Clojure)
(let! g/iced_default_key_mapping_leader "<LocalLeader>"
g/iced_enable_default_key_mappings "v:true"
g/iced_enable_clj_konda_analysis "v:true")

; LSP
(local lspconfig (require "lspconfig"))

(local servers ["gopls" "clojure_lsp"])

(defn on-attach [client bufnr]
(defn buf-set-keymap [...] (vim.api.nvim_buf_set_keymap bufnr ...))
(defn buf-set-option [...] (vim.api.nvim_buf_set_option bufnr ...))

(buf-set-option "omnifunc" "v:lua.vim.lsp.omnifunc")

; Mappings
(local opts {noremap true silent true})
(buf-set-keymap "n" "gD" "<cmd>lua vim.lsp.buf.declaration()<CR>" opts)
(buf-set-keymap "n" "gd" "<cmd>lua vim.lsp.buf.definition()<CR>" opts)
(buf-set-keymap "n" "K" "<cmd>lua vim.lsp.buf.hover()<CR>" opts)
(buf-set-keymap "n" "gi" "<cmd>lua vim.lsp.buf.implementation()<CR>" opts)
(buf-set-keymap "n" "gr" "<cmd>lua vim.lsp.buf.references()<CR>" opts)
(buf-set-keymap "n" "[d" "<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>" opts)
(buf-set-keymap "n" "]d" "<cmd>lua vim.lsp.diagnostic.goto_next()<CR>" opts)
(buf-set-keymap "n" "<leader>rn" "<cmd>lua vim.lsp.buf.rename()<CR>" opts)

; Set some keybinds conditional on server capabilities
(if client.resolved_capabilities.document_formatting
(buf-set-keymap "n" "<leader>ef" "<cmd>lua vim.lsp.buf.formatting()<CR>" opts))
(if client.resolved_capabilities.document_range_formatting
(buf-set-keymap "v" "<leader>ef" "<cmd>lua vim.lsp.buf.range_formatting()<CR>" opts))

; Set autocommands conditional on server_capabilities
(if client.resolved_capabilities.document_highlight
(vim.api.nvim_command
"hi LspReferenceRead cterm=bold ctermbg=red guibg=LightYellow
hi LspReferenceText cterm=bold ctermbg=red guibg=LightYellow
hi LspReferenceWrite cterm=bold ctermbg=red guibg=LightYellow
augroup lsp_document_highlight
autocmd! * <buffer>
autocmd CursorHold <buffer> lua vim.lsp.buf.document_highlight()
autocmd CursorMoved <buffer> lua vim.lsp.buf.clear_references()
augroup END")))

; Use a loop to conveniently both setup defined servers and map buffer local
; keybindings when the language server attaches
(each [_ lsp (ipairs servers)]
((. (. lspconfig lsp) "setup") {on_attach on-attach}))

0 comments on commit c6a44d2

Please sign in to comment.