Skip to content

Instantly share code, notes, and snippets.

@AndrewRadev
Created April 24, 2020 12:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndrewRadev/0edc266975c9c404596c278ea58ffd0c to your computer and use it in GitHub Desktop.
Save AndrewRadev/0edc266975c9c404596c278ea58ffd0c to your computer and use it in GitHub Desktop.
An old Vim guide I wrote in Bulgarian. Originally published at https://github.com/fmi/ruby-course-guides/blob/master/vim.md#readme

Vim

TL;DR – VIM EMERGENCY!

  • За да излезете от Vim, без да запазвате файл, натиснете Esc, след това напишете :q! и натиснете Enter.
  • За да направите промяна, натиснете i и си редактирайте текста като в нормален редактор.
  • За да запазите направените промени, натиснете Esc и след това напишете :w и натиснете Enter. След това е окей да излезете от редактора с :q.

А ако се чудите къде да инвестирате следващите десет минути от живота си, непременно прочетете това ръководство до края.

Основни принципи

Vim вероятно е коренно различен от "нормалните" редактори, с които сте свикнали. Когато натиснете клавиш като j, t, f в нормален редактор, очевидното нещо, което ще се случи, е че въпросния символ ще влезе в текста. За да можем да направим специални движения, като да скачаме по думи, да търсим дефиниции или отваряме файлове, ползваме сложни комбинации от Ctrl, Shift, Alt и нормални клавиши. Редактори като emacs позволяват да се наберете на няколко такива клавишни комбинации, но това е рядкост. Обикновено просто се прибягва до все по-сложни комбинации от мета-клавиши.

За разлика от тях, Vim използва символните клавиши за движение и манипулация на текста. Клавиша j придвижва курсора един ред надолу. Клавиша t чака за следващ клавиш и след това скача на следващото срещане на въведения символ на текущия ред. И така нататък. За да въвеждате текст, има нужда да влезете в различен режим на работа.

Тоест:

  • "Нормални" редактори: Символните клавиши просто въвеждат текст. Специални действия се правят с Ctrl/Alt/Shift комбинации.
  • Vim: Символните клавиши правят специални действия. Смяната на режима позволява символните клавиши да въвеждат текст.

Режими

Vim има няколко главни режима (modes): Normal, Insert, Visual, Command-line.

"Normal" е режима, в който искаме да сме през повечето време. Това е важно. Една от най-често допусканите грешки от новаци е да се опитват да използват Vim като нормален редактор и съответно да прекарват времето си предимно в Insert mode, който е подобен на това, с което са свикнали. Това е неудобно и неефективно. Правилният начин е да стоите предимно в Normal mode, в който лесно можете да навигирате из текста, маркирате области, прилагате действия. Когато имате нужда от това да въведете текст, влизате в Insert mode по подходящ начин и след това веднага излизате. Отнема известно време да се свикне, но след като това се случи, ще откриете, че е изключително удобно. За някакви основни клавиши за навигация, вижте следващите секции.

За да влезете в Insert mode, може да използвате няколко различни клавиша:

  • i ще влезе в Insert mode преди символа, върху който е курсора в момента.
  • a ще влезе в Insert mode след символа, върху който е курсора в момента.
  • I влиза в Insert mode в началото на реда.
  • A влиза в Insert mode в края на реда.
  • o ще отвори нов ред след текущия и ще ви остави в Insert mode.
  • O ще отвори нов ред преди текущия и ще ви остави в Insert mode.

Друг клавиш, който влиза в Insert mode, е c, но употребата му е по-сложна за обяснение. Използвайте командата (вижте по-долу за Command-line mode) :help motion.txt за по-широко обяснение на идеята за "motions" и как може да ги използвате за да извършвате сложни действия върху добре дефинирани области от текста. Това е изключително мощен инструмент, и е силно препоръчително да опитате да му свикнете.

За да излезете от Insert mode (и почти всички други), използвайте <esc> или <c-[> (CTRL+[). Обмислете варианта да remap-нете Caps Lock клавиша си на Ctrl или Esc. Помага много, и за доста други неща.

Критично е да се знае, че u се използва за undo, а <c-r> (Ctrl+r) се използва за redo. Ще допускате доста грешки, свикнете да ги revert-вате с undo.

Във Visual mode навигацията е горе-долу същата, както в Normal mode, само че когато го активирате, ще маркирате текста от текущата позиция, докъдето заведете курсора. За да поставите курсора в другия край на визуалната селекция, натиснете O. Оттам нататък, можете да:

  • Копирате текста с y
  • Изтриете текста с d
  • Изтриете текста с c, което ви оставя в Insert mode.

И доста други неща (:help visual-operators). За да влезете във Visual mode, използвайте:

  • V за поредов visual mode. Както и да се движите, винаги е маркиран цял ред, а не част от него. Това е удобно за манипулация на цели буци текст.
  • v за visual mode символ по символ. Удобен предимно за малки парчета текст в рамките на един ред.
  • <c-v> (Ctrl+v) за visual mode във формата на блок. Удобен за по-специални цели, :help blockwise-operators за повече информация.

В Command-line mode се влиза с натискането на : в Normal mode. Това отваря един ред в долната част на Vim, където могат да се въвеждат команди, като write за записване на файла на диска, или quit за излизане от Vim. Натискането на Enter ги активира.

Може да забележите, че клавишите в Normal mode се използват почти изцяло за "недеструктивни" действия, такива които могат да се обърнат. Запазването на файла или затварянето на Vim са команди, понеже са опасни, по някакъв начин и изискват малко по-различен интерфейс, за избягване на случайно активиране.

Основни команди:

  • :write или :w записва промените по файла на диска.
  • :quit или :q излиза от Vim.
  • :edit <filename> редактира нов файл в текущия прозорец.
  • :split <filename> отваря нов файл в нов прозорец в split. За повече информация за split-ове (по-точно за прозорци, "windows"), почетете :help window.txt
  • :s/<regex>/<replacement>/ замества всички match-ове на regex-а с replacement. Вижте :help :substitute за помощ (и почетете доста).

Основна навигация в Normal mode

Най-известния инструмент за навигация във Vim са клавишите h, j, k, l. Те работят по същия начин както стрелкичките, с тази разлика, че ако използвате десетопръстната система за писане на текст, те са изключително близко до пръстите на дясната ръка. Това ги прави много по-удобни за работа, особено ако ги използвате като навигационни клавиши в собствени клавишни комбинации.

That said, те са удобни само за прецизна навигация, когато нищо друго няма да свърши работа. Забравете за мишката. Тя е добър инструмент за визуална навигация, което рядко се налага, ако свикнете да мислите за структурата на текста. В повечето случаи пречи ужасно много за поддържане на удобен flow. Ето няколко други начина за навигация в контекста на различни use cases:

Вертикална навигация

  • <c-f>/<c-b> - Движение напред/назад по страници. Мнемоника: Forward/Back
  • <c-d>/<c-u> - Движение напред/назад по половин-страници. Мнемоника: Down/Up
  • H/M/L - Скок до горната част/средата/долната част на екрана. Мнемоника: High/Middle/Low
  • j/k - Движение по един ред надолу/нагоре

Хоризонтална навигация

  • w/b - Движение напред/назад по думи. Скачат до началата на думите. Мнемоника: Word/Back
  • e/ge - Движение напред/назад по думи. Скачат до краищата на думите. Мнемоника: End
  • f/t - Чакат за следващия клавиш и след това скачат върху следващото му срещане на реда (f) или точно преди него (t). Пример: f( ще отиде върху следващата отваряща скобка. Бонус: dt) ще изтрие всичко до следващата затваря скобка, което е един начин да изтриете всичко в чифт скоби. Това е защото d е "operator" а t) е "motion". В случай на любопитство, опитайте се да разберете какво значи това.
  • ^/$ - Скачат до началото/края на реда. Мнемоника: регулярни изрази.

Търсене

Можете да потърсите какъвто и да е текст във файла, използвайки клавиша / в нормален режим. Това ви оставя в специален command-line в долната част на редактора, където можете да въведете нещо за търсене и да натиснете Enter, за да скочи Vim върху него. Клавишите n и N вървят напред и назад по попаденията. Използвайте :help / за доста повече информация.

Следващи стъпки

Vim идва с програма, която се казва vimtutor. Изпълнението на vimtutor в командния ред ще стартира редактора със зареден tutorial. Четете инструкциите внимателно. Писани са изключително подробно, за пълни начинаещи. Задължително минете през vimtutor за да утвърдите доста от нещата, които съм написал. След това прочетете този guide отново, въоръжени с новия усет.

Help системата на Vim е огромна. Толкова огромна, че малко хора са я чели цялата. Това да не ви спира да пробвате. Полезен attitude за help-а на Vim е да го възприемете като Wikipedia. Намерите ли информация за нещо, scroll-нете малко надолу-нагоре и ще намерите нещо ново и интересно.

Може да намерите интересна и полезна информация в reddit, а също и в Stack Overflow. Има добри книги, като Practical Vim на Drew Neil. Неговите screencast-ове също са изключително качествен източник на информация: Vimcasts.

Ако искате да се хвърлите в customizations и скриптиране (което силно препоръчвам), може да погледнете Learn Vimscript the Hard Way от един могъщ Vim-аджия на име Steve Losh. Той настоява първо да сте комфортни с Vim, преди да се захванете с това, но чувствайте се свободни да се пробвате и по-отрано. Няма да ви навреди.

Final Tips

Ако ставаше с гледане, кучето щеше да е най-добрия месар (credit: Стефан Кънев). Няма да свикнете с Vim, без да го използвайте. Използвайте го. За каквото можете. Пишете си мейлите с него, коментари в github, водете си бележки. Пишете си домашните по scheme и пролог и ruby и python и каквото още учите. Четете документация, търсете нови трикове и си създайте собствен flow.

Не се стремете да сте бързи като баш-майсторите. Стремете се да ви е максимално удобно и бързината ще последва. Пазете се от локални максимуми, обаче. Много често ще се наложи да излезете от comfort зоната си и да пробвате нещо странно (като например hjkl вместо стрелкичките). Дайте си време да свикнете и ще се чудите как се използвали нещо различно някога.

Забравете за мишката. Помислете за мястото, където искате да позиционирате курсора и намерете начин да го направите. Ако не ви е удобно, може би има друг начин? Почетете документация.

Стойте предимно в Normal mode. Казах го по-горе, но ще го кажа пак. Важно е.

Някой ден (може би след няколко седмици, може би след няколко месеца, зависи от количеството практика) ще откриете, че току-що сте нарязали няколко парчета текст точно както сте искали, без да имате каквато и да е идея точно как е станало. Това е към което се стремите. Не се опитвайте да го насилвате, просто вкарвайте практика и ще стане. И след това продължавайте да се подобрявате.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment