post

Vim ru:Modes

Contents

Введение

Наша первая встреча с режимами произошла в предыдущей главе. Теперь давайте изучим дальнейший принцип работы доступных режимов, и то, что мы можем делать в каждом из них.

Виды режимов

Существует три основных режима в Vim – нормальный, вставки и визуальный.

  • В Нормальном режиме вы можете запустить команды. Это стандартный режим, с которым Vim запускается по умолчанию.
  • В режиме Вставки вы можете вставлять, т.е. писать ваш текст.
  • В Визуальном режиме вы можете выделить участок текста и запустить операцию/команду только над этой частью текста.

Нормальный режим

По умолчанию, вы находитесь в нормальном режиме. Давайте посмотрим, что мы можем сделать в этом режиме.

Введите :echo "hello world" и нажмите ввод. Вы должны увидеть знаменитые слова hello world возвращенные вам. Только что, Vim вызывал команду :echo с введеным вами текстом и вернул результаты обратно.

Введите /hello и нажмите клавишу ввода. Vim будет искать эту фразу и перейдет на первое совпадение.

Это только два простых примера команд такого рода, доступных в обычном режиме. Мы увидим намного больше таких команд, в последующих главах.

Как получить помощь

Наиболее важно, в нормальном режим, это знать, как пользоваться командой :help. Здесь вы узнаете больше о доступных командах в Vim.

Помните, что вам не нужно знать каждую команду Vim, гораздо лучше знать, где их найти, когда вы в них нуждаетесь. Для пример, посмотрите :help usr_toc отобразит нам содержимое справочного руководства. Вы можете посмотреть :help index для поиска по конкретной теме, в который вы заинтересованы, например, запустить /insert mode чтобы узнать необходимую информацию о режиме вставки.

Если вы не можете запомнить как найти пару этих справочных руководств, просто нажмите F1 или запустите :help.

Режим вставки

Когда Vim запускается в нормальном режиме, мы видели, как использовать i, чтобы войти в режим ввода текста. Есть и другие способы перехода от нормального режима в режим ввода текста:

  • Запустите :e dapping.txt
  • Нажмите i
  • Введите следующий параграф (включая все опечатки и ошибки, мы исправим их позже):

means being determined about being determined and being passionate about being passionate

  • Нажмите клавишу <Esc> чтобы вернуться в нормальный режим.
  • Запустите :w

Упс, похоже мы упустили слово в начале строки, и наш курсор находится в конце строки, что мы сделаем теперь?

Что было бы наиболее эффективным способом, двигаться к началу строки и вставить недостающее слово? Должны ли мы использовать мышь, чтобы переместить курсор в начало строки? Возможно, мы будем использовать клавиши управления курсором для перемещения курсора на начало строки. Или мы нажмем клавишу Home и введем i для переключения в режим вставки снова?

Получается, что наиболее эффективным способом является нажатие клавиши I (I в верхнем регистре):

  • Нажмите I
  • Введите Dappin
  • Нажмите клавишу <Esc> для возврата в нормальный режим.

Заметьте что мы используем другую клавишу для перехода в режим вставки, ее назначение в том что она перемещает курсор в начало строки и потом переводит в режим вставки.

Так же обратите внимание как важно “возвращаться в нормальный режим как только вы закончили вводить текст”. Закрепление такой привычки будет очень полезно, так как основная часть работы (после начальной фазы написания) будет проходить в нормальном режиме – именно в нем производят все важные этапы правки и редактирования.

Рассмотрим разные варианты комманды i. После нажатия i курсор переместится к предыдущему символу в строке и редактор перейдет в режим вставки. Для того, чтобы начать редактирование после (‘a’fter) текущего положения курсора, нажмите a.

  • Нажмите a
  • Напечатайте g (чтобы дополнить слово до “Dapping”)
  • Нажмите <Esc> для возвращения в нормальный режим

Отличие между клавишами i и I такое же, как и между клавишами a и A – если вы хотите дописать текст в конце строки, то нажмите клавишу A.

  • Нажмите A
  • Напечатайте . (Поставьте точку для того, чтобы окончить предложение)
  • Нажмите <Esc> для возвращения в нормальный режим

Подведем итоги:

Комманда Действие
i вставка текста прямо перед курсором
I вставка текста в начале строки
a добавление текста после курсора
A добавление текста в конце строки

Notice how the upper case commands are ‘bigger’ versions of the lower case commands.

После того, как мы рассмотрели приемы быстрого редактирования в одной строке, рассмотрим способы перемещения и редактирования для нескольких строк. Если вам необходимо начать запись текста с номой строки (‘o’pen a new line), нажмите клавишу o.

  • Нажмите o
  • Напечатайте I'm a rapper.
  • Нажмите <Esc> для возвращения в нормальный режим.

Возможно, было бы лучше, если бы предложение было в отдельном абзаце.

  • Нажмите O (заглавная ‘O’)
  • Нажмите <Esc> для возвращения в нормальный режим.

Подведем итоги:

Комманда Действие
o начать с новой строки ниже текущей
O начать с новой строке выше текущей

Notice how the upper and lower case ‘o’ commands are opposite in the direction in which they open the line.

Правильно ли мы ввели предложение? Похоже, нужно ввести ‘dapper’, но не ‘rapper’! В этом предложении нужно заменить лишь один символ. Какой наиболее эфективный способ для такой правки?

Мы могли бы нажать i для перехода в режим вставки, нажать клавишу <Del> для удаления символа r, напечатать d и нажать <Esc> для перехода в базовый режим. Для такой простой правки мы выполнили четыре шага. Существует ли способ выполнить ту же правку, но быстрее? Да, можно использовать клавишу s для замены (‘s’ubstitute).

  • Переместите курсор к необходимому символу (r) (или просто нажмите b для перемещения назад (‘b’ack) к началу слова)
  • Нажмите s
  • Введите d
  • Нажмите <Esc> для возвращения в нормальный режим.

В нашем случае такое действие сэкономило не так много времени, но предположим, что подобное действие нужно выполнить очень и очень много раз! Быстрое выполнение рутинных операций позволяет сконцентрироваться на творческом аспекте работы. As Linus Torvalds says, “it’s not just doing things faster, but because it is so fast, the way you work dramatically changes.”

Существует комманда, аналогичная комманде s, которая заменяет всю строку, а не только один символ. Для ее использования нажмите клавишу S.

  • Нажмите S
  • Введите Be a sinner.
  • Нажмите <Esc> для возвращения в нормальный режим.
Комманда Действие
s Заменить текущий символ
S Заменить текущую строку

Let’s go back our last action… Can’t we make it more efficient since we want to ‘r’eplace just a single character? Yes, we can use the r key.

  • Move the cursor to the first character of the word sinner.
  • Press r
  • Type d

Notice we’re already back in the normal mode and didn’t need to press <Esc>.

There’s a bigger version of r called R which will replace continuous characters.

  • Move the cursor to the ‘i’ in sinner.
  • Press R
  • Type app (the word now becomes ‘dapper’)
  • Press <Esc> to switch back to normal mode.
Command Action
r replace the current character
R replace continuous characters

The text should now look like this:

Dapping means being determined about being determined and being passionate about being passionate.

Be a dapper.

Phew. We have covered a lot in this chapter, but I guarantee that this is the only step that is the hardest. Once you understand this, you’ve pretty much understood the heart and soul of how Vim works, and all other functionality in Vim, is just icing on the cake.

To repeat, understanding how modes work and how switching between modes work is the key to becoming a Vimmer, so if you haven’t digested the above examples yet, please feel free to read them again. Take all the time you need.

If you want to read more specific details about these commands, see :help inserting and :help replacing.

Visual mode

Suppose that you want to select a bunch of words and replace them completely with some new text that you want to write. What do you do?

One way would be to use the mouse to click at the start of the text that you are interested in, hold down the left mouse button, drag the mouse till the end of the relevant text and then release the left mouse button. This seems like an awful lot of distraction.

We could use the <Del> or <Backspace> keys to delete all the characters, but this seems even worse in efficiency.

The most efficient way would be to position the cursor at the start of the text, press v to start the visual mode, use arrow keys or any text movement commands to the move to the end of the relevant text (for example, press 5e to move to the end of the 5th word counted from the current cursor position) and then press c to ‘c’hange the text. Notice the improvement in efficiency.

In this particular operation (the c command), you’ll be put into insert mode after it is over, so press <Esc> to return to normal mode.

The v command works on a character basis. If you want to operate in terms of lines, use the upper case V.

Summary

Here is a drawing of the relationship between the different modes:


               +---------+  i,I,a,A,o,O,r,R,s,S  +----------+
               | Normal  +---------->------------+ Insert   |
               | mode    |                       | mode     |
               |         +----------<------------+          |
               +-+---+---+        <Esc>          +----------+
                 |   |
                 |   |
                 |   |
                 |   |
                 |   |
           v,V   V   ^  <Esc>
                 |   |
                 |   |
                 |   |
                 |   |
             +---+---+----+
             | Visual     |
             | mode       |
             +------------+

(This drawing was created using Vim and Dr.Chip’s DrawIt plugin)

See :help vim-modes-intro and :help mode-switching for details on the various modes and how to switch between them respectively.

If you remain unconvinced about why the concept of modes is central to Vim’s power and simplicity, do read the articles on “Why Vi” and about the vi input model on why it is a better way of editing.


Advertisements