website
- alt + shift + s (Search) - (note: this is a html
AccessKey
)
ubuntu
- alt + aboveTab (switch to last window)
- ctrl + aboveTab (switch to last workspace)
- like ^ in firefox or alt + tab in Ubuntu
- window mgmt:
wmctrl -l
(list)wmctrl -a window-name
(go to workspace and focus by window name)- map this to alt + shift + 1, 2, 3, etc. (after renaming the windows properly, renaming command: see below)
wmctrl -i -a 0x066f5d24
(go to workspace and focus by window ID)wmctrl -i -a 0x066f5d24 -T "documentation"
(rename)wmctrl -i -a 0x0667167d -T "main-tmux"
(rename)- more complex commands
terminal
- ctrll (clear)
firefox
- ctrl u (view page source code)
Page Info
- ctrli altg (page info)
- ctrli altm (page media)
- ctrli altp (page permissions)
- ctrli alts (page security, cookies, etc)
DevTools
- ctrl + shifti (or F12) (shows the tool that was last opened)
Page Inspector
- ctrl + shiftc (pick element mode)
Web Console
From doc:
The Web Console:
- Logs information associated with a web page: network requests, JavaScript, CSS, security errors and warnings as well as error, warning and informational messages explicitly logged by JavaScript code running in the page context
- Enables you to interact with a web page by executing JavaScript expressions in the context of the page
Shortcuts:
- ctrl + shiftk (console) (click “…” to get side-by-side view)
JavaScript Debugger
React DevTools (Addon)
- only visible on webpages built with React
- beside standard firefox DevTools tabs
- React Components panel
- React Profiler panel
vimium
- T (switch tab)
- click on “vimium button in firefox” → “Options” (to see custom maps)
- yt (duplicate tab)
- gi (jump into the first search box (must be in the view, does not work if you have to scroll the box into the view!))
- gs (view source)
- HL (tabs)
- JK (history)
Textmarker
- Notes:
- Warning: the “x” button deletes the note, use the “-“ button to hide
- sidebar contains useful buttons, eg.
- jump from one highlight to the next/previous
- Notes: if a highlight has a Note attached to it, there is a small white box beside it in the “Marks and Notes” list
- helps to quickly find all existing Notes (without clicking through all of them)
cpp
godbolt
- f1 (command palette)
- ctrlx (cut line)
- ctrld (duplicate line)
markdown
- alti (next
#
) - alto
:LspStop 1 (tailwindcss)
(because the treesitter markdown parser is sufficient)- altf (insert arrow symbol)
vim-markdown
- ge (format a table)
- when the table contains code with a pipe symbol “
|
” this won’t work, but you can use the following workaround:- first escape all pipe symbols with a backslash
\
, but not the|
-symbols of the table - format the table with ge
- manually remove all
\
again
- first escape all pipe symbols with a backslash
- this works only if all rows of the table start with a “
|
“-symbol- you can run something like
:%s/\(^`.*`\s|\)/| \1/g
to reformat all tables in your markdown files, so that ge works
- you can run something like
- when the table contains code with a pipe symbol “
LaTex
- math mode
- altb
- altu
- altt ($[ \text{Let}\ x=\text{number of cats}. ]$)
nvim
Debugging
print(lua-variable)
print'some-string'
Useful Help Pages
:h lua-guide
(basics of lua):h lua-vim-variables
:h highlight-groups
(meaning of each highlight-group, ie. which vim objects each highlight-group affects):h 'runtimepath'
:help lspconfig-all
(lsp server configuration: configuration options for each lsp server):h lspconfig-setup
(lsp server configuration: global)- lua
- lazy
Variables
:echo $SOME_ENV_VAR
(print the value ofSOME_ENV_VAR
):echo g:someGlobalVar
(print the value ofvim.g.someGlobalVar
):echo b:someBufferVar
(print the value ofvim.b.someBufferVar
)- eg.
:echo b:AutoPairs
shows the list of all currently set AutoPairs for the current buffer
- eg.
:set someOption?
(print the value ofsomeOption
):lua =table
(print a lua table)
Options
- list of all options (lua code)
- shows how to set values for options in
init.lua
- shows how to set values for options in
nvim Plugins
Lazy
- plugin spec: list of properties when adding plugins to init.lua
- dev.to
- restore specific plugin to previous state/version
- revert all plugins to previous state/version
:Lazy
(must update regularly)- C (check if a tag exists, after changing
tag =
orversion =
ininit.lua
) :checkhealth
(debug broken plugins, shows a log)- hint: use
:set ft=markdown
for syntax highlighting :checkhealth somePluginName
- hint: use
LSP, Mason
- space ca (apply code fix)
:Mason
(manage all LSPs, DAPs, Linter, Formatter)- install new language servers via
:LspInstall <tab>
:LspInfo
- (Note: die “installierten” server sind in der Zeile ganz unten in der Ansicht! Die server, die oben in der Liste sind, sind die “aktiven” für aktuelle buffer!)
:LspStop serverName
- eg. to stop tailwindcss server for markdown files (→ markdown)
lsp_signature.nvim
- shows the function signature in a floating window while typing
- highlights the current parameter in the signature
- altp (focus the floating window, put the cursor in the floating window)
- altu, altd (while in the floating window: move cursor up/down)
Diagnostics
- definition in neovim doc
- “Nvim provides a framework for displaying errors or warnings from external tools, otherwise known as “diagnostics”. These diagnostics can come from a variety of sources, such as linters or LSP servers. The diagnostic framework is an extension to existing error handling functionality such as the quickfix list.”
- leadere (open floating diagnostic message, useful if you cannot read the inline message)
Formatter
- list
- markdown:
prettier.formatfile
- lua:
:Format
(LSP format buffer) - cpp:
:ClangFormat
(rhysd/vim-clang-format)
- markdown:
- TODO: install conform.nvim
- leaderjkey-for-language
- available formatters:
:ClangFormat
coc-prettier
, github- typical workflow:
- To install prettier in your project and pin its version as recommended, run:
npm install prettier -D --save-exact
- Then, create an empty config file to let editors and other tools know you are using Prettier:
node --eval "fs.writeFileSync('.prettierrc','{}\n')"
- Next, create a .prettierignore file to let the Prettier CLI and editors know which files to not format. Here’s an example:
node --eval "fs.writeFileSync('.prettierignore','# Ignore artifacts:\nbuild\ncoverage\n')"
- Now, format all files with Prettier:
npx prettier . --write
prettier --write .
is great for formatting everything, but for a big project it might take a little while. You may runprettier --write app/
to format a certain directory, orprettier --write app/components/Button.js
to format a certain file.
- To install prettier in your project and pin its version as recommended, run:
- typical workflow:
:Format
, alias forvim.lsp.buf.format()
(defined ininit.lua
)
clang, clangd
- clang is the compiler
- clangd is the language server
clang
compile commands json
- From
:LspInfo
→ press tab:- If
compile_commands.json
lives in a build directory, you should symlink it to the root of your source tree.ln -s /path/to/myproject/build/compile_commands.json /path/to/myproject/
- If
compile flags txt
- doc
- run
:LspRestart
to reload- or: run
:e
to reload
- or: run
- for simple projects (eg. compile one file only):
- create a
compile_flags.txt
- in the folder where the source code is
- eg. with the content
-std=c++20
- create a
Example compile_flags.txt
:
-nostdlibinc
-I/home/bra-ket/osbook/devenv/x86_64-elf/include
-I/home/bra-ket/osbook/devenv/x86_64-elf/include/c++/v1
-I.
-D__ELF__
-D_LIBCPP_HAS_NO_THREADS
-O2
-Wall
-g
--target=x86_64-elf
-fno-exceptions
-ffreestanding
-fno-rtti
-std=c++2a
.clangd (project configuration file, yaml)
- e.g. to suppress
In included file: main file cannot be included recursively when building a preamble
add
Diagnostics:
Suppress: 'pp_including_mainfile_in_preamble'
to .clangd
autocomplete, completion
- see also Help Code, Doc
- 3 popup/drop-down Arten:
- vim builtin completion (sieht so aus wie
completionVorschlag1
) coc.nvim
(sieht so aus wiecompletionVorschlag1 [A]
)nvim-cmp
(sieht so aus wiecompletionVorschlag1 Variable
)
- vim builtin completion (sieht so aus wie
- ctrl y (confirm + replace)
- ctrl e (discard + do not do anything)
- helpful eg. if two conflicting completion popups appear at the same time, ctrl e will switch between these
vim builtin completion
- ctrl n (next suggestion)
- ctrl p (previous suggestion)
- ctrl x followed by ctrl f (Path completion)
- select with ctrl n then press ctrl x followed by ctrl f again to select the next subfolder etc.
nvim-cmp, LuaSnip, friendly-snippets
- das completion popup mit den Kategorien (
Variable
,Function
,Keyword
, usw) in der rechten Spalte (zBcompletionVorschlag1 Variable
,completionVorschlag2 Keyword
,completionVorschlag2 Function
, usw) wird vonnvim-cmp
erzeugt - servers must be added to the LSP server list
local servers = {}
ininit.lua
, otherwisenvim-cmp
will not autocomplete luasnip
(snippet engine):LuaSnipListAvailable
nvim-cmp
requires a snippet engine- tab, shifttab
- select item in drop-down
- if the item is a function a snippet is inserted
- edit next/previous function parameter in the function snippet
- select item in drop-down
- luasnip config: Example-mappings#luasnip
- TODO:
- maybe configure a loader: LuaSnip#add-snippets
friendly-snippets
(snippet collection)- requires
luasnip
- some snippets contained in this collection are disabled by default, but you can enable them
- see tips for using friendly-snippets
- requires
nvim-cmp
steuert scrolling im “documentation preview” popup- press ctrl f to scroll down
- alle key mappings in
.config/nvim/init.lua
beicmp.setup { ..., mapping = ... }
- problem: you cannot jump into the documentation preview window in nvim-cmp (which is important to open links in the documentation preview window, eg. MDN links for JavaScript)
- solution: instead, you can first autocomplete an expression and then press ctrl k or shift k while the cursor is on the completed expression
friendly-snippets
important: Each language has its own Wiki page where you can find all keymaps to trigger the snippets.
Other Tricks:
How to type the following code?:
<div className='wrapper'>
|
</div>
- steps:
- press j and select the “jsx element” snippet
- write
div
into the first jsx tag and press Esc (or jj)- this will write another
div
into the second jsx tag while the cursor remains in its current position
- this will write another
- press a and write
classN
, then press tab to selectclassName?~ Field
, press Enter onclassName?~ Field
- this will put a
className='|'
attribute into the first jsx tag with the cursor positioned in between the single quotes (where the vertical bar|
is)
- this will put a
- write
wrapper
- after typing the last
r
ofwrapper
press ctrlo and then j- this will place the cursor in the middle line between the first and second jsx tag (where the vertical bar
|
is) in insert mode - you can press ctrloj even after just typing
wra
, pressing tab and selectingwrapper
and before pressing Enter onwrapper
in the popup (ie. once you selectwrapper
, the completed wordwrapper
will not disappear when you press ctrloj)
- this will place the cursor in the middle line between the first and second jsx tag (where the vertical bar
coc.nvim
- das completion popup mit den eckigen Klammer Symbolen in der rechten Spalte (zB
completionVorschlag1 [A]
,completionVorschlag2 [B]
, usw) wird voncoc.nvim
erzeugt, wobei jedes eckige Klammer Symbol für jeweils eine “source” steht, die in:CocList
→ “sources” registriert wurde- am besten alle “sources” deregistrieren (über
:CocList
→ “sources”), weil sonst dernvim-cmp
popup und dercoc.nvim
popup manchmal gleichzeitig erscheinen - wobei das source namens
File
nützlich ist (zeigt die files in cwd, wenn man./
typet)
- am besten alle “sources” deregistrieren (über
:CocList
(select “sources” to configure which sources are used for autocompletion):CocConfig
(openscoc-settings.json
where you can configure Coc, eg. you can turn off Coc’s autocompletion by adding"suggest.autoTrigger": "none"
tococ-settings.json
)
nvim-tree
- tricks:
- P (parent directory)
- Ptab (collapse parent)
- f
somepattern
(filter the tree) - - (show more (show parent folder))
- ctrl] (show less (only show the folder on which the cursor is placed, ie. this works only if the cursor is placed on a folder))
- c then p (duplicate file, automatically shows “rename” where you have to choose a new name)
- for Firefox-Bookmarks-like behavior use
init.lua
:on_attach
keymap: bind ctrle toapi.tree.toggle
keymaps.lua
: normal keymap: bind ctrle to:NvimTreeFocus
- alth, altl (focus/unfocus nvim-tree, when nvim-tree open)
- a then put a “/” at the end of the written name (create dir)
- J (jump to last item in folder)
- K (jump to first item in folder)
- i (show gitignored folders and files)
- U (show hidden folders and files)
- q (quit)
- statt netrw
- / (search)
- ctrld (collapse)
- gy (get absolute path)
- Y (get relative path)
toggleterm (for lazygit integration in nvim)
- enter terminal mode: press i
- scroll (= enter normal mode)
- ctrl\ ctrln to exit terminal mode, then you can use vim motions to move around
- scroll with mouse first and then you can use pageUp/pageDown
- press i to enter terminal mode again
- written in lua
- better than floaterm (written in vimscript)
- 1ctrl\, 2ctrl\, 7ctrl\, etc. to create and access terminals
- the prefixed number is the number of the terminal instance
- pressing a non-existent number will create a new terminal
git
gitsigns
This plugin is only active in git-tracked folders. Ie. :map
(and, therefore, space sk) will not show any keymaps related to gitsigns in non-git-tracked folders.
- alt , (next hunk)
- alt . (prev hunk)
- space h b (blame line)
- um schnell herauszufinden in welchem commit die line geaddet wurde
- press the keymap twice to jump into the preview window (useful if you want to copy the commit hash in the preview window in order to see the whole commit)
- diff
- space h d (diff zu letztem commit)
- space h D (diff zu vorletztem commit)
- better use fugitive: space g f (see fugitive)
lazygit
- meaning of keymaps (official doc)
- altenter (when writing a commit message: starts a new line)
- when lazygit spins up the external hard drive so that lazygit lags, open
nvim ~/.config/lazygit/state.yml
and run:g/^-\ \/media/d
to remove all “recent repo” paths to a git repo on the external hard drive - start lazygit
- space gg (for normal repos)
- space gd (for dotfiles repo)
- each panel has its own help menu!
- commands that work in all panels
- R (Refresh the git state (i.e. run
git status
,git branch
, etc in background to update the contents of panels). This does not rungit fetch
.)- does not work in the “branches” panel because “rename branch” is also mapped to R
- W (groß W, diff menu)
- ctrl r (switch repo)
- does not work when a commit is selected during cherry-picking (see commands under “commits” panel)
- @ (focus command log)
- x (help) (ins commit panel und auf x drücken, zeigt zB amend, reset, etc.)
- H, L (scroll left, right)
- praktisch um kleine panels zu lesen, e.g. “commit” panel
- h, l
- switch between the 5 panels (or 12345)
- \[, \]
- tabs sind getrennt durch “-“
- zB “Commit” - “Reflog” sind 2 tabs
- + (rotate through views, zoom-out - not necessary then)
- esc (go back, Achtung: q is for exit lazygit!)
- esc (go back to commit list after seeing a commit’s files)
- pageup/pagedown to scroll the main panel
- ctrl -/+ (zoom out/in, very useful to view the full main panel)
- better: press enter on the file in the “files” panel, then press + to rotate to the view where the file spans the full width of the screen
- R (Refresh the git state (i.e. run
- in “files” panel
- d (git checkout, to discard changes made to a file)
- A (amend)
- erst space und dann A
- in “commits” panel
- ctrls (show commits for a specific file only)
- when you want to see the commits of a deleted file you have to checkout one of the commits before the commit where the file was deleted, then ctrls will work for this file (when you are done, you can checkout
master
in the “branches” panel to get back the latest commits)
- when you want to see the commits of a deleted file you have to checkout one of the commits before the commit where the file was deleted, then ctrls will work for this file (when you are done, you can checkout
- / (search commits, Warning: if a commit message has more than one line the search will only search in the first line of the commit message, doc)
- + (view awesome commit graph, or just to make the commit messages more readable)
- ctrlo (copy commit SHA to clipboard; useful eg. when writing commit messages that refer to other commits)
- um mehr vom file zu sehen:
- im “Commits” panel den commit fokussieren (aber nicht enter drücken) und dann mehrmals \} drücken, sodass am Ende der ganze file sichtbar ist
- better: press enter on the file in the “files” panel, then press + to rotate to the view where the file spans the full width of the screen
- reword commit messages
- R (change multiline commit message)
- r (change commit message)
- cherry-pick
- c (select cherry-pick)
- v (apply cherry-pick to the current branch)
- ctrl r (unselect cherry-pick)
- ctrls (show commits for a specific file only)
- in “stash” panel (first you have to stash changes in the “files” panel)
- space (apply)
- g (pop)
lazygit: Git actions
- scroll
- H / L (left/right) (useful when committing hunks with the “stage individual hunks” function)
- add
- a (git add all)
- space (git add file, press again to undo)
- commit
- c
- push
- P (UPPERcase!)
- pull
- p (lowercase!)
fugitive
- for normal git commands use exclamation mark “
:!git ...
” :G
(former “Gstatus”, press g? to see what you can do):G <tab><tab>
to see available commands:G log
:G shortlog
:Gdiffsplit HEAD~1
(horizontal view):Gvdiffsplit HEAD~1
(vertical view)- space g f
- in the right buffer select the changes you want to add with v and then press dp (so that the changes are added to the left buffer), then
:write
the left buffer to stage (aka git add) these changes, see:h :Gdiffsplit
:Gread %
(git checkout) (use u to undo/go back)
GV
- öffnet sich in neuem Tab, d.h. “H”, “L” um mit aktuellem file zu vergleichen
- space gc (only commits of current file)
- space ga (all commits)
- q (quit)
telescope
'
(prefix'
to the search string to get an exact match instead of a fuzzy match, eg. useful when searching keymaps by writing the key combination):h
(telescope.mappings)- ctrl/ (in insert mode), ? (in normal mode) (show shortcuts)
- spacespace (recent files)
- based on
:oldfiles
(:h :o
)- eg. you can filter the
:oldfiles
list using:filter pattern o
(where:o
is the short version of:oldfiles
, see:h :o
)
- eg. you can filter the
- to remove entries in
:oldfiles
edit the “ShaDa” file using nvimnvim .local/state/nvim/shada/main.shada
(see vi.stackexchange)- eg. you can install
michaeljsmith/vim-indent-object
and then use:g/pattern/norm dai
- note:
nvim
has a different:oldfiles
system thanvim
(see vi.stackexchange) - useful if you accidentally put some files in the
:oldfiles
list that are on an external hard drive (the hard drive has to spin up each time you press this telescope shortcut while the frozen telescope window is blockingnvim
)- in this case you can run
:g/\/media\/bra-ket\/INTENSO\//norm dai
to clear the:oldfiles
list from all entries that are causing this behavior
- in this case you can run
- eg. you can install
- based on
- ignoring files (comment):
- put them in
.ignore
- use the
file_ignore_patterns
telescope option (:h telescope.defaults.file_ignore_patterns
) - use
.gitignore
- put them in
- ctrlt (open file in new tab)
- ctrl-/+ (see more of the preview pane/results pane)
- ctrlu, ctrld (scroll preview up/down)
- spacesk (search keymaps of active plugins, ie keymaps of inactive plugins are not shown)
- spacesa (search autocommands, my own custom autocommands have a
ph_
prefix in theiraugroup
so that I can find them more easily in telescope or via:autocmd ph_<tab>
)- what is augroup?
- better: use
:autocmd ph_<tab>
to find autocommands and their doc (specified in thedesc = "..."
field ofnvim_create_autocmd
)
- space? (recently opened)
- space/ (current buffer find)
treesitter
(note: treesitter highlighting is distinct from the LSP-based “semantic highlighting”)
:set ft=markdown
(enable syntax highlighting for unwritten buffer, ie a “No name
” buffer)- from supported-languages
- to support a specific feature for a specific language requires both
- a parser for that language and
- an appropriate language-specific query file for that feature
:TSInstall parserName
(install a specific parser)- in use:
markdown
,markdown_inline
- in use:
:TSInstallInfo
(list all installed parsers):TSModuleInfo
(colorful overview of installed features:h :TSModuleInfo
):TSUninstall parserName
- to support a specific feature for a specific language requires both
- v multiple times (select nodes, von innen nach außen)
- altv (decrement selection)
- shiftv (“select line” works as usual)
- press ] (next) or [ (previous) to see keybindings
- jumps to
- start of next function/class
- end of next function/class
- jumps to
treesitter-textobjects
- an external plugin for the main treesitter plugin
- if and af (inner/outer function)
- eg. cif to delete the inner part of a function
Aerial
- ToC window mode:
- space bb
- space bt (Telescope Search)
- faster than “bb” for jumping to sections
- also try: ctrln, ctrlp (next / previous section)
- sidebar mode:
- g?
- q
- zM (collapse all)
- ctrlb (fast markdown section select)
Vista (Aerial ist besser!)
- Vista: in “
:h Vista
”: tag:vista-key-mappings
- q (quit)
- p (preview)
vim illuminate
auto-session
- while in the session-lens telescope picker:
- c-s restores the previously opened session. This can give you a nice flow if you’re constantly switching between two projects.
- c-d will delete the currently highlighted session. This makes it easy to keep the session list clean.
- space cs (save session)
nvim Profiling
Try run nvim with nvim -u NONE
. Is it still slow?
Try profiling when inside that file.
:profile start profile.log
:profile func *
:profile file *.
Now start doing what is slow
:profile pause.
Quit vim and open profile.log
.
At the end you should see sum of functions exec times and count of usage. Should point you.
bot summon :help profile
Finding Keymaps
:nmap <some-key>
to list all bindings with<some-key>
- space sk (show keybindings in Telescope)
Understanding Code
Documentation
- LSP Documentation:
- shift k (hover doc, for objects: press when cursor is on object)
- press 2x to jump into def window
- press q to jump out
- ctrl k (function signature doc, for functions: press when cursor inside function brackets)
- press 2x to jump into def window
- press q to jump out
- shift k (hover doc, for objects: press when cursor is on object)
nvim-cmp
documentation preview window- problem: you cannot jump into the documentation preview window in nvim-cmp (which is important to open links in the documentation preview window, eg. MDN links for JavaScript)
- solution: instead, you can first autocomplete an expression and then press ctrl k or shift k while the cursor is on the completed expression
- problem: you cannot jump into the documentation preview window in nvim-cmp (which is important to open links in the documentation preview window, eg. MDN links for JavaScript)
Definitions
- LSP Definitions:
- gd (go to def)
- gr (go to references)
Search for Words
- Search through content of ONE file:
- (symbols: classes, properties, methods)
- space ds (native lsp)
- space bb (aerial)
- space bm (collapse all in aerial)
- space bt (aerial in telescope)
- gr (e.g. cycle through all occurrences of a variable in the file)
- (symbols: classes, properties, methods)
- Search through content of ALL files:
- space sw (search word under cursor; gives the same results as space sg)
- space sg (search by grep all files in cwd)
vim
- ; (undo repeat)
- , (repeat)
- ga (show ascii code of letter under cursor)
custom
-
fc (`keymaps.lua`) -
fi (`init.lua`) -
fp (`plugins/init.lua`)
scroll
- zz (center this line)
motion (in a line)
- fletter,,,, (jump to letter, press , repeatedly to jump to the next letter)
- B (beginning of previous WORD, faster than b)
- E (end of WORD, faster than e)
- gE (end of previous WORD, be does not work if cursor currently in middle of a word)
- ge (end of previous word, be does not work if cursor currently in middle of a word)
- Ea (start writing at end of WORD)
- ea (start writing at end of word)
motion
- search
- shiftN (instead of ? to search backwards)
- g_ (end of line, last non-blank character)
:changes
related motions (jumping between change locations)- g; and g, (jump to previous/next change location)
- blocks
- [% (jump to beginning of block) → alt h
- ]% (jump to end of block) → alt l
- sometimes when there are multiple brackets and parentheses [{ or [( can be faster than [%
- see vi.stackexchange
- % (jump out of parenthesized block to 1st parenthesis)
- %% (jump out of parenthesized block to 2nd parenthesis)
- backtick (list possible jumps and marks)
- backtick . (jump to last change in current buffer)
- m + markLetter (set jump mark)
- backtick + markLetter (jump to mark)
- move
- ), (
- * fwd, # bwd
- markdown sections
- ctrln, ctrlp (next / previous section)
edit
- ctrlr % (in insert mode: insert current file name)
- registers
"
(show all registers)"ry
(yank text to register"r
)"rp
(paste text from register"r
)- record arbitrary normal mode commands:
qa5jq
(q
: start recording into register “a”,5j
: record motion “5j
”,q
: stop recording)"a
(to use the recorded command5j
in normal mode)
- delete
D
(liked$
)ciw
(stattdiwa
,diwi
)de
(stattdw
)0d$
(clear line without deleting it)
- find and replace
:%s///gc
(find and replace in buffer; g for all occurrences; c for confirm):s///gc
(find and replace in one line; g for all occurrences; c for confirm)
- replace one word:
cw
stattdwi<space>
- replace more than one word:
- vt letter, vf letter (if you need to paste) statt ve
- ct letter (change till letter)
- dt letter (delete till letter)
- df letter (delete till and including letter)
- f (“find” in motions)
- t (“till” in motions)
rx
(replace character under cursor withx
, wherex
can be any letter)- less useful:
3rx
(replace the two characters to the right as well)Rxyz Esc
(replace multiple characters withxyz
, where pressingEsc
marks completion andbackspace
acts as an undo)
- less useful:
c
(delete + start insert, aka “change”)C
(delete to EOL + start insert)- selection
u
(lowercase selection) - selection
U
(uppercase selection) ~
(change case of letter under cursor)- A (insert at end of line, besser als $a)
- selection
c"aString"
(replace selection with “aString”) - shiftj (append the line below)
- text objects
- sometimes “word” works, whereas “WORD” doesn’t and vice versa
- W (WORD, delimited by whitespaces)
- w (word, delimited by non-keyword characters, which are configurable)
- iW (inner WORD)
- iw (inner word)
- aw (a word)
- is, as (sentence)
- ip, ap (paragraph)
- overview: text-objects
- cib (change parenthesis block)
- vib (select parenthesis block)
- v2ib (select nested parenthesis block)
- ciB (change curly braces block)
- viB (select curly braces block)
- v2iB (select nested curly braces block)
control
:mes[sages]
(Show all messages.)- ctrlo (temporary normal mode for one command)
:set ft?
(show filetype)- eg. for denylist in vim-illuminate config
- autocomplete
- ctrly (confirm vim-complete)
- ctrlspace (show cmp-complete)
- enter (confirm cmp-complete)
- ctrle (abort complete) (both cmp-complete and vim-complete)
- buffers
:b partialName<tab>
(open buffer):ls
(list buffers)
- sessions
- spacefod (load default session)
- spacefsd (save default session)
- spacefon (load new session)
- spacefsn (save new session)
- tabs
- next tab: gt or ctrlPageDown (by default in vim)
- previous tab: gT or ctrlPageUp (by default in vim)
- last accessed tab: gtab (by default in vim,
:h ctrl-<tab>
) - list tabs:
:tabs
(also shows which ones are modified,:h :tabs
)
- alth and altl (switch viewports)
- to go to
:AerialToggle
and back (Avoid this! Use:AerialNavToggle
(leaderbb) instead!) - to go to nvim-tree and back
- to go to
Edit Code
- space ca (apply code fix)
- space rn (rename a variable)
_
(like^
)[count]_
(1st non-blank charcount-1
lines downward)
- comments
- repeat to uncomment
- line: gcc (or gbc)
- visual selection: gc (or gb)
surround
- dst (delete surrounding tag)
- ds) (delete surrounding parentheses)
- ds” (delete surrounding “)
- ds’ (delete surrounding ‘)
- ysl” (surround letter under cursor)
- vSo (surround letter under cursor)
- ys3iw” (surround ohne select)
- ys3iW” (see word vs WORD)
Troubleshooting
- auto-session errors can often be resolved by simply deleting the session (with ctrld) in the session list (press leaderss) and then restarting nvim