LINUX.ORG.RU

vim для самых маленьких

 , ,

vim для самых маленьких

26

8

Основные команды текстового редактора vim

Итак, в вашей жизни случилось так, что вам нужно отредактировать какой-нибудь файл конфигурации, заполнить комментарий коммита git или написать подобную заметку с использованием разметки markdown. И в вашем распоряжении оказался редактор vim или vi то откройте терминал и введите vimtutor и не читайте дальше эту простыню. Мотайте в самый низ, если вам нужно просто открыть, отредактировать, закрыть файл и забыть.

Для базового взаимодействия с этим мощным редактором нужно знать что…

В редакторе есть два режима — обычный и режим ввода:

  • esc переводит вас в командный режим из режима ввода;
  • i или a переводит вас из командного режима в режим ввода.

В режиме ввода вы просто редактируете текст, как в любом текстовом редакторе.

В командном режиме вы можете, открывать и создавать файлы, сохранять их, менять настройки редактора, исполнять команды в терминале, разделять окна редактора, включать и выключать подсветку, менять её, буквально что угодно.

Командный режим делится на:

  • клавиатурный, то есть после нажатия Esc вся клавиатура превращается в набор хоткеев;
  • режим командной строки, когда вы вводите текстовые команды которые исполняет редактор.

В клавиатурном режиме вы можете например нажать:

  • dd тем самым удалив строку на котором есть курсор;
  • u отмотать редактирование назад.

Команды выделения, копирования и вставки:

  • ctrl + v или shift + v выделить текст;
  • y скопировать выделенный текст;
  • p вставить выделенный текст.

Так, как описано выше, копирование и вставка работают только внутри vim.

Внешний текст вы можете вставить, нажав на колёсико мышки. Или:

  • esc — переходим в командный режим;
  • жмём shift + ", затем жмём отдельно клавишу +, затем отдельно p.

Для копирования в системный буфер обмена — то же самое с y в конце:

  • esc переходим в командный режим;
  • Вместе жмём shift и " затем жмём отдельно клавишу + затем отдельно y

Символ " там где буква э. По описанию сложно, на деле всё нажимается легко.

В режим командной строки перейти надо так:

  • нажать esc;
  • затем нажать shift + ; (там где буква ж)

Теперь можно ввести команды:

  • e имя_файла.txt создать и открыть для редактирования новый файл e (от слова edit, редактировать — понимание того, как образуются сокращения поможет вам в запоминании и вспоминании команд);
  • set syntax=on включить подсветку кода;
  • set mouse=a включить полную поддержку мыши;
  • vs разделить окно вертикально;
  • sp разделить окно горизонтально;

Горизонтальное и вертикальное разделение окон очень удобно, если вам нужно писать в одной части файла и что-то почитывать в другом конце или другом файле.

  • q закрыть текущий файл или/и разделённую область редактирования.
  • ter открыть терминал прямо в редакторе.
  • !command запустить программу прямо из редактора например !ls.

Выполнение команд из редактора бывает очень полезным например вам нужен файл со списком файлов в текущем каталоге.

  • esc;
  • shift + ; (там где буква ж)
  • e list.txt или просто нажать клавишу e на клавиатуре, а не вводить команду e list.txt.
  • .!ls вставить вывод команды в файл в строку с курсором с заменой строки если она что-то содержала.
  • 4!ls тоже самое что выше, но вы явно указываете строку в которую надо вставить, тут в четвёртую.
  • +!ls тоже самое, но вставить на строку выше чем там где курсор.
  • -!ls тоже самое, но на строку ниже чем там где курсор.
  • %!ls вставить вывод команды в файл с перезапись всего файла.
  • wq list.txt или просто wq если до этого указывали имя файла, а не входили в режим редактирования просто клавишей e

Символ % обозначает текущий редактируемый буфер. Нажатие клавиши е означает вход режим редактирования файла без имени. Тут ls для примера, модно использовать date, pwd и любое иное не интерактивное. Можно комбинировать как в терминале

  • %!date && uptime && uname -a && echo "hello lor"

Ну и самое важное:

  • w сохранить в ткущий файл;
  • w filename сохранить в конкретный файл;
  • wq сохранить файл и выйти;
  • q! принудительно выйти без сохранения;

Любые настройки вы можете внести в свой конфигурационный файл ~/.vimrc

Например:

"так тут пишут комментарии
set syntax=on "включить подсветку синтаксиса
set mouse=a   "включить полную поддержку мыши
set list "отображать спец символы
set listchars=tab:►·,eol:·,trail:↔ "табы ,конец строки, пробелы

"можно программировать и вызывать другие программы
"это пример простой функции
function Hello()
    exec('silent !notify-send hello бугагашенька')
endfunction

"по клавише F2 на рабочем столе будет уведомление
nnoremap <F2> :call Hello()<CR>
inoremap <F2> :call Hello()<CR>

"И многое другое 

Если вы редактируете ~/.vimrc из вим, то, чтобы применить изменение, перезагрузите конфигурацию:

  • esc
  • shift + ; (там где буква ж)
  • so % или so ~/.vimrc. so сокращение от source исходник по нашему.

Затем нажмите F2 и на рабочем столе выскочит уведомление. Если не выскочило то значит не установлен notify-send (в качестве домашнего задания заставьте всё работать). Также вы можете сохранять файлы по своим горячим кнопкам, например, F5, если вы геймер =) Но для этого нужно отредактировать пример выше, пусть это тоже будет домашним заданием.

Всё описано в огромной документации:

  • esc;
  • shift + ; (там где буква ж)
  • h ;
  • Enter;

…которая всё же сложна для чтения. На первых порах просто ищите, как сделать желаемое, в интернете или через поиск на этом форуме.

Это не просто конфигурационный файл, а целый исходный файл скриптового языка программирования VimL и описывая настройки редактора, вы программируете его.
Впрочем, за этим дуйте в интернет.

Быстрый, базовый поиск:

  • esc;
  • /
  • Далее вводите то что хотите найти
  • Enter

Сброс подсветки найденного. К примеру

  • esc
  • /
  • набрать тарабарщину типа asdfsf (тупо, но я использую это, потому что быстро)
  • Enter
  • esc
  • shift + ;
  • noh
  • Enter

Быстрый переход к нужной строке в файле.

  • esc
  • shift + ;
  • номер строки
  • Enter

Быстрая, простая, замена текста.

  • esc
  • shift + ;
    • s/что-ищем/на-что-заменить/ замена только одного совпадения и только в строке на котором курсор.
    • s/что-ищем/на-что-заменить/g замена всех совпадений, но только в строке на котором курсор.
    • %s/что-ищем/на-что-заменить/g замена всех совпадений во всём файле.
  • Enter

Я описал базовые возможности, хотя вышло всё равно длинновато, но уже их хватит для очень многого, сам я использую vim на постоянной основе, но редко выхожу за рамки того что описал выше. Про цветовые схемы, тысячи плагинов и прочее я умолчал, это уже за рамками краткого описания.


Если вам лишь изредка нужно править конфигурационные файлы на своём сервере или роутере с предустановленным vim, то всё, что нужно знать, это:

  • vim /путь/до/файла/имя_файла;
  • i вход в режим редактирования. Меняйте текст как вам надо;
  • esc выход из режима редактирования;
  • shift + ; вызов командной строки, то что ниже вписывается именно в неё;
  • wq сохранить и выйти;
  • wq! если для сохранения нет прав то всё равно выйти (когда забыли sudo перед vim);
  • q! выйти без сохранения (когда что-то напортачили и испугались);

Всё!


★★★★★

Проверено: hobbit ()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 29)

Ответ на: комментарий от dimgel

Еще для замены очень крутая опция:

opt.inccommand = 'split'

(на Lua, у меня nvim и конфиг на lua)

Позволяет сразу видеть что меняется на что.

emorozov
()
Ответ на: комментарий от Gentooshnik

«Отдельно клавишу» не значит клавишу, где только «плюс».

Думал, что достаточно разъяснил. )

жмём shift + ", затем жмём отдельно клавишу +, затем отдельно p.

Жмем и держим shift. Далее, не отпуская! shift, жмем клавишу с "/’. Затем, опять же все еще не отпуская! shift, жмем клавишу с +/=. Далее жмем p.

Надеюсь это не настолько сложно и не превратит пальцы в щупальца осьминога. )

krasnh ★★★
()
Ответ на: комментарий от mx__

Можно повесить на биндинг:

cmap w!! w !sudo tee > /dev/null %
Turbid ★★★★★
()
Ответ на: комментарий от krasnh

жмём shift + ", затем жмём отдельно клавишу +, затем отдельно p.

ИМХО «отдельно» как раз говорит что нужно перед нажатием + и p всё остальное отпустить. Включая shift.

Gentooshnik ★★★★★
()
Ответ на: комментарий от emorozov

Ngg действительно удобнее, сенькс, хотя начинает удивлять, нахрена столько альтернатив делать одно и то же.

А nvim и lua – влом, я не так часто им пользуюсь. И изучил-то его просто потому что реклама: мол работает в любых терминалах. Хрен там, был когда-то хостер (или может на работе какой) с настолько кривым ssh, что там не то что стрелки (про буквенные альтернативы знаю), вообще ни черта не работало.

dimgel ★★★★★
()
Последнее исправление: dimgel (всего исправлений: 1)
Ответ на: комментарий от dimgel

хотя начинает удивлять, нахрена столько альтернатив делать одно и то же.

Ну, это вроде нечасто бывает, на самом деле.

А nvim и lua – влом, я не так часто им пользуюсь. И изучил-то его просто потому что реклама: мол работает в любых терминалах. Хрен там, был когда-то хостер (или может на работе какой) с настолько кривым ssh, что там не то что стрелки (про буквенные альтернативы знаю), вообще ни черта не работало.

Это связано чаще с тем, что на системе, куда входишь, нет информации о твоем терминале (особенно, если он из новых, типа kitty или alacritty). Эта система ужасно кривая, потому что, сколько не использовал рецептов для копирования информации о терминале на целевую систему, все они не работают. Там какие-то эзотерические заклинания для кода 50-летней давности, и никогда они не работают, так и не удалось разобраться почему.

Использую чаще два приёма:

  1. просто export TERM=xterm-256color, этот терминал поддерживается почти везде
  2. infocmp -x | ssh -t target-system 'cat > "$TERM.info" && tic -x "$TERM.info"'

2 - тоже адский костыль, но работает, и от лени часто им пользуюсь.

А вообще, с удалёнными системами часто использую nvim scp://..., чтобы работали все мои настройки. И почти не использую переназначение клавиш в конфиге, поэтому если в любой удаленной системе есть vim, то дискомфорт не испытываю, т.к. большинство клавиш совпадает из-за того, что использую стандартные.

emorozov
()
Ответ на: комментарий от emorozov

export TERM=xterm-256color

Учту, сенькс.

поэтому если в любой удаленной системе есть vim

В генте уже довольно давно (т.е. ещё до того как я с неё слез) по дефолту стало nano вместо vim. :) Тут должен быть пассаж про задравшую многих 50-летнюю давность не только в коде терминалов, но чёт не формулируется красиво. :)

dimgel ★★★★★
()
Ответ на: комментарий от emorozov

Ну, это вроде нечасто бывает, на самом деле.

У меня часто. Я когда чужие сорцы скачиваю, мне влом из них qtcreator-овый проект делать, так что смотрю vim-ом, и в блокнотик что мне нужно с номерами строк выписываю (примерно так), и/или grep -rn function_name ищу и потом открываю файлы с переходом на нужную строку.

dimgel ★★★★★
()
Последнее исправление: dimgel (всего исправлений: 1)
Ответ на: комментарий от dimgel

довольно давно

насколько давно? В 2004/2005 nano ж уже был.

Там правда ещё есть прикол с virtual/editor и порядком следования пакетов в нём. И если что-то установлено из списка, что идёт первым, то следующие он предлагает удалить.

grem ★★★★★
()
Ответ на: комментарий от grem

насколько давно? В 2004/2005 nano ж уже был.

А 2004/2005 – это по-вашему недавно? :) Я хз насколько, потому как тыщу лет назад её поставил, воткнул vim (по дефолту или сам – поди вспомни) – и всё, жил и радовался. Пока конпелять не осточертело.

dimgel ★★★★★
()
Ответ на: комментарий от dimgel

Ну так сам генту эдак в 2002 всего появился, а я его впервые поставил в 2004. Vim там вообще не помню, разве что какая-то утилита его зачем-то как-то притащила. Но потом он удалился.

grem ★★★★★
()
Ответ на: комментарий от dimgel

Я имею в виду, нечасто бывает, что одна и та же функциональность в vim находится на разных клавишах.

А так, когда копаюсь в сырцах незнакомых проектов, то чаще в командой строке пишу nvim SomeFile.cpp +99, чтобы сразу на нужной строке открылся.

И использую вместо grep всегда rg, т.к. очень много удобных плюшек, типа не лезть в файлы из .gitignore, возможность задавать типы файлов для поиска (намного короче писать, чем конструктор из find + grep).

Собс-но для этого даже в своей конфигурации вкрячил взятый откуда-то конструктор для поиска сразу в nvim с использованием rg и fzf, но постоянно забываю им воспользоваться. )))

emorozov
()

set mouse=a включить полную поддержку мыши;

Вредные советы однако… наоборот надо set mouse=c

eternal_sorrow ★★★★★
()
Ответ на: комментарий от Roy-Batty

почитай, прежде чем других учить

Истоком этой статьи был достаточно развернутый коммент ТС в соседней теме о nano. Можно сказать, это я предложил перенести тот пост в раздел «Статьи», как напоминалку о часто используемых хоткеях.

Но никто не мешает любому желающему забабахать абсолютно полную статью о vi/vim. Дерзайте.

krasnh ★★★
()

И я бы сделал раздел по Vim и разбил на сборку статей (по theme, плагинам, клавишам, программированию (Lua/Viml), интересным решениям, конечно по regexp, заручился бы поддержкой единомышлеников, создал git…

Но я не ты.

Roy-Batty
()
Ответ на: комментарий от krasnh

Но никто не мешает любому желающему забабахать абсолютно полную статью о vi/vim. Дерзайте.

Возможно на своём ресурсе. LOR - это модераторы. Зачем мне вливать своё время (а это не один месяц) сюда, где Шому держали и только критическая ситуация его вывела (я даже не уверен, что до конца).

Roy-Batty
()
Ответ на: комментарий от Roy-Batty

LOR - это модераторы.

LOR — это большей частью очень либеральные модераторы. Где ещё можно их так обсуждать и спорить?

Я вот свою программу на один в целом очень хороший, полезный ресурс выложил, модератор тему тут же заблокировал, я повзывал-повзывал к администрации, в результате мои взывания потёрли, а тему открыли, но переместили в далёкий раздел, где 90% ЦА её никогда не увидит. Правда, это было 5 лет назад, и тот модератор уже давно не модератор…

Если есть претензии по конкретным случаям модерации — пиши в спецраздел. От ошибок никто не застрахован. Кстати, тот же Шома по моей жалобе как-то восстанавливал сгоряча удалённую тему, было и такое (я тогда ещё модератором не был).

А свой ресурс — это хорошо, замечательно, но на ЛОРе уже есть готовая аудитория.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

Я вот свою программу на один в целом очень хороший, полезный ресурс выложил, модератор тему тут же заблокировал, я повзывал-повзывал к администрации, в результате мои взывания потёрли, а тему открыли, но переместили в далёкий раздел, где 90% ЦА её никогда не увидит. Правда, это было 5 лет назад, и тот модератор уже давно не модератор…

Согласен. Поэтому надо и создавать свою страницу, как бы это не было лень или «не знаю как».

А по аудитории - её везде есть. СЕО никто не отменял.

Roy-Batty
()
Ответ на: комментарий от eternal_sorrow

Консольный редактор с мышкой плохо дружит. А в sam мышка основной инструмент. Это же из Plan 9.

А консольных, доведённых до совершенства (в разных его пониманиях), всего два.

monk ★★★★★
()

В редакторе есть два режима

И на этом можно попрощаться с удобством и эффективностью использования.

massimus ★★★
()
Ответ на: комментарий от massimus

Чвойто? Во всяких хипсторо редакторах тоже минимум два, это изначальный режим ввода и режим команд по ctrl + p (или типа того) саблаймы там всякие,вскоды,лайты да куча их. Просто в виме командный/хоткейный режим по умолчанию, вот и всё. Но и это не беда, напиши в своём vimrc слово start и всё, открыв какой то файл в vim ты будешь просто сразу печатать как и в любом другом редакторе/блокноте/ide, а в режим хоткеев переходить по esc, а можешь вообще не переходить.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от grem

А сделать так не судьба?

nmap <silent> <leader><space> :nohlsearch<CR>

Или даже так:

nmap <silent> <space> :nohlsearch<CR>
andreyu ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

А при чём здесь хипсторедакторы? Я про то, что для команд лучше хоткеи, которые не меняют контекст, а не «переключил контекст, дал команду, переключил контекст». Это антиюзабилити.

massimus ★★★
()
Последнее исправление: massimus (всего исправлений: 1)
Ответ на: комментарий от massimus

Я про то, что для команд лучше хоткеи, которые не меняют контекст, а не «переключил контекст, дал команду, переключил контекст».

Это в emacs. Но любители vim говорят, что там хоткеи для осьминогов.

monk ★★★★★
()
Ответ на: комментарий от bugfixer

Плюсую. 20+ лет в vim’е живу - стрелочками до сих пор навигируюсь…

+1.

y скопировать выделенный текст;

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

GFORGX ★★★
()
Последнее исправление: GFORGX (всего исправлений: 1)
Ответ на: комментарий от GFORGX

+1.

Рыбак рыбака…

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

Я пролистал несколько экранов Ваших последних сообщений - и relevant вопросов не увидел. Сильно затруднит прямую ссылку запостить?

ПыСы. Поздравляю, правда! Вы поняли о чём я…

bugfixer ★★★★
()
Ответ на: комментарий от GFORGX

визуального выбора перед янком: vi в командном режиме и стрелочки

Можно же просто shift-V, как и ZZ/ZQ вместо :q/:wq

yu-boot ★★★★
()
Ответ на: комментарий от bugfixer

!command запустить программу прямо из редактора

А вот тут (это ответ @LINUX-ORG-RU, а не багфиксеру): мне проще держать рядом вкладку, где будет, неважно, go run …, cc, ./configure –prefix=$(pwd) && make install.

GFORGX ★★★
()
Последнее исправление: GFORGX (всего исправлений: 1)
Ответ на: комментарий от yu-boot

Вот, кстати, Shift-Z-Z, бывает, использую иногда по настроению.

Вообще, наверное, мне просто командный режим больше нравится, хоткеи вима мало использую (хотя надо выучить, тут не нужно (при всей искренней любви к emacs) растопыривать пальцы, как не в себя :)).

GFORGX ★★★
()
Ответ на: комментарий от GFORGX

Воть: vim, сделать yank целого логического блока.

Я обычно действую так же как господин @Crocodoom - лично мне так удобнее.

bugfixer ★★★★
()

s/два режима — обычный и режим ввода:/два режима — командный и режим ввода:/

sniper21 ★★★★★
()
Последнее исправление: sniper21 (всего исправлений: 1)
Ответ на: комментарий от bugfixer

Вы же про табчик в терминале сейчас?

Ага.

GFORGX ★★★
()

i или a переводит вас из командного режима в режим ввода.

У меня сразу вопрос: какого хрена сделано именно так? Зачем две кнопки для одного и того же действия?

Я то знаю, что «i» - переход в режим редактирования (вставки) в месте, где стоит курсор. А «a» - тоже переход в режим редактирования (вставки), но с символа, следующим за текущим. Сомнительное удобство, но что есть то есть.

Однако вы же должны это объяснять неофитам, а не порождать очередные непонятки вокруг и так марсианского интерфейса.

Xintrea ★★★★★
()
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от Xintrea

Никаких непоняток нет. Это сделано для того, чтобы не переходить каждый раз точно в позицию, где надо начать вставлять текст.

Чаще всего, например, надо начать добавлять текст в конце строки: достаточно оказаться в строке и нажать A. Ещё чаще надо начать писать в новой строке, следующей за текущей, поэтому вместо ji или ja проще нажать o.

Это не разные клавиши для одного действия, это разные действия.

Хотя если человек привык всё время жмакать стрелки, как приходится в несовершенных редакторах, то понять, наверное, сложно.

emorozov
()
Ответ на: комментарий от emorozov

нечасто бывает, что одна и та же функциональность в vim находится на разных клавишах

у меня для вас очень плохие новости. практически любую цель в этом мире можно достичь более чем одним способом. в vim есть «дефолтные» настройки, есть те, что дистрибутив добавляет. я уж и не говорю про пользовательские «хотелки».

dummy ★★
()
Последнее исправление: dummy (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.