редактор - Какая у вас самая результативная комбинация с Vim?




настройка vim (20)

Как вы используете Vim, который делает вас более продуктивным, чем с современным редактором?

Возможность выполнять сложные, повторяющиеся изменения с очень небольшим количеством нажатий клавиш (часто с использованием macros ). Взгляните на VimGolf чтобы стать свидетелем силы Вима!

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

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

Единственные две вещи, о которых вам следует заботиться, когда вы говорите о скорости (вы можете не беспокоиться о них, но вы должны):

  1. Использование альтернативных левых и правых рук - самый быстрый способ использовать клавиатуру.
  2. Никогда не касаясь мыши, это второй способ быть как можно быстрее. Вам нужно много времени, чтобы переместить руку, захватить мышь, перенести ее и вернуть ее на клавиатуру (и вам часто приходится смотреть на клавиатуру, чтобы быть уверенным, что вы вернули руку правильно в нужное место)

Вот два примера, демонстрирующие, почему я гораздо менее продуктивен с Vim.

Копировать / Вырезать и вставить. Я делаю это все время. Со всеми современными редакторами вы нажимаете Shift левой рукой, и вы перемещаете курсор правой рукой, чтобы выбрать текст. Затем Ctrl + C копирует, вы перемещаете курсор и вставляете Ctrl + V.

С Вимом это ужасно:

  • yy чтобы скопировать одну строку (вы почти никогда не хотите целую линию!)
  • [number xx]yy чтобы скопировать строки xx в буфер. Но вы точно не знаете, выбрали ли вы то, что хотели. Мне часто приходится делать [number xx]dd затем u чтобы отменить!

Другой пример? Поиск и замена.

  • В PSPad : Ctrl + f введите то, что вы хотите найти, затем нажмите Enter .
  • В Vim: / , затем введите то, что вы хотите найти, затем, если есть некоторые специальные символы, поместите \ перед каждым специальным символом, затем нажмите Enter .

И все с Vim выглядит так: кажется, я не знаю, как правильно обращаться с ним.

NB: Я уже читал cheat sheet Vim :)

Мой вопрос:

Как вы используете Vim, который делает вас более продуктивным, чем с современным редактором?


Плагины Vim

Здесь есть много хороших ответов, и один замечательный рассказ о дзэн vi. Одна вещь, о которой я не вижу, - это то, что vim чрезвычайно расширяем через плагины. Есть сценарии и плагины, чтобы заставить его делать всевозможные сумасшедшие вещи, которые автор никогда не рассматривал. Вот несколько примеров невероятно удобных плагинов vim:

rails.vim

Rails.vim - это плагин, написанный tpope. Это невероятный инструмент для людей, занимающихся развитием рельсов. Это волшебные контекстно-зависимые вещи, которые позволяют вам легко перейти от метода в контроллере к соответствующему представлению, к модели и вплоть до модульных тестов для этой модели. Он сохранил десятки, если не сотни часов, как разработчик рельсов.

gist.vim

Этот плагин позволяет вам выбрать область текста в визуальном режиме и ввести оперативную команду для публикации на gist.github.com . Это позволяет легко получить доступ к пастебинам, что невероятно удобно, если вы сотрудничаете с кем-то из IRC или IM.

space.vim

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

surround.vim

Этот плагин дает вам возможность работать с текстом, который определен каким-то образом. Это дает вам объекты, которые обозначают вещи внутри parens, вещи внутри кавычек и т. Д. Это может пригодиться для манипулирования разделительным текстом.

supertab.vim

Этот скрипт предоставляет функциональные возможности завершения vim для vim. Материал автозаполнения уже существует в ядре vim, но это приводит его к быстрой вкладке, а не к нескольким различным многопользовательским ярлыкам. Очень удобно, и невероятно интересно использовать. Хотя это не VS intellisense, это отличный шаг и приносит большую функциональность, которую вы хотели бы ожидать от инструмента завершения табуляции.

syntastic.vim

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

fugitive.vim

Прямой доступ к git изнутри vim. Опять же, я не использовал этот плагин, но я вижу утилиту. К сожалению, я в культуре, где svn считается «новым», поэтому я вряд ли увижу git на работе в течение некоторого времени.

nerdtree.vim

Дерево-браузер для vim. Я начал использовать это недавно, и это очень удобно. Он позволяет легко вставлять дерево в вертикальное разделение и открывать файлы. Это отлично подходит для проекта с большим количеством исходных файлов, с которыми вы часто переходите.

FuzzyFinderTextmate.vim

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

Заключение

Для vim существует множество невероятных инструментов. Я уверен, что я только поцарапал поверхность здесь, и стоит поискать инструменты, применимые к вашему домену. Сочетание мощного набора инструментов vi, улучшений vim на нем и плагинов, которые расширяют vim еще больше, это один из самых мощных способов редактирования текста, когда-либо задуманного. Vim легко так же эффективен, как emacs, eclipse, visual studio и textmate.

Спасибо

Благодаря duwanis для его vim configs, из которых я многому научился и заимствовал большинство плагинов, перечисленных здесь.


Ваша проблема с Vim заключается в том, что вы не рискуете vi .

Вы упоминаете обрезание с yy и жалуетесь, что вы почти никогда не хотите вырезать целые линии. На самом деле программисты, редактируя исходный код, очень часто хотят работать на целые строки, диапазоны строк и блоков кода. Тем не менее, yy является лишь одним из многих способов вытащить текст в буфер анонимной копии (или «зарегистрироваться», как он называется в vi ).

«Zen» vi - это то, что вы говорите на одном языке. Начальный y является глаголом. Утверждение yy является синонимом y_ . y удваивается, чтобы упростить ввод, поскольку это такая общая операция.

Это также можно выразить как dd P (удалить текущую строку и вставить копию на место, оставив копию в анонимном регистре в качестве побочного эффекта). Глаголы y и d "принимают любое движение как своего" субъекта ". Таким образом, yW « yW отсюда (курсор) до конца текущего / следующего (большого) слова», а y'a «дергается отсюда до строки, содержащей знак« a ».»

Если вы понимаете только основные движения вверх, вниз, влево и вправо, то vi будет более продуктивным, чем копия «блокнота» для вас. (Хорошо, у вас все еще будет подсветка синтаксиса и возможность обрабатывать файлы размером более ~ 45 КБ или около того, но со мной работайте).

vi имеет 26 «знаков» и 26 «регистров». Знак устанавливается на любое местоположение курсора, используя команду m . Каждая отметка обозначается одной строчной буквой. Таким образом, ma устанавливает метку « a » в текущее местоположение, а mz устанавливает знак « z ». Вы можете перейти к строке, содержащей знак, используя команду ' (одиночная кавычка)». Таким образом, 'a переходит к началу строки, содержащей знак« а ». Вы можете перейти к точному расположению любой метки с помощью команды ` (backquote). Таким образом, `z будет перемещаться непосредственно в точное местоположение метки ' z '.

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

Таким образом, одним из способов вырезать произвольный выбор текста было бы падение метки (обычно я использую « a » как «первый» знак, « z » в качестве моей следующей метки, « b » как другой, а « e » как еще один (я не помню, чтобы когда-либо интерактивно использовалось более четырех знаков за 15 лет использования vi , один создает собственные соглашения о том, как метки и регистры используются макросами, которые не мешают интерактивному контексту). на другом конце нашего искомого текста, мы можем начинать с обоих концов, это не имеет значения. Тогда мы можем просто использовать d`a для вырезания или y`a для копирования. Таким образом, весь процесс имеет 5 нажатий клавиш накладные расходы (шесть если мы начали в режиме «вставки» и должны были выполнить команду « Выключить командный режим»). После того, как мы вырезали или скопировали, тогда вставка в копию - это одно нажатие клавиши: p .

Я говорю, что это один из способов сократить или скопировать текст. Однако это лишь один из многих. Часто мы можем более кратко описать диапазон текста, не перемещая наш курсор и не отбрасывая знак. Например, если я в абзаце текста, я могу использовать { и } движения к началу или концу абзаца соответственно. Итак, чтобы переместить абзац текста, я разрезал его с помощью { d} (3 нажатия клавиши). (Если я уже нахожусь в первой или последней строке абзаца, я могу просто использовать d} или d{ соответственно.

Понятие «параграф» по умолчанию означает нечто, что обычно интуитивно разумно. Таким образом, он часто работает как с кодом, так и с прозой.

Часто мы знаем некоторый шаблон (регулярное выражение), который отмечает один конец или другой текст, который нам интересен. Поиск вперед или назад - это движения в vi . Таким образом, они также могут использоваться как «субъекты» в наших «заявлениях». Поэтому я могу использовать d/foo для вырезания из текущей строки в следующую строку, содержащую строку «foo» и y?bar чтобы скопировать из текущей строки в последнюю (предыдущую) строку, содержащую «bar». Если мне не нужны целые строки, я все равно могу использовать движения поиска (как собственные собственные), отбросить мои метки и использовать команды `x как описано ранее.

В дополнение к «глаголам» и «субъектам» vi также имеет «объекты» (в грамматическом смысле этого слова). До сих пор я описывал использование анонимного регистра. Тем не менее, я могу использовать любой из 26 «названных» регистров, префикс ссылки «объект» с помощью " (модификатор двойной цитаты). Таким образом, если я использую "add я сокращаю текущую строку в регистр« a », и если Я использую "by/foo тогда я дергаю копию текста отсюда до следующей строки, содержащей« foo »в регистр« b ». Чтобы вставить из регистра, я просто префикс пасты с той же последовательностью модификатора: "ap вставляет копию содержимого « a » в текст после курсора и "bP вставляет копию с« b »до текущей строки.

Это понятие «префиксов» также добавляет аналоги грамматических «прилагательных» и «наречий» к нашему языку «манипуляции текстом». Большинство команд (глаголов) и движение (глаголы или объекты, в зависимости от контекста) также могут принимать числовые префиксы. 3J означает «соединить следующие три строки», а d5} означает «удалить из текущей строки в конец пятого абзаца».

Это все промежуточный уровень vi . Ни один из них не является Vim специфичным, и в vi есть более продвинутые трюки, если вы готовы их изучить. Если бы вы освоили только эти промежуточные концепции, то вы, вероятно, обнаружите, что вам редко приходится писать какие-либо макросы, потому что язык обработки текста достаточно лаконичен и выразителен, чтобы сделать большинство вещей достаточно легко, используя «родной» язык редактора.

Выбор более продвинутых трюков:

Существует несколько команд : наиболее вероятно :% s/foo/bar/g метод глобальной подстановки :% s/foo/bar/g . (Это не продвинуто, но другое : команды могут быть). Все : набор команд был исторически унаследован предыдущими воплощениями vi как редактор ed (редактор строк), а затем утилиты ex (расширенный редактор строк). На самом деле vi назван так потому, что это визуальный интерфейс ex .

: команды обычно работают над строками текста. ed и ex были написаны в эпоху, когда экраны терминалов были необычными, и многие терминалы были устройствами «телетайпа» (TTY). Таким образом, было распространено работать с печатными копиями текста, используя команды через чрезвычайно тонкий интерфейс (общая скорость соединения составляла 110 бод или, примерно, 11 символов в секунду - это медленнее, чем быстрая машинистка; многопользовательские интерактивные сеансы, кроме того, часто существовала мотивация к сохранению бумаги).

Таким образом, синтаксис большинства команд : содержит адрес или диапазон адресов (номер строки), за которыми следует команда. Естественно, можно использовать литеральные номера строк :127,215 s/foo/bar чтобы изменить первое появление «foo» на «bar» на каждой строке между 127 и 215. Также можно использовать некоторые сокращения, такие как . или $ для текущей и последней строк соответственно. Можно также использовать относительные префиксы + и - для ссылки на смещения после или после текущей строки, соответственно. Таким образом:: :.,$j означает «от текущей строки до последней строки, соединить их всех в одну строку». :% является синонимом :1,$ (все строки).

Команды :... g и :... v имеют некоторое объяснение, поскольку они невероятно мощны. :... g является префиксом для «глобально», применяя следующую команду ко всем строкам, которые соответствуют шаблону (регулярное выражение), в то время как :... v применяет такую ​​команду ко всем строкам, которые НЕ соответствуют данному шаблону («v «от« conVerse »). Как и в случае с другими командами ex, они могут быть префиксами с помощью ссылок / диапазонов. Таким образом :.,+21g/foo/d означает «удалить любые строки, содержащие строку« foo »от текущей до следующих 21 строки», в то время как :.,$v/bar/d означает «отсюда до конца файл, удалите любые строки, которые НЕ содержат строку «bar».

Интересно, что общая команда команд Unix на самом деле была вдохновлена ​​этой командой ex (и названа в честь того, как она была задокументирована). Команда ex :g/re/p (grep) - это то, как они документировали, как «глобально» «печатать» строки, содержащие «регулярное выражение» (re). Когда ed и ex были использованы, команда :p была одной из первых, которую кто-либо узнал, а часто и первой, используемой при редактировании любого файла. Это было то, как вы напечатали текущее содержимое (обычно только одну страницу, заполненную за раз, используя :.,+25p или некоторые такие).

Обратите внимание, что :% g/.../d или (его реверсивный / converse аналог:: :% v/.../d - наиболее распространенные шаблоны использования. Однако есть несколько других ex команд, которые стоит запомнить:

Мы можем использовать m для перемещения строк вокруг, а j для объединения строк. Например, если у вас есть список, и вы хотите отделить все совпадения файлов (или, наоборот, НЕ соответствующие некоторым шаблонам), не удаляя их, то вы можете использовать что-то вроде :% g/foo/m$ ... и всех " foo "будут перенесены в конец файла. (Обратите внимание на другой совет об использовании конца вашего файла в качестве места для царапин). Это сохранит относительный порядок всех строк «foo», извлекая их из остальной части списка. (Это будет эквивалентно выполнению чего-то вроде: 1G!GGmap!Ggrep foo<ENTER>1G:1,'ag/foo'/d (скопируйте файл в собственный хвост, отфильтруйте хвост через grep и удалите все содержимое от головы).

Для объединения строк обычно я могу найти шаблон для всех строк, которые необходимо присоединить к их предшественнику (все строки, которые начинаются с «^», а не «^ *» в некоторых списках маркеров, например). В этом случае я бы использовал:: :% g/^ /-1j (для каждой подходящей строки, :% g/^ /-1j на одну строку и присоединяйте их). (BTW: для списков маркеров, пытающихся найти пулевые строки и присоединяющихся к следующему, не работает по нескольким причинам ... он может присоединиться к одной линии пули к другой, и он не будет присоединяться к какой-либо пулевой строке ко всем его продолжения, он будет работать только в матчах).

Почти бесполезно упомянуть, что вы можете использовать нашего старого друга s (заменить) командами g и v (global / converse-global). Обычно вам не нужно это делать. Однако рассмотрим случай, когда вы хотите выполнить подстановку только в строках, соответствующих некоторому другому шаблону. Часто вы можете использовать сложный шаблон с захватами и использовать обратные ссылки для сохранения частей строк, которые вы НЕ хотите изменять. Однако часто бывает проще отделить матч от подстановки:: :% g/foo/s/bar/zzz/g - для каждой строки, содержащей «foo», заменить все «bar» на «zzz». (Что-то вроде :% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g будет работать только для случаев, когда экземпляры «bar» были преконструированы «foo» on одна и та же строка, она уже довольно неудобна и должна быть искажена, чтобы поймать все случаи, когда «бар» предшествовал «foo»)

Дело в том, что в командном наборе ex имеется больше, чем просто p , s и d строк.

Адреса : также могут ссылаться на метки. Таким образом, вы можете использовать:: :'a,'bg/foo/j для присоединения любой строки, содержащей строку foo к ее последующей строке, если она находится между строками между метками ' a ' и ' b '. (Да, все предыдущие примеры ex команд могут быть ограничены подмножествами строк файла с помощью префикса этих выражений адресации).

Это довольно неясно (я использовал только что-то подобное несколько раз за последние 15 лет). Тем не менее, я свободно признаю, что я часто делал итеративно и интерактивно, что, возможно, было бы сделано более эффективно, если бы я нашел время, чтобы придумать правильное заклинание.

Еще одна очень полезная команда vi или ex :r для чтения в содержимом другого файла. Таким образом:: :r foo вставляет содержимое файла с именем «foo» в текущей строке.

Более мощным является :r! команда. Это считывает результаты команды. Это то же самое, что приостановка сеанса vi , запуск команды, перенаправление ее вывода во временный файл, возобновление сеанса vi и чтение содержимого из temp. файл.

Еще более мощными являются ! (bang) и :... ! ( ex bang). Они также выполняют внешние команды и считывают результаты в текущий текст. Тем не менее, они также фильтруют подборку нашего текста с помощью команды! Это позволяет сортировать все строки в нашем файле с помощью 1G!Gsort ( G - это команда «goto»), по умолчанию она отправляется в последнюю строку файла, но может иметь префикс номера строки, например 1, первая строка). Это эквивалентно ex- варианту :1,$!sort . Писатели часто используют ! с утилитами Unix fmt или fold для переформатирования или «переноса слов» текста. Очень общий макрос {!}fmt (переформатировать текущий абзац). Программисты иногда используют его для запуска своего кода или только его частей с помощью инструментов отформатирования отступа или другого кода.

Используя :r! и ! команды означает, что любая внешняя утилита или фильтр можно рассматривать как расширение нашего редактора. Я иногда использовал их со сценариями, которые извлекали данные из базы данных или с помощью команд wget или lynx, которые извлекали данные с сайта или команды ssh, которые извлекали данные из удаленных систем.

Другая полезная команда ex :so (short для :source ). Это считывает содержимое файла как последовательность команд. Когда вы запускаете vi, обычно, неявно, выполняет :source в файле ~/.exinitrcVim обычно делает это на ~/.vimrc , естественно, достаточно). Использование этого заключается в том, что вы можете изменить свой профиль в редакторе на лету, просто используя набор макросов, сокращений и настроек редактора. Если вы подлый, вы можете использовать это как трюк для хранения последовательностей команд редактирования, которые применяются к файлам по требованию.

Например, у меня есть семистрочный файл (36 символов), который запускает файл через wc и вставляет комментарий в стиле C в верхней части файла, содержащего данные о количестве слов. Я могу применить этот макрос к файлу с помощью команды типа: vim +'so mymacro.ex' ./mytarget

(Опция командной строки + vi и Vim обычно используется для запуска сеанса редактирования с заданным номером строки. Однако малоизвестный факт, что можно следовать за + помощью любой действующей команды ex / ex , например, «источника», как я это сделал, для простого примера у меня есть скрипты, которые вызывают: vi +'/foo/d|wq!' ~/.ssh/known_hosts чтобы удалить запись из моего файла SSH известных хостов неинтерактивно, пока я 're-imaging набор серверов).

Обычно гораздо проще писать такие «макросы» с помощью Perl, AWK, sed (что, по сути, похоже на grep - утилиту, вдохновленную командой ed ).

Команда @ вероятно, является самой неясной командой vi . Изредка преподавая курсы усовершенствования систем в течение почти десятилетия, я встречал очень мало людей, которые когда-либо использовали его. @ выполняет содержимое регистра, как если бы это была команда vi или ex .
Пример. Я часто использую:: :r!locate ... чтобы найти файл в моей системе и прочитать его имя в моем документе. Оттуда я удаляю любые посторонние хиты, оставляя только полный путь к интересующему меня файлу. Вместо того, чтобы кропотливо переходить через каждый компонент пути (или, что еще хуже, если я застрял на машине без завершения вкладки поддержка в его копии vi ) Я просто использую:

  1. 0i:r (чтобы включить текущую строку в действительную команду : r ),
  2. "cdd (удалить строку в регистр" c ") и
  3. @c выполнить эту команду.

Это всего лишь 10 нажатий клавиш (и выражение "cdd для меня - это макрос пальцев», поэтому я могу набрать его почти так же быстро, как любое общее шестибуквенное слово).

Отрезвляющая мысль

Я только поцарапал поверхность власти vi , и ничто из того, что я здесь описал, даже не является частью «улучшений», для которых назван vim ! Все, что я описал здесь, должно работать над любой старой копией vi с 20 или 30 лет назад.

Есть люди, которые использовали значительно больше энергии vi , чем когда-либо.


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

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

Рассмотрим следующие общие сценарии:

Вам нужно выбрать следующую скобку.

Вы можете сделать:

  • v% если курсор находится в исходной / конечной скобках
  • vib если курсор находится внутри блока скобок

Вы хотите выбрать текст между кавычками:

  • vi " для двойных кавычек
  • vi ' для одинарных кавычек

Вы хотите выбрать фигурный блок (очень распространенный в языках C-стиля):

  • viB
  • vi{

Вы хотите выбрать весь файл:

  • ggVG

Выбор визуального блока - еще одна действительно полезная функция, она позволяет вам выбрать прямоугольную область текста, вам просто нужно нажать Ctrl- V, чтобы запустить ее, а затем выбрать требуемый текстовый блок и выполнить любой тип операции, такой как yank, удалять, вставлять, редактировать и т. д. Замечательно редактировать текст, ориентированный на столбцы .


Некоторые советы по повышению производительности:

Умные движения

  • * и # поиск слова под курсором вперед / назад.
  • w к следующему слову
  • W к следующему пространственно разделенному слову
  • b / e к началу / концу текущего слова. ( B / E для пространства)
  • gg / G перейти к началу / концу файла.
  • % перейти к сопоставлению {..} или (..) и т. д.
  • { / } перейти к следующему абзацу.
  • '. вернуться к последней отредактированной строке.
  • g; вернуться к последней отредактированной позиции.

Команды быстрого редактирования

  • I вставляю в начале.
  • Добавление к концу.
  • o / O открыть новую строку после / до текущего.
  • v / V / Ctrl+V визуальный режим (для выбора текста!)
  • Shift+R заменить текст
  • C измените оставшуюся часть линии.

Объединение команд

Большинство команд принимают количество и направление, например:

  • cW = изменение до конца слова
  • 3cW = изменить 3 слова
  • BcW = начать полное слово, сменить полное слово
  • ciW = изменить внутреннее слово.
  • ci" = изменить внутреннее между" .. "
  • ci( = изменить текст между (..)
  • ci< = изменить текст между <..> (необходимо set matchpairs+=<:> в vimrc)
  • 4dd = удалить 4 строки
  • 3x = удалить 3 символа.
  • 3s = заменить 3 символа.

Полезные команды программиста

  • r заменить один символ (например, rd заменяет текущий символ на d ).
  • ~ меняется случай.
  • J соединяет две линии
  • Ctrl + A / Ctrl + X увеличивает / уменьшает число.
  • . повторить последнюю команду (простой макрос)
  • == исправить отступ строки
  • > блок отступа (в визуальном режиме)
  • < unindent block (в визуальном режиме)

Макросъемка

  • Нажмите q[ key ] чтобы начать запись.
  • Затем нажмите q чтобы остановить запись.
  • Макрос можно воспроизвести с помощью @[ key ] .

Используя очень специфические команды и движения, VIM может воспроизводить эти точные действия для следующих строк. (например, A для добавления к концу, b / e для перемещения курсора в начало или конец слова соответственно)

Пример хорошо построенных настроек

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

Настройки можно сохранить в ~/.vimrc или в общесистемной области в /etc/vimrc.local а затем прочитать из файла /etc/vimrc используя:

source /etc/vimrc.local

(вам придется заменить символ # комментария на " чтобы заставить его работать в VIM, я хотел бы дать правильное выделение синтаксиса здесь).

Команды, перечисленные здесь, довольно простые, и основные из них я использую до сих пор. Они уже делают меня более продуктивным, не зная всех причудливых вещей.


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

Я сэкономлю много времени с этим.

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


солдат

Перейти к последнему отредактированному местоположению (очень полезно, если вы выполнили поиск и хотите вернуться к редактированию)

^ P и ^ N

Завершите предыдущий (^ P) или следующий (^ N) текст.

^ O и ^ I

Перейдите к предыдущему ( ^O- "O"для старого) местоположения или к следующему ( ^I- "I"рядом "O"). Когда вы выполняете поиск, редактируете файлы и т. Д., Вы можете перемещаться по этим «прыжкам» вперед и назад.


Автоматический отступ:

gg(перейдите к началу документа)
=(время отступа!)
shift-g(перейдите к концу документа)

В вашем .vimrcфайле вам понадобится отпечаток плагина filetype и, возможно, соответствующие настройки «shiftwidth» и «expandtab».


Все в обычном режиме:

f <char>, чтобы перейти к следующему экземпляру определенного символа в текущей строке и ; повторить.

F <char>, чтобы перейти к предыдущему экземпляру определенного символа в текущей строке и ; повторить.

Если использовать разумно, два вышеперечисленных могут сделать вас убийцей - быстро перемещаться по одной линии.

* по слову для поиска следующего экземпляра.

# на слове для поиска предыдущего экземпляра.


Массовые манипуляции с текстом!

Либо через макросы:

  • Начните с записи: qq
  • Сделайте что-нибудь
  • Остановить запись: q
  • Повторите: @q(в первый раз) @@после этого.
  • Повторите 20 раз: [email protected]@

Или посредством регулярных выражений:

  • Заменить материал: :%s/[fo]+/bar/g

(Но будьте осторожны: если вы сделаете последнее, у вас будет 2 проблемы :).)


<Ctrl> + W, V для разделения экрана по вертикали
<Ctrl> + W, W для переключения между окнами

! python% [args] для запуска скрипта, который я редактирую в этом окне

ZF в визуальном режиме для сбрасывания произвольных строк


Вы спросили о продуктивных ярлыках, но я думаю, что ваш реальный вопрос: стоит ли vim? Ответ на этот вопрос -> «Да»

Вы, должно быть, заметили две вещи. Вим силен, и VIM трудно учиться. Большая часть его власти заключается в ее расширяемости и бесконечной комбинации команд. Не чувствуйте себя подавленным. По-медленнее. Одна команда, по одному плагину за раз. Не переусердствуйте.

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


Используйте в \cлюбом месте поиска, чтобы игнорировать регистр (переопределяя ваши настройки ignorecase или smartcase). Например , /\cfooили /foo\cбудет соответствовать foo, Foo, fOO, FOOи т.д.

Используйте в \Cлюбом месте поиска для принудительного соответствия. Например, /\Cfooили /foo\Cбудет соответствовать только foo.


Используйте встроенный файловый проводник! Команда есть :Exploreи позволяет очень быстро перемещаться по вашему исходному коду. У меня есть это сопоставление в моем .vimrc:

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

Проводник также позволяет делать изменения файлов. Я отправлю некоторые из моих любимых клавиш, нажатие <F1>даст вам полный список:

  • - : Самое полезное: перейдите в верхний каталог ( cd ..)
  • mf : Отметьте файл
  • D : Удалить отмеченные файлы или файл, на котором курсор включен, если ничего не отмечено.
  • R : Переименуйте файл, в котором находится курсор.
  • d : Создать новый каталог в текущем каталоге
  • % : Создать новый файл в текущем каталоге

На днях я только что открыл обход Vim, и, хотя я признаю, что я немного туман на то, что делает, у меня были удивительно хорошие результаты, просто смяв либо Ctrl+ x Ctrl+, uлибо Ctrl+ n/ Ctrl+ pв режиме вставки. Это не совсем IntelliSense , но я все еще это изучаю.

Попробуйте! :help ins-completion


На прошлой неделе на работе наш проект унаследовал много кода Python из другого проекта. К сожалению, код не вписывался в нашу существующую архитектуру - все было сделано с глобальными переменными и функциями, которые не работали бы в многопоточной среде.

У нас было ~ 80 файлов, которые нужно было переработать, чтобы быть объектно-ориентированными - все функции были перемещены в классы, изменены параметры, добавлены вложения импорта и т. Д. У нас был список из примерно 20 типов исправлений, которые нужно было сделать для каждого файла. Я бы оценил, что делать это вручную одним человеком может, возможно, 2-4 в день.

Итак, я сделал первый из них вручную, а затем написал сценарий vim для автоматизации изменений. Большинство из них было списком команд vim, например

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

Последнее заслуживает некоторого объяснения:

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

Для нескольких более сложных преобразований, таких как создание всех операторов импорта, я вложил некоторый python в скрипт vim.

После нескольких часов работы над ним у меня был скрипт, который будет делать не менее 95% конверсии. Я просто открываю файл в vim, затем запускаюсь, :source fixit.vimи файл превращается в мгновение ока.

У нас все еще есть работа по замене оставшихся 5%, которые не стоили автоматизировать и тестировать результаты, но, проведя день, записывая этот сценарий, я считаю, что мы спасли недели работы.

Конечно, было бы возможно автоматизировать это с помощью языка сценариев, такого как Python или Ruby, но потребовалось бы гораздо больше времени для записи и было бы менее гибким - последний пример был бы трудным, поскольку только одно из регулярных выражений не могло бы обрабатывать вложенные скобки, например, для преобразования bar(foo(xxx))в foo(xxx).bar(). Вим отлично справлялся с задачей.


Нечетные никто не упоминал ctags. Загрузите «exuberant ctags» и поставьте его впереди дрянной предустановленной версии, которую вы уже имеете в своем пути поиска. Cd в корне того, над чем вы работаете; например, дистрибутив ядра Android. Введите «ctags -R». для создания индекса исходных файлов в любом месте ниже этого каталога в файле с именем «теги». Это содержит все теги, нотематировать язык и где в директории, в одном файле, поэтому кросс-язычная работа проста.

Затем откройте vim в этой папке и прочитайте: help ctags для некоторых команд. Несколько я часто использую:

  • Поместите курсор на вызов метода и введите CTRL-], чтобы перейти к определению метода.

  • Введите: ta name, чтобы перейти к определению имени.


Проведите 30 минут, выполняя учебник vim (запустите vimtutor вместо vim в терминале). Вы узнаете основные движения и некоторые нажатия клавиш, это сделает вас по крайней мере столь же продуктивным с vim, как и с текстовым редактором, который вы использовали раньше. После этого, хорошо, прочитайте ответ Джима Денниса снова :)


Я недавно (получил) открыл этот сайт: http://vimcasts.org/

Это довольно новый и действительно очень хороший. Парень, который запускает сайт, переключился с textmate на vim, и хосты очень хорошо и лаконично перекликаются с конкретными темами vim. Проверьте это!


Я с удивлением обнаружил, что никто не упоминает об этом tдвижении. Я часто использую его с списками параметров в форме dt,илиyt,





vi