Vim и продуктивность: профессиональный текстовый редактор
Vim motions, macros, plugins и продвинутые техники
Vim существует с 1991 года и до сих пор остается одним из самых мощных редакторов. Крутая кривая обучения, но огромная продуктивность. VS Code добавил Vim motions. IntelliJ имеет IdeaVim. Разберем как освоить Vim. Почему Vim Скорость — редактирование без мыши Везде — на любом сервере Lightweight — мгновенный запуск Extensible — тысячи плагинов Muscle memory — работает всю жизнь Modes Normal Mode: Режим по умолчанию для навигации и команд. h — влево j — вниз k — вверх l — вправо w — следующее слово b — предыдущее слово e — конец слова 0 — начало строки $ — конец строки gg — начало файла G — конец файла f{char} — найти char в строке t{char} — до char ; — повторить f/t , — повторить f/t назад Insert Mode: i — вставка перед курсором a — вставка после курсора I — вставка в начале строки A — вставка в конце строки o — новая строка ниже O — новая строка выше Esc — выйти в Normal Mode Visual Mode: v — character-wise visual V — line-wise visual Ctrl+v — block-wise visual # В Visual Mode: y — копировать d — удалить c — изменить > — indent Command Mode: :w — сохранить :q — выйти :wq — сохранить и выйти :q! — выйти без сохранения :e filename — открыть файл :bn — следующий buffer :bp — предыдущий buffer Text Objects Мощная фича Vim — редактирование объектов: iw — inner word aw — a word (с пробелом) is — inner sentence as — a sentence ip — inner paragraph ap — a paragraph i( или ib — внутри () a( или ab — включая () i{ или iB — внутри {} a{ или aB — включая {} i[ — внутри [] a[ — включая [] i a i" — внутри "" a" — включая "" it — внутри HTML tag at — включая HTML tag Примеры: ciw — change inner word daw — delete a word yi( — yank inside () da{ — delete including {} vit — visual inside tag di" — delete inside quotes Operators + Motions Формула: operator + count + motion Operators: d — delete c — change y — yank (copy) p — paste > — indent Примеры комбинаций: d2w — delete 2 words c$ — change до конца строки y3j — yank 3 lines down d4k — delete 4 lines up >2j — indent 2 lines down dt, — delete до запятой df) — delete до ) ci{ — change inside {} da" — delete including quotes ggdG — delete все содержимое файла ggVG — select весь файл Search and Replace Search: /pattern — искать вперед ?pattern — искать назад n — следующее совпадение N — предыдущее совпадение * — искать слово под курсором вперед # — искать слово под курсором назад :noh — убрать подсветку Replace: # Замена в текущей строке :s/old/new/ — первое вхождение :s/old/new/g — все вхождения # Замена во всем файле :%s/old/new/g — все вхождения :%s/old/new/gc — с подтверждением # Замена в диапазоне :10,20s/old/new/g — строки 10-20 :.,+5s/old/new/g — текущая + 5 строк Macros Запись и воспроизведение последовательности команд: # Запись q{register} — начать запись в register # Делаем действия q — закончить запись # Воспроизведение @{register} — выполнить macro @@ — повторить последний macro 100@{register} — выполнить 100 раз # Пример: qa — начать запись в register a 0 — в начало строки i" — вставить " Esc — выйти из Insert A" — добавить " в конец Esc — выйти j — следующая строка q — закончить запись # Теперь: 10@a — применить к 10 строкам Registers # Специальные registers: " — default register 0 — последний yank 1-9 — история delete + — системный буфер обмена * — системный selection # Использование: "ay — yank в register a "ap — paste из register a "+y — копировать в системный буфер "+p — вставить из системного буфера :reg — показать все registers Marks m{a-z} — установить local mark m{A-Z} — установить global mark `{mark} — перейти к mark (точная позиция) '{mark} — перейти к строке mark `` — вернуться к предыдущей позиции ". — перейти к последнему изменению :marks — показать все marks Multiple Files Buffers: :e file — открыть файл :ls — список buffers :b{n} — переключиться на buffer n :bn — следующий buffer :bp — предыдущий buffer :bd — закрыть buffer Windows (splits): :sp file — horizontal split :vsp file — vertical split Ctrl+w h — перейти влево Ctrl+w j — перейти вниз Ctrl+w k — перейти вверх Ctrl+w l — перейти вправо Ctrl+w = — выровнять размеры Ctrl+w _ — максимизировать высоту Ctrl+w | — максимизировать ширину Ctrl+w c — закрыть window Tabs: :tabnew — новый tab :tabn — следующий tab :tabp — предыдущий tab :tabc — закрыть tab Vimrc Configuration " ~/.vimrc " Основные настройки set number " Номера строк set relativenumber " Относительные номера set tabstop=2 " Размер tab set shiftwidth=2 " Размер indent set expandtab " Пробелы вместо tab set autoindent " Автоотступы set smartindent set wrap " Перенос длинных строк set linebreak " Не разрывать слова " Search set incsearch " Поиск по мере ввода set hlsearch " Подсветка результатов set ignorecase " Игнорировать регистр set smartcase " Но учитывать если есть заглавные " UI set showcmd " Показывать команды set wildmenu " Command line completion set laststatus=2 " Всегда показывать statusline set cursorline " Подсветка текущей строки " Performance set lazyredraw " Не перерисовывать во время macros set ttyfast " Leader key let mapleader = " " " Custom mappings nnoremap w :w nnoremap q :q nnoremap e :e " Easy window navigation nnoremap h nnoremap j nnoremap k nnoremap l " Clear search highlight nnoremap / :noh Plugins (с vim-plug) " Install vim-plug curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim " ~/.vimrc call plug#begin('~/.vim/plugged') " File explorer Plug 'preservim/nerdtree' " Fuzzy finder Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } Plug 'junegunn/fzf.vim' " Git integration Plug 'tpope/vim-fugitive' " Syntax highlighting Plug 'sheerun/vim-polyglot' " Status line Plug 'vim-airline/vim-airline' " Auto pairs Plug 'jiangmiao/auto-pairs' " Comments Plug 'tpope/vim-commentary' " Surround Plug 'tpope/vim-surround' " LSP Plug 'neoclide/coc.nvim', {'branch': 'release'} call plug#end() " NERDTree nnoremap n :NERDTreeToggle " FZF nnoremap f :Files nnoremap b :Buffers nnoremap g :Rg Advanced Techniques Vim Surround: ysiw" — окружить слово кавычками cs"' — заменить " на ' ds" — удалить окружающие " ysiw — окружить тегом Visuал Mode: S — окружить selection Vim Commentary: gcc — закомментировать строку gc2j — закомментировать 2 строки gcap — закомментировать paragraph Multiple Cursors (manual): Ctrl+v — block visual j/k — выбрать строки I — вставить в начале ESC — применить ко всем строкам # Или: Ctrl+v j/k — выбрать A — вставить в конце ESC Neovim Современная версия Vim с лучшей архитектурой: -- init.lua (Lua configuration) vim.opt.number = true vim.opt.relativenumber = true vim.opt.tabstop = 2 vim.opt.shiftwidth = 2 vim.opt.expandtab = true -- Key mappings vim.g.mapleader = ' ' vim.keymap.set('n', ' w', ':w ') -- Plugins (packer.nvim) require('packer').startup(function(use) use 'wbthomason/packer.nvim' use 'nvim-treesitter/nvim-treesitter' use 'neovim/nvim-lspconfig' use 'hrsh7th/nvim-cmp' end) VS Code Vim Extension // settings.json { "vim.leader": " ", "vim.useSystemClipboard": true, "vim.hlsearch": true, "vim.normalModeKeyBindingsNonRecursive": [ { "before": [" ", "w"], "commands": ["workbench.action.files.save"] }, { "before": [" ", "f"], "commands": ["workbench.action.quickOpen"] } ] } Learning Path vimtutor — встроенный туториал (30 минут) Изучить основные motions — hjkl, w, b, 0, $ Text objects — ciw, di", yi( Operators — d, c, y с motions Visual mode — выделение и операции Search/Replace — /, ?, :s Macros — автоматизация Plugins — расширение функциональности Productivity Tips . — повторить последнее изменение Ctrl+a/Ctrl+x — increment/decrement числа :earlier 5m — вернуться на 5 минут назад :later 5m — вперед на 5 минут gf — открыть файл под курсором Ctrl+o/Ctrl+i — jump list назад/вперед Заключение: Vim — инвестиция в продуктивность. Первые недели сложно, но затем скорость редактирования взлетает. Начните с vimtutor. Практикуйте motions и text objects каждый день. Добавляйте плагины по мере необходимости. Muscle memory развивается месяцами. Vim motions работают везде — VS Code, IntelliJ, браузер. Изучите Vim — не пожалеете.