# Занятие 1. Основы Linux # Практическая работа №1.1 ## Задания: ### 1. Посмотреть под каким пользователем в системе Linux. ``` who whoami last w ``` ![](https://i.imgur.com/OxIVBSw.png) ### 2. Перейти в корневой каталог. ``` cd / (знак перед диезом изменился; ~ - домашний каталог, / - корневой) ``` ![](https://i.imgur.com/KonktAa.png) ### 3. Посмотреть содержимое каталога. ``` ls (покажи содержимое) ls -la (а - и скрытое, l - права содержимого (файлов, ссылок, каталогов), дату и другую подробную инфу) ``` ![](https://i.imgur.com/SLj7OMF.png) ### 4. Определить типы команд ls, cd. ``` type ls type cd ``` ![](https://i.imgur.com/UpIJVR8.png) ### 5. Посмотреть из корневого каталога содержимое директории Home. `ls + абсолютный путь до нужного каталога` ![](https://i.imgur.com/imKII3d.png) иначе при не абсолютном пути ![](https://i.imgur.com/yz4XQki.png) `ls -la /home` ![](https://i.imgur.com/mUyIjlR.png) ### 6. Перейти в директорию /tmp. ``` cd /tmp (перед диезом появилось имя каталога) ``` ![](https://i.imgur.com/4cfGtER.png) ### 7. Создать директорию /pt. ``` mkdir pt (создаём директорию) ls (смотрим, появилась ли?) ``` ![](https://i.imgur.com/1fGUhOn.png) ### 8. Создать 3 текстовых документа 1.txt 2.txt 3.txt. ``` touch 1.txt 2.txt 3.txt ls ``` ![](https://i.imgur.com/480pM7D.png) ### 9. Изменить или добавить содержимое текстового документа с помощью редакторов nano и vim. ``` nano 3.txt cat 3.txt ``` ![](https://i.imgur.com/sKHsewm.png) ``` vim text.txt cat text.txt ``` ![](https://i.imgur.com/sGBAPA3.png) ![](https://i.imgur.com/DqNMnFQ.png) ### 10. Скопировать и переименовать директорию с файлами. Скопируем файлы в новую дирректорию. `cp -r /pt /pt1` ![](https://i.imgur.com/BXFhanN.png) Затем переименуем старую дирректорию: `mv /pt /new_pt` ![](https://i.imgur.com/ORvWPkx.png) ### 11. Заархивировать директорию. `tar -cvf pt1.tar pt1` ![](https://i.imgur.com/unHdesn.png) ### 12. Разархивировать директорию. `tar -xvf pt1.tar` ![](https://i.imgur.com/kkgjX3m.png) ### 13. Посмотреть содержимое домашней директории и каталога usr одной командой. `ls ~ /usr` ![](https://i.imgur.com/zT9jPIb.png) ### 14. Посмотреть содержимое каталога в обратном порядке. Обратный порядок `ls -lr /pt1` ![](https://i.imgur.com/TrrB05I.png) Обычный `ls -l /pt1` ![](https://i.imgur.com/Rded8Vp.png) ### 15. Посмотреть права на директорию. `ls -dl /pt1` ![](https://i.imgur.com/B17rjN3.png) ### 16. Посмотреть права на текстовые файлы. `ls -dl /pt1/3.txt` ![](https://i.imgur.com/eHEWPt6.png) ### 17. Переместить и переименовать один текстовый файл в директорию /tmp. Перемещение `mv del.txt /tmp` ![](https://i.imgur.com/ZTrwOo1.png) Переименование `mv del.txt nel.txt` ![](https://i.imgur.com/B0S0TNW.png) ### 18. Создать новую директорию, в ней создать новый текстовый документ, переместить из директории /tmp файл в новую директорию с заменой файла и запросом на его изменение Создание дирректории и файла ``` mkdir /newdir cd /newdir touch 1t.txt ls ``` ![](https://i.imgur.com/wKG5R5b.png) Перемещение с заменой mv -i /tmp/tet.txt 1.txt ![](https://i.imgur.com/9eqs42L.png) ### 19. Определить местоположение данного исполняемого файла ls, cd. Невозможно посмотреть местоположение исполняемого файла cd, так он является встроенным в оболочку командной строки и не является исполняемым файлом. `which ls` ![](https://i.imgur.com/cxYrf5m.png) ``` whereis cd whereis ls ``` ![](https://i.imgur.com/gZt2QYU.png) ### 20. Вывести краткое описание команды и утилиты ls, nano, rm. команда `man -f "имя команды или утилиты"` ![](https://i.imgur.com/e0FP819.png) ### 21. Создать символические ссылки. создадим файл "homef" ``` touch homef ln -s homef link1 ln -s link1 link2 ln -s link2 link3 ``` ![](https://i.imgur.com/KIXNyVs.png) ### 22. Создать символическую ссылку в никуда, продемонстрировать её. Удалим ccылку, на которую указывают ссылки link2 и link3 (**rm link1**). Теперь они указывают на то, чего нет, то есть в никуда. Проверим, что выведет команда `cat`. ![](https://i.imgur.com/ujjhLIT.png) А раньше было так: ![](https://i.imgur.com/r4xLAdO.png) ### 23. Создать прямые ссылки. ``` touch homeforlinks ln homeforlinks link1 ``` ссылки 2 и 3 по аналогии ![](https://i.imgur.com/Oz7LsfO.png) ### 24. Создать собственную команду, которая будет использовать следующее: cd /usr; ls; cd - , с помощью alias. `mycom` - переходит на директоию назад, вывод файлы из директории пт1, переходим в директрию юзр ![](https://i.imgur.com/N5SoS9Q.png) ### 25. С помощью команды cat написать любой текст и записать его в текстовый файл. ``` cat >> text.txt "текст" cat text.txt ``` ![](https://i.imgur.com/KCnBH4Z.png) ![](https://i.imgur.com/0NckFGL.png) ### 26. Удалить один текстовый файл `rm -v nel.txt` ![](https://i.imgur.com/sjhKY8N.png) ### 27. Создать пустую директорию и удалить её Создание `mrdir deli` ![](https://i.imgur.com/zAhgnm3.png) Удаление `rm -rv deli` ![](https://i.imgur.com/Cc3sGh6.png) ### 28. Удалить директорию с 3-я текстовыми файлами `rm -rv new_pt` ![](https://i.imgur.com/Sjh4vV5.png) ### 29. Создать пользователя Создадим пользователя и добавим пароль ``` useradd newu passwd newu ``` ![](https://i.imgur.com/emuy1Iz.png) ### 30.Поменять пароль нового пользователя Той же командой изменим пароль `passwd newu` ![](https://i.imgur.com/jc0D8SS.png) ### 31. Найти текстовый документ с помощью команд Find и Grep Найти в директории /pt1 файл с именем 1.txt `find /pt1 -name 1.txt` ![](https://i.imgur.com/EbI9tiw.png) Вывод команды ls передать grep, чтобы она нашла файл с "txt" в имени или файл с именем "1.txt" ``` ls | grep "txt" ls /pt1 | grep "txt" ``` ![](https://i.imgur.com/dzZDH9O.png) `ls | grep "1.txt"` ![](https://i.imgur.com/RuUDkn0.png) ### 32. Воспользоваться логическими 'и' и 'или' как пример использовать команду ping Пинганём восьмёрки 4 раза или, если с ними будет ошибка, яндекс.ру 2 раза `ping -c4 8.8.8.8 || ping -c2 ya.ru` Пинганём восьмёрки 4 раза и яндекс.ру 2 раза `ping -c4 8.8.8.8 && ping -c2 ya.ru` ![](https://i.imgur.com/A1cbADk.png) Ещё вариант с обединением "и" и "или". Намерено будем пинговать несуществующее доменное имя, отпработает только часть после "или" `ping -c2 y.vb && ping -c2 ya.ru || ping -c1 8.8.8.8` ![](https://i.imgur.com/E1QxfB4.png) # Практическая работа №1.2 ### **Задача:** - Вы проводите поиск в Интернете, и видите, что используются две разные версии Python, и вы не знаете, какая из них был установлен в вашей системе установщиком Ubuntu или Debian, и устанавливал ли он какие-либо дополнительные модули? Команда `dpkg -l |grep -i 'python'` ![](https://i.imgur.com/IirfRw0.png) Вывод ![](https://i.imgur.com/yzm22Ue.png) - Допустим, у вас возникли проблемы с вашим веб-сервером Apache, и вы обратились к одному из многих форумов в сети с просьбой о помощи. Добрая душа, которая вам ответила, попросила вас отправить содержимое вашего файла `/etc/apache2/sites-available/default-ssl`. Разве вам не было бы легче, если бы вы могли просто удалить все закомментированные строки? Используем команду `grep -v '#' etc/apache2/sites-available/default-ssl` . Для примера применим команду на файле text.txt: ![](https://i.imgur.com/MxYbh4V.png) А так выглядит весь файл ![](https://i.imgur.com/EfhJgwF.png) - Например, предположим, что у вас есть целая папка, полная музыкальных файлов разных форматов. Вы хотите найти все файлы `.mp3` у исполнителя ABC, но вы не хотите никаких ремиксов. Как поступить? Изначально я затупила и сделала папку "Музыка" с папкой внутри "АВС", поэтому использовала команду `find -name '*.mp3'`, чтобы увидеть все файлы мр3. А потом команду`find -name '*.mp3 | grep -vi 'remix`, чтобы вывести не ремиксы. ![](https://i.imgur.com/QHvwRMh.png) Осознав косяк, я добавила ещё три файла с именем группы и использовала команду `find -name '*.mp3 | grep -vi 'remix' | grep -i 'abc'`, чтобы вывести не ремиксы данной группы. ![](https://i.imgur.com/ogRL6EW.png) - Как отобразить количество строк до или после строки поиска? После `grep -A 3 'str$' text.txt` До `grep -В 3 'str$' text.txt` ![](https://i.imgur.com/7C2jUwn.png) И до, и после (В методических материалах эта команда стоит в задании "вывести количество строк совпадения", но она же не выводит количество строк совпадения, она выводит именно совпавшие строчки во всех направлениях, поэтому я написала её в это задание) `grep -С 3 'str$' text.txt` ![](https://i.imgur.com/Sb3mvNH.png) - Как вывести количество строк совпадения? А к этому заданию подходит эта команда: `grep -c 12345 text.txt` Потому что она выведет именно количество строк, в которых есть заданное слово. С помощью команды ниже мы увидим, что "12345" встречается 7 раз, но в 4 строках, а цифра 4 - это именно вывод команды выше `grep 12345 text.txt` ![](https://i.imgur.com/cjxmZ8y.png) - Как выяснить количество совпадений? Чтобы выяснить именно количество совпадений (напомню, в файле их 7, но строчек с этим словом 4), используем следующую команду: ``` grep -о 12345 text.txt | wc -l ``` ![](https://i.imgur.com/r5npQwY.png) - Как найти файлы по заданным номерам строк? Возможно в задании описка, и стоит написать “как найти номера строк по заданным файлам / словам”? команда `grep -n 'str$' text.txt` ![](https://i.imgur.com/wO79Hl5.png) - Произвести поиск рекурсивной строки во всех каталогах. Во всех `grep -r '#'` ![](https://i.imgur.com/9MUEnWb.png) Только в текущем `grep -r '#' *` ![](https://i.imgur.com/OHwBqI1.png) - Произвести поиск строк в архивах файлах Gzip. (создать zip архив см.п.1.10) Создание архива `zip text.zip text.txt` ![](https://i.imgur.com/YV5M8XT.png) Поиск `zgrep -i str text.zip` ![](https://i.imgur.com/SdZepHP.png) `zgrep -i emp empty.txt.gz` ![](https://i.imgur.com/kLPDYH6.png) # Практическая работа №1.3 ## 1. Философия Vim Данный пункт прочитан, краткое изложение философии: когда клавиатура была только с буквами, редавктировать текст приходилось их комбинациями, поэтому в Vim несколько режимов. Если понять их, данный редактор перестанет быть головоловкой. ## 2. Установка Перед началом работы с Vim установим его: ``` apt install vim ``` ![](https://i.imgur.com/cOnGmea.png) Установка выполнена успешно. ## 3. Запуск Vim ### 3.1 Создание файла Я использую текстовый файл, который создала в предыдущих практических работах командой **`touch text.txt`**. Сейчас он выглядит так (команда `cat text.txt`): ![](https://i.imgur.com/sfF5ukS.png) Добавим ещё пару строчек: ``` echo "hola, mi amigo! chocolate & banana = ?????? it's so strange! yep" >> text.txt ``` И посмотрим, как он выглядит сейчас (команда `cat text.txt`): ![](https://i.imgur.com/1EobHXc.png) Теперь откроем файл с помощью Vim: ``` vim text.txt ``` ![](https://i.imgur.com/ItMwUCM.png) #### Перейдём в режим вставки. Начальное положение (курсор на третьей снизу строчке, перед "mi"): ![](https://i.imgur.com/zZaOY1a.png) После "А" - перейти в конец данной строки: ![](https://i.imgur.com/CIaz5O6.png) Возвращение в нормальный режим кнопкой **`Esp`**. (скрин другой, так как эти скриншоты я добавляла уже после редактирования) ![](https://i.imgur.com/gcjykx4.png) Теперь перейдём в режим редактирования в это же положение курсора с помощью i (начальное положение на скриншоте выше, вторая строка сверху, на символе "5"): ![](https://i.imgur.com/IXKyfKm.png) Затем в положение после курсора с помщью а: ![](https://i.imgur.com/lDfw77i.png) Выйдем в нормальный режим, кнопка esc и передвинем курсор вправо с помощью "l": ![](https://i.imgur.com/WrLx7NX.png) И наконец в начало строки с курсором с помщью I: ![](https://i.imgur.com/w6HGQTt.png) #### Визуальный режим: "**v**" - режим обычного (посимвольного) визуального выделения перемещением курсора вверх, вниз, влево или вправо. ![](https://i.imgur.com/8zXcDeN.png) "**V**" - режим построчного визуального выделения. Строки выделяются целиком перемещением вверх или вниз. ![](https://i.imgur.com/xjzqnUh.png) "**[ctrl]-v**" — режим блочного визуального выделения. Выделяется прямоугольный участок, который можно увеличивать и уменьшать. Позволяет выбирать фрагменты нескольких линий. ![](https://i.imgur.com/Smzbp4l.png) ### 3.2 Перемещение Начальное положение: ![](https://i.imgur.com/InTyBfs.png) h — перемещение влево ![](https://i.imgur.com/21M3E0I.png) j — перемещение вниз ![](https://i.imgur.com/OIB72rS.png) k — перемещение вверх ![](https://i.imgur.com/21M3E0I.png) l — перемещение вправо ![](https://i.imgur.com/InTyBfs.png) ^ - перемещает в начало строки, но не включая пробелы ![](https://i.imgur.com/P3DoUij.png) 0 - перемещает в начало строки ![](https://i.imgur.com/Qn4iWLN.png) Далее все команды будут применяться к этому положению курсора: Было: ![](https://i.imgur.com/3H3byi0.png) w - на слово вправо Стало: ![](https://i.imgur.com/Jgy28qM.png) $ - конец строки Стало: ![](https://i.imgur.com/0ggtKJM.png) 6е - перемещение на 6 слов вперёд в конец слова Стало: ![](https://i.imgur.com/lkvpWlj.png) 4b - переместиться на 4 слова назад Стало: ![](https://i.imgur.com/qOPmhve.png) 14G - переместимся на 14 строку ![](https://i.imgur.com/paxT9dg.png) G - переместиться в конец документа: ![](https://i.imgur.com/8MipGhF.png) gg -в начало ![](https://i.imgur.com/l5wlmLt.png) 8w - на восемь слов вправо ![](https://i.imgur.com/sJiIYyU.png) e - переместимся к концу слова fishhh ![](https://i.imgur.com/s8DF9wR.png) b - вернёмся к пердыдущему слову ![](https://i.imgur.com/VOIslKc.png) ### 3.3 Поиск текста Стандартный регистрозавизимый поиск: ![](https://i.imgur.com/tfwByR1.png) Поиск без учёта регистра: ![](https://i.imgur.com/ZzDXVqA.png) Поищем все совпадения с начала документа с помощью **n**: ![](https://i.imgur.com/Mi2WSCd.png) А теперь с конца с помощью N: ![](https://i.imgur.com/lRjnHFU.png) Укажем явно регистр: ![](https://i.imgur.com/tEk9HeN.png) Хотя без "\С" работает так же: ![](https://i.imgur.com/RhAi51F.png) ### 3.4 Редактирование Опять же сделаем наиболее интересные скрины, а если будет возможность, отобразим выполнение функций на одном скриншоте. #### 3.4.1 Удаление текста Было: ![](https://i.imgur.com/TE47od6.png) x - удаление символа под курсором Стало: ![](https://i.imgur.com/iYAC8im.png) dl - удаление символа слева от курсора (первая строка на скрине) dd - удаление строки (раньше была вторая) D - от положения курсора до конца строки удалить символы (сравнивать 4 строку из "было" и третью из "стало") Стало: ![](https://i.imgur.com/oBrHDkq.png) **Теперь работаем с заменой.** Было: ![](https://i.imgur.com/nhg46zc.png) r — заменить символ на позиции курсора заданным после команды символом (см. строку 3) ce — заменить следующее слово с конца (см. строку 5) C — заменить до окончания строки. Текст на замену набирается в режиме вставки. (см. строку 6) Стало: ![](https://i.imgur.com/6VZtjrF.png) #### 3.4.2 Копирование и вставка Было: ![](https://i.imgur.com/NBroM7V.png) Команды написаны в порядке выполнения: y — копировать в заданном далее направлении (yj - копирование вниз, см. строку 2) p — вставить последнюю скопированную (или удаленную!) строку ниже текущей (см. строку 2) yy — копировать всю строку (копируем строку #rf5676gh, см. строку 4) P — вставить последнюю скопированную (или удаленную!) строку выше текущей (см. строку 4) Стало: ![](https://i.imgur.com/RPO292l.png) Y — копировать до окончания строки + P Было: ![](https://i.imgur.com/LDw6fBH.png) Стало: ![](https://i.imgur.com/AqoQQ7E.png) #### 3.4.3 Дополнительные команды редактирования Отменим предыдущее действие (**u**): ![](https://i.imgur.com/VQ3MIda.png) Вернём его обратно (**<ctrl>-r**): ![](https://i.imgur.com/KMTphz2.png) Присоединим строку к предыдущей (**J**): ![](https://i.imgur.com/zAq6eR4.png) ### 3.5 Командный режим ### 3.5.1 Команды управления **Сохраним изменения и выйдем:** ![](https://i.imgur.com/bHt0vNO.png) **Сообщение, что всё успешно:** ![](https://i.imgur.com/TRtvV7z.png) **Проверка текста с помощью cat:** ![](https://i.imgur.com/tBd5vSv.png) Да, текст наш, всё сохранилось. **Допишем что-то:** ![](https://i.imgur.com/sGBAPA3.png) **Попробуем выйти (:q)** ![](https://i.imgur.com/piowMv3.png) **Не вышло(** ![](https://i.imgur.com/Dl0uTuw.png) **сохраним (:w)** ![](https://i.imgur.com/RB9RdUg.png) ![](https://i.imgur.com/qVNejq7.png) **выйдем (:q)** ![](https://i.imgur.com/QTAzfUy.png) **Проверим с помощью cat:** ![](https://i.imgur.com/y1kv6tZ.png) **зайдём обратно и сотрём что-то ещё** ![](https://i.imgur.com/oIsKlV9.png) **выйдем и не сохраним(:q!)** ![](https://i.imgur.com/NJ20yiR.png) **проверим через cat:** ![](https://i.imgur.com/DqNMnFQ.png) Всё хорошо, данные новые не сохранились **сделаем новый файл** ![](https://i.imgur.com/OHQDC8k.png) **Откроем старый файл и перейдём в новый файл** ![](https://i.imgur.com/qYzblvO.png) **Перешли:** ![](https://i.imgur.com/Dreex7a.png) **Вернёмся к предыдущему:** ![](https://i.imgur.com/GLFXWrE.png) ![](https://i.imgur.com/tDjY69y.png) **А теперь к следующему:** ![](https://i.imgur.com/1gX0PyP.png) ![](https://i.imgur.com/YoE4YlA.png) ### 3.6 Объединение команд Скопируем 5 строк командой "**:y5**" ![](https://i.imgur.com/5SmlWEf.png) ## 4. Заключение ![](https://i.imgur.com/0Gdbl9y.png) ![](https://i.imgur.com/vQeJ5v6.png) ![](https://i.imgur.com/VCGjwhK.png) ### Basic movement: h, j, k, and l ![](https://i.imgur.com/2zmkEyC.png) ![](https://i.imgur.com/jecF67T.png) ![](https://i.imgur.com/d0E4ILi.png) ![](https://i.imgur.com/4bsfl7q.png) ![](https://i.imgur.com/YdljTJU.png) ![](https://i.imgur.com/a61T9zG.png) ![](https://i.imgur.com/Lhnn6iS.png) ### Word movement: w, e, b ![](https://i.imgur.com/dRwRsxU.png) ![](https://i.imgur.com/5VXTPUV.png) ![](https://i.imgur.com/LrpPVji.p ![](https://i.imgur.com/0PjUmu8.png) ![](https://i.imgur.com/V3S6fKh.png) ![](https://i.imgur.com/fYDxJov.png) ![](https://i.imgur.com/qneEo8B.png) ![](https://i.imgur.com/wd1hoIM.png) ![](https://i.imgur.com/1ojoSIy.png) ![](https://i.imgur.com/SySjV7x.png) ### Number powered movement, e.g. 5w ![](https://i.imgur.com/4z6Q6Ln.png) ![](https://i.imgur.com/8WxMQPr.png) ![](https://i.imgur.com/0PjUmu8.png) ![](https://i.imgur.com/V3S6fKh.png) ![](https://i.imgur.com/fYDxJov.png) ![Uploading file..._o8kr0b97c]() ### Insert text repeatedly, e.g. 3iYes ![](https://i.imgur.com/2sM4XVy.png) ![](https://i.imgur.com/B1Ug69t.png) ![](https://i.imgur.com/A46DZSy.png) ![](https://i.imgur.com/7mbQcYH.png) ![](https://i.imgur.com/hMyYLCN.png) ![](https://i.imgur.com/YHtz9xR.png) ![](https://i.imgur.com/rJkT9qv.png) ### Find a character, f and F ![](https://i.imgur.com/mEgEarD.png) ![](https://i.imgur.com/VnfxO5Z.png) ![](https://i.imgur.com/TEfr33I.png) ![](https://i.imgur.com/SgczHub.png) ![](https://i.imgur.com/ReRT4bX.png) ![](https://i.imgur.com/XmzjVnX.png) ![](https://i.imgur.com/0Q7pagh.png) ![](https://i.imgur.com/zRlV2U5.png) ![](https://i.imgur.com/G5hbt3d.png) ### Go to matching parentheses, % ![](https://i.imgur.com/qbfTswB.png) ![](https://i.imgur.com/3HZuTHS.png) ### Go to start/end of line, 0 and $ ![](https://i.imgur.com/3HO8Bs5.png) ![](https://i.imgur.com/XllVf3K.png) ![](https://i.imgur.com/bEkb8oN.png) ### Find word under cursor, * and # ![](https://i.imgur.com/TeTUVxJ.png) ![](https://i.imgur.com/QA1YV7N.png) ![](https://i.imgur.com/lZXcXE6.png) ### Goto line, g and G ![](https://i.imgur.com/YWuVOg7.png) ![](https://i.imgur.com/xZC18U3.png) ![](https://i.imgur.com/QYNlylq.png) ![](https://i.imgur.com/jcrq0dE.png) ### Search, /text with n and N ![](https://i.imgur.com/LRWb7Dw.png) ![](https://i.imgur.com/4Zewdsg.png) ![](https://i.imgur.com/zmL7Drt.png) ![](https://i.imgur.com/YrIyO0x.png) ![](https://i.imgur.com/VEdggo4.png) ![](https://i.imgur.com/qo6QLcy.png) ### Insert new line, o and O ![](https://i.imgur.com/FZAB0rk.png) ![](https://i.imgur.com/kU8IwAv.png) ### Removing a character, x and X ![](https://i.imgur.com/YdSSVNt.png) ![](https://i.imgur.com/tMptgk2.png) ### Replacing letter under cursor, r ![](https://i.imgur.com/jzHumbr.png) ![](https://i.imgur.com/Y5IdXV1.png) ### Deleting, d ![](https://i.imgur.com/kCChScC.png) ![](https://i.imgur.com/C8U3Vx8.png) ![](https://i.imgur.com/M0b128s.png) ![](https://i.imgur.com/1RtDtAR.png) ![](https://i.imgur.com/X3PcVOd.png) ### Repetition with . ![](https://i.imgur.com/r3SsbgF.png) ![](https://i.imgur.com/9qsWiVl.png) ![](https://i.imgur.com/nNIu43n.png) ![](https://i.imgur.com/YZF7Fzh.png) ![](https://i.imgur.com/iz0TSPE.png) ### Visual mode, v ![](https://i.imgur.com/WEE5Fnz.png) ![](https://i.imgur.com/p3I4Xtx.png) ### Real Vim awaits ![](https://i.imgur.com/JhbkYE7.png) ### The end. ![](https://i.imgur.com/PSeYvNf.png) ![](https://i.imgur.com/gCSze3y.png)