====== vim ======
За основу взята [[http://xgu.ru/wiki/Vim|статья с xgu.ru]]
Vim (**vi** **im**proved) — текстовый редактор, идеологическое продолжение текстового редактора vi. Отличительная особенность редактора (как и редактора vi) - поддержка режимов редактирования: поведение редактора и его реакция на нажатие клавиш определяется тем, в каком режиме он сейчас находится.
++++Так выглядила клавиатура создателя vi |
{{:soft:vi-keyboard.jpg}}
++++
===== Теория =====
==== vim modes ====
{{:soft:vim_modes.jpg|}}
==== Буферы ====
Буферы - это области в оперативной памяти, куда загружается содержимое открываемых vim файлов. Каждый открытый файл считывается в отдельный буфер. Между ними можно переключаться не теряя сделанных в изменений. Содержимое буфера можно записать в файл (тот же, из которого он был прочитан, или другой).
==== Регистры ====
Регистры - это "буферы обмена" / "карманы" для хранения команд и текста.
TODO: написать о типах регистров и работе с ними.
===== Использование =====
==== normal mod ====
=== Переключение режимов ===
* ''c'' / ''['' / ''esc'' - выход из режима
* '':'' - **c**ommand mod
* ''i'' - **i**nsert mod
* ''v'' - **v**isual mod (common)
* ''V'' - **v**isual mod (lines)
* ''ctrl+v'' - **v**isual mod (blocks)
=== Быстрые действия ===
* ''y'' - скопировать
* ''p'' - вставить
* ''x'' - вырезать
* ''d'' - удалить
* ''dd'' - вырезать строку в default регистр
* ''zz'' - сохранить и выйти
* ''ZQ'' - выйти
=== Навигация ===
Внутри строки:
* ''0'' - переход в начало строки
* ''^'' - переход на первый непробельный символ
* ''$'' - переход в конец строки
* ''f символ'' - переход к первому найденному символу
* ''F символ'' - переход к первому найденному символу в обратном направлении
* ''t символ'' - перейти на один символ левее заданного (почти как f, только идёт на один символ меньше; очень удобно, когда надо "удалить до запятой, но запятую оставить")
* ''T символ'' - перейти на один символ левее заданного, поиск ведется в обратном направлении
* ''w'' - перейти к началу следующего слова
* ''e'' - перейти в конец следующего слова
* ''b'' - перейти к началу предыдущего слова
* ''ctrl+y'' - сдвиг вверх, с сохранение позиции коретки
* ''ctrl+e'' - сдвиг вниз, с сохранением позиции коретки
По строкам:
* ''gg'' - перейти на первую строку
* ''G'' - перейти на последнюю строку
* ''30G'' - перейти на строку 30
По отметкам:
* ''``'' - к месту, с которого был сделан последний прыжок (прыгнуть назад)
* ''`.'' - к месту последней правки
Прокрутка окна:
* ''ctrl+y'' - перемещение вверх на одну строку, с сохранением абсолютной позиции курсора
* ''ctrl+e'' - перемещение вниз на одну строку, с сохранением абсолютной позиции курсора
* ''z-'' - прокрутить окно так, что строка с курсором будет почти в самом низу
* ''z.'' - прокрутить окно так, что строка с курсором будет почти в центре
* ''z Enter'' - прокрутить окно так, что строка с курсором будет вверху
=== Поиск ===
* ''/слово'' - найти подстроку "слово"
* ''n'' - следующее вхождение
* ''N'' - предыдущее вхождение
==== command mod ====
* ''quit'' / ''q'' - выйти
* ''write'' / ''w'' - записать буфер
* ''pwd'' - текущая рабочая директория
* ''cd'' - сменить рабочую директорию
* ''ls'' - листинг буферов
* ''edit файл'' / ''e файл'' - открыть новый буфер
* ''buffer n'' / ''b n'' - сменить текущий буфер на //n//
* ''n'' - переключатся на следующий буфер
* ''N'' - переключатся на предыдущий буфер
* ''set опция'' - изменить опцию
* ''reg'' - листинг регистров
* ''sp'' - разделение экрана по горизонтали
* ''vsp'' - разделение экрана по вертикали
* ''help'' - справка
* ''argdo'' - выполнить следующие команды для всех файлов
=== Замена ===
Для замены будет использоваться такая конструкция:\\
'':%s/искать/заменить/g''
++++regex syntax|
* ''.'' - соответствует любому одиночному символу, кроме символа новой строки.
* ''*'' - соответствует нулю или более вхождениям предыдущего символа или группы.
* ''+'' - соответствует одному или более вхождениям предыдущего символа или группы.
* ''?'' - соответствует нулю или одному вхождению предыдущего символа или группы.
* ''^'' - соответствует началу строки.
* ''$'' - соответствует концу строки.
* ''[]'' - определяет класс символов. Например, ''[abc]'' соответствует ''a'', ''b'' или ''c''.
* ''[^]'' - соответствует любому символу, не входящему в указанный класс. Например, ''[^abc]'' соответствует любому символу, кроме ''a'', ''b'' или ''c''.
* ''{n}'' - соответствует ровно n вхождениям предыдущего символа или группы. Например, ''a{3}'' соответствует ''aaa''.
* ''{n,}'' - соответствует ''n'' или более вхождениям. Например, ''a{2,}'' соответствует ''aa'', ''aaa'' и так далее.
* ''{n,m}'' - соответствует от ''n'' до ''m'' вхождений. Например, ''a{2,4}'' соответствует ''aa'', ''aaa'' и ''aaaa''.
* ''\\'' - экранирует специальные символы. Например, ''\\''. соответствует точке.
* ''()'' - группирует выражения. Например, ''(abc)*'' соответствует ''abc'', ''abcabc'' и так далее.
* ''|'' - логическое "или". Например, ''abc|def'' соответствует либо ''abc'', либо ''def''.
++++
=== Bash команды ===
Для выполнения команд в текущем pwd прямо из vim использоваться такая конструкция:\\
'':!<команда>''
==== insert mod ====
* ''ctrl+t'' - сдвинуть строку вправо
* ''ctrl+d'' - сдвинуть сроку влево
* ''ctrl+w'' - стереть слово слева
* ''ctrl+u'' - стереть всю строку слева
===== Настройка =====
TODO: написать о опциях и vimrc
==== Плагины ====
Проще всего ставить плагины при помощи плагина //vim-plug//. Его установка:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
Далее в ''~/.vimrc'' прописываем следующее:
call plug#begin()
" Тут список плагинов
" Примеры:
" Сокращенная запись для GitHub; переводится как https://github.com/junegunn/seoul256.vim.git
Plug 'junegunn/seoul256.vim'
" Любой допустимый git URL разрешен
Plug 'https://github.com/junegunn/vim-easy-align.git'
" Используя помеченный релиз; допускается подстановочный знак (требуется git 1.9.2 или выше)
Plug 'fatih/vim-go', { 'tag': '*' }
" Используя не-умолчательную ветку
Plug 'neoclide/coc.nvim', { 'branch': 'release' }
" Используйте опцию 'dir', чтобы установить плагин в не-умолчательную директорию
Plug 'junegunn/fzf', { 'dir': '~/.fzf' }
" Хук после обновления: выполните команду оболочки после установки или обновления плагина
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
" Хук после обновления может быть лямбда-выражением
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
" Если плагин vim находится в подкаталоге, используйте опцию 'rtp', чтобы указать его путь
Plug 'nsf/gocode', { 'rtp': 'vim' }
" Загрузка по требованию: загружается, когда выполняется указанная команда
Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' }
" Неподдерживаемый плагин (установлен и обновлен вручную)
Plug '~/my-prototype-plugin'
call plug#end()