Syntax highlighting of
a514140 ~( vim)
# 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
---|---
| 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> | Замена двойных кавычек на одинарные
| 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` | перейти к корневому представлению
|`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`