Syntax highlighting of a514140 ~( vim)

[TOC]

# Links

https://danielmiessler.com/study/vim/#gs.Xg9jNGw

https://www.labnol.org/internet/learning-vim-for-beginners/28820/

[Шпаргалка](https://eax.me/vim-commands/)

[VimCasts](http://vimcasts.org/)

https://gist.github.com/theotherzach/5033931

[Эффективное использование Vim](https://habr.com/post/131951/)

[Минимум один трюк Vim, про который вы не знали](https://habr.com/ru/post/454742/)

# Recipes

```vim
" spaces to tabs
%!unexpand -t 2 --first-only
" tabs to spaces
set tabstop=2 shiftwidth=2 expandtab
:retab
" объединяем строки через запятую или запятую с пробелом
" https://vi.stackexchange.com/a/4149/26373
:'<,'>s/\n/,/
:'<,'>s/\n/, /

" Rails.vim - кандидат на альтернативный файл
" можно использовать для создания нового файла
:echo rails#buffer().alternate_candidates()
```
```bash
# --- vim as default editor
sudo update-alternatives --config editor
```

# .gitignore

```
# Swap
[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]

# Session
Session.vim
Sessionx.vim

# Temporary
.netrwhist
*~
# Auto-generated tag files
tags
# Persistent undo
[._]*.un~
```


# Commands


## View 

Command (via :set) | Description
---|---
`cursorline` | подсветка текущей строки
`hls` | Подсветка поискового запроса
`list` | Отображение непечатных символов
`number` | отображение номеров строк


## Buffer Navi 

Command | Decsription
---|---
NORM|
`:Exp` | Эксплоер
<kbd>+</kbd> | На первый символ следущей строки
<kbd>-</kbd> | На первый символ предыдущей строки
<kbd>Ctrl</kbd>+<kbd>g</kbd> | Отображение информации о текущем расположении курсора
<kbd>Ctrl</kbd>+<kbd>e</kbd> | Прокручивание на одну строку вниз
<kbd>Ctrl</kbd>+<kbd>y</kbd> | Прокручивание на одну строку вверх
<kbd>Ctrl</kbd>+<kbd>d</kbd> | Вниз на полстраницы
<kbd>Ctrl</kbd>+<kbd>u</kbd> | Вверх на полстраницы
<kbd>Ctrl</kbd>+<kbd>f</kbd> | Вниз на страницу
<kbd>Ctrl</kbd>+<kbd>b</kbd> | Вверх на страницу
<kbd>Ctrl</kbd>+<kbd>o</kbd> | Перейти на предыдущую позицию в истории переходов
<kbd>Ctrl</kbd>+<kbd>i</kbd> | Перейти на следующую позицию в истории переходов
<kbd>Ctrl</kbd>+<kbd>j</kbd> | Перейти по гиперссылке
<kbd>Ctrl</kbd>+<kbd>t</kbd> | Перейти назад по истории переходов по гиперссылкам
`:e %:h/filename` | Открыть (создать) файл *filename* в текущей директории


## Clipboard

Command | Decsription
---|---
<kbd>p</kbd> | вставляем из буфера после курсора
<kbd>P</kbd> | (заглавная p) вставляем из буфера перед курсором
<kbd>y</kbd><kbd>y</kbd><kbd>p</kbd> или <kbd>Y</kbd><kbd>p</kbd> | Дублировать строку
<kbd>"</kbd><kbd>a</kbd><kbd>y</kbd> | Скопировать текст в буффер `a`
<kbd>"</kbd><kbd>a</kbd><kbd>p</kbd> | Вставить текст из буффера `a`
<kbd>"</kbd><kbd>+</kbd><kbd>y</kbd> | Копировать в системный буфер обмена

## Editing

Command | Decsription
---|---
<kbd>i</kbd> | Переход в режим редактирования. Курсор остается на месте
<kbd>I</kbd> | Заглавная `i`. Переход в режим редактирования. Курсор переходит в начало строки.
<kbd>a</kbd> | Переход в режим редактирования. Курсор переходит на следующий символ.
<kbd>A</kbd> | Переход в режим редактирования. Курсор переходит в конец строки.
<kbd>o</kbd> | Переход в режим редактирования с созданием пустой строки ниже. Курсор переходит на новую строку.
<kbd>O</kbd> | Заглавная `o`. Переход в режим редактирования с созданием пустой строки выше. Курсор переходит на новую строку.
<kbd>s</kbd> | Переход в режим редактирования с удалением текущего символа.
<kbd>N</kbd><kbd>s</kbd> | Удаление N-символов и переход в режим редактирования
<kbd>S</kbd> | Переход в режим редактирования с удалением строки.
<kbd>r</kbd><kbd>x</kbd> | Заменить символ под курсором на символ `x`
`R` | Переход в режим замены
<kbd>c</kbd><kbd>c</kbd> | Удаление строки, переход в режим редактирования и отступ
<kbd>c</kbd><kbd>$</kbd> | Удаление от курсора до конца строки и переход в режим редактирования
<kbd>c</kbd><kbd>e</kbd> | Удаление символов от курсора до конца слова и переход в режим редактирования
<kbd>d</kbd><kbd>i</kbd><kbd>)</kbd> | Удаление символов между скобками
<kbd>d</kbd><kbd>i</kbd><kbd>"</kbd> | Удаление символов между кавычками
<kbd>d</kbd><kbd>d</kbd><kbd>p</kbd> | Удаление строки и вставка ее ниже следующей (смена строк)
<kbd>u</kbd> | Отмена изменений, сделанных крайней командой
<kbd>U</kbd> | (заглавная `u`) Отмена крайних изменений в строке

## Find

Command | Description
---|---
<kbd>f</kbd><kbd>x</kbd> |Поиск далее по строке символа x 
<kbd>2</kbd><kbd>f</kbd><kbd>x</kbd>  | Поиск второго символа `х` в строке
<kbd>t</kbd><kbd>x</kbd> | Поиск далее по строке символа `x`x с установкой курсора перед ним
<kbd>F</kbd><kbd>x</kbd> | Поиск назад по строке символа x 
<kbd>T</kbd><kbd>x</kbd> | Поиск назад по строке символа x с установкой курсора перед ним
<kbd>*</kbd> | Поиск всех вхождений слова под курсором
<kbd>#</kbd> | Поиск всех вхождений слова под курсором (в обратном направлении)
`/text` | Поиск
`?text` | Поиск в обратном направлении
<kbd>n</kbd> | Переход к следующему совпадению 
<kbd>N</kbd> | Переход к предыдущему совпадению

## Visual Mode

Command | Description
---|---
<kbd>v</kbd> | включаем визуальный режим
<kbd>V</kbd> | строчное выделение
<kbd>y</kbd> | копируем выделенное
<kbd>d</kbd> | вырезаем выделенное
<kbd>u</kbd> | преобразование в нижний регистр

## Windows

Command | Description
---|---
<kbd>Ctrl</kbd>+<kbd>g</kbd> | Отображение информации о позиции в файле
<kbd>Ctrl</kbd>+<kbd>w</kbd><kbd>r</kbd> | поменять местами компоновку
<kbd>Ctrl</kbd>+<kbd>w</kbd><kbd>w</kbd> | переключение курсора между буферами компоновки
<kbd>Ctrl</kbd>+<kbd>w</kbd><kbd>_</kbd> | максимизировать окно
<kbd>Ctrl</kbd>+<kbd>w</kbd><kbd>=</kbd> | выровнять окна
<kbd>Ctrl</kbd>+<kbd>w</kbd><kbd>c</kbd> | закрыть текущее окно
<kbd>Ctrl</kbd>+<kbd>w</kbd><kbd>H</kbd> | переключение горизонтальной в вертикальную компоновку
<kbd>Ctrl</kbd>+<kbd>w</kbd><kbd>J</kbd> | переключение вертикальной в горизонтальную компоновку

## Tabs

[link](http://vim.wikia.com/wiki/Using_tab_pages)

Command | Description
---|---
`$vim -p file1 file2` | открываем vim с вкладками
`:tabn file3` | открываем файл file3 в новой вкладке
`:tabf index*` | открываем файл с шаблону имени
`:tabn` (или <kbd>g</kbd><kbd>t</kbd>) | следующая вкладка 
<kbd>g</kbd><kbd>T</kbd> | предыдущая вкладка
<kbd>i</kbd><kbd>g</kbd><kbd>t</kbd> | перейти на i-ую вкладку
`:tabfirst` | первая вкладка
`:tablast` | последняя вкладка
`:tabs` | список вкладок
`:tabm X`  | перемещаем текущую вкладку на позицию Х+1
`:tabclose`<br>`:q` |  закрываем текущую вкладку
`:tabclose i` | закрываем i-ую вкладку
`:tabonly` | закрываем все вкладки кроме текущей


## Reduce & Expand

Command | Decsription
---|---
<kbd>z</kbd><kbd>c</kbd> | свернуть блок
<kbd>z</kbd><kbd>o</kbd> | развернуть блок
<kbd>z</kbd><kbd>M</kbd> | свернуть все блоки
<kbd>z</kbd><kbd>R</kbd> | развернуть все блоки
<kbd>z</kbd><kbd>a</kbd> | инвертировать свернутые блоки


## Macros

Command | Decsription
---|---
<kbd>q</kbd><kbd>a</kbd> | Старт записи макроса `a`.
<kbd>q</kbd> | остановка записи макроса.
<kbd>@</kbd><kbd>a</kbd> | Вызов макроса `a`
<kbd>n</kbd><kbd>@</kbd><kbd>a</kbd> | исполнение макроса n-раз

## Marks

Command | Decsription
---|---
<kbd>m</kbd><kbd>a</kbd> | Установка метки `a`.
<kbd>'</kbd><kbd>a</kbd> | переход на метку `a`
<kbd>d</kbd><kbd>'</kbd><kbd>a</kbd> | удалить всё до метки `a`
`:marks` | Отображение меток
`:delm!` | Удаление всех меток в нижнем регистре

## Commentary

[commentary.vim](https://github.com/tpope/vim-commentary) - плагин для комментариев

Command | Description
---|---
NORM |
<kbd>g</kbd><kbd>c</kbd><kbd>c</kbd> | комментирование строки
<kbd>N</kbd><kbd>g</kbd><kbd>c</kbd><kbd>c</kbd> | Комментирование *N* строк
<kbd>g</kbd><kbd>c</kbd><kbd>}</kbd> | Комментировать до конца параграфа
<kbd>g</kbd><kbd>c</kbd><kbd>{</kbd> | Комментировать до начала параграфа
<kbd>g</kbd><kbd>c</kbd><kbd>N</kbd><kbd>k</kbd> | Комментировать N строк вверх
`:X,YCommentary` | Коментирование строк X-Y





## Surround

[vim-surround](https://github.com/tpope/vim-surround) - оборачивание текста в кавычки и скобки

[Документация](https://github.com/tpope/vim-surround/blob/master/doc/surround.txt)

Command | Description
---|---
&nbsp; | Normal Mode
<kbd>d</kbd><kbd>s</kbd><kbd>'</kbd> | Удаление одинарных кавычек
<kbd>d</kbd><kbd>s</kbd><kbd>"</kbd> | Удаление двойных кавычек
<kbd>c</kbd><kbd>s</kbd><kbd>"</kbd><kbd>'</kbd> | Замена двойных кавычек на одинарные
&nbsp; | Visual Mode
<kbd>S</kbd><kbd>'</kbd> | оборачивание выделенного текста в одинарные кавычки
<kbd>S</kbd><kbd>"</kbd> | оборачивание выделенного текста в двойные кавычки

## FZF

https://github.com/junegunn/fzf

```bash
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

cd ~/.vim-config/.vim/bundle
git clone https://github.com/junegunn/fzf
```
.vimrc
```vim
" --- open zfz on Ctrl + P
nnoremap <C-p> :<C-u>FZF<CR>
```

Command | Decsription
---|---
<kbd>Ctrl</kbd>+<kbd>p</kbd> | Включение режима zfz
<kbd>Ctrl</kbd>+<kbd>c</kbd> | Отключение режима zfz
<kbd>Ctrl</kbd>+<kbd>j</kbd> or <kbd>Down</kbd> | Выделение вниз
<kbd>Ctrl</kbd>+<kbd>k</kbd> or <kbd>Up</kbd> | Выделение вверх
<kbd>Ctrl</kbd>+<kbd>x</kbd> | Открыть выделенный файл с горизонтальным разделением
<kbd>Ctrl</kbd>+<kbd>v</kbd> | Открыть выделенный файл с вертикальным разделением
<kbd>Ctrl</kbd>+<kbd>t</kbd> | Открыть выделенный файл новой вкладке

## Grep

Command | Decsription
---|---
`:vimgrep QUERY dir/**` | Поиск строки QUERY в файлах директории dir/

## Quickfix

Command | Decsription
---|---
`:copen` | Open the quickfix window
`:ccl` | Close window
`:cw` | Open it if there are "errors", close it otherwise (some people prefer this)
`:cn` | Go to the next error in the window
`:cp` | Go to previous
`:cnf` | Go to the first error in the next file

## Bash

Command | Decsription
---|---
`:!cmd` | Выполнить bash-команду `cmd` 
`:!motionCMD` | Фильтрация строк, попадающих под *motion*,  bash-командой *CMD*. Например, `!10Gsort` - сортировка строк между текущей и 10й bash-командой *sort*
`:!` | Выполнить пустую команду (отобразить предыдущий вывод)
`:.!cmd` | Выполнение bash-команды *cmd* и вставка стандартного вывода в текущую строку. Пример: `:.!date`

## Terminal

Команда `:term` включает терминал с горизонтальным разделением.

Переход между терминалом и редактором <kbd>Ctrl</kbd><kbd>w</kbd>+<kbd>w</kbd>

В терминале переход в режим просмотра комбинацией <kbd>Ctrl</kbd><kbd>w</kbd>+<kbd>N</kbd>

Выход из режима просмотра <kbd>i</kbd> или <kbd>a</kbd>

## Misc

Command | Decsription
---|---
NORM|
`:set paste` | Режим "вклейки". Текст вставляется "как есть", без автоотсутпов
`:set nopaste` | Отключение режима "вклейки"
`:set autowrite` | Автоматическая запись при переходе к другому файлу.
INSERT|
`C-R "` | Вставить текст, скопированный yank
`ccl` | Скрыть список быстрых исправлений
`C-K AB` | Вставка символа из таблицы символов, `AB` комбинация из таблицы `:digraphs`
`:retab` | Изменить режим отступов в соответствии с текущими настройками

Трансляция кириллицы в латиницу. Позволяет выполнять команды в кириллической раскладке.

https://github.com/powerman/vim-plugin-ruscmd

```vim
# переключение курсора между буферами (,l)
let mapleader = ","
nmap <Leader>l <C-w>w
```

```vim
# переключение курсора между буферами (,l)
let mapleader = ","
nmap <Leader>l <C-w>w
```

# Python

https://skillbox.ru/media/code/prevrashchaem-vim-v-polnotsennuyu-ide-dlya-python/




# Rails

[Rails.Vim](https://github.com/tpope/vim-rails)

[vim-bundler](https://github.com/tpope/vim-bundler)

[vim-dispatch](https://github.com/tpope/vim-dispatch)

[RailsCasts Color Scheme](https://github.com/jpo/vim-railscasts-theme)

https://robots.thoughtbot.com/extending-rails-vim-with-custom-commands

Command | Description
---|---
<kbd>g</kbd><kbd>f</kbd> | Перейти к файл под курсором
<kbd>Ctrl</kbd>+<kbd>w</kbd><kbd>g</kbd><kbd>f</kbd> | Открыть файл под курсором в новой вкладке
<kbd>Ctrl</kbd>+<kbd>w</kbd><kbd>f</kbd> | Открыть файл под курсором с горизонтальным разделением
<kbd>Ctrl</kbd>+<kbd>w</kbd><kbd>v</kbd><kbd>g</kbd><kbd>f</kbd> | Открыть файл под курсором с вертикальным разделением
`:A` | Alternate. Переключение между MVC и MVC spec
`:R` | Related. Переключение связанных сущностей: экшн контроллера - вьюха, 
`:{E/S/V/T}controller` | перейти к контроллеру
`:{E/S/V/T}helper` | перейти к хелперу
`:{E/S/V/T}init` | переход в *routes.rb*
`:{E/S/V/T}mailel` | перейти к майлеру
`:{E/S/V/T}migration` | перейти к миграции
`:{E/S/V/T}schema` | перейти к файлу схему
`:{E/S/V/T}task` | перейти к задаче
`:{E/S/V/T}layout` | перейти к корневому представлению
&nbsp;|`E` - в текущей вкладке `:edit`<br>`S` - `:split`<br>`V` - `:vsplit`<br>`T` - `:tabedit`
`:Rails console` | запуск Rails console
`:Generate controller Blog` | Запуск генератора
`:help Rails` | Справка по плагину
 

https://www.sitepoint.com/effective-rails-development-vim/

https://github.com/smolnar/vim-rails-bundle

https://robots.thoughtbot.com/intro-rails-vim

https://masteruby.github.io/productivity-booster/2014/05/02/vim-plugins-for-ruby.html#.WnCE03omzCI

# Golang

[vim-go](https://github.com/fatih/vim-go) | - полезные команды

```bash
git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go
```

[readme](https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt)


[tagbar](https://github.com/majutsushi/tagbar) - панель со структурой файла

```bash
git clone git@github.com:majutsushi/tagbar.git ~/.vim/bundle/vim-tagbar
```
Добавляем строку в *.vimrc*
```vim
" ~/.vimrc
nmap <F8> :TagbarToggle<CR>
```

Для корректной работы *tagbar* требуется *ctags*.
```bash
sudo apt-get install autoconf
git clone git@github.com:universal-ctags/ctags.git
cd ctags
./autogen.sh
./configure
make
sudo make install
```

[vim-compiler-go](https://github.com/rjohnsondev/vim-compiler-go) - проверка синтаксиса

```bash
git clone https://github.com/rjohnsondev/vim-compiler-go.git ~/.vim/bundle/vim-compiler-go
```
В файл *.vimrc* необходимо прописать путь к директории установки Golang.
```vim
" ~/.vimrc
let g:golang_goroot = "/usr/lib/go-1.10"
```
Узнать полный путь к этой директории можно командой
```bash
go env GOROOT
```

# Snippets

https://github.com/SirVer/ultisnips

```bash
cd ~/.vim/bundle && git clone git://github.com/SirVer/ultisnips.git
cd ~/.vim/bundle && git clone git://github.com/honza/vim-snippets.git
```
```vim
" ~/.vimrc
" Trigger configuration. Do not use <tab> if you use https://github.com/Valloric/YouCompleteMe.
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger="<c-b>"
let g:UltiSnipsJumpBackwardTrigger="<c-z>"

" If you want :UltiSnipsEdit to split your window.
let g:UltiSnipsEditSplit="vertical"
```
Открытие редактора снипетов `:UltiSnipsEdit`
Документация `:help UltiSnips` (или [онлайн](http://bazaar.launchpad.net/~sirver/ultisnips/trunk/view/head:/doc/UltiSnips.txt))

[UltiSnips Screencast Episode 1](https://www.sirver.net/blog/2011/12/30/first-episode-of-ultisnips-screencast/)

[UltiSnips Screencast Episode 2](https://www.sirver.net/blog/2012/01/08/second-episode-of-ultisnips-screencast/)


Ruby snippets (from procure gem)
```vim
global !p
def upperfirst(t):
	if len(t) < 2:
		return '' if len(t) < 1 else t.capitalize()
	return t[0].capitalize() + t[1:]
def lowerdash(t):
	return '-'.join([ w.lower() for w in re.findall('[a-z]+|[A-Z]+[a-z]*', t) ])
def snake(t):
	return '_'.join([ w.lower() for w in re.findall('[a-z]+|[A-Z]+[a-z]*', t) ])
endglobal

snippet llc "one line class"
class $1; end
endsnippet

snippet xc "class with include XML::Mapping"
class ${1}
  include XML::Mapping$0
end
endsnippet

snippet tn "text_node"
text_node :$2`!p snip.rv=snake(t[1])`, '$1'
endsnippet

snippet tno "text_node optional"
text_node :$2`!p snip.rv=snake(t[1])`, '$1', optional: true
endsnippet

snippet opt "optional: true" i
, optional: true
endsnippet

snippet on "object_node"
object_node :$2`!p snip.rv=snake(t[1])`, '$1',
            class: ${3:`!p snip.rv=upperfirst(t[1])`}
endsnippet


# --- EXAMPLES

snippet rc "require package that converts from camelCase or PascalCase to kebab-cased" b
const $1 = require('$2`!p snip.rv=lowerdash(t[1])`');
endsnippet

snippet imp "import package that converts from camelCase or PascalCase to kebab-cased" b
import $1 from '$2`!p snip.rv=lowerdash(t[1])`';
endsnippet
```

yaml.snippets
```vim
# --- TYPES

snippet ta "type array"
description: $1
type: array
items:
  $2
endsnippet

snippet to "type object"
description: $1
type: object
properties:
  $2
endsnippet

snippet ti "type integer"
description: $1
type: integer
nullable: ${2:false}
example: ${3:0}
$0
endsnippet

snippet tf "type float"
description: $1
type: number
format: float
nullable: false
example: ${2:1.23}
$0
endsnippet

snippet ts "type string"
description: $1
type: string
nullable: ${2:false}
example: "${3:string}"
$0
endsnippet

snippet tbs "type binary string"
description: $1
type: string
format: binary
nullable: ${2:false}
$3
endsnippet

snippet tdt "type date-time"
description: $1
type: string
format: date-time
nullable: ${2:false}
$0
endsnippet

snippet turl "type url"
description: $1
type: string
format: uri
nullable: ${2:false}
example: "${3:http://example.com}"
$0
endsnippet

snippet tb "type boolean"
description: $1
type: boolean
default: ${2:false}
nullable: ${3:false}
$0
endsnippet

# --- QUERY PARAMETERS

snippet parip "parameter integer in path"
- name: $1
  in: path
  description: $2
  required: true
  schema:
    type: integer
endsnippet

snippet pars "parameter string in query"
- name: $1
  in: query
  description: $2
  required: ${3:false}
  schema:
    type: string
endsnippet

snippet parsort "parameter for sorting"
- name: sort_by
  in: query
  description: Сортировка записей по заданному полю
  required: false
  schema:
    type: string
    enum: [$1]
$0
endsnippet

snippet parpages "parameter with referenced page and limit"
- $ref: "${1:../../swagger.yaml}#/components/parameters/page"
- $ref: "$1#/components/parameters/limit"
endsnippet

snippet parif "parameter with referenced Id-Modified-Since"
- $ref: "${1:../../swagger.yaml}#/components/parameters/ifmods"
endsnippet

snippet parauth "parameter with referenced Authorization"
- $ref: "#/components/parameters/auth"
endsnippet

# --- REFERENCES

snippet refc "reference to component"
$ref: "${1:../../swagger.yaml}#/components/schemas/$2"
endsnippet

# --- PATHS

snippet pathget "path get"
${1:get}:
  summary: $2
  operationId: `!v expand('%:t:r')`
  tags:
    - $3
  parameters:
  responses:
    "200":
      description: Успешный запрос
      content:
        application/json:
          schema:
    "401":
      $ref: "${4:../../swagger.yaml}#/components/responses/Unauthorized"
endsnippet

snippet pathpost "path post"
post:
  summary: $1
  operationId: ${2:`!v expand('%:t:r')`}
  tags:
    - $3
  requestBody:
    required: true
    content:
      application/json:
        schema:
          type: object
          properties:
	    $0
  responses:
    "200":
      description: Успешный запрос
      content:
        application/json:
          schema:
    "401":
      $ref: "${4:../../swagger.yaml}#/components/responses/Unauthorized"
    "422":
      $ref: "$4#/components/responses/UnprocessableEntity"
endsnippet

# --- RESPONSES

snippet 304 "NotModified response"
"404":
  $ref: "${1:../../swagger.yaml}#/components/responses/NotModified"
endsnippet

snippet 404 "NotFound response"
"404":
  $ref: "${1:../../swagger.yaml}#/components/responses/NotFound"
endsnippet

snippet 422 "UnprocessableEntity response"
"422":
  $ref: "${1:../../swagger.yaml}#/components/responses/UnprocessableEntity"
endsnippet

# --- HEADERS

snippet hlast "header Last-Modified"
Last-Modified:
  $ref: "${1:../../swagger.yaml}#/components/headers/Last-Modified"
$0
endsnippet

snippet hpages "header paginate"
X-Total:
  $ref: "${1:../../swagger.yaml}#/components/headers/X-Total"
X-Page:
  $ref: "$1#/components/headers/X-Page"
X-TotalPages:
  $ref: "$1#/components/headers/X-TotalPages"
$0
endsnippet
```

# Syntax highlighting & Themes

http://vimcolors.com/

[source](https://www.cyberciti.biz/faq/turn-on-or-off-color-syntax-highlighting-in-vi-or-vim/)

Команда | Описание
---|---
`:syntax on` | включение подсветки синтаксиса
`:syntax off` | отключение подсветки

## Rails Theme 

https://github.com/jpo/vim-railscasts-theme

## JS Hightlite

https://github.com/jelera/vim-javascript-syntax

## Markdown Highlight

[Vim Markdown](https://github.com/plasticboy/vim-markdown)
```vim
" --- отсключение folding по умолчанию
let g:vim_markdown_folding_disabled = 1
```
## Изменение цвета курсора

https://stackoverflow.com/questions/34251566/how-can-i-change-the-cursor-style-in-vim-depending-if-im-in-insert-mode-or-norm

# Plugins

## Pathogen

[Pathogen](https://github.com/tpope/vim-pathogen) - плагин для управления плагинами

```bash
# устанавливаем плагин
mkdir -p ~/.vim/autoload ~/.vim/bundle && \
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
# корректируем файл конфигурации vim
vim ~/.vimrc
```
Добавляем строки
```
execute pathogen#infect()
syntax on
filetype plugin indent on
```
Плагины, помещенные в директорию `~/.vim/bundle` будут активироваться автоматически.

Пример загрузки плагина [vim-sensible](https://github.com/tomlion/vim-solidity/)
```bash
cd ~/.vim/bundle && \
git clone https://github.com/tpope/vim-sensible.git
```

# Troubleshooting

## Не работает цветовая схема в tmux

Решение
https://stackoverflow.com/questions/10158508/lose-vim-colorscheme-in-tmux-mode

Создаем или редактируем файл конфигурации tmux
```bash
# ~/.tmux.conf
set -g default-terminal "xterm-256color"
```

## Ошибки при старте vim-config на новом сервере

```bash
vim .
...
line   28:
E474: Invalid argument: listchars=tab:>·,trail:~,extends:>,precedes:<,space:.
```

Возможно установлена некорректная локаль в ОС. Открываем файл *~/.vim-config/vimrc* и кириллица будет нарушена.

Решение:
```bash
# --- текущая локаль
locale
# --- доступные локали
locale -a
# --- генерация новой (если нет ru_RU.UTF-8)
sudo locale-gen ru_RU.UTF-8
# --- устанавливаем текущую
sudo update-locale LANG=ru_RU.UTF-8
```

## Error detected while processing .vimrc:

Чаще всего на новом сервере при первом запуске `vim` видим нечто подобное:

```bash
Error detected while processing /home/zoid/.vimrc:
line   22:
E474: Invalid argument: listchars=tab:>·,trail:~,extends:>,precedes:<,space:.
Press ENTER or type command to continue
```

При этом в открытом файле наблюдаем нарушение отображения некоторых символов. 

Этом может быть связано с тем, что на сервере не установлена русская локаль:

```bash
sudo locale
LANG=en_US
...
sudo locale -a | grep ru
# ничего не выводится
```

Решение: https://vps.ua/wiki/setting-russian-locale-linux/

```bash
sudo apt-get install language-pack-ru
sudo vim /etc/default/locale
# заменяем содержимое на
LANGUAGE=ru_RU:ru
LANG=ru_RU.UTF-8
```


## Буфер обмена

### Ubuntu

По-умолчанию vim не поддерживает работу с системным буфером обмена. Для работы с ним необходимо установить `vim-gnome` вместо `vim`.

[источник](https://stackoverflow.com/a/51186812/4498602)

```bash
# проверяем поддержку
# -xterm_clipboard - не поддерживается
# +xterm_clipboard - поддерживается
vim --version | grep .xterm_clipboard -o
# удаляем "старый" vim
sudo apt-get purge vim
sudo apt-get autoremove
# устанавливаем "новый"
sudo apt-get install vim-gtk3
```
Комбинации клавиш
`"+y` - копирование в буфер
`"+d` - вырезание в буфер
`"+p` - вставка из буфера

### WSL

https://www.reddit.com/r/bashonubuntuonwindows/comments/be2q3l/how_do_i_copy_whole_text_from_vim_to_clipboard_at/el2vx7u/?utm_source=share&utm_medium=web2x

```vim
" WSL yank support
let s:clip = '/mnt/c/Windows/System32/clip.exe'  " change this path according to your mount point
if executable(s:clip)
    augroup WSLYank
        autocmd!
        autocmd TextYankPost * if v:event.operator ==# 'y' | call system(s:clip, @0) | endif
    augroup END
endif
```

## "Зависание" vim

[Stackoverflow](https://stackoverflow.com/questions/3419820/sometimes-my-file-just-freezes-in-my-vi-vim-what-happened)

В произвольный момент vim "зависает" - перестает отвечать на команды. Причиной тому может служить комбинация `Ctrl+S`

Лечение - `Ctrl-Q`