-
Notifications
You must be signed in to change notification settings - Fork 5
vim neovim Notes
- General
- Install Vim & Neovim via brew
- File Structure
- Working with buffers
- Working with autocommands
- Searching for Patterns the platinum searcher
- Working with Cursor color and shape
- Working with Splits
- Working with Italic Fonts
- Working with Sessions and Views
- Python Support
- Working with Cursor color & shape
- Working with Tabs
- Working with wildmenu
- Working with
netrw
- Spell Checking
- Visual Block mode
- Working with Documentation in Vim
- Neovim Profiling
- Vim & Neovim Plugins
- Working with Vimscript
- Troubleshooting
- Useful Links
- TODOs
General π
To toggle / switch a word from UPPERCASE to lowercase in Vim, highlight the word (visual block works) and then from command mode press ~
~
tags shell vim external sh command cmd vim buffer
An external shell command can modify the current contents of a Vim buffer. One such example is working with binary plist files on macOS, as the Info.plist files used to store settings for Xcode.app and Simulator.app are in a binary plist format.
To convert a binary plist file to a readable XML format from a CLI
plutil -convert xml1 /path/to/binary.plist
To convert a XML formatted plist file to binary using a CLI
plutil -convert binary1 /path/to/xml.plist
The above plutil -convert xml1 can be applied to the contents of a vim buffer thus allowing to properly modify the contents of a plist file that was saved in a binary format.
:%! plutil -convert xml1 /path/to/binary.plist
I experienced complications in converting an XML plist file back to binary from within vim so I converted it back to binary via a shell.
see for more detailed / automated process of working with binary plist files using Vim.
Command mode in Vim does not use typical normal mode movement motions in Vim, however to delete the previous word under the cursor in command mode
:control + w
For more command mode shortcuts see or,
:help ex-edit-index
has()
checks for features
To get a list of features supported by Vim or Neovim
:h feature-list
That said, mkview
is a command, and not a feature.
To check if Vim or Neovim suports a command in a Vimscript file, ie. .vim
exists(':mr42fancy') == 2
2
will do an exact literal string match formr42fancy
.
To print a statement to messages
echom 'mr fancy message'
To clear messages in Vim / Neovim
The below command requires Vim 7.4.1735
:messages clear
To set the syntax highlighting for a specific file, using a specific formatting
:set syntax=[LANGUAGE]
Ex
To set the stynax for a .babelrc file
:set syntax=json
To write to or save a file opened in Vim or Neovim without having proper permissions, ie. super user perms
:w !sudo tee > /dev/null %
For a deeper understanding of what the above command is doing see
To adjust the indentation of a particular line within a file
>>
To auto indent a line in vim
==
To paste code from the clipboard with indentation
:set paste
Installing Vim using Linuxbrew clipboard support π
To get clipboard support working with Vim when installing Vim 8.x on Debian, make sure the following dependencies have been installed.
libx11-dev
libxtst-dev
apt-get install libx11-dev libxtst-dev
If Vim has already been installed via brew it can be reinstalled,
brew -v reinstall --build-from-source --with-client-server vim
To test if xclip
is working within a remote ssh session
echo "copy me" | xclip -selection clipboard
To print all variables and variable values ie. python_host_prog
assigned within Vim or Neovim
:let
To copy all lines of an open buffer to the system clipboard
:%y+
To display a list of commands in Vim or Neovim
:Commands
To display the decimal, octal, and hex representation of a character in Vim
g + a
To repeat the previous command or last operation
.
To show the current running version of Vim or Neovim
:version
To reload the current buffer
:edit
or
:source %
To start Vim or Neovim without loading a .vimrc
configuration file
vim -u NONE
File Structure General π
To override default settings for specific filetypes use the after
directory located within $HOME/.vim
, ie. for specific settings related to python
$HOME/.vim/after/ftplugin/python.vim
Vim and Neovim allow creating a new file / buffer within a directory that does not yet exist, so it can become problematic to save the newly created file / buffer to disk if the containing directory doesn't exist on the file system.
To work around the above mentioned scenario use the key binding within mappings.vim file present within this dotfiles repo.
leader mkd
or run the below command from within Vim
!mkdir -p %:p:h
To get a high level overview of settings in Vim & Neovim
:browse options
To print out all the options / settings enbabled for the active buffer
:browse set
To check and see if python 3 support is working with Neovim
:echo has('python3')
To check to see if Vim or Neovim was compiled with a specific setting
:echo has('[mr-fancy-setting]')
ie.
:echo has('clipboard')
To check and see which particular clipboard is being used, ie. unnamed
or unnamedplus
:set clipboard?
For more information see:
:h version
:h has(
:h feature-list
To toggle VISUAL
mode
v
To toggle invisible characters
:set list!
To exit PASTE
mode
:set nopaste
To change the mode to visual-block or v-block
control+v
To switch between an open and closing parentheses (
or curly brace {
press % in NORMAL
mode.
To inspect the runtimepath
:set rtp?
To print a list of all scripts in the order in which they were loading at runtime
:scriptnames
To print the current working directory
:pwd
To change the local working directory
:lcd
To print the $VIMRUNTIME
path
echo $VIMRUNTIME
To redraw the UI elements, ie. User Interface
control + l
βοΈ If control+l has been remapped the Vim command can be manually invoked with
:redraw!
To print / return the value of a setting
:set option?
ie.
:set autoindent?
To see where a particular setting is being set ie. which file and line is issuing the setting.
:verbose set option?
ie.
:verbose set termguicolors?
To display the current key mappings for normal, visual, insert
:nmap
:vmap
:imap
To display all key mappings within a Neovim session
:map
To display a value of an environment variable within a Neovim session
:echo [$MR_FANCY_ENV_VAR_01, $MR_FANCY_ENV_VAR_02]
ie. to display the values of the below environment variables within Neovim
:echo [$LANG, $LC_CTYPE, $LC_ALL]
Working with buffers π
To reload all buffers, ie. will update code folds when new ones are added
:bufdo e
To display a list of open buffers
:ls
To switch to the previous buffer
:bp
To switch to the new buffer
:bN
Working with autocommands, ie. autocmd
π
Protip when working with autocommands, and expiermenting with new features in .vimrc
or init.vim
make certain to enclose autocmd!
within an augroup
block or the autocmd!
will be reloaded, and NOT flush out the previously defined autocmd!
, thus slowing Vim & Neovim exponentially with each reload of a configuration file.
A proper way to define autocommands within a .vimrc
augroup customColorscheme
" Clear the group
autocmd!
autocmd ColorScheme * call CustomHighlights()
augroup END
Searching For Patterns the_platinum_searcher π
To search for a pattern within all text or source code files within the current working directory
pt [mr-fancy-expression-to-search-for]
The above command is quite useful for finding syntax errors that are scattered through a directory structure, and the specific file / line is not specified within standard error output.
Working with Cursor color and shape π
Working with Splits π
Vim can create horizontal & vertical splits within a Vim session, ie. think how panes split the current window in tmux.
To create a vertical split within Vim
:vsplit
To create a horizontal split using a Vim command
:split
The above split commands will create a split, ie. a new buffer with the file from the previous buffer in the new split.
To create a horizontal split without the previous open buffers from the prior window
:sp 0
The above command will create a horizontal split with a buffer named 0 however the previously open buffer in the previos window will not be shown in the new split. Also, a split can also be created by specifying a path to a different file.
Ex
:sp ./path/to/README.md
With my current Vim configuration a horizontal split be created below the current buffer with the README.md file contained within the split.
To create a vertical split using key bindings
control + W then v
To create a horizontal split using key bindings
control + W then S
Yes, that is a capital S and not a lower case s
To close all splits other than the active split / window
:on
:on
is short for:only
Buffers can be accessed across multiple splits. π€
To learn more about using splits within Vim
:h opening-window
Working with Italic fonts π
- First, make sure the terminal can support italics
echo -e "\e[3m foo \e[23m"
To get italic code comments working with Neovim the below line is required π
highlight Comment gui=italic
- Credit: StackOverflow Franey's comment
Working with Sessions and Views π
TL;DR
- session files can store the state of all open buffers and much more.
- views can store the state of code folds and cursor position within a buffer.
:h sessionoptions
:h viewoptions
Working with Sessions and Views Manually Invoking π
To manually create a session file for the current Vim session
:mks ~/.vim/tmp/sessions/[mr-fancy-session.vim]
To manually load / restore from a session file
:source /path/to/[mr-fancy-session.vim
To manually create a view file that preserves code fold for the current session
:mkview ~/.vim/tmp/views/[mr-fancy-view.vim]
If an existing
session.vim
orview.vim
file exists use the!
option to replace the existing file
ie.
To update a session file
:mks! ~/.vim/tmp/sessions/[mr-fancy-session.vim]
To install universal-ctags on macOS
brew install --HEAD universal-ctags/universal-ctags/universal-ctags
Polluting a git repo with a tags file isn't exactly the most kosher π· thang. That said, a tags file can be generated for a git repo and stored within the .git directory of the repo, and should not get checked into source control, and one shouldn't have to get on their soap box π¦ to get a PR merged for updating a .gitignore file is a popular repo, ...pretty much a bipartisan tags file for a popular project.
To generate a tags file for a git repo and store the tags file within the .git directory.
cd /path/to/git/repo/root
ctags -R -f ./.git/tags .
For more details regarding ctags
:help tags
:help CTRL-]
Python Support π
Python Support anaconda π
To uninstall anaconda on macOS follow the instructions provided by the below link. Official anaconda uninstall
Python Support Setting Up Python 2/3 π
π¨ Make certain that a Homebrew or Linuxbrew python is not in the
$PATH
when trying to install a particular version of Python usingpyenv
, especially on a Linux box.
To setup different versions of Python for a particular user, use pyenv
pyenv can be installed via homebrew or cloning the github repo
pyenv/pyenv
I chose the latter because I was running into issues using the homebrew version of pyenv.
To install pyenv on macOS
git clone https://github.com/pyenv/pyenv $code/python/pyenv
To update the list of available pythons to install as well as pulling the latest version of pyenv itself
cd $PYENV_ROOT; git pull
To get virtualenv support with python install pyenv-virtualenv
git clone https://github.com/pyenv/pyenv-virtualenv $PYENV_ROOT/plugins/pyenv-virtualenv
Once those two packages have been installed, one can begin installing different versions of python.
On Debian some additional packages will need to be installed in order for python 2.7.X to be installed, ie.
libbz2-dev
To get verbose output when building python using pyenv
pyenv install -v 2.7.15
To setup a virtualenv named py2neovim for the python-neovim
provider packages
pyenv virtualenv 2.7.15 py2neovim
To activate the neovim2 virtual environment
pyenv activate py2neovim
To install the neovim python module for Neovim within the neovim2 virtualenv
pip install neovim
To upgrade the neovim provider package if it just needs updating
pip install --upgrade neovim
To upgrade the pip package manager itself
pip install --upgrade pip
The above command
pip install neovim
works for both neovim2 and neovim3 virtual environments.
To print the path for the python executable for the neovim2 env
pyenv which python
π¨ when providing the path for the python executable in
init.vim
MAKE CERTAIN to use the full path, ie. DO NOT use the$HOME
env var or else:checkhealth
will fail.
Add the above python path to init.vim
To activate the py2neovim virtualenv
pyenv activate py2neovim
To exit out of either virtualenv
pyenv deactivate
To remove a virtualenv created with pyenv
and pyenv-virtualenv
pyenv uninstall [name-of-virtualenv]
To check and see if vim is compiled with either python2 or python3 support
:version
Neovim does not provide a way to compile in Python support because it is automatically compile in no matter what.
To get detailed help information about the python providers for Neovim, and the below command is worth it's weight in π₯
:help provider-python
Vim only supports python 2 or python 3, but not both at the same time.
Neovim can support both Python 2 and Python 3 at the same time.
To check and see if Neovim supports Python 3
:py3 print('hello')
To check and verify Python 2.x is working
:python print('hello')
Useful Links Python Support π
Working with Tabs π
Each vim tab contains it's own unique splits. Think of a tab in Vim as a window in tmux.
To create a new tab within a Vim session
:tabnew
To focus on the next tab
g+t
To focus on the previous tab
g+T
To move to the next tab
g+t
To move to the previous tab
g+T
Working with wildmenu π
When the wildmenu is present for navigating between files and one wants to cd
into a directory use the β down arrow on the keypad to go into the selected directory.
Working with netrw
ie. file explorer π
To toggle a vertical file explorer, ie. netrw
to left of the current buffer
:Vex
To create a new file within the current working directory followed by a filename
:% [FILENAME]
To create a new directory using netrw
d
To rename the current highlighted directory using netrw
R
To close a netrw
buffer,
- find the buffer number with
:ls
- close the buffer with
:bd[#]
, ie.:bd42
Spell Checking π
To enable spell checking in vim
set spell
A dictionary file may need to be downloaded before spell checking can be enabled.
To add a "misspelled" word to a local dictionary file
z then g
To remove a "misspelled" word from a local dictionary file
z then w
To correct a misspelled word
z + =
The above commands must be run from command or normal mode
Visual Block Mode π
To insert into visual block mode
ctrl+v
Then select which lines you would like the repeated text to appear on.
Then go into visual insert mode
with shift+i
Then type out what you want repeated and it will appear in the buffer after exiting insert mode.
When working in visual block mode
to toggle between opposing corners when drawing a rectangular region.
o
Working with Documentation in Vim π
To launch the help system within nvim
:help
To generate documentation for installed plugins
:helptags ALL
Neovim Profiling π
To record verbose startup time of Vim or Neovim into a file
nvim --startuptime /tmp/nvim.log
Vim & Neovim Plugins π
To print all loaded vim scripts on a separate line
:scriptnames
minpac builds on top Vim's job-control features introduced in Vim 8.
To print or view a log of messages from running PackUpdate
:messages
To remove a plugin installed with minpac
-
Remove the
call minpac#add('author/plugin-name')
from your.vimrc
-
Save the
.vimrc
-
Source the file
source %
- Then invoke the
clean
function from minpac
call minpac#clean()
I wrote a custom minpac binding to invoke the
clean
function, see below.
:PackClean
Minpac stores plugins downloaded from git repositories in the following directories
$dots/editors/vim/vim/pack/minpac/start
or
$HOME/.vim/pack/minpac/start/
To generate help tag files for plugins maintained by minpac
helptags ALL
When running minpac#update() tag files will be (re)generated.
Working with Conqure of Completion
coc is a great Neovim plugin for managing language support for code completion. See my vimrc file for how I setup coc. I also installed denite.nvim for managing extensions installed via coc.
To list installed coc extensions using denite
Denite coc-extension
coc extensions can be installed, uninstalled, and toggled using denite
Personally I use coc-html, coc-css, coc-json, and coc-tsserver for doing web development with Neovim.
Another way to list installed coc extensions
cat ~/.config/coc/extensions/package.json
Packages can me added and removed by manually editing the above package.json file using yarn if using denite is not preferred, or they call be installed via Neovim by running;
CocInstall [PLUGIN_NAME]
Ex
CocInstall coc-html coc-css coc-json
Another alternative way to remove a COC extension is to call CocAction
:call CocAction('uninstallExtension', 'EXTENSION_NAME')
When updating Coc using the below commands
:PackClean
:PackUpdate
It may be required to reinstall / build Coc after the update.
:call BuildCoc()
π¨ If Neovim python modules have been updating in a virtualenv because :CheckHealth
reported that they were outdated, then Coc will have to be reinstalled / built again.
The error message I was seeing after updating the python provider packages for Neovim was
no matching autocommands
Working with ALE Asynchronous Lint Engine
ALE can operate as a linter, and a Language Server Protocol client
Working with fzf
in Vim & Neovim π
TODO flesh out commands that can be used with fzf
and Vim to search for specific contents within a project, ie. the source files that comprise a project.
In the meantime, use the_platinum_searcher to search for specific terms within source files, ie.
To search for a miss spelling of PropTypes
within a React project
pt ProTypes
The above command will search through an entire project for ProTypes and print the offending file along with the line number of the error on STDOUT.
When using ctrl + p fzf prints the file names realitve to the cwd within in Vim.
Working with Vimscript π
To get help writing Vimscript
:help usr_40.txt
:help function-list
To do string equality on a variable using Vimscript
if actor ==? 'Michael Keaton'
echom 'I am Batman!'
else
echom 'No sir ree bob'
endif
==? performs case insensitive pattern matching ==# performs case sensitive pattern matching
When writing a function in Vimscript make sure the function name begins with a captial letter.
function MrFancyFucntion()
echo "Hey, There"
endfunction
Find and Replace π
To replace mr-fancy
with mr-fancy-pants
:s/mr-fancy/mr-fancy-pants
To replace all occurrences of mr-fancy
with mr-fancy-pants
:s/mr-fancy/mr-fancy-pants/g
Useful Links Vimscript π
Writing Custom Code Folds π
To get the current fold method being used in a vim buffer
:set foldmethod?
If the fold method is set to expr
:set foldexpr?
will print the current expr
To print the current fold expression for a particular file / buffer
:set foldexpr?
To get native vim help for fold expressions
:help fold-expr
To expand all code folds z+shift then R
To collapse all code folds z+shift then m
Useful Links Code Folds π
- vimcasts.org setup custom markdown code folding expr
- YouTube wincent
- stackexchange.com code folding
- learnvimscriptthehardway Advanced Folding
Troubleshooting π
If Vim or Neovim is getting sluggish when starting up, profile the start time
vim --startuptime ~/logs/nvim-boot-time.log
To see an example of bad or good startup time & performance
πΈ βοΈ Profiling startup time
If you find any of this info helpful on your journey π click that π βοΈ star button. It sure makes me feel warm and fuzzy π» on the inside.
-
Linux and macOS Operation Notes
- β macOS Op Notes
- π§ Linux Op Notes
- Vim & Neovim Notes
- git Notes
- π fish shell Notes
- ECMAScript Tooling
- π₯§ Raspberry Pi Notes
- asdf version manager Notes
- Bind9 Notes
- Creating a custom motd on Debian Jessie
- ECMAScript Tooling
- Email client Notes
- Email Server Setup Notes Postfix & Dovecot
- Emoji side quest
- fish shell Notes
- π₯ π€ git it got it good Notes
- git Notes
- Graphics and Image Processing Notes
- GUI text editor Notes
- π»π§ Homebrew and Linuxbrew formula Notes
- Linux and macOS Administration Notes
- Linux and macOS Troubleshooting Notes
- MacBook Pro Late 2013 Notes
- Vim & Neovim Notes
- Video Production Notes
- Python Notes
- radare Notes
- Raspberry Pi Notes
- Terminal Emulators
- Tmux Notes
- Web Browser Notes
- Weechat Notes
- Microsoft Windows Notes