# Vim

I'm a big fan of modal editing and specifically Vim.

## Resources

### Videos

* [Derek Wyatt Vim Videos](http://derekwyatt.org/vim/tutorials/) - The first

  time I came across their videos was on global commands - [Globals, Command Line and Functions](https://vimeo.com/15443936).&#x20;

  This is a pretty good video to show some *magic* of Vim and it is very funny to boot! This would be my

  current video of choice to show someone the power of Vim at the hands of an advanced user.
* [Greg Hurrell](https://www.youtube.com/channel/UCXPHFM88IlFn68OmLwtPmZA) - Greg's channel is not exclusively about Vim,&#x20;

  but his channel full of Vim tips and tricks.

## Tips

* Map `CapsLock` to `Esc`
  * In Linux I've used [xmodmap](https://www.x.org/archive/X11R6.8.1/doc/xmodmap.1.html) based method for mapping for this.

    ```
    ! Swap caps lock and escape
    remove Lock = Caps_Lock
    ! keysym Escape = Caps_Lock
    keysym Caps_Lock = Escape
    add Lock = Caps_Lock

    ! Press both Shift keys to get Caps_Lock
    keycode  50 = Shift_L Caps_Lock Shift_L Caps_Lock
    keycode  62 = Shift_R Caps_Lock Shift_R Caps_Lock
    ```
  * On macOS this could be done via settings -

    <https://stackoverflow.com/questions/127591/using-caps-lock-as-esc-in-mac-os-x>.
* Appending result from an external command to the buffer - <https://vim.fandom.com/wiki/Append_output_of_an_external_command>

  `read !<external command>`

  For example, to get CPU info into the current buffer, `read !cat /proc/cpuinfo`.
* Format JSON,
  * with `python` - `:%!python -m json.tool`
  * with `jq` tool - `:%!jq '.'`
* Change `Tabs` to `Spaces` - <https://stackoverflow.com/questions/426963/replace-tabs-with-spaces-in-vim>

  ```
  " settings for tabs
  :set tabstop=2 shiftwidth=2 expandtab
  " convert the existing buffer
  :retab
  ```

  Another option to would be to *reindent* the whole file with `gg=G`.
* Enabling mouse scroll support - <https://stackoverflow.com/questions/7225057/use-mouse-scroll-wheel-in-vim>.

  ```
  set mouse=a
  ```
* Opening files based on a command line search. This is more of a command line tip, but I find this pattern to be quite useful. To open all Dockerfiles in a directory,

  ```
  vim $(fd Dockerfile ~/Code)
  ```

  Another adaptation of this pattern is to use a temporary vim buffer to put the search results and then open files based from buffer contents.

  ```
  fd Dockerfile ~/Code | vim -

  # Then open files one by one based on the contents (which could be empty if
  # the search results are empty). Opening buffers for file locations is a
  # pretty easy in Vim with Vim unimpared commands like `gf` in normal mode
  ```
* Write a file as superuser,

  ```
  :w !sudo tee %
  ```

  How this works - <https://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-sudo-trick-work>.
* [Vim regex](http://vimregex.com/)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.dewaka.com/editors/vim.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
