Эффективное использование Vim

Введение


Я очень люблю редактор Vim, использую его в своей работе (для написания кода) уже больше четырех лет и хочу поделиться своим опытом его использования.

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

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

По умолчанию Vim настроен очень старомодно, и эта настройка подразумевает, что пользователь при работе с текстом будет мыслить метафорами пятидесятилетней давности, как будто бы сейчас заря эпохи UNIX. Однако дизайн Vim позволяет сделать несколько настроек, после которых система станет выглядеть вполне прилично и станет работать весьма эффективно, сочетая в себе полезные черты и древних юниксовых инструментов работы с текстом, и современных WYSIWIG-процессоров, при этом обходя, насколько это возможно, присущие им недостатки. Вот об этих настройках и приемах их использования и пойдет речь.

Работа с содержимым по модели “существительное — глагол”

Джеф Раскин, известный авторитет в области эргономики интерфейсов, в своем классическом труде “Интерфейс: новые направления в проектировании компьютерных систем” упоминает две модели работы с содержимым — “глагол — существительное”, когда сначала задается действие, а затем выбирается содержимое, к которому его нужно применить, и “существительное — глагол”, когда сначала выделяется содержимое, а затем к нему применяется какая-либо операция. В большинстве случаев предпочтительна именно модель “существительное — глагол”. В данном случае это определенно так. Добавлю, что часть приемов, о которых пойдет речь, были изобретены мной независимо от Раскина в то время, когда я еще не знал о существовании его книги, путем проб и ошибок — я пробовал разные способы выполнения действий, и через некоторое время у меня формировалось представление о том, что удобно, а что — нет.

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

В Vim, однако, понятие выделенного содержимого раздваивается. В качестве него могут выступать:
  • Блок текста, выделенный в режиме визуального выделения (обычно серым цветом)
  • Текст, отвечающий регулярному выражению, находящемся в регистре / (регистре текущего поиска). Иными словами, это текст, который подсвечивается желтым, когда включена опция hlsearch.

Первый случай широко известен, и подробно останавливаться на нем я не буду. В визуальном режиме серым цветом выделяется блок текста, затем к нему применяется команда (допустим, “Перевести в верхний регистр”). Все, как в других редакторах.

Подсветил — посмотрел — выполнил

Второй случай более интересен. В модели “существительное — глагол” он позволяет сделать существительным текст, отвечающий регулярному выражению в регистре /. При этом, когда включена опция :hlsearch, данный текст подсвечивается желтым. Это позволяет выработать стиль работы с текстом, который можно описать как «подсветил — посмотрел — (заменил ЭТО |удалил ЭТО |скопировал содержащие ЭТО строки | выполнил какую надо команду)», где ЭТО — текст, отвечающий регулярному выражению в регистре /. Такой стиль дает совершенно новый уровень удобства при выполнении операций типа “заменить все вхождения одного слова на другое” благодаря тому, что все вхождения заменяемого слова сразу видны в тексте. После перехода на такой стиль вернуться к старому стилю массовой замены практически невозможно (под “старым стилем” я здесь понимаю, например, реализацию команды “Заменить все” в текстовом редакторе Far manager’а, которая либо действительно заменяет все с риском заменить там, где не надо, либо запрашивает подтверждение каждой замены, создавая ненужные раздражающие запинки в работе). При использовании предварительной визуальной подстветки риск совершения ошибки при совершении массовых замен и подобных операций сведен к минимуму.

Дальше я опишу несколько настроек, которые при использовании стиля “подсветил — посмотрел — выполнил” оказались для меня очень удобными.

Строки из моего файла конфигурации _vimrc:
" по звездочке не прыгать на следующее найденное, а просто подсветить
nnoremap * *N
" выключить подсветку: повесить на горячую клавишу Ctrl-F8
nnoremap <C-F8> :nohlsearch<CR>

Поясню, что они делают. В Vim встроена команда * (звездочка, вызывается обычным нажатием Shift+8 в нормальном режиме), которая помещает текущее слово (на котором стоит курсор) в регистр поиска /, производит поиск следующего вхождения этого слова в тексте и перемещает курсор к этому следующему вхождению. Кроме этого, производится подсветка вхождений этого слова (на самом деле опять текста, отвечающего регулярному выражению в регистре поиска, но на практике в данном случае это значит именно вхождения текущего слова). По моему мнению, эта команда реализована неправильно. Я считаю ошибочным прыжок на следующее вхождение слова, потому что этот прыжок выбивает из контекста, приводя к смене текста на экране (следующее вхождение может оказаться где угодно, и текст может поменяться на совершенно незнакомый). Поэтому я использую первый мэппинг, котороый меняет семантику команды * на “подсветить текущее слово, но позицию курсора не менять”. Второй мэппинг используется для назначения горячей клавиши, сбрасывающей подсветку (по эргономическим соображениям она должна находится близко к клавише 8, на которой находится команда *, поскольку команды “подсветить” — “сбросить подсветку” очень часто используются в паре, например, для таких задач, как “подсветить все вхождения переменной, на которой я сейчас стою курсором”. После того, как локальная задача, ради которой подсвечивали переменные, решена, подсветку лучше сбросить, чтобы она не отвлекала внимание от дальнейшей работы. Причем при реальной работе промежуток времени между “подсветить” и “сбросить подсветку” может сокращаться до одной секунды). После того, как слово подсвечено, можно использовать команды n и N для прыжков вперед / назад по его вхождениям, если это необходимо.
" в визуальном режиме по команде * подсвечивать выделение
vnoremap * y :execute ":let @/=@\""<CR> :execute "set hlsearch"<CR>

Это то же, что команда * делает для слов, но примененное для фрагмента, выделенного в визуальном режиме. Используется, когда нужно подсветить не слово (обрамленное пробелами), а произвольный фрагмент, который, допустим, может содержать пробел в середине.

Использование стиля “подсветил — посмотрел — выполнил” совместно с визуальным режимом оказалось очень удобной практикой. Такое комбинирование стилей выделения используется при решении задач типа “в данной функции переименовать переменную foo в bar” и подобных. Такая (и подобные) задачи решаются последовательностью действий:
  • Подсвечиваем foo командой *
  • Переходим в режим визуального выделения и выделяем текущую функцию
  • Отдаем команду замены :’<,’>s//bar/g

Символы ’<,’>, означающие начало и конец текущего выделенного блока, и определяющие диапазон применения команды :s, Vim подставляет автоматически при отдаче любой команды из режима визуального выделения. Также опущен первый аргумент команды :s, т. к. набирать его нет необходимости — когда он опущен, Vim использует в качестве этого аргумента содержимое регистра текущего поиска. То есть именно то, что подсвечено желтым.

Таким образом достигается наглядность. Содержимое регистра / подсвечивается желтым, поэтому мы видим, ЧТО мы будем заменять. Блок, выделенный в режиме визуального выделения, подсвечивается серым, поэтому мы видим, ГДЕ мы будем это заменять. Остается отдать команду :s, в которой указать, НА ЧТО заменять.

Отдельного акцента заслуживает уже упоминавшаяся особенность Vim (к сожалению, не сразу понятно, что она у него имеется, и узнать о ее существовании можно либо наткнувшись на ее описание в документации либо в интернете, либо методом “тыка”), которая состоит в том, что команды, применяющиеся для массовых операций над текстом, такие, как :s (substitute, замена одного шаблона на другой), :d (delete, удаление строк, содержащих шаблон), :g (global, выполнение произвольной операции над строками, содержащими шаблон) используют содержимое регистра / в качестве своего аргумента, в случае, когда он опущен при их вызове. Это очень удобно, и к такому поведению привыкаешь моментально. Собственно, именно эта “фича” и делает возможным редактирование текста в режиме “подсветил — посмотрел — выполнил”, который настолько хорошо совместим с особенностями человеческого восприятия, что в компьютерных интерфейсах он используется повсеместно — мы выделяем файлы в файловом менеджере (они подсвечиваются), смотрим на выборку, выполняем с ними какую-либо операцию. То же самое происходит и в графических и других редакторах. Собственно, после короткого периода привыкания к редактированию в таком стиле, становится непонятно, как вообще можно по-другому.

Несколько рецептов из моей “поваренной книги Vim”

Дальше я приведу несколько команд и приемов использования Vim, которые я считаю полезными для себя, но, в принципе, их использование или неиспользование — уже дело вкуса и личных предпочтений, а также набранного опыта использования Vim. Вполне возможно, что для каких-то описанных мной ниже задач есть более эффективные способы решения.

:g//t$ — скопировать строки, содержащие подсвеченное значение, в конец файла. Если, например, надо быстро понять, как глобальная переменная (sic! — а что делать, в legacy-коде они встречаются) используется в модуле.

:g//d — удалить строки, содержащие подсвеченное значение
:g!//d — удалить строки, НЕ содержащие подсвеченного значения

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

Заменить каждое вхождение нескольких пустых строк на одну пустую строку (чтобы между параграфами стал одинаковый промежуток в одну линию):
:v/./,/./-j

Убрать пустые строки (в визуальном режиме)
:'<,'>g/^$/d

Раздвинуть подряд идущие строки (обратное предыдущему действие, каждая строка станет параграфом)
Нужно при форматировании текста под 76 символов, из формата, как его сохраняет Word, когда каждый абзац становится строкой в текстовом файле.
:'<,'>s/$/\r/g

Показали свою полезность следующие аккорды (фрагмент из _vimrc)
" по Alt-1 редактировать текущее слово
nnoremap <M-1> ciw

" по Alt-5 изменять хвост текущего слова
nnoremap <M-5> cw

Использование Vim для работы с кодом и программирования

Приведу несколько приемов, полезных при работе с кодом. Собственно, именно для работы с кодом Vim и создавался (в отличие от Emacs, который считается более универсальным редактором, подходящим для работы с любыми текстами, а не только с кодом. Впрочем, это известная тема для holy wars).

Удобно использовать метку ] для вставки блока кода внутрь операторных скобок и его последующего выравнивания (indenting). Тут имеется в виду, что после вставки блока внутрь операторных скобок по команде p нужно вновь выделить вставленный блок, чтобы выровнять его положение внутри скобок в соответствии с принятыми правилами форматирования. Для этого нужно выделить вставленный блок. Это можно легко сделать, если встать на первую строку вставленного блока, перейти в режим визуального выделения строк (команда V), и дать команду перейти к специальной метке, означающей последнюю строку только что вставленного блока: ‘] (апостроф, потом закрывающая квадратная скобка).

Плагин matchit для перемещения по операторным скобкам. Без комментариев must have. По команде % курсор прыгает между { и } в языках с Си-подобным синтаксисом, между begin и end в Паскале, и т. д. Плагин входит в стандартную поставку Vim.

Автодополнение по Ctrl-N. Конечно, настолько хорошо, как в IDE-средах, поддерживающих парсинг и предкомпиляцию, работать не будет, но если такого IDE нет, или неохота ставить, то вполне сгодится.

Генератор тэгов ctags и команды перемещения по тэгам Ctrl-] (пойти в функцию под курсором) и Ctrl-T (вернуться обратно). Опять же, по сравнению с IDE, получается простая и порой дубовая, но работающая навигация по коду (причем кода может быть вполне много, полмиллиона строк вполне тянет, а говорят, может тянуть и гораздо больше).

Можно использовать :r !grep <аргументы для grep> и потом Ctrl-W gf для поиска и-или замены по массиву кода (для рефакторинга). Команда :r !grep вставляет в текущее место (где стоит курсор) вывод grep’а. Команда gf (go [to] file) открывает файл, на имени которого стоит курсор, в новом окне (либо вкладке). Если имя файла хитрое (допустим, путь к файлу содержит пробелы), то можно выделить полный путь к файлу в режиме визуального выделения, и уже после этого дать команду gf (либо Ctrl-W gf).

Использование Vim в операционной системе Windows

Поскольку основная ОС у меня Windows, я выполняю некоторые дополнительные настройки Vim, чтобы горячие клавиши вели себя единообразно. В стандартную поставку входит файл настроек mswin.vim, который включается в начало файла инициализации _vimrc:
set nocompatible
source $VIMRUNTIME/mswin.vim
behave mswin

Включение этого файла приводит к тому, что команды копирования и вставки в буфер (Ctrl-C и Ctrl-V) начинают работать стандартным для Windows способом, что полностью оправдано.

Для редактирования нескольких файлов я использую вкладки. Чтобы открыть файл в Vim (добавить вкладку с файлом / файлами, если Vim уже открыт), я использую команду для меню Far:
"C:\Program Files\Vim\vim73\gvim.exe" --remote-tab-silent !&
(!& — это специальный макрос Far’а, означающий “текущий либо выделенные файлы”). Собственно, интерфейс командной строки здесь такой:
"C:\Program Files\Vim\vim73\gvim.exe" --remote-tab-silent file1 [file2] ...
Для переключения между вкладками я использую стандартные для Windows сочетания Ctrl-Tab (Shift-Ctrl-Tab). Также практика показала, что нужна возможность двигать вкладки влево-вправо, чтобы несколько файлов, которые редактируются одновременно, можно было бы сдвинуть так, чтобы они оказались в соседних вкладках. Для этого я использую следующие настройки:

" CTRL-Tab is Next tab
nnoremap <C-Tab> :tabnext<CR>

" CTRL-Shift-Tab is Previous tab
nnoremap <C-S-Tab> :tabprevious<CR>

" use Alt-Left and Alt-Right to move current tab to left or right
nnoremap <silent> <A-Left> :execute 'silent! tabmove ' . (tabpagenr()-2)<CR>
nnoremap <silent> <A-Right> :execute 'silent! tabmove ' . tabpagenr()<CR>

" CTRL-F4 is :tabclose
nnoremap <C-F4> :tabclose<CR>


При работе в режиме insert мне удобнее использовать стандартное системное переключение раскладки (которое обычно по Alt-Shift, а у меня по Caps), а не встроенное в Vim, которое по Ctrl-^. Хотя, возможно, это уже чисто личное предпочтение.

Курсор между окнами (в терминах Vim, то есть текстовыми областями, создаваемыми командами :split или :vsplit) я перемещаю клавишей Tab, что, опять же, стандартно для Windows:
" Tab is Next window
nnoremap <Tab> <C-W>w

" Shift-Tab is Previous window
nnoremap <S-Tab> <C-W>W

Хинт, неочевидный для новых пользователей Vim: для того, чтобы вставить полезную команду из шпаргалки в командную строку Vim из буфера обмена Windows, надо, находясь в режиме отдачи команды (в который переходим после нажатия двоеточия), нажать Ctrl-R (курсор сменит форму на кавычку), затем нажать Shift-8 (в данном контексте это значит “вставить содержимое регистра, в котором находится буфер обмена Windows”).

Разбивать окна (окна в терминологии Vim) удобно по сокращенным командам Ctrl-W s и Ctrl-W v, закрывать по Ctrl-W c (это быстрее, чем набирать команды :split и :vsplit)

Заключение

Мы рассмотрели некоторые принципы и приемы, применение которых в редакторе Vim позволяет повысить эффективность редактирования текста. Возможно, эта статья заинтересовала кого-то, кто не работал с Vim, но хотел (или захотел) попробовать, или тех, кто, возможно, уже видел Vim, но не начал его использовать из-за необычности и непривычности его интерфейса. Действительно, Vim — не самый простой в использовании инструмент и кривая обучения у него не самая пологая. Однако проверенный временем дизайн и огромная гибкость делают его одним из самых эффективных инструментов редактирования текстов, который не потерял актуальности и в наши дни. Более того, он развивается и выходят новые версии. Наибольшая эффективность использования Vim достигается при использовании правильных подходов, некоторые из которых (как это видится мне) я постарался осветить в данной статье.

Начинающим пользователям, которые хотят научиться использовать Vim, я бы посоветовал идти тем путем, каким шел я сам — выполнить включенный в комплект поставки tutorial, а затем постепенно читать главы User Manual из справочной системы (она там очень хороша, доступна по команде :help) по порядку, пробовать применять описанные там команды и, конечно, использовать Vim в повседневной деятельности.

Спасибо за внимание.
Метки:
Поделиться публикацией
Комментарии 67
  • 0
    И не одной картинки…
    • +8
      Изначально консольная программа не подразумевает картинок
      • +6
        По картинке можно определить много вещей: консольная ли программа(ога), стандартная подсветка синтаксиса(фон), «многооконность»(Window splitting) и т. д.
        И хочу заметить что у это" изначально консольной программы" есть GUI.
        • +1
          А как же ASCII art? Чем не картинки? :)
          • +1
            вы не видели видимо вим никогда, он такой бывает «консольный», что иногда и новомодные, популярные иде меркнут с своими рюшечками.
            • +8
              А я считаю вот эту картинку охрененно наглядной:

              image

              Отсюда What is your most productive shortcut with Vim?.
              • 0
                А я так и не понял, как они это сделали. Т.е. как блок выделили — с этим все просто, а вот дальше…
                • +2
                  w<C-v>6jecfooКак-то так по-моему :)
                  • +1
                    Парсер съел <Esc> после foo
                    • 0
                      Самое важное съел.
                    • НЛО прилетело и опубликовало эту надпись здесь
                    • +1
                      Че дальше-то? Все просто: жми c, вводи свой текст, потом, выйдя в командный режим по Esc, Vim заменит object1 на твое творчество.
                      • 0
                        Короче, читай туториал. Для запуска его в *nix просто выполни команду vimtutor. В Windows перейди в Пуск->Программы->Vim->Vim tutor.

                        2 часа муштры – и ты начинающий vim-джедай!
                        • 0
                          Точно, спасибо. Забывал выйти в командный режим, теперь работает :)
                        • 0
                          Помоему это делается вот так: w<C-S-v>6jIfoo
                          • 0
                            извиняюсь пропустил е
                            • 0
                              а в посте наверху описанно, моя ошибка не заметил там ещё вместо I с
                    • +10
                      :s/е/и
                      • +1
                        У меня были мысли, что неплохо бы вставить несколько картинок, но, насколько я знаю, тут для них надо использовать специальный хаброхостинг, а я пока еще не нашел, где он находится.
                        • +1
                          • +1
                            Спасибо. Обязательно воспользуюсь — если не в этот раз, так в следующий.
                      • 0
                        Спасибо, добавил в избранное.
                        По поводу табов. Сам использую их, но при больших проектах это не совсем удобно. Смотрю в сторону какого-нибудь project-manager плагина
                        • 0
                          Согласен, когда число открытых файлов доходит, скажем, до 50-ти, табы уже не справляются. Они работают до тех пор, пока все открытые вкладки видны на экране, а это 7-10 файлов (кошелек Миллера). Дальше нужно что-то другое. Я пока использую плагин Buffer Explorer, но мне там сильно не хватает прогрессивного фильтра (когда вводишь сочетание букв, и по мере ввода в списке остаются только строки, содержащие это сочетание). Все никак не соберусь его написать, хотя и хочется.
                          • +2
                            FuzzyFinder? В принципе, более-менее хватает и :b foo, но оно «слепое».
                            • 0
                              Огромное спасибо! Кажется, это именно то, что нужно.
                        • 0
                          У меня сразу не заработала подсветка результатов поиска, оказывается в .vimrc было:
                          set nohlsearch " Don't highlight search results

                          Заменил на:
                          set hlsearch " Enable highlight search results


                          Еще советую использовать следующие бинды, очень помогают для настроек:
                          map ,vv :vsp $MYVIMRC " открыть файл конфигурации .vimrc
                          map ,V :call ReloadRc() " перезапустить файлы конфигурации

                          (в нормально режиме набираем ,vv для редактирования или ,V для перезапуска конфигурации)
                          • 0
                            > Разбивать окна (окна в терминологии Vim) удобно по сокращенным командам Ctrl-W s и Ctrl-W v, закрывать по Ctrl-W c (это быстрее, чем набирать команды :split и :vsplit)

                            Я пишу сокращенно :sp и :vs соответственно. ИМХО, это быстрее, чем жмакать Ctrl+W s и Ctrl+W v. Тут кому как удобнее.
                            • +8
                              Не понял зачем вы поиздевались над звездочкой, она в принципе и нужна для быстрого перехода к следующему вхождению слова и то что меняется контекст это логично, а подсветить вхождения слова под курсором можно через /<ctrl-r-w> в крайнем случае повесить бинд на данную комбинацию.

                              Не знаю может читали, как по мне одна из луших заметок о эффективном кодинге в виме.
                              • –22
                                Ох уже эти чумовые динозавры…
                                • +1
                                  А как вы языки переключаете?

                                  От себя добавлю )
                                  set keymap=russian-jcukenwin «переключение на русский через ctrl-^
                                  set iskeyword=@,48-57,_,192-255 „учим вим правильно “понимать» русские слова
                                  • 0
                                    Языки переключаю системным переключателем (Punto Switcher позволяет повесить переключение раскладки на Caps Lock, чем я и пользуюсь).

                                    Эти две строчки у меня в _vimrc тоже есть, и переключение по Ctrl-^ вполне работает, но через некоторое время я понял, что использовать системный переключатель удобнее. Прочитав книгу Джефа Раскина, я даже понял, почему — так увеличивается «монотонность» (в его терминах) интерфейса. Он называет «монотонным» интерфейс, в котором одно действие можно выполнить только одним способом, и считает эту «монотонность» положительной характеристикой. Мне кажется, он прав — если везде переключать раскладку одним способом (по Caps), а в Vim'е — другим (по Ctrl-^), это будет создавать некоторую путаницу.
                                  • 0
                                    > " выключить подсветку: повесить на горячую клавишу Ctrl-F8
                                    > nnoremap <C-F8> :nohlsearch<CR>


                                    Как говорится «На вкус и цвет...», но мне всё же нравится/кажется_более_логичным не отключать подсветку полностью, а переключать режим подсвечивать/неподсвечивать.

                                    :nnoremap <C-H> :set hls!
                                    • 0
                                      Сорри. Сам nohlsearch не пользуюсь и неправильно понял её назначение, хотя чуть дальше в тексте про это было. Конечно же сброс подсветки нужен.
                                    • 0
                                      Пользуясь моментом, хочу пропиарить плагин друга, для автодополнения как в IDE (пускай и только для C используя llvm но все же): ccode на GitHub
                                      • 0
                                        А я с вкладками работаю
                                        Alt+j — переключится на вкладку слева
                                        Alt+k — переключится на вкладку справа
                                        Alt+h — переключится на первую вкладку
                                        Alt+l — переключится на последнюю вкладку
                                        С зажатым при этом Shift вкладки двигаются

                                        nbsp; nbsp;fu! TabMoveLeft()
                                        nbsp; nbsp; nbsp; nbsp;let current_tab = tabpagenr()
                                        nbsp; nbsp; nbsp; nbsp;if current_tab > 1
                                        nbsp; nbsp; nbsp; nbsp; let current_tab = current_tab - 2
                                        nbsp; nbsp; nbsp; nbsp; execute 'tabmove' current_tab
                                        nbsp; nbsp; nbsp; nbsp;endif
                                        nbsp; nbsp;endf

                                        nbsp; nbsp;fu! TabMoveRight()
                                        nbsp; nbsp; nbsp; nbsp;let current_tab = tabpagenr()
                                        nbsp; nbsp; nbsp; nbsp;execute 'tabmove' current_tab
                                        nbsp; nbsp;endf

                                        " предыдущая вкладка
                                        nmap <A-j> :tabpreviousimap <A-j> <C-O>:tabpreviousvmap <A-j> :tabprevious" следующая вкладка
                                        nmap <A-k> :tabnextimap <A-k> <C-O>:tabnextvmap <A-k> :tabnext" первая вкладка
                                        nmap <A-h> :tabfirstimap <A-h> <C-O>:tabfirstvmap <A-h> :tabfirst" последняя вкладка
                                        nmap <A-l> :tablastimap <A-l> <C-O>:tablastvmap <A-l> :tablast" переместить вкладку в начало
                                        nmap <A-S-h> :tabmove 0imap <A-S-h> <C-O>:tabmove 0vmap <A-S-h> :tabmove 0" переместить вкладку в конец
                                        nmap <A-S-l> :tabmoveimap <A-S-l> <C-O>:tabmovevmap <A-S-l> :tabmove" переместить вкладку назад
                                        nmap <A-S-j> :call TabMoveLeft()imap <A-S-j> <C-O>:call TabMoveLeft()vmap <A-S-j> :call TabMoveLeft()" переместить вкладку вперёд
                                        nmap <A-S-k> :call TabMoveRight()imap <A-S-k> <C-O>:call TabMoveRight()vmap <A-S-k> :call TabMoveRight()
                                        • 0
                                          В общем вот pastie.org/2825448
                                          И в придачу что бы по фреймам(окнам) путешествовать сделал вот так:
                                          map <C-h> <C-w>h
                                          map <C-j> <C-w>j
                                          map <C-k> <C-w>k
                                          map <C-l> <C-w>l
                                        • –16
                                          Ненавижу вим.
                                          Особенно режимы эти идиотские. Как на минном поле. Если читать того же Раскина, он пишет, что режимы — зло, и абсолютно прав. Особенно нелегко новичкам.
                                          Смысла пользоваться этим убожеством нет. Настраивать «под себя» ЭТО бессмысленно. Это блин в конце концов текстовый редактор, а не система управления космическим кораблем! Почему чтобы тупо отредактировать файл, человек должен заучивать какие-то магические кнопки, режимы и прочую фигню?
                                          • –5
                                            Да, действительно, режимы — плохо.
                                            But there are good parts.
                                            • +11
                                              Вы — самый простой неосилятор, который пытается доказать всем, что знания ему не нужны. Необходимо бояться незнания, а Вы ими кичитесь. И это — неверно, ибо выставляет Вас в дураках.

                                              Vim — редактор для действительно грамотных и умных людей, которым надо просто выполнять свою работу. А вам я советую выключить крякнутую Visual Studio и почитать книги умных людей, которые жили до нас с Вами.
                                              • 0
                                                Иногда я просто вынужден пользоваться этим редактором, поэтому я более менее его изучил, по крайней мере могу не задумываясь отредактировать то, что мне надо и сохранить и т.д… Но рвотный рефлекс как был так и остался.
                                                Это точно НЕ редактор для действительно грамотных и умных людей. Это редактор-инвалид, к которому вы пытаетесь приделать костыли, чтобы он хоть как-то позволял в нем работать. А смысл?
                                                Да вы почитайте статью внимательно.… Список команд, которые вообще не запомнить, запишите на шпаргалку…
                                                Круто! Давайте выучим 100500 команд наизусть и еще будем под рукой иметь минисправочник — вот эффективная работа!
                                                Я предпочитаю это время тратить на решение бизнес-задач.
                                                • +2
                                                  Vim, как и любая другая программа должна использоваться по назначению. Т.е. если Вы опытный пользователь, Вам необходимо следить за работой компьютера, читать логи, править конфиги или под рукой только консоль, а нужно срочно править много кода в файле, то лучше vima ничего не найти и Вы его просто обязаны знать и все команды становятся понятны особенно тем, кто хоть каким-то образом сталкивался с регулярными выражениями.
                                                  Если ваша работа с редактором сводится к работе с небольшим файлом не требующим никаких серьезных исправлений, то конечно можно воспользоваться чем-то попроще, например nano — но для администратора он совсем не удобен, т.к. половину действий сделать невозможно, а вторую половину действий просто неудобно.

                                                  P.S. Всему свое предназначение!
                                                  P.P.S. Оставляя компьютер, делаю так: 1) CTRL+ALT+F2 2) Ввожу логин и пароль 3) vim pricol 4) Прихожу и смотрю, как любопытные варвары из виндовса пытались закрыть окошко и полазить у меня по компьютеру)))
                                                  • +2
                                                    Почему вынужден? Вас как-будто по дулом пистолета заставляют его использовать, всегда есть альтернатива, не используйте его и будет вам счастье.

                                                    А команды не нужно запоминать их нужно чувствовать, понятное дело что не сразу приходит, но потом кайф.
                                                • +1
                                                  Обожаю VIM.
                                                  Особенно эти прекрасные режимы. Как в идеальной вселенной. Если читать а не писать — один режим, писать а не читать — другой; Ъ

                                                  Смысла не пользоваться этим — нет. Настраивать «под себя» ЭТО осмысленно. Это в конце концов редактор, а не система управления проектами!
                                                  Почему чтобы тупо отредактировать файл, человек должен заучивать какие-то магические кнопки, режимы и прочую фигню? Можно же включать мозг и понимать что каждая комбинация принадлежит с слову.
                                                  P.S. n — normal, v — visual, i = inpit, r — replace, H — high, M — medium, L — low,
                                                  • –5
                                                    Режимы не позволяют делать дело, не задумываясь. Ой, я забыл нажать i и успел при этом набрать слово, и теперь вместо того, чтобы набралось слово, у меня что-то удалилось или отменилось или еще выполнилось несколько команд о которых я даже не в курсе.

                                                    P.S.А двоеточие какому слову принадлежит?
                                                    • 0
                                                      я более менее его изучил, по крайней мере могу не задумываясь отредактировать то, что мне надо и сохранить и т.д…

                                                      Режимы не позволяют делать дело, не задумываясь.

                                                      Я что-то запутался, вы можете не задумываясь редактировать в Vim или нет?
                                                      • 0
                                                        могу, после многолетних тренировок
                                                        • 0
                                                          А если клавиша недожалась? Или там надо жать энтер для подтверждения команды?
                                                          • 0
                                                            Не очень понял вопрос, если честно.
                                                            • 0
                                                              Т.е., например, я в неком командном режиме. Где обычно человеческое слово может быть, например, целой пачкой однобуквенных команд. И вот мне надо в документ это слово вписать. Ткнул я в кнопку перевода другой режим (i или что там, чтобы перейти в режим ввода, но не дожал до конца ее, клава старая больная или еще какая беда), но режим не сменился и я, вместо желаемого слова, вбил пачку команд, не глядя, по инерции, с пулеметной скоростью слепой печати, которые мне что то в тексте похерили, что то заменил, а потом до кучи все это сохранили. И что делать после этого?

                                                              З.Ы. Я вим в глаза не видел, просто часто он последнее время темы на него встречаю…
                                                              • 0
                                                                После этого надо нажать несколько раз u в командном режиме чтобы сделать undo до корректного состояния и повторить заклинание.
                                                                • +1
                                                                  Сохранить документ в Vim можно по команде :w. Поэтому если Вы наберете что-то вроде :foo bar gorokhovy sup и нажмете Enter, Vim разразится приступом детского гнева.
                                                                  • 0
                                                                    Да-да, а вместо :wq используется :x (это не смайлы xD)

                                                                    Я все время :wq использовал, только недавно на более короткий начал переучиваться.
                                                                    • 0
                                                                      Еще есть ZZ и ZQ.
                                                    • +1
                                                      Картинка про емакс, но сюда тоже подходит.
                                                      image
                                                      • 0
                                                        Автор молодец, но немного замечаний:
                                                        1. Упомянуты плагины, но автор не упомянул про эффективное управление ими. Например pathogen.
                                                        2. Автор говорит, что нет автодополнения как у IDE. Если плагины, реализующие это, с описанием автодополняемых методов и атрибутов и прочими плюшками (по крайней мере для Python я себе это сделал, как в других языках, не ведаю).
                                                        3. Автор предлагает запомнить команды типа :'<,'>s/$/\r/g. Я бы предложил просто почитать документацию по этой теме и понять принцип их построения (эти команды наследие ex редактора).
                                                        4. Не вижу в этом особого смысла: nnoremap <M-1> ciw, nnoremap <M-5> cw. Комбо и так коротко, зачем его на шорткат вешать? :)
                                                        • 0
                                                          2. Автодополнние по ^P/^N есть и без плагинов. Для перла специальное автодополнение тоже есть — показывает варианты не только из текущего файла, но и из модулей, включая системные.
                                                        • +1
                                                          Стоит упомянуть, что особенно удобен vim и навигация в его стиле при наличии навыка «слепой» печати. Пальцы все время на стандартной позиции — не надо «бегать» за стрелками курсора.
                                                          • 0
                                                            Ага, зато надо «бегать» до кнопки Escape. По моему опыту, чаще оказывается проще стрелками перемещаться, не выходя из режима вставки, чем исполнять Esc, h/j/k/l, a/i.
                                                            • 0
                                                              Мне (возможно субъективно) проще добраться до Esc и вернуться, чем до стрелок курсора.

                                                              Причина видимо в том, что чтобы попасть по Esc не нужно перемещать кисть руки, а для стрелок надо.
                                                              • +1
                                                                В консольном виме есть C-[, в gvim его тоже можно включить. Ну и esc вимеры часто ремапят куда-то в район капслока, таба или тильды.
                                                                • 0
                                                                  С вами многие согласны, поэтому ремаппинг Esc на CapsLock один из самых популярных для vim.
                                                              • 0
                                                                самая простая и самая удобная фича — постоянное наличие «под рукой» 2-буферов обмена

                                                                1) y(ank) / p(aste)
                                                                2) C-c / C-v

                                                                т.е. тривиальное действие — копирование строки (у), вставка этой строки на новое место(р) и замена в новой копии некого фрагмента (ранее скопированного в С-с) происходит на 1-2

                                                                отличный справочник (почти все главные фичи):
                                                                www.rayninfo.co.uk/vimtips.html
                                                                • +2
                                                                  Очень хорошо, но сколько воды в статье ((((
                                                                  • +3
                                                                    К VIMу было «подходов» 5, наверное. Сначала живой интерес к этому редактору, так как он очень популярный. Терпел, старался… не осилил. И так пару раз. Последний «подход» длился почти 2 недели, старался использовать его на работе, дома. Заставлял себя, так как понимал, что со временем и с определенными усилиями пальцы сами запомнят нужные комбинации, нужные режимы и т.п. Редактировать код действительно стало удобно, быстро и интересно, даже. Появился некий fun.
                                                                    Но, увы, в больших проектах, где ты не знаешь всего кода, где нужно часто использовать поиск, где нужно прыгать по методам, классам и т.п. для меня все же ближе оказалась IDE (PyCharm для Python). Хотя больше половины функциональности не использую: работа с mercurial, git, debugger — все делаю в консоли.
                                                                    VIM сейчас использую для создания и редактирования мелких файлов, но для больших проектов мне больше времени и сил экономит PyCharm.
                                                                    • +3
                                                                      Полностью согласен с предыдущим комментатором.

                                                                      Я сейчас работаю примерно на половину в Vim и на половину в PyCharm. Не люблю PyCharm за то что он тяжеловат, но куда деваться. А не люблю Vim за то что… хотя коротко не скажешь.

                                                                      В моих глазах, идеальный процесс разработки должен быть примерно такой: у меня есть идея, она мне нравится и я ее реализую за 2 часа. Причем, я трачу 10 минут на кодинг и 110 минут на доработку идеи «на ходу». Я могу использовать самые крутые технологии и инструменты, это не имеет значения. Мне не важно как я это делаю, главное что через 2 часа проект готов и запущен. Ну, это в идеале, как происходит на самом деле мы знаем.

                                                                      Возвращаясь к Vim, если мне вдруг потребовалось что-то сделать, то софт которым я пользуюсь, в идеале, должен это уметь. А я должен это найти, причем быстро. Я понимаю что Vim можно настроить под себя, есть куча плагинов, но заниматься этим — совершенно некогда. Например, мне надо посмотреть все неиспользуемые переменные в большом куске кода. Моя текущая среда на это не настроена, я это сделал два года назад и забыл. Мне намного проще и быстрее открыть PyCharm, который это умеет по дефолту, чем вспоминать как это сделать в Vim.

                                                                      Знания это конечно хорошо, но, все-таки лишние знания тоже бывают, особенно после окончания школ/универов и прихода в реальную жизнь. Вот, например, кто из тех, кому за 25, может назвать теорему Гаусса? Мой поклон тому кто помнит, о чем она вообще. Я — нет. А ведь школьный курс физики, ведь знали же.

                                                                      Вывод: Vim хорош для небольшого домена задач. Статья полезна для общего развития, но новичков скорее отпугнет (привет nano). Использовать Vim как IDE — это, пожалуй слишком. Если у вас получается — это ваш выбор, не мне судить.
                                                                      • 0
                                                                        ух ты
                                                                        большое спасибо за nohlsearch

                                                                        заменил свой дурацкий вариант:
                                                                        «map /I don't know other waymap :nohlsearchуж извините, но привык по виндузятницки отменять подсветку эскейпом :)
                                                                        • 0
                                                                          съели символы :(
                                                                          заменил свой дурацкий вариант:
                                                                          "map <Esc><Esc> /I don't know other way<CR>
                                                                          map <Esc><Esc> :nohlsearch<CR>

                                                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.