Поиск
/word
Искать слово “word” сверху вниз?word
Искать слово “word” снизу вверх/jo[ha]n>
Искать “john” или “joan”/\< the
Искать слова, начинающееся на “the”/the\>
Искать слова, заканчивающиеся на “the”/\< the\>
Искать “the” (точное соответствие)/\< …. \>
Искать слова из четырех символов/fred\|joe
Искать “fred” или “joe”/\<\d\d\d\d\>
Искать 4 цифры подряд/^\n\{3}
Искать 3 пустые строки:bufdo /searchstr/
Искать во всех открытых файлах
Удаление
d^
Удалить все символы от текущей позиции до начала строкиd$
Удалить все символы от текущей позиции до конца строкиd/word
Удалить всё от текущей позиции до слова “word”dfx
Удалить всё от текущей позиции до символа “x”
Замена
:%s/old/new/g
Заменить все вхождения “old” на “new”:%s/old/new/gw
Заменить все вхождения “old” на “new” с запросом подтверждения:2,35s/old/new/g
Заменить все вхождения “old” на “new” между 2 и 35 строками:5,$s/old/new/g
Заменить все вхождения “old” на “new” начиная с 5 строки и до конца файла:%s/^/hello/g
Добавить “hello” в начало каждой строки:%s/$/Harry/g
Добавить “Harry” в конец каждой строки:%s/onward/forward/gi
Заменить “onward” на “forward” с учетом регистра:%s/ *$//g
Убрать все пробелы:g/string/d
Удалить все строки, содержащие “string”:v/string/d
Удалить все строки, не содержащие “string”:s/Bill/Steve/
Заменить первое вхождение “Bill” на “Steve” в текущей строке:s/Bill/Steve/g
Заменить все вхождения “Bill” на “Steve” в текущей строке:%s/\r//g
Убрать символ возврата каретки (Такие тексты обычно приходят от windows-пользователей):%s#>[^<]\+>##g
Очистить текст от HTML-тегов:%s/^\(.*\)\n\1$/\1/
Удалить строки, повторяющиеся дваждыCtrl+a
Увеличить число под курсором на единицуCtrl+x
Уменьшить число под курсором на единицуggVGg?
Преобразовать текст в Rot13
Комментарий к замене: …мне нужно во всем файле совершить замену
Abs[ ‘выражение’ ] -> | ‘выражение’ |
Если при описании разыскиваемой последовательности заключить какое-нибудь выражение в скобки ( ), то Vim поместит его в память под соответствующим номером (первое выражение под номером один, второе — два) и позволит в дальнейшем вызывать командой \x, где x — номер, под которым выражение было помещено в память.
Таким образом, нужная команда будет выглядеть примерно так::%s/Abs\[\([^\]]*\)\]/|\1|/g
Здесь стоит отметить, что для буквального совпадения квадратные скобки предваряются слешами, поскольку являются спецсимволами. Вообще любой спецсимвол, если должен участвовать в поиске, обозначая свое непосредственное значение, предваряется слешем: ^; * и т.д. Сам слеш предваряется также слешем. Выглядит это так: для поиска последовательности ‘\cos’ надо ввести ‘\cos’.
…совершить замену вида
‘Заглавная латинская буква'‘цифра’ -> ‘Заглавная латинская буква’_‘цифра’
Самое тривиальное решение, которое напрашивается — перебрать все комбинации, если их немного. То есть, запустить замену сначала ‘U1’ -> ‘U_1’, потом ‘U2’ -> ‘U_2’ и т.п. Понятно, что это не наш метод. Мы вспомним, что есть квадратные скобки. И для того, чтобы найти одну заглавную латинскую букву, достаточно ввести шаблон ‘[A-Z]’. Но и это не предел. Для такого шаблона у Vim есть специальная аббревиатура: ‘\u’ (от ‘uppercase’). Для цифр же есть ‘\d’ (от ‘digit’). Подробнее о таких конструкциях можно почитать по адресу :help pattern.txt. С использованием этих аббревиатур команда для поиска примет вид
:%s/\(\u\)\(\d\)/\1_\2/g
Тут опять встречается группировка круглыми скобками: она позволяет при поиске поместить найденную букву и цифру в память под соотвествующими номерами, и впоследствии их оттуда извлечь, вызывая командами с теми же номерами: ‘\1’ вызовет букву, а ‘\2’ — цифру.
Регистр
Vu
Перевести строку в нижний регистрVU
Перевести строку в верхний регистрg~~
Инвертировать регистрvEU
Перевести слово под курсором в верхний регистрvE~
Инвертировать регистр словаggguG
Перевести весь текст в нижний регистр:set ignorecase
Регистронезависимый поиск:set smartcase
Игнорировать регистр при поиске, если в искомом выражении нет символов верхнего регистра:%s/\<./\u&/g
Перевести первую букву каждого слова в верхний регистр:%s/\<./\l&/g
Перевести первую букву каждого слова в нижний регистр:%s/.*/\u&
Перевести первую букву первого слова в каждой строке в верхний регистр:%s/.*/\l&
Перевести первую букву первого слова в каждой строке в нижний регистр
Чтение/запись файлов
:1,10 w outfile
Записать в outfile с первой по десятую строки:1,10 w >> outfile
Добавить в outfile с первой по десятую строки:r infile
Вставить содержимое файла infile:23r infile
Вставить содержимое файла infile после 23 строки
Навигация по ФС
:e .
Открыть встроенный файл-менеджер:Sex
Разбить окно и открыть встроенный файл менеджер:browse e
Графический файл-менеджер:ls
Список буферов:cd ..
Перейти в родительскую директорию:args
Список открытых файлов:args *.php
Открыть все файлы с расширением *.php:grep expression *.php
Показать список файлов с расширением php, содержащих в имени expressiongf
Открыть файл с именем, равным слову, находящемуся под курсором
Взаимодействие с ОС
:!pwd
Выполнить команду pwd и вернуться!!pwd
Выполнить команду pwd и вставить результат в редактор:sh
Открыть шелл$exit
Вернуться в редактор из шелла
Выравнивание
:%!fmt
Выровнять все строки!}fmt
Выровнять все строки в текущей позиции5!!fmt
Выровнять следующие 5 строк
Вкладки
:tabnew
Создать новую вкладкуgt
Перейти на следующую вкладку:tabfirst
Перейти на первую вкладку:tablast
Перейти на последнюю вкладку:tabm n(position)
Изменить порядок вкладок:tabdo %s/foo/bar/g
Выполнить команду во всех вкладках:tab ball
Поместить все открытые файлы во вкладки
Разделение окна
:e filename Редактировать filename в текущем окне :split filename Разделить окно и открыть filename ctrl-w + стрелка ВВЕРХ Переместить курсор в верхнее окно ctrl-w ctrl-w Переместить курсор в следующее окно ctrl-w ctrl-p Переместить курсор в предыдущее окно(вернуться назад) ctrl-w ctrl-x Поменять окна местами ctrl-w_ Максимизировать текущее окно ctrl-w= Подогнать окна по размеру 10 ctrl-w+ Увеличить текущее окно на 10 строк :vsplit file Вертикально разделить окно :sview file Разделить окно и открыть file только для чтения :hide Закрыть текущее окно :only Закрыть все окна, кроме текущего :b 2 Открыть #2 в текущем окне
Автодополнение
Ctrl+n Ctrl+p (в режиме вставки) Дополнить слово Ctrl+x Ctrl+l Дополнить строку :set dictionary=dict Установить словарь Ctrl+x Ctrl+k Дополнение из словаря
Метки
mk Пометить текущую позиция как k ‘k Перейти к метке k d’k Удалить все до метки k d’a,’k Удалить все от метки a до метки k
Сокращения
:ab mail mail@provider.org Определить mail как сокращение от mail@provider.org
Отступы
:set autoindent Включить автоматическую расстановку отступов :set smartindent Включить “умную” расстановку отступов :set shiftwidth=4 Установить отступ равный 4 пробелам ctrl-t, ctrl-d Убрать/добавить отступ в режиме вставки « Добавить отступ
Убрать отступ Подсветка синтаксиса :syntax on Включить подсветку :syntax off Выключить подсветку :set syntax=perl Установить режим подсветки
Вставить символ в начало большого количества подряд идущих строк:
Вариант 1
Use Ctrl+v to select the first column of text in the lines you want to comment.
Then hit ‘I’ and type the text you want to insert.
Then hit ‘Esc’, wait 1 second and the inserted text will appear on every line.
Вариант 2 This replaces the beginning of each line with “//":
:%s!^!//!
This replaces the beginning of each selected line (use visual mode to select) with “//":
:'<,'>s!^!//!
What if you’ve forgot to give sudo when you’ve opened the /etc/group file as shown below? In this case, instead of coming out of the file (and loosing all > > your changes) and executing the vim command with sudo, you can do the following. $ vim /etc/group :w !sudo tee % Note: “:w !sudo tee %” will save the file as root privilege, even if you didn’t use sudo command to open it.
Использование стиля “подсветил — посмотрел — выполнил” совместно с визуальным режимом оказалось очень удобной практикой. Такое комбинирование стилей выделения используется при решении задач типа “в данной функции переименовать переменную foo в bar” и подобных. Такая (и подобные) задачи решаются последовательностью действий:
Подсвечиваем foo командой *
Переходим в режим визуального выделения и выделяем текущую функцию
Отдаем команду замены :’<,’>s//bar/g
Символы ’<,’>, означающие начало и конец текущего выделенного блока, и определяющие диапазон применения команды :s, Vim подставляет автоматически при отдаче любой команды из режима визуального выделения. Также опущен первый аргумент команды :s, т. к. набирать его нет необходимости — когда он опущен, Vim использует в качестве этого аргумента содержимое регистра текущего поиска. То есть именно то, что подсвечено желтым.
:g//t$ — скопировать строки, содержащие подсвеченное значение, в конец файла. Если, например, надо быстро понять, как глобальная переменная (sic! — а что делать, в legacy-коде они встречаются) используется в модуле.
:g//d — удалить строки, содержащие подсвеченное значение :g!//d — удалить стрки, НЕ содержащие подсвеченного значения
Заменить каждое вхождение нескольких пустых строк на одну пустую строку (чтобы между параграфами стал одинаковый промежуток в одну линию): :v/./,/./-j
Убрать пустые строки (в визуальном режиме) :'<,'>g/^$/d
Раздвинуть подряд идущие строки (обратное предыдущему действие, каждая строка станет параграфом) Нужно при форматировании текста под 76 символов, из формата, как его сохраняет Word, когда каждый абзац становится строкой в текстовом файле. :'<,'>s/$/\r/g
быстро вставить текст при включенном autoindent (set ai) - борьба с “лесенкой”
:r !cat
Выбрать синтаксис редактируемого файла
:set ft=ruby
Способы перейти в режим вставки
i - вставить текст слева от текущего I - вставить текст в начало строки a - вставить текст справа от текущего символа A - вставить текст в конец текущей строки o - создать новую строку под текущей O - создать новую строку над текущей C - заменить всё до конца строки r - заменить 1 символ 3s - удалить 3 символа и перейти в режим вставки ciW - заменить большое слово под курсором ci” - заменить текст между кавычками ci( - заменить текст между круглыми скобками gi - перейти к последнему месту, где производилось редактирование
Передвижение по тексту
fx - Передвинуть курсор вперед к следующему вхождению символа х в текущей строке tx - Передвинуть курсор вперед к следующему вхождению символа х в текущей строке и установить курсор перед символом x Fx - Передвинуть курсор назад к предыдущему вхождению символа х в текущей строке w - Передвинуть курсор вперед на одно слово b - Передвинуть курсор назад на одно слово 0 - Передвинуть курсор на начало текущей строки ^ - Передвинуть курсор на первый символ в текущей строке $ - Передвинуть курсор на конец текущей строки
- начать поиск по слову под курсором # - начать поиск по слову под курсором в обратном порядке w - перейти к следующему слову W - перейти к следующему большому слову (тому, что разделено пробелом) b/e - перейти к началу/концу текущего слова B/E - перейти к началу/концу текущего большого слова gg/G - перейти в начало/конец файла % - перейти к парной скобке {/} - перейти к следующему/предыдущему параграфу ‘. - перейти к последнему месту, где производилось редактирование
Удаление данных
4dd - удалить 4 строки 3x - удалить 3 символа D - удалить от текущей позиции до конца строки
Способы сложного выделения текста
v% - когда курсор установлен на одной из скобок - выделит всё до её пары. vib - выделить всё между двумя ближайшими к курсору круглыми скобками viB - выделить всё между двумя ближайшими к курсору фигурными скобками vi” - выделить всё между двумя ближайшими двойными кавычками vi’ - выделить всё между двумя ближайшими одинарными кавычками ggVG - выделить весь файл Ctrl+v - выделять прямоугольником
Заменить все вхождения ‘old’ на ‘new’
:%s/old/new/g
Заменить все вхождения ‘old’ на ‘new’ с запросом подтверждения
:%s/old/new/gw
Удалить все строки, не содержащие ‘string’
:v/string/d
Удаление всех пустых строк в VIM
:g/^$/d
Сокращения для быстрого создания закомментированных участков кода
:ab #b /*************************************************
:ab #e *************************************************/
Заставить вим не раскрывать табы при редактировании makefile
\ # vim: set tabstop=4 shiftwidth=4 noexpandtab:
Открыть файл, но предопределить синтаксис редактора
$ vim “+set filetype=lisp” file.rb
Отправить весь буфер вима в grep
:%!grep data
Редактировать последний изменённый файл
$ vim ls -t | head -n1
Убрать символ переноса строки ^M в файле из windows двумя способами. ^M вводится как Ctrl-V Ctrl-M.
:set ff=unix :w
:%s/^M//g
Заменить “foo” на “bar” в строках 127-215
:127,215s/foo/bar
С текущей строки до конца файла объеденить все строки в одну
:.,$j
Оба вида записи указывают на весь файл целиком
:1,j :%
Начиная с текущей, удалить в следующих 21-ой строках те, что содержат слово foo
:.,+21g/foo/d
Начиная с текущего места и до конца файла удалить все строки что НЕ содержат “bar”
:.,$v/bar/d
Все строки, что содержат “foo” перенести в конец файла, в том же порядке, в каком они встречаются по документу
:%g/foo/m$
Все строки, что начинаются с пробела, объединить с предыдущими
:%g/^ /-1j
Во всех строках содержащих “foo”, заменить “bar” на “zzz”
:%g/foo/s/bar/zzz/g
Между метками ‘a’ и ‘b’, объединить строки, что содержат ‘foo’ с теми что идут после них.
:‘a,‘bg/foo/j
Вставка содержимого из другого места
:r file.txt - прочитать и вставить содержимое файла ‘file.txt’ в место под курсором :0r file.txt - вставить файл в начало документа :$r file.txt - вставить файл в конец документа :r !uptime - вставить вывод команды в место под курсором
Дописать содержимое буфера в конец другого файла
:w »~/file.txt
Отсортировать весь файл с помощью sort
:%!sort
увеличить/уменьшить число под курсором на 1
Ctrl+a Ctrl+x
Изменить регистр символа под курсором на противоположный
~
Объединить текущую строку со следующей
J
В режиме вставки, комбинация Ctrl+R позволяет вставлять некоторые полезные вещи:
" - последний удалённый/скопированный текст % - текущее имя файла
- содержимое буфера обмена (X11: primary selection)
- содержимое буфера обмена / - последний запрос поиска : - последняя команда . - последний вставленный текст
- последний маленький удалённый текст (меньше строки) =5*5 - вставит 25. Мини калькулятор
Дополнить слово в режиме вставки
Ctrl+p Ctrl+n
Путешествие по результатам поиска.
Переход будет осуществляться по местам, которые были указаны явно: - поиск с помощью / - переход gg, G, [\d]G Так же будут открываться другие файлы, где осуществлялись подобные действия.
Ctrl+o Ctrl+i
Работа с сессиями
Сохраняем
:mks sessionname " или принудительно: :mks! sessionname
Загружаем
$ vim -S sessionname
Работа со встроенным файловым менеджером. Вызвать его можно командой :Explore или попытавшись открыть на редактирование каталог :sp ./
- перейти на каталог выше mf - пометить файл D - удалить помеченые файлы. Удалит файл под курсором, если помеченых нет R - переименовать файл под курсором d - создать новый каталог % - создать новый файл
отправить текущий файл на исполнение питоном
:!python %
работа с несколькими окнами
Ctrl+wv - разбить окно по вертикали Ctrl+ws - разбить окно по горизонтали Ctrl+ww - переключиться между окнами Ctrl+w{h,j,k,l} - перейти к окну левее, ниже, выше, правее Ctrl+w{<,>,+,-} - изменить размеры текущего окна Ctrl+wq - закрыть окно
Проставить отступы для всего документа
gg=G
Для того чтобы это работало - надо добавить в .vimrc следующую строку: filetype plugin indent on
Копируем содержимое строк выше/ниже курсора, не покидая режима вставки
Ctrl+y - вставить символ над курсором Ctrl+e - вставить символ под курсором
Отбросить правки до последнего сохранённого состояния
:e!
Q - войти в ex-режим :vi - выйти из ex-режима
Удалить все строки что не содержат слова “git”
:v/git/d :g!/git/d
Для всех строк, что содержат слово git добавить в начало ‘»’ и в конец ‘«’. После слова norm - можно написать любую vim команду. В данном случае - ‘I’ - вставить в начало строки, ‘A’ - в конец.
:g/git/norm I»ctrl+vescA«
Файл настройки: ~/.vimrc Можно редактировать файлы через сеть, например :e <scp|ftp|ftps>://user@host/path/to/the/file.txt :Ex или :e ./ - файловый менеджер
== Основы == hjkl перемещение в разные стороны i режим вставки I добавление в начало строки a режим добавления A добавление в конец строки o добавить строку сразу за текущей O добавить строку перед текущей R писать поверх имеющегося текста u, :u[ndo] отмена предыдущего действия (undo) CTR-R, :red[o] отмена отмены предыдущего действия (redo) dd вырезать (удалить) строку cc удалить и начать редактирование yy копировать строку p вставить из буфера обмена d удалить n+1 строку y скопировать n+1 строку ESC перейти в режим просмотра DEL удалить следующий символ : перейти на строку #n % перейти к парной скобке :e **/filename.c редактировать файл (с поиском по имени) :w [fname] записать изменения :wa сохранить изменения во всех файлах :q выйти из редактора :q! выйти из редактора, не сохраняя изменения :color выбор цветовой схемы. цветвые схемы: /usr/local/share/vim/vim72/colors/.vim :pwd текущий каталог :cd [path] перейти в другой каталог :!команда выполнить команду - man, git, и так далее стрелочками веерх и вниз можно автодополнять команды и искать по истории CTR+p или CTR+n автоматическое дополнение текста (в режиме редактирования) CTR+r,=, вставить выражение, например 52 - 3 (в режиме редактирования) CTR+u, CTR+d Page Up / Page Down CTR+y, CTR+e Перемотка вверх/вниз без движения курсора
== Подсветка синтаксиса == :syntax on включить подсветку :syntax off выключить подсветку (по умолчанию)
== Перенос строк == :set wrap разрешить word wrap (по умолчанию) :set nowrap запретить word wrap
== Печать == :ha[rdcopy] распечатать документ :set printoptions=duplex:off отключить двустороннюю печать
== Сворачивание == zc свернуть блок zo развернуть блок zM закрыть все блоки zR открыть все блоки za инвертирование zf см :set foldmethod=manual :set foldenable включить свoрачивание :set foldmethod=syntax сворачивание на основе синтаксиса :set foldmethod=indent сворачивание на основе отступов :set foldmethod=manual выделяем участок с помощью v и говорим zf :set foldmethod=marker сворачивание на основе маркеров в тексте :set foldmarker=bigin,end задаем маркеры начала и конца блока
== Маркеры ==
ma установить локальный маркер a
mB установить глобальный маркер B
c перейти к локальному маркеру c
0 вернуться на позицию, на которой закончили
работу при закрытии vim
:marks просмотр маркеров
set viminfo=‘1000,f1 маркеры пишутся в ~/.viminfo, восстанавливаясь
при следующем запуске vim. маркер " хранит
последнюю позицию курсора в файле
== Сессии ==
mksession file.session сохранить текущую сессию
source file.session восстановить ранее сохраненную сессию
== Макросы == qa записать макрос с именем a q в режиме записи макроса: закончить запись @a выполнить макрос с именем a @@ повторить последний макрос
== Регистры == “ayy скопировать строку в регистр a “bdd вырезать строку и поместить в регистр b “С2d вырезать три строки и дописать в конец регистра C :reg [name1][name2][…] просмотреть содержимое регистров
== Выделение == v + hjkl выделение текста SHIFT + v выделить строку CTR + v выделение прямоугольника p вставить y копировать d удалить gu к нижнему регистру gU к верхнему регистру
== Отступы == [#]> сдвинуть выделенное вправо [#]< сдвинуть выделенное влево [#]» сдвинуть строку вправо [#]« сдвинуть строку влево set tabstop=# для табуляции используется # пробелов set shiftwidth=# в командах отступа используется # пробелов set [no]expandtab заменять ли табуляцию на соответствующее число пробелов
== Поиск и замена в файле == /Выражение поиск выражения в файле \cВыражение поиск без учета регистра n следующее совпадение N предыдущее совпадение :%s/foo/bar/gi замена строк, см http://eax.me/regular-expr/
== Поиск по всему проекту == :vimgrep /EXPR/ **/*.c поиск по регулярному выражению :copen показать все найденные места :close скрыть все найденные места :cn переход к следующему результату :cp переход к предыдущему результату
== Нумерация строк == :set number включить нумерацию строк :set nonumber отключить нумерацию строк
== Работа с вкладками (a.k.a табами) == :tabnew [fname] создать таб :tabs вывести список табов :tabn следующий таб :tabp предыдущий таб gt перейти на таб #n gt следующий таб gT предыдущий таб :tabm +1 переместить таб вперед на одну позицию :tabm -1 переместить таб назад на одну позицию :tabm 2 переместить таб на заданную позицию (нумерация начинается с нуля)
== Работа с окнами == :split горизонтальное разбиение :vsplit вертикальное разбиение Ctr+W, затем с закрыть окно +- изменение высоты текущего окна <> изменение ширины текущего окна = установить равный размер окон hjkl или стрелочки перемещение между окнами
== Проверка орфографии == mkdir -p ~/.vim/spell cd ~/.vim/spell wget http://ftp.vim.org/vim/runtime/spell/ru.koi8-r.sug wget http://ftp.vim.org/vim/runtime/spell/ru.koi8-r.spl wget http://ftp.vim.org/vim/runtime/spell/en.ascii.sug wget http://ftp.vim.org/vim/runtime/spell/en.ascii.spl
:set spell spelllang=ru,en включить проверку орфографии :set nospell выключить проверку орфографии ]s следующее слово с ошибкой [s предыдущее слово с ошибкой z= замена слова на альтернативу из списка zg good word zw wrong word zG ignore word
== Работа с кодировкой == e ++enc=<имя кодировки> Редактирование файла в ??? кодировке w ++enc=<имя кодировки> Сохранить файл в новой кодировке set fileencodings=utf-8,koi8-r Список автоматически определяемых кодировок в порядке убывания приоритета
== Другое == :set [no]wildmenu При авто-дополнении в командной строке над ней выводятся возможные варианты :set list Отображать табуляцию и переводы строк q: История команд . Повторение последней команды
Есть еще вариант перехода на нужную строку. В нормальном режиме набрать G
Сначала номер строки (номер отображается в строке статуса), потом сразу нажать “G”.
=== Ещё немного полезностей ===
vip - выделить параграф
viw - выделить слово
Shift+v или 0v$ - выделить строку
^v$ - выделить строку, начиная с первого непробельного символа
vi( - выделить всё между ближайшими круглыми скобками (аналогично ‘vi[’ и ‘vi{’ для квадратных и фигурных скобок)
va( - выделить всё между ближайшими круглыми скобками, включая сами скобки
v2j - выделить на две строки вниз
dip - вырезать параграф
di( - вырезать содержимое круглых скобок
da( - вырезать содержимое круглых скобок и сами скобки
y2y - скопировать две строки
yy - скопировать строку
yiw - скопировать слово
p - вставить после курсора
[p - вставить перед курсором
xp - поменять две буквы местами
vt, - выделить всё до ближайшей запятой
Ctrl+G - номер текущей строки, общее число строк в файле и его имя
N,M ya - копировать в буфер обмена строки с N до M включительно (потом их можно вставить в нужном месте той же “p”)
Ndd - удалить N строк (любые удалённые строки попадают в буфер обмена)