В этой статье описывается, как выполнять поисковые операции в Vim / Vi.
Vim или его предшественник Vi предустановлен в macOS и большинстве дистрибутивов Linux. Поиск текста — одна из самых распространенных задач при работе с файлами. Знание основ Vim может быть очень полезным, когда вы сталкиваетесь с ситуацией, когда ваш любимый редактор недоступен.
Базовый поиск
Для поиска в Vim вы должны быть в обычном режиме. Когда вы запускаете редактор Vim, вы находитесь в этом режиме. Чтобы вернуться в нормальный режим из любого другого режима, просто нажмите клавишу Esc.
Vim позволяет быстро находить текст с помощью /
(косая черта) и ?
(знак вопроса) команды.
Для поиска вперед нажмите /
а для поиска назад нажмите ?
, введите шаблон поиска и нажмите Enter
чтобы запустить поиск:
Важно отметить, что команда поиска ищет шаблон как строку, а не целое слово. Если, например, вы искали «gnu», поиск совпадет с тем, что «gnu» встроено в слова большего размера, такие как «cygnus» или «magnum».
Нажмите n
для поиска следующего вхождения или N
в верхнем регистре для поиска в обратном направлении.
Основные шаги для выполнения поиска в Vim следующие:
- Нажмите
/
. - Введите шаблон поиска.
- Нажмите
Enter
чтобы выполнить поиск. - Нажмите
n
чтобы найти следующее вхождение, илиN
чтобы найти предыдущее вхождение.
Искать слово целиком
Для поиска всего слова начните поиск, нажав /
или ?
, введите <
чтобы отметить начало слова, введите шаблон поиска, введите >
чтобы отметить конец слова, и нажмите Enter
чтобы выполнить поиск.
Например, для поиска «gnu» вы должны использовать /<work>
:
Искать в текущем слове
Вы также можете выполнить поиск целого слова, переместив курсор на слово и нажав *
(звездочка) для поиска вперед или #
(решетка) для поиска в обратном направлении. Чтобы найти следующее совпадение, снова нажмите *
или #
.
История поиска
Vim отслеживает все операции поиска, выполненные вами в текущем сеансе. Чтобы просмотреть историю поиска, нажмите /
или ?
и используйте клавиши со стрелками вверх / вниз, чтобы найти предыдущую операцию поиска. Чтобы запустить поиск, просто нажмите Enter
. Вы также можете отредактировать шаблон поиска перед выполнением операции.
Чувствительность к регистру
По умолчанию в результатах поиска учитывается регистр; поиск «GNU» не будет соответствовать «Gnu».
Чтобы игнорировать регистр :set ignorecase
или :set ic
в командной строке Vim. Вы также можете установить регистр игнорирования как вариант по умолчанию, добавив команду в ваш файл ~/.vimrc
.
Чтобы вернуться в режим совпадения регистра, введите :set noignorecase
или :set noic
.
Другой способ принудительно игнорировать регистр — добавить c
после шаблона поиска. Например, /Linuxc
выполняет поиск без учета регистра. Верхний регистр C
после шаблона приводит к поиску совпадения по регистру.
Выводы
Для поиска в Vim / Vi введите /
или ?
, введите шаблон поиска и нажмите Enter
.
Не стесняйтесь оставлять комментарии, если у вас есть вопросы.
This tip shows how to search using Vim, including use of *
(the super star) to search for the current word. Search options are described, and the see also section links to other useful searching tips.
Basic searching[]
In normal mode you can search forwards by pressing /
(or <kDivide>
) then typing your search pattern. Press Esc to cancel or press Enter to perform the search. Then press n
to search forwards for the next occurrence, or N
to search backwards. Type ggn
to jump to the first match, or GN
to jump to the last.
Note: ggn
skips first match if it is at row 1 column 1. Type Gn
to jump to the real first match. For this, 'wrapscan'
must be on (default).
Search backwards by pressing ?
then typing your search pattern. Pressing n
searches in the same direction (backwards), while N
searches in the opposite direction (forwards).
Searching for the current word[]
In normal mode, move the cursor to any word. Press *
to search forwards for the next occurrence of that word, or press #
to search backwards.
Using *
(also <kMultiply>, <S-LeftMouse>) or #
(also <S-RightMouse>) searches for the exact word at the cursor (searching for rain would not find rainbow).
Use g*
or g#
if you don’t want to search for the exact word.
Using the mouse[]
With appropriate settings, you can search for an exact word using the mouse: Shift-LeftClick a word to search forwards, or Shift-RightClick to search backwards.
This needs a GUI version of Vim (gvim), or a console Vim that accepts a mouse. You may need the following line in your vimrc to enable mouse searches:
:set mousemodel=extend
In gvim, click the Edit menu, then Global Settings, then the “tear off” bar at the top. That will show a floating Global Settings menu with useful Toggle Pattern Highlight and Toggle Ignore-case commands.
More searching[]
Vim maintains a search history. Type /
or ?
and use the arrow up/down keys to recall previous search patterns. You can edit a pattern, and press Enter to search for something different.
Suppose the cursor is on a word, and you want to search for a similar word.
Press /
then Ctrl-r then Ctrl-w to copy the current word to the command line. You can now edit the search pattern and press Enter. Use Ctrl-r Ctrl-w for a <cword>, or Ctrl-r Ctrl-a for a <cWORD>.
After searching, press Ctrl-o to jump back to your previous position (then Ctrl-i will jump forwards).
After searching, an empty search pattern will repeat the last search. This works with /
, :s
and :g
.
So, after searching for a word, use :%s//new/g
to change all occurrences to ‘new’, or :g/
to list all lines containing the word. See substitute last search.
You can enter a count before a search. For example 3/pattern
will search for the third occurrence of pattern, and 3*
will search for the third occurrence of the current word.
You can highlight all search matches (and quickly turn highlighting off), and you can use a mapping to highlight all occurrences of the current word without moving (see highlight matches).
A search can include an offset to position the cursor. For example, searching with /green
positions the cursor at the beginning of the next “green”, while /green/e
positions the cursor at the end of the next “green”. :help search-offset
A search pattern can include characters with codes specified in decimal or hex. For example, searching with /%d65
or with /%x41
both find ‘A
‘ (character decimal 65 = hex 41), and searching with /%d8211
or with /%u2013
both find ‘–
‘ (a Unicode en dash). :help /%d
Case sensitivity[]
By default, searching is case sensitive (searching for “the” will not find “The”).
With the following in your vimrc (or entered via a toggle mapping), searching is not case sensitive:
:set ignorecase
Now the command /the
will find “the” or “The” or “THE” etc. You can use c
to force a pattern to be case insensitive, or C
to force a pattern to be case sensitive. For example, the search /thec
is always case insensitive, and /theC
is always case sensitive, regardless of the 'ignorecase'
option.
If 'ignorecase'
is on, you may also want:
:set smartcase
When 'ignorecase'
and 'smartcase'
are both on, if a pattern contains an uppercase letter, it is case sensitive, otherwise, it is not. For example, /The
would find only “The”, while /the
would find “the” or “The” etc.
The 'smartcase'
option only applies to search patterns that you type; it does not apply to *
or #
or gd
. If you press *
to search for a word, you can make 'smartcase'
apply by pressing /
then up arrow then Enter (to repeat the search from history).
When programming, there is generally no reason to want 'smartcase'
to apply when you press *
. For other situations, use:
:nnoremap * /<<C-R>=expand('<cword>')<CR>><CR> :nnoremap # ?<<C-R>=expand('<cword>')<CR>><CR>
With these mappings, if 'smartcase'
is on and you press *
while on the word “The”, you will only find “The” (case sensitive), but if you press *
while on the word “the”, the search will not be case sensitive.
The mapping for *
uses /
to start a search; the pattern begins with <
and ends with >
so only whole words are found; <C-R>=
inserts the expression register to evaluate expand('<cword>')
which inserts the current word (similar to Ctrl-R Ctrl-W but avoiding an error when used on a blank line).
Show the next match while entering a search[]
To move the cursor to the matched string, while typing the search pattern, set the following option in your vimrc:
:set incsearch
Complete the search by pressing Enter, or cancel by pressing Esc. When typing the search pattern, press Ctrl-L (:help c_CTRL-L) to insert the next character from the match or press Ctrl-R Ctrl-W (:help c_CTRL-R_CTRL-F) to complete the current matching word.
Other search options[]
By default, the 'wrapscan'
option is on, which means that when “search next” reaches end of file, it wraps around to the beginning, and when “search previous” reaches the beginning, it wraps around to the end.
These examples show how to set 'wrapscan'
(abbreviated as 'ws'
):
:set nowrapscan " do not wrap around :set wrapscan " wrap around :set wrapscan! " toggle wrap around on/off :set ws! ws? " toggle and show value
By default, search hits may occur in lines at the top or bottom of the window. The 'scrolloff'
option controls whether context lines will be visible above and below the line containing the search hit.
If your text is folded, you probably want folds to automatically open to reveal search hits. To achieve that, the 'foldopen'
option should include “search” (check by entering :set fdo?). :help ‘foldopen’ Conversely, this option can be used to Search only in unfolded text.
See also[]
- Searching
- Highlighting search matches
- Search for visually selected text
- Search patterns regex tutorial with useful searches
- Search for current word in new window
- Make search results appear in the middle of the screen
- Search and replace using
:s
to substitute text - Browse the searching category for more.
- Searching in multiple files
- Find in files within Vim
- Finding a file from its name
- Project browsing using find
- Find files in subdirectories
References[]
- :help *
- :help <S-LeftMouse>
- :help :<cword>
- :help jump-motions
- :help ‘iskeyword’ controls which characters
*
considers make a word
[]
On UK keyboards, <Shift-3> produces ₤ but works just like #
for searching backwards.
vi (visual editor) – лучший редактор текстовых файлов командной строки для Unix-подобных операционных систем.
Vim – это улучшенная версия текстового редактора vi, используемого в современных системах.
Это текстовый редактор с широкими возможностями настройки.
Это руководство поможет вам найти текст, строку или шаблон в текстовом редакторе Vi (m).
Как искать в редакторе Vi (m)
Чтобы начать поиск в редакторе Vi (m), сначала нажмите клавишу ESC, чтобы переключиться в командный режим в редакторе.
Затем нажмите «/», а затем введите текст, который нужно найти.
- Нажмите ESC
- Ведите “/”
- Ведите шаблон поиска
- Нажмите клавишу Enter или Return для поиска.
/pattern
Система переместит курсор к первому совпадению искомой строки.
Затем используйте сочетания клавиш для перехода к предыдущей или следующей строке поиска, как показано ниже:
- Нажмите n (строчная буква) для поиска следующих вхождений
- Нажмите N (заглавной буквой), чтобы найти предыдущие вхождения
Поиск без учета регистра в Vim
По умолчанию vim ищет совпадения с учетом регистра.
Чтобы искать шаблон во всех случаях, вам нужно отключить регистр с помощью команды set в vim.
Введите следующую команду в vim, чтобы отключить поиск с учетом регистра.
Introduction
Vim and its older counterpart Vi are widely used text editors. They are both open-source (free) and available on most Linux and macOS distributions.
Searching in Vim/Vi for words or patterns is a common task that allows you to navigate through large files easily.
This tutorial shows you how to search in Vim/Vi with practical examples.
Important: Make sure you are in Normal Mode before you start searching. This allows in-text navigating while using normal editor commands. Vi and Vim open a file in normal mode by default.
To switch to normal mode, press Esc.
Basic Searching in Vim / Vi
There are two ways to search for a pattern of numbers or letters in the Vim/Vi text editor.
1. Search forward for the specified pattern
2. Search backward for the specified pattern
The direction is determined in relation to the cursor position.
Searching Forward For Next Result of a Word
To search forward, use the command:
/pattern
Replace pattern
with the item(s) you want to find.
For example, to search for all instances of the pattern “root”, you would:
1. Press Esc to make sure Vim/Vi is in normal mode.
2. Type the command:
/root
The text editor highlights the first instance of the pattern after the cursor. In the image below, you can see that the result is part of a word that contains the specified pattern. This is because the command does not specify to search for whole words.
From this position, select Enter and:
- jump to the next instance of the patter in the same direction with
n
- skip to the next instance of the pattern in the opposite direction with
N
Searching Backward For a Word
To search backward type:
?pattern
Replace pattern
with the item(s) you want to find.
For example, to search for all instances of the pattern “nologin”, you would:
1. Press Esc to make sure Vim/Vi is in normal mode.
2. Type the command:
?nologin
Vim/Vi highlights the first instance of the specified pattern before the cursor.
Hit Enter to confirm the search. Then, you can:
- move to the next instance of the pattern in the same direction with
n
- jump to the next instance of the pattern in the opposite direction with
N
Searching for Current Word
The current word is the word where the cursor is located.
Instead of specifying the pattern and prompting Vim/Vi to find it, move the cursor to a word, and instruct it to find the next instance of that word.
1. First, make sure you are in normal mode by pressing Esc.
2. Then, move the cursor to the wanted word.
3. From here, you can:
- Search for the next instance of the word with
*
- Search for the previous instance of the word with
#
Each time you press *
or #
the cursor moves to the next/previous instance.
Searching for Whole Words
To search for whole words, use the command:
/<word>
The text editor only highlights the first whole word precisely as specified in the command.
Open a File at a Specific Word
Vim (and Vi) can open files at a specified word allowing you to skip a step and go directly to the searched term.
To open a file at a specific word, use the command:
vim +/word [file_name]
or
vi +/word [file_name]
For example, to open the /etc/passwd file where it first uses the term “root”, use the command:
vim +/root /etc/passwd
The text editor opens the file and the first line it displays is the one containing the term “root”, as in the image below.
Case Insensitive Search
By default Vi(m) is case sensitive when searching within the file. For example, if you search for the term /user
it doesn’t show results with the capitalized U (i.e., User).
There are several ways to make Vim/Vi case insensitive.
- To search for a specified word with the case insensitive attribute, run the command:
/<word>c
The c
attribute instructs Vi(m) to ignore case and display all results.
- An alternative is to set Vim to ignore case during the entire session for all searches. To do so, run the command:
:set ignorecase
- Lastly, the configuration file can be modified for the text editor to ignore case permanently. Open the ~/.vimrc file and add the line
:set ignorecase
.
Highlight Search Results
Vi(m) has a useful feature that highlights search results in the file. To enable highlighting, type the following command in the text editor:
:set hlsearch
To disable this feature run:
:set !hlsearch
Search History
Vi(m) keeps track of search commands used in the session. Browse through previously used commands by typing ?
or /
and using the up and down keys.
Conclusion
After reading this article, you have multiple options to search and find words using Vim.
Once you find the searched term, you can move on to cutting, copying, or pasting text.
Общее
- :help keyword – открыть помощь по ключевому слову
- 😮 file – открыть file
- :sav file – сохранить весь текщий буфер как file
- :close – закрыть текущую панель
- K – открыть справочное руководство для слова под курсором
Перемещение курсора
- h – передвинуть курсор влево
- j – передвинуть курсор на одну фактическую строку вниз
- k – передвинуть курсор на одну фактическую строку вверх
- l – передвинуть курсор вправо
- gj – передвинуть курсор на одну видимую строку вниз
- gk – передвинуть курсор на одну видимую строку вверх
- H – переместиться к началу экрана
- M – переместиться к середине экрана
- L – переместиться к концу экрана
- w – переместиться вперед на начало слова
- W – переместиться вперед на начало слова (слово может содержать пунктуацию)
- e – переместиться вперед на конец слова
- E – переместиться вперед на конец слова (слово может содержать пунктуацию)
- b – переместиться назад на начало слова
- B – переместиться назад на начало слова (слово может содержать пунктуацию)
- % – переместиться к парному символу (по умолчанию поддерживаются: ‘()’, ‘{}’, ‘[]’ – подробнее по команде
:h matchpairs
в vim) - 0 – переместиться на начало строки
- ^ – переместиться на первый непробельный символ строки
- $ – переместиться на конец строки
- g_ – переместиться к последнему непустому символу в строке
- gg – переместиться на первую строку документа
- G – переместиться на последнюю строку документа
- 5G – переместить на пятую строку
- fx – переместиться к следующему вхождению символа x в текущей строке
- tx – установить курсор за следующим вхождением символа x в строке
- Fx – переместиться на предыдущее вхождение символа x в текущей строке
- Tx – установить курсор за предыдущим вхождением символа x в строке
- ; – повторить предыдущее f, t, F или T перемещение
- , – повторить предыдущее f, t, F или T перемещение, в обратном направлении
- } – переместиться к следующему параграфу (или функции/блоку при редактировании кода)
- { – переместиться к предыдущему параграфу (или функции/блоку при редактировании кода)
- zz – сдвинуть весь буфер по вертикали вместе с курсором, так чтобы курсор оказался в центре
- Ctrl + b – переместиться назад на целый экран
- Ctrl + f – переместиться вперед на целый экран
- Ctrl + d – переместиться вперед на половину экрана
- Ctrl + u – переместиться назад на половину экрана
Совет: Добавьте число перед командой перемещения курсора для того, чтобы повторить её. Например, 4j перемещает курсор на 4 строки вниз.
Режим вставки – вставка/добавление текста
- i – вставка перед курсором
- I – вставка в начало строки
- a – вставка (добавление) после курсора
- A – вставка (добавление) в конец строки
- o – добавление новой строки под текущей
- O – добавление новой строки над текущей
- ea – вставка (добавление) после конца слова
- Esc – выход из режима вставки
Редактирование
- r – заменить один символ
- J – присоединить нижнюю строку к текущей
- cc – заменить всю строку
- cw – заменить всё текущее слово
- c$ – заменить до конца строки
- s – удалить символ и заменить текст
- S – удалить строку и заменить текст (то же что cc)
- xp – переставить две буквы (удалить и вставить)
- u – отменить
- Ctrl + r – применить последнее отменённое изменение
- . – повторить последнюю команду
Выделение текста (визуальный режим)
- v – включить режим выделения текста, выделить строки, затем выполнить команду (например, y-копирование)
- V – включить построчный режим выделения
- o – переместиться на другой конец выделенной области
- Ctrl + v – включить режим выделения блоков
- O – переместить на другой угол блока
- aw – выделить слово
- ab – блок в ()
- aB – блок в {}
- ib – внутренний блок в ()
- iB – внутренний блок в {}
- Esc – выйти из режима выделения текста
Визуальные команды
- > – сместить текст вправо
- < – сместить текст влево
- y – скопировать выделенный текст
- d – удалить выделенный текст
- ~ – переключить регистр
Регистры
- :reg – показать содержимое регистров
- "xy – поместить содержимое в регистр x
- "xp – вставить содержимое регистра x
Совет: Содержимое регистров сохраняется в ~/.viminfo, и будет восстановлено при следующем запуске vim.
Совет: В нулевом регистре всегда хранится содержимое последней команды копирования.
Метки
- :marks – список меток
- ma – установить метку A на текущей позиции
- `a – переместиться к метке A
- y`a – скопировать до метки A
Макросы
- qa – записать макрос A
- q – остановить запись макроса
- @a – run macro a
- @@ – выполнить последний макрос
Вырезать и вставить
- yy – скопировать строку
- 2yy – скопировать 2 строки
- yw – скопировать слово
- y$ – скопировать до конца строки
- p – вставить буфер обмена после курсора
- P – вставить буфер обмена перед курсором
- dd – удалить (вырезать) строку
- 2dd – удалить (вырезать) 2 строки
- dw – удалить (вырезать) слово
- D – удалить (вырезать) до конца строки
- d$ – удалить (вырезать) до конца строки
- x – удалить (вырезать) символ
Выход и сохранение
- :w – сохранить файл, но не выходить
- :w !sudo tee % – сохранить файл с sudo
- :wq либо 😡 либо ZZ – сохранить файл и выйти
- :q – выйти (терпит неудачу в случае несохраненных изменений)
- :q! либо ZQ – выйти и потерять несохраненные изменения
Поиск и замена
- /pattern – поиск шаблона
- ?pattern – обратный поиск шаблона
- vpattern – ‘very magic’ режим: все не алфавитно-цифровые символы интерпретируются как специальные (экранирование не требуется)
- n – повторить поиск в том же направлении
- N – повторить поиск в обратном направлении
- :%s/old/new/g – заменить все вхождения шаблона в файл на указанное значение
- :%s/old/new/gc – заменить все вхождения шаблона в файл на указанное значение с подтверждением
- :noh – отключить подсвечивание результатов поиска
Поиск в нескольких файлах
- :vimgrep /pattern/ {file} – поиск по шаблону в нескольких файлах
Например:
:vimgrep /foo/ **/*
- :cn – переместиться к следующему совпадению
- :cp – переместиться к предыдущему совпадению
- :copen – открыть окно со списком результатов
Сворачивание
- zf#j – создает свертку от текущей позиции до # строк
вниз - zf/подстрока – создает свертку от текущей позиции и
до первой найденной подстроки - v/V и zf – выделение блока и создание свертки
- zc – свернуть блок
- zo – развернуть блок
- zM – закрыть все блоки
- zR – открыть все блоки
- za – инвертирование (если открыто – закрыть, если
закрыто – открыть) - zj – переход к следующей свертке
- zk – переход к предыдущей свертке
- zd – удалить свертку под курсором
- zD – удалить все свертки
- [z – перейти к началу текущей свертки
- ]z – перейти к концу текущей свертки
Команды для управления:
После закрытия Vim все свертки забываются, для
сохранения сверток в открытом файле используется команда
:mkview
, для загрузки – :loadview
(подробнее).