practicalli / neovim-config-redux

First attempt at a Fennel based configuration for Neovim 0.8.0, aimed mainly at Clojure developers (project on-hold)
40 stars 8 forks source link

Practicalli Neovim Configuration

ARCHIVED PROJECT

practicalli/neovim-config-redux is now archived project.

Practicalli Neovim book was updated to use the AstroNvim configuration for Neovim, providing a wide range of plugins with a highly flexible configuration via the Lazy Package plugin manager.

The author of Aniseed is making a significant change to how Fennel is used and creating the nfnl project. A new fennel based configuration may be created in the future to replace this project (although it woud be a huge investment to replicate everything that AstroNvim provides).

Overview

A Fennel configuration for Neovim 0.8.0 or greater, with a focus on Clojure REPL driven development with Conjure as well as general development workflow. A complete configuration to transform your Neovim in a simple, powerful and fun to use Clojure IDE

The key bindings (mappings) are evolving and trying to follow a Spacemacs style mnemonic approach (SPC f f to open a file browser). A which-key text menu is also provided to help discover key bindings. Using mnemonic keybinding will make Neovim more accessible to Spacemacs users (like myself) and those less familiar with the ways of interacting with a Vim editor, i.e. the : commands approach.

Practicalli Neovim book uses this configuration as it describes using Neovim, there is also (WIP) a description of this configuration in more detail.

Derived work

This project owes it existence to the contributions and guidance of rafaeldelboni and the amazing work on Aniseed and Conjure by Olical

Support has also been provided in the #vim channel of the Clojurians Slack community.

Prerequisites

Ubuntu Neovim 0.8.0 Install: use *.deb file from Neovim releases page on GitHub

How to use

Move $HOME/.config/nvim if you have an existing Neovim configuration

mv  $HOME/.config/nvim  $HOME/backup/nvim

Clone the repository to the $HOME/.config/nvim directory

git clone git@github.com:practicalli/neovim-config-redux.git $HOME/.config/nvim

Run nvim without opening any files and press RTN at the warning message.

When starting nvim for the first time, the download packer and aniseed plugins are downloaded and some errors occur as there are more packages to download using the Packer tool.

In Neovim, press : and type PackerInstall (or type Pack and press TAB to cycle through the menu of completions).

RET will run :PackerInstall, opening a new window (split) showing the progress of the install.

All the plugins declared in fnl/config/plugin.fnl should be installed

:q! to close neovim and use the nvim command open Neovim again, hopefully without errors this time.

Should errors persist, try :PackerUpdate in neovim and quit / restart.

Plugins

themes

Supporting plugins

Telescope extensions to try

Neovim configurations

Plugin Not used

Using Neovim

Starting Neovim

nvim runs Neovim on the command line and if no files are given as arguments then the startup dashboard is displayed, providing easy access to previously opened files and other common actions.

Neovim startup plugin with dashboard theme

Projects and files

Telescope and project plugin

TODO: configure telescope to respect the global gitignore patterns

Project key bindings - https://github.com/nvim-telescope/telescope-project.nvim#default-mappings-normal-mode

Comments

commentary.vim toggles a comment for lines, visual selections or for motions

gcc comment current line, 4gcc comment current line and next 4 lines

gc comment region or use with motion e.g. gcap comment paragraph,

gc in operator pending mode to target a comment TODO: what is operator pending mode

:7,17Commentary comment a range

:g/TODO/Commentary as part of a :global invocation

gcgc removes comments from a set of adjacent commented lines.

Version Control

Neogit provides a Magit style client.

fugitive package provides a command line experience (no keybinding)

<leader>gs opens Git Status, by running :Neogit

Other commands to map

:Neogit kind=<kind> " override kind
:Neogit cwd=<cwd> " override cwd
:Neogit commit" open commit popup

GitHub interaction

Work with GitHub issues and Pull Requests from the comfort of Neovim.

Requires the GitHub CLI for authentication to GitHub, using a developer personal access token that should be added to your GitHub account

TODO: Review Octo.nvim configuration settings

Command line form: Octo <object> <action> [arguments] - Object, Action and Arguments commands

List issues from current project (optionally add a specific repository)

:Octo issue list

Create a pull requests from current project

:Octo pr create

Add a comment to the current topic (issue/pr)

:Octo comment add
:Octo gist list

Files

init.lua

Wrapper responsible for two things:

fnl/config/init.fnl

In this file among other settings I do set the leader key as space and local-leader as , for the sake of the examples of how use this configuration I will use this as basis for the commands.

fnl/config/plugin.fnl

Here we define the plugins we want packer to download and load for us, we define here a private function called use which will search in the plugin map for the keyword :mod and load the namespace defined in its value.

For example in the line we define that we need telescope we have this map:

  :nvim-telescope/telescope.nvim
  {:requires [:nvim-lua/popup.nvim
              :nvim-lua/plenary.nvim]
   :mod :telescope}

This will state to packer download nvim-telescope/telescope.nvim and all the required plugins in :requires and search for the namespace telescope in file located in the following path fnl/config/plugin/telescope, where I usually add plugin specific configuration like keymaps and settings.

fnl/config/plugin/conjure.fnl

Conjure specifics settings, I like to remap the doc work keymap to be <localleader>K instead the only K, to not conflict with the LSP docs K.

fnl/config/plugin/telescope.fnl

Settings like ignore node_modules and everything in .gitignore to be listed in the file finder. Keymaps:

fnl/config/plugin/treesitter.fnl

Settings to select which treesitter's features we want enabled and which language extension we want to ensure they will be always installed.

fnl/config/plugin/lspconfig.fnl

All about nvim's lsp settings and keymaps.

LSP Configuration

fnl/config/plugin/cmp.fnl

Here settings of which sources we want to show up in the autocomple menu like (conjure, lsp, buffer) and some mapping to navigate in the menu.

fnl/config/plugin/theme.fnl

This configuration uses the Neovim GitHub theme which gives 3 dark and 3 light themes to choose from. Individual colors and styles can be configured to change specific parts of the theme.

The light theme is used by default, with a softer background colour that is slightly red-shifted.

Options are specified in the theme.setup function, where the option names are keywords and the values are strings, boolean or hash-map of more option keywords and values.

(theme.setup {:theme_style "light"
              :colors {:bg "#f8f2e6"}
              :comment_style "italic"})

The colors (Hex values) for each theme are in the github-nvim-theme/lua/github-theme/palette with the overal theme definition in github-nvim-theme/lua/github-theme/theme.lua

fnl/config/plugin/sexp.fnl

Settings for vim-sexp like enabling it for another lisp languages like Fennel and Jannet

fnl/config/plugin/lualine.fnl

Configure the status line (lualine) that shows at the bottom of Neovim, defining colors and elements that appear on that line.

The Neovim GitHub theme includes definitions to set the look of the status line.

Neovim in action

Telescope - Find Files

telescope-find-files <leader>ff

Lsp - Syntax check

lsp-syntax-check <leader>le

Lsp - Go to definition

lsp-go-to-definition gd

Lsp - Document/Signature Help

lsp-document K/<leader>lh

Lsp - Find definition/references

lsp-find-references <leader>lr

Lsp - Formatting

lsp-format <leader>lf

Lsp - Code actions

lsp-code-actions <leader>la

Lsp - Refactorings

lsp-refactorings <leader>la

Lsp - Rename

lsp-rename <leader>ln

Conjure - Eval

conjure-eval <localleader>er

Conjure - Repl

conjure-repl <localleader>lv

Conjure - Document

conjure-document <localleader>K

Completion

auto-complete

Contributing

Please raise an issue for anything other than trivial changes

License

Creative Commons Attribution Share-Alike 4.0 International

Environment variables

:Telescope env list all the environment variables on the operating system, type patters to narrow the list

Getting help

:h menu followed by feature name that help is needed for, e.g. :h conjure

<leader>h/ list and preview help via telescope

Visual select tips

ve select to end of word

Where is

Where is the neovim configuration?

:echo stdpath('config')

Configuration to try

syntax highlight code block in markdown - built-in neovim

-- Give me some fenced codeblock goodness
g.markdown_fenced_languages = { "html", "javascript", "typescript", "css", "scss", "lua", "vim" }

Lets try this with some Clojure code

(def fish "I am a string")

(defn blah
 "doc string"
 [args]
 (map inc args)

😈 cmd + ctrl + spc in Kitty terminal brings up an emoji selector - is this emoji menu MacOS specific ? How to get this on Linux?