Links

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

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

Шпаргалка

VimCasts

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

Эффективное использование Vim

Минимум один трюк Vim, про который вы не знали

Recipes

" 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()
# --- 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

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

Clipboard

CommandDecsription

p
вставляем из буфера после курсора
P(заглавная p) вставляем из буфера перед курсором
yyp или YpДублировать строку
"ayСкопировать текст в буффер a
"apВставить текст из буффера a
"+yКопировать в системный буфер обмена

Editing

CommandDecsription

i
Переход в режим редактирования. Курсор остается на месте
IЗаглавная i. Переход в режим редактирования. Курсор переходит в начало строки.
aПереход в режим редактирования. Курсор переходит на следующий символ.
AПереход в режим редактирования. Курсор переходит в конец строки.
oПереход в режим редактирования с созданием пустой строки ниже. Курсор переходит на новую строку.
OЗаглавная o. Переход в режим редактирования с созданием пустой строки выше. Курсор переходит на новую строку.
sПереход в режим редактирования с удалением текущего символа.
NsУдаление N-символов и переход в режим редактирования
SПереход в режим редактирования с удалением строки.
rxЗаменить символ под курсором на символ x
RПереход в режим замены
ccУдаление строки, переход в режим редактирования и отступ
c$Удаление от курсора до конца строки и переход в режим редактирования
ceУдаление символов от курсора до конца слова и переход в режим редактирования
di)Удаление символов между скобками
di"Удаление символов между кавычками
ddpУдаление строки и вставка ее ниже следующей (смена строк)
uОтмена изменений, сделанных крайней командой
U(заглавная u) Отмена крайних изменений в строке

Find

CommandDescription

fx
Поиск далее по строке символа x
2fxПоиск второго символа х в строке
txПоиск далее по строке символа xx с установкой курсора перед ним
FxПоиск назад по строке символа x
TxПоиск назад по строке символа x с установкой курсора перед ним
*Поиск всех вхождений слова под курсором
#Поиск всех вхождений слова под курсором (в обратном направлении)
/textПоиск
?textПоиск в обратном направлении
nПереход к следующему совпадению
NПереход к предыдущему совпадению

Visual Mode

CommandDescription

v
включаем визуальный режим
Vстрочное выделение
yкопируем выделенное
dвырезаем выделенное
uпреобразование в нижний регистр

Windows

CommandDescription

Ctrl+g
Отображение информации о позиции в файле
Ctrl+wrпоменять местами компоновку
Ctrl+wwпереключение курсора между буферами компоновки
Ctrl+w_максимизировать окно
Ctrl+w=выровнять окна
Ctrl+wcзакрыть текущее окно
Ctrl+wHпереключение горизонтальной в вертикальную компоновку
Ctrl+wJпереключение вертикальной в горизонтальную компоновку

Tabs

link

CommandDescription
$vim -p file1 file2открываем vim с вкладками
:tabn file3открываем файл file3 в новой вкладке
:tabf index*открываем файл с шаблону имени
:tabn
(или gt)
следующая вкладка
gTпредыдущая вкладка
igtперейти на i-ую вкладку
:tabfirstпервая вкладка
:tablastпоследняя вкладка
:tabsсписок вкладок
:tabm Xперемещаем текущую вкладку на позицию Х+1
:tabclose

:q
закрываем текущую вкладку
:tabclose iзакрываем i-ую вкладку
:tabonlyзакрываем все вкладки кроме текущей

Reduce & Expand

CommandDecsription

zc
свернуть блок
zoразвернуть блок
zMсвернуть все блоки
zRразвернуть все блоки
zaинвертировать свернутые блоки

Macros

CommandDecsription

qa
Старт записи макроса a.
qостановка записи макроса.
@aВызов макроса a
n@aисполнение макроса n-раз

Marks

CommandDecsription

ma
Установка метки a.
'aпереход на метку a
d'aудалить всё до метки a
:marksОтображение меток
:delm!Удаление всех меток в нижнем регистре

Commentary

commentary.vim - плагин для комментариев

CommandDescription
NORM
gccкомментирование строки
NgccКомментирование N строк
gc}Комментировать до конца параграфа
gc{Комментировать до начала параграфа
gcNkКомментировать N строк вверх
:X,YCommentaryКоментирование строк X-Y

Surround

vim-surround - оборачивание текста в кавычки и скобки

Документация

CommandDescription
 Normal Mode
ds'Удаление одинарных кавычек
ds"Удаление двойных кавычек
cs"'Замена двойных кавычек на одинарные
 Visual Mode
S'оборачивание выделенного текста в одинарные кавычки
S"оборачивание выделенного текста в двойные кавычки

FZF

https://github.com/junegunn/fzf

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

" --- open zfz on Ctrl + P
nnoremap <C-p> :<C-u>FZF<CR>
CommandDecsription

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

Grep

CommandDecsription
:vimgrep QUERY dir/**Поиск строки QUERY в файлах директории dir/

Quickfix

CommandDecsription
:copenOpen the quickfix window
:cclClose window
:cwOpen it if there are "errors", close it otherwise (some people prefer this)
:cnGo to the next error in the window
:cpGo to previous
:cnfGo to the first error in the next file

Bash

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

Terminal

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

Переход между терминалом и редактором Ctrlw+w

В терминале переход в режим просмотра комбинацией Ctrlw+N

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

Misc

CommandDecsription
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

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

vim-bundler

vim-dispatch

RailsCasts Color Scheme

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

CommandDescription

gf
Перейти к файл под курсором
Ctrl+wgfОткрыть файл под курсором в новой вкладке
Ctrl+wfОткрыть файл под курсором с горизонтальным разделением
Ctrl+wvgfОткрыть файл под курсором с вертикальным разделением
:AAlternate. Переключение между MVC и MVC spec
:RRelated. Переключение связанных сущностей: экшн контроллера - вьюха,
:{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

S - :split

V - :vsplit

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 | - полезные команды

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

readme

tagbar - панель со структурой файла

git clone git@github.com:majutsushi/tagbar.git ~/.vim/bundle/vim-tagbar

Добавляем строку в .vimrc

" ~/.vimrc
nmap <F8> :TagbarToggle<CR>

Для корректной работы tagbar требуется ctags.

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 - проверка синтаксиса

git clone https://github.com/rjohnsondev/vim-compiler-go.git ~/.vim/bundle/vim-compiler-go

В файл .vimrc необходимо прописать путь к директории установки Golang.

" ~/.vimrc
let g:golang_goroot = "/usr/lib/go-1.10"

Узнать полный путь к этой директории можно командой

go env GOROOT

Snippets

https://github.com/SirVer/ultisnips

cd ~/.vim/bundle && git clone git://github.com/SirVer/ultisnips.git
cd ~/.vim/bundle && git clone git://github.com/honza/vim-snippets.git
" ~/.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 (или онлайн)

UltiSnips Screencast Episode 1

UltiSnips Screencast Episode 2

Ruby snippets (from procure gem)

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

# --- 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

КомандаОписание
: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

" --- отсключение 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 - плагин для управления плагинами

# устанавливаем плагин
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

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

# ~/.tmux.conf
set -g default-terminal "xterm-256color"

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

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

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

Решение:

# --- текущая локаль
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 видим нечто подобное:

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

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

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

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

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

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.

источник

# проверяем поддержку
# -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

" 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

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

Лечение - Ctrl-Q