Skip to content

Commit

Permalink
docs: Add documentation for vim mode
Browse files Browse the repository at this point in the history
  • Loading branch information
asharkhan3101 committed Dec 16, 2023
1 parent 8ff8d55 commit ce612ac
Show file tree
Hide file tree
Showing 3 changed files with 160 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ tech-doc-hugo
dist/
tmp/
*.lock
.DS_Store
153 changes: 153 additions & 0 deletions content/docs/preferences/code-edit/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,156 @@ You can choose the parentheses to jump out by Tab in the [Parentheses](../langua
When you insert an indent, insert spaces instead of a tab character. The number of spaces is equal to the [Tab Width](#tab-width).

Note that this won't replace the existing tab characters. In [Auto Indent](#auto-indent), the tab characters in the old line will remain in the new line (however, the new indent inserted after `{` will be spaces).

### Enable Vim emulation

If enabled, code editor will emulate vim behaviour. In vim emulation, Control Key such as <kbd>Ctrl+N</kbd> will not be intercepted by CP Editor but by Code Editor. We provide some custom commands that can perform various tasks like opening new tab, running testcases etc. [Here](#custom-vim-commands) is a list of all supported custom vim commands.

### Vim configuration

The configuration to use in vim mode. The list of all supported vim commands are listed [here](../general/\_index.md#vim-commands)

### Vim Commands

#### Supported Features

Most of supported commands can be followed by motion command or executed in visual mode, work with registers or can be prefixed with number of repetitions.

Here is list of emulated commands with description where it can diverge from Vim in functionality.

#### Modes

- normal
- insert and replace
- visual
- command line (`:`)

#### Normal and Visual Modes

- basic movement -- `h`/`j`/`k`/`l`, `<C-U>`, `<C-D>`, `<C-F>`, `<C-B>`, `gg`, `G`, `0`, `^`, `$` etc.
- word movement -- `w`, `e`, `b` etc.
- "inner/a" movement -- `ciw`, `3daw`, `ya{` etc.
- `f`, `t` movement
- `[`, `]` movement
- `{`, `}` -- paragraph movement
- delete/change/yank/paste with register
- undo/redo
- `<C-A>`, `<C-X>` -- increase or decrease number in decimal/octal/hexadecimal format (e.g. `128<C-A>` on or before "0x0ff" changes it to "0x17f")
- `.` -- repeat last change
- `/search`, `?search`, `*`, `#`, `n`, `N` -- most of regular expression syntax used in Vim except `\<` and `\>` just is the same as `\b` in QRegExp
- `@`, `q` (macro recording, execution) -- special keys are saved as `<S-Left>`
- marks
- `gv` -- last visual selection; can differ if text is edited around it
- indentation -- `=`, `<<`, `>>` etc. with movement, count and in visual mode
- "to upper/lower" -- `~`, `gU`, `gu` etc.
- `i`, `a`, `o`, `I`, `A`, `O` -- enter insert mode
- scroll window -- `zt`, `zb`, `zz` etc.
- wrap line movement -- `gj`, `gk`, `g0`, `g^`, `g$`

#### Command Line Mode

- `:map`, `:unmap`, `:inoremap` etc.
- `:source` -- very basic line-by-line sourcing of vimrc files
- `:substitute` -- substitute expression in range
- `:'<,'>!cmd` -- filter through an external command (e.g. sort lines in file with `:%!sort`)
- `:.!cmd` -- insert standard output of an external command
- `:read`
- `:yank`, `:delete`, `:change`
- `:move`, `:join`
- `:20` -- go to address
- `:history`
- `:registers`, `:display`
- `:nohlsearch`
- `:undo`, `:redo`
- `:normal`
- `:<`, `:>`

#### Insert Mode

- `<C-O>` -- execute single command and return to insert mode
- `<C-V>` -- insert raw character
- `<insert>` -- toggle replace mode

#### Options (:set ...)

- `autoindent`
- `clipboard`
- `backspace`
- `expandtab`
- `hlsearch`
- `ignorecase`
- `incsearch`
- `indent`
- `iskeyword`
- `scrolloff`
- `shiftwidth`
- `showcmd`
- `smartcase`
- `smartindent`
- `smarttab`
- `startofline`
- `tabstop`
- `tildeop`
- `wrapscan`

#### Example Vimrc

```vimrc
" highlight matched
set hlsearch
" case insensitive search
set ignorecase
set smartcase
" search while typing
set incsearch
" wrap-around when searching
set wrapscan
" show pressed keys in lower right corner
set showcmd
" tab -> spaces
set expandtab
set tabstop=4
set shiftwidth=4
" keep a 5 line buffer for the cursor from top/bottom of window
set scrolloff=5
" X11 clipboard
set clipboard=unnamed
" use ~ with movement
set tildeop
" mappings
nnoremap ; :
inoremap jj <Esc>
" clear highlighted search term on space
noremap <silent> <Space> :nohls<CR>
" reselect visual block after indent
vnoremap < <gv
vnoremap > >gv
" MOVE LINE/BLOCK
nnoremap <C-S-J> :m+<CR>==
nnoremap <C-S-K> :m-2<CR>==
inoremap <C-S-J> <Esc>:m+<CR>==gi
inoremap <C-S-K> <Esc>:m-2<CR>==gi
vnoremap <C-S-J> :m'>+<CR>gv=gv
vnoremap <C-S-K> :m-2<CR>gv=gv
```

### Custom Vim commands

In this section we present a list of all custom vim commands that are supported to perform different operation in CP Editor.

| Command | Shorthand | Description | Usage |
| :----------: | :-------: | :-----------------------------------------------------------------------------------------------------------------------: | :-------------------------: |
| `new` | `new` | Opens a new tab, if no langauge is specified, a tab in default editor langauge will open | `new cpp` or `new` |
| `open` | `opn` | Opens a new file, Only C++/Java/Python files will be opened. Without arguments it is same as open in Action menu. | `open` or `opn ~/cf/a.cpp` |
| `compile` | `cmp` | Compiles the code, It is like clicking "Compile" button in a tab. | `compile` or `cmp` |
| `crun` | `crn` | Compiles and run, It is like clicking "Compile and Run" button in a tab. | `crun` or `crn` |
| `run` | `run` | Run, if no argument is provided all testcases are ran, otherwise nth testcase is ran. Counting includes hidden testcases. | `run` or `run 2` |
| `drun` | `drn` | Detached run, It is same as clicking "Detached Run" in menu. | `drun` or `drn` |
| `killall` | `kap` | Kill all process, It is same as clicking "Kill Process" in menu | `killall` or `kap` |
| `format` | `fmt` | Format Code, It is same as clicking "Format Code" in menu | `format` or `fmt` |
| `snippet` | `snp` | Open snippet dialog, It is same as clicking "Use Snippets" in menu | `snippet` or `snp` |
| `vmode` | `vmd` | View mode, Changes the view mode. It can only toggle to "edit" and "split" mode | `vmode edit` or `vmd split` |
| `preference` | `prf` | Preferences, It is same as clicking "Preference" in menu | `preference` or `prf` |
| `chlang` | `chl` | Language, It can be used to change the language of a tab. | `chlang cpp` or `chl java` |
| `clear` | `clr` | Clear Message logger text | `clear` or `clr` |
| `exit` | `ext` | Exit, It is same as pressing "Quit" in menu. | `exit` or `ext` |
6 changes: 6 additions & 0 deletions content/docs/tips/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,12 @@ You can use <kbd>Ctlr+Tab</kbd> and <kbd>Ctlr+Shift+Tab</kbd> to go through the

You can set a hotkey for switching view modes in [Preferences](../preferences/key-bindings/\_index.md).

## Vim Emulation

You can enable vim emulation in code editor. Most [basic vim commands](../preferences/code-edit/\_index.md#vim-commands) and some [custom vim commands](../preferences/code-edit/\_index.md#custom-vim-commands) to perform various actions are supported. Many code editor settings like Tab width, Indentation, Current Line Highlight etc are disabled when using vim mode, you have to customize them from [Vim Configuration](../preferences/code-editing/\_index.md#vim-configuration).

You can switch to next or previous tab using `tabn` and `tabp` respectively.

## Launch CP Editor in the command line

CP Editor supports some command-line options, run `cpeditor --help` for more information.
Expand Down

0 comments on commit ce612ac

Please sign in to comment.