Какой ваш самый быстрый ярлык с Vim?

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

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

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

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

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

С Vim это ужасно

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

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

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

И все с Vim так: кажется, я не знаю, как с этим справиться правильно.

NB: Я уже прочитал Vim плутовки лист :)

Мой вопрос:

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

1126 vivim
2.08.2009 08:08:28
«Использование левой и правой руки поочередно - самый быстрый способ использования клавиатуры». Не для меня, как ни странно. Когда я могу набрать слово одной рукой, я обнаружил, что я намного быстрее.
Ben Mordecai 6.02.2013 05:03:16
30 ОТВЕТОВ
РЕШЕНИЕ

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

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

«Дзен» vi - это то, что вы говорите на языке. Инициал y- это глагол. Заявление yyявляется синонимом для y_. Символ yудваивается, чтобы его было легче набирать, поскольку это такая распространенная операция.

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

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

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

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

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

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

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

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

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

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

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


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

Существует ряд :команд, в первую очередь метод :% 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 grep была вдохновлена ​​этой бывшей командой (и названа в честь того, как она была задокументирована). Экс команда :g/re/p(Grep) был способ , которым они задокументированы , как «глобально» «печать» строки , содержащие «регулярное выражение» (ре). Когда использовались ed и ex , :pкоманда была одной из первых, которую кто-либо узнал, и часто первой, которая использовалась при редактировании любого файла. Это было то, как вы печатаете текущее содержание ( как правило , только одна страница полностью , в то время , используя :.,+25pили некоторые такие).

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

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

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

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

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

В :адресе может также относиться к отметкам. Таким образом, вы можете использовать: :'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это команда vi "goto"; по умолчанию она идет до последней строки файла, но перед ней может стоять префикс номера строки, например, 1, первая строка). Это эквивалентно бывшему варианту :1,$!sort. Авторы часто используют утилиты !Unix fmt или fold для переформатирования или «переноса слов» выделенных фрагментов текста. Очень распространенный макрос{!}fmt(переформатировать текущий абзац). Программисты иногда используют его для запуска своего кода или только его частей через отступ или другие инструменты переформатирования кода.

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

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

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

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

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

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

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

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


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

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

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

2860
22.12.2011 11:43:37
Святой код обезьян, .. это один глубокий ответ. Замечательно, что вы написали в vim примерно 10 нажатий клавиш.
EightyOne Unite 27.11.2009 15:36:15
@Wahnfieden - «Грок» - это именно то, что я имел в виду: en.wikipedia.org/wiki/Grok (это, очевидно, даже в OED - мы, англоязычные, ближе всего к канонической лексике). «Грохнуть» редактора означает найти себя свободно использующим его команды ... как если бы они были вашим естественным языком.
Jim Dennis 12.02.2010 04:08:29
вау, очень хорошо написанный ответ! я не могу согласиться, хотя я @q
knittl 27.02.2010 13:15:33
Превосходный ответ, который полностью искупает действительно ужасный вопрос. Я собираюсь поднять этот вопрос, который, как правило, я бы понизил, просто чтобы этот ответ стало легче найти. (И я парень из Emacs! Но таким образом у меня будет где-то указывать новым людям, которые хотят получить хорошее объяснение того, что опытным пользователям vi нравится находить удовольствие в vi. Затем я расскажу им об Emacs, и они могут принять решение.)
Brandon Rhodes 29.03.2010 15:26:30
Можете ли вы создать веб-сайт и поместить этот учебник туда, чтобы он не зарывался здесь на stackoverflow. Я еще не читал лучшего введения в vi, чем это.
Marko 1.04.2010 14:47:49

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

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

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

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

Вы могли бы сделать:

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

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

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

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

  • viB
  • vi{

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

  • ggVG

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

504
8.02.2017 14:14:05
В каждом редакторе есть что-то вроде этого, это не относится к vim.
finnw 2.08.2009 08:49:15
Да, но это была конкретная жалоба автора. Визуальный режим - лучший метод прямого выбора текста и управления им в Vim. И поскольку методы обхода буфера в vim превосходны, выбор текста в vim довольно приятен.
guns 2.08.2009 09:54:18
Я думаю, что также стоит упомянуть Ctrl-V, чтобы выбрать блок - то есть произвольный прямоугольник текста. Когда вам это нужно, это спасатель.
Hamish Downer 16.03.2010 13:34:42
@viksit: я использую Camtasia, но есть много альтернатив: codinghorror.com/blog/2006/11/screencasting-for-windows.html
CMS 2.04.2010 02:07:08
Кроме того, если у вас есть визуальный выбор и вы хотите изменить его, oперейдите на другой конец. Таким образом, вы можете перемещать начало и конец выделения столько, сколько захотите.
Nathan Long 1.03.2011 19:05:16

Вставка текста в некоторый бит в коде:

ctrl + v, (selecting text on multiple lines), I, (type something I want), ESC

Запись макроса для редактирования текста и запуск его N раз:

q, a (or some other letter), (do the things I want to record), q, ESC,
(type N, as in the number of times I want to run the macro), @, a
7
28.05.2011 09:48:17
+1. Я часто переключаюсь со своей IDE (например, XCode, Visual Studio, Eclipse) на Vim для подобных задач.
finnw 2.08.2009 08:50:42
<Esc> при записи макроса не останавливает запись! Он просто записывает <Esc> (то есть возвращается в нормальный режим). Чтобы перестать тебя использовать q. Кроме того, я склонен называть свои макросы q:)
R. Martinho Fernandes 1.04.2010 03:01:25

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

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

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

  • - : самое полезное: перейти в верхний каталог ( cd ..)
  • mf : пометить файл
  • D : Удалить отмеченные файлы или файл, на котором находится курсор, если ничего не отмечено.
  • R : переименовать файл, на котором находится курсор.
  • d : создать новый каталог в текущем каталоге
  • % : Создать новый файл в текущем каталоге
28
2.08.2009 11:17:12
Я всегда думал, что методы по умолчанию для просмотра своего рода отстой для большинства вещей. Это просто медленно просматривать, если вы знаете, куда вы хотите пойти. LustyExplorer из раздела сценариев vim.org является очень необходимым улучшением.
Svend 2.08.2009 08:48:12
Ваше второе сопоставление может быть более простым: map <silent> <S-F8>: Sexplore <CR>
Taurus Olson 6.08.2009 17:37:20
Я рекомендую NERDtree вместо встроенного проводника. Это изменило способ, которым я использовал vim для проектов, и сделало меня намного более продуктивным. Просто Google для этого.
kprobst 1.04.2010 03:53:25
Я никогда не чувствую необходимости исследовать дерево исходных текстов , я просто использовать :find, :tagи различные родственные нажатия клавиш прыгать. (Может быть, это потому, что исходные деревья, над которыми я работаю, большие и организованы иначе, чем я бы сделал? :))
dash-tom-bang 24.08.2011 00:35:59

Проигнорируем вопрос на мгновение (мой ответ ниже), пару вещей, которые могут помочь с вашими проблемами с vim:

:map <C-F> /\V

Это заставит Ctrl-F начать поиск с первых символов поискового существа \V, что отключит всю «магию», так что вам не придется ничего экранировать (как PsPad).

" CTRL-X and SHIFT-Del are Cut
vnoremap <C-X> "+x
vnoremap <S-Del> "+x

" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y
vnoremap <C-Insert> "+y

" CTRL-V and SHIFT-Insert are Paste
map <C-V>       "+gP
map <S-Insert>      "+gP

cmap <C-V>      <C-R>+
cmap <S-Insert>     <C-R>+

(взято непосредственно из mswin.vim из дистрибутива Vim). Это даст вам Ctrl-C, Ctrl-V и т. Д. Для копирования и вставки.

Лично я считаю, что копирование и вставка намного лучше со стандартным Vim. В Vim я могу поместить курсор на строку, набрать yyее, 10pчтобы вставить 10 копий. С плагином Align я могу затем использовать Ctrl-V(при условии, что приведенные выше отображения окон не используются) для визуального блока выбрать столбец чисел, который был создан; :IIзатем автоматически увеличивает этот столбец чисел. Аналогично, с YankRing я могу копировать 10 (или более) строк одну за другой, а затем вставлять их обратно одну за другой.

Что касается того, как Vim делает меня более продуктивным, я бы сказал, что файл тегов - это то, без чего я больше не могу. Когда курсор находится над тегом, я могу нажать, Ctrl-]чтобы перейти к функции (и Ctrl-T, чтобы вернуть столько уровней, сколько мне ,pнужно ), либо открыть определение функции или макроса (или что-то еще) в окне предварительного просмотра (которое может затем быстро закройте: pcl) или [iпросто покажите определение макроса в строке состояния. Для навигации по сложному исходному коду эти инструменты неоценимы.

Однако окно предварительного просмотра зависит от отображения в .vimrc:

:map ,p :ptag <C-R><C-W><CR>

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

7
2.08.2009 08:47:51

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

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

22
27.02.2010 11:29:17

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

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

  • Начать с записи: qq
  • Делать вещи
  • Остановить запись: q
  • Повторите: @q(первый раз), @@после этого.
  • Повторите 20 раз: 20@@

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

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

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

23
2.08.2009 08:59:30
+1 за справку о Джейми Завински . (Нет очков, забранных за неспособность связаться с ним, даже). :)
Jim Dennis 10.01.2010 04:03:54
@ Джим, я даже не знал, что это цитата Джейми Завински :). Я постараюсь запомнить это с этого момента.
jqno 10.01.2010 10:06:20
Я нахожу следующий трюк все более полезным ... для случаев, когда вы хотите соединить строки, которые соответствуют (или не соответствуют) некоторому шаблону, с предыдущей строкой: :% g/foo/-1jили, :'a,'z v/bar/-1jнапример, (где первый - «все строки и соответствие шаблону») в то время как последний является «линиями между знаком a и знаком z, которые не соответствуют шаблону»). Часть после шаблона в команде a gили vex может быть любой другой командой ex, -1j - просто относительное перемещение строки и команда соединения.
Jim Dennis 12.02.2010 04:15:39
Конечно, если вы называете свой макрос «2», то, когда приходит время его использовать, вам даже не нужно перемещать палец от клавиши «@» к клавише «q». Вероятно, экономит от 50 до 100 миллисекунд каждый раз, прямо здесь. = P
JustJeff 27.02.2010 12:54:14
@JustJeff Зависит полностью от вашей раскладки клавиатуры, моя клавиша @ находится на другой стороне клавиатуры от моей клавиши 2.
Simon Steele 1.04.2010 13:12:19

Несколько буферов и, в частности, быстрый переход между ними для сравнения двух файлов с :bpи :bn(правильно переназначается на один Shift+ pили Shift+ n)

vimdiff режим (разделяется на два вертикальных буфера, с цветами, чтобы показать различия)

Область-копия с Ctrl+v

И, наконец, добавление идентификаторов на вкладке (поиск «mosh_tab_or_complete»). Это изменит жизнь.

13
27.02.2010 11:23:25

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

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

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

18
2.08.2009 09:47:38
<Ctrl> + W и j / k позволят вам перемещаться абсолютно (j вверх, k вниз, как с обычным vim). Это замечательно, когда у вас есть 3+ сплитов.
Andrew Scagnelli 1.04.2010 02:58:46
+1 для zf в визуальном режиме, мне нравится сворачивание кода, но я не знал об этом.
coder_tim 30.01.2012 20:08:13
после нажатия на мою клавиатуру я вывел, что <C-w>nили <C-w>sэто новое горизонтальное окно, <C-w>bэто нижнее правое окно <C-w>cили <C-w>qзакрытое окно, <C-w>xэто увеличение, а затем уменьшение ширины окна (??), <C-w>pэто последнее окно, <C-w>backspaceэто перемещение влево (ish) окно
puk 24.02.2012 07:00:34
:help ctrl-wFTW ... сделайте себе одолжение, и заставьте себя попробовать эти вещи, по крайней мере, 15 минут!
sjas 25.06.2012 00:25:11

солдат

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

^ P и ^ N

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

^ O и ^ I

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

48
24.12.2012 14:50:03
@Kungi `. приведет вас к последнему редактированию `` вернет вас к позиции, в которой вы находились до последнего 'прыжка' - которая / может / также быть позицией последнего редактирования.
Grant McLean 23.08.2011 08:21:37

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

Вы упоминаете, что у вас проблемы с копированием и вставкой, но, похоже, вам нужно больше опыта с общими командами движения в vim. yank 3 слова: y3w рывок от курсора до следующей точки с запятой: yf; Перейдите к следующему появлению вашего последнего поиска: yn Все это гораздо быстрее, чем пытаться перемещаться с помощью мыши, удерживая нажатой клавишу-модификатор. Кроме того, как видно из некоторых примеров в ответе CMS, команды движения vim сильно оптимизированы для эффективной навигации в исходном коде C и C ++.

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

10
2.08.2009 13:36:18

CTRL+A увеличивает номер, на котором вы стоите.

42
27.02.2010 11:20:40
... и CTRL-X уменьшает.
innaM 3.08.2009 09:14:23
Это удобный ярлык, но до сих пор я НИКОГДА не нашел для него никакого применения.
SolutionYogi 26.02.2010 20:43:55
если вы запускаете vim на экране и удивляетесь, почему это не работает - ctrl + A, A
matja 27.02.2010 14:21:45
@SolutionYogi: Учтите, что вы хотите добавить номер строки в начало каждой строки. Решение: ggI1 <пробел> <esc> 0qqyawjP0 <ca> 0q9999 @ q
hcs42 27.02.2010 19:05:54
Чрезвычайно полезно с Vimperator, где он увеличивает (или уменьшает Ctrl-X) последнее число в URL. Полезно для быстрого серфинга по картинным галереям и т. Д.
blueyed 1.04.2010 14:47:12

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

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

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

При разумном использовании вышеупомянутые два могут быстро убить вас в очереди.

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

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

38
28.08.2009 15:23:22
Ого, я не знал о привязке * и # (поиск вперед / назад по слову под курсором). Это круто. Ф / Ф и т / т а; Команды - это быстрый переход к символам в текущей строке. f / F помещает курсор на указанный символ, в то время как t / T помещает его только «до» символа (символ непосредственно перед или после него в соответствии с выбранным направлением.; просто повторяет самый последний f / F / t / T прыгать (в том же направлении).
Jim Dennis 14.03.2010 06:38:59
:) Слоган в верхней части страницы советов на vim.org: «Можете ли вы представить, сколько нажатий клавиш можно было бы сохранить, если бы я знал только команду« * »вовремя?» - Юрген Солка, 1/19/2001"
Yewge 3.04.2010 23:50:09
Как упоминал Джим, комбо «t / T» часто так же хорошо, если не лучше, например, ct(стерет слово и переведет вас в режим вставки, но сохранит парантезы!
puk 24.02.2012 06:45:25

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

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

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

14
27.02.2010 11:19:21
Или просто используйте ": set ai" (авто-отступ), который был в vi с самого начала.
xcramps 28.08.2009 17:14:31

Договорились с верхним постером - the : r! Команда очень полезна.

Чаще всего я использую его для «вставки» вещей:

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

Таким образом, мне не нужно возиться :set paste.

12
28.08.2009 16:07:18
Возможно, лучше установить clipboardопцию unnamed( set clipboard=unnamedв вашем .vimrc), чтобы использовать системный буфер обмена по умолчанию. Или , если вы все еще хотите, чтобы система CLIPBOARD отдельно от безымянного регистра, используйте соответствующее название регистр буфера обмена: "*p.
R. Martinho Fernandes 1.04.2010 03:17:54
Любить это! После того, как я был раздражен, вставляя примеры кода из Интернета, я только начинал чувствовать себя опытным в vim. Это была команда, которую я придумал на месте. Это было, когда Vim полностью зацепил меня.
kevpie 12.10.2010 22:38:52
Если вы разрабатываете на Mac, Command + C и Command + V копируйте и вставляйте с использованием системного буфера обмена, переназначение не требуется.
Ben Mordecai 6.02.2013 19:54:58
Только с GVIm… С консоли вставка без :set pasteне работает так хорошо, если включен автоиндентирование.
David Wolever 6.02.2013 20:55:39

Мой самый продуктивный трюк с vi / Vim:

:%s

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

10
27.02.2010 11:17:31
Я хотел бы знать, как сделать его менее неуклюжим для ввода
jberryman 22.08.2011 17:50:28
@jberryman Я положил nnoremap <leader>/ :%s/\v/gc<Left><Left><Left>в свой .vimrc. Это дает мне очень волшебный режим, глобальную замену, запрос подтверждения и расположение моего курсора так, что мне нужно только набрать что-то вроде search/replaceи нажать Enter.
brymck 28.06.2012 06:47:07

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

например

ка (установить отметку)

«А ,. ш! t (скопируйте все с отметки в файл t)

.. переместите свой курсор вокруг ..

: .rt (читать в текущем месте).

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

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

5
22.12.2009 19:04:34
Примечание: ma установит метку "a", как и будет: ka (команда ex mark это "k", потому что "m" уже было принято за "move"). Кроме этого этот ответ показывает хорошее использование небольших файлов. Иногда эти частичные файлы сэкономят немного работы, когда вы поймете, что случайно удалили большую часть временной работы ... или испортили вещи с неправильной последовательностью команд замены и отмены.
Jim Dennis 13.05.2010 23:36:33

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

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

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

53
31.03.2010 23:01:05
Кроме того, если вы используете сжатую команду (например, A для добавления в конец) для редактирования текста, vim может повторить то же самое действие для следующей строки, на которой вы нажимаете .клавишу.
vdboor 1.04.2010 08:34:39

На прошлой неделе на работе наш проект унаследовал много кода 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(). Vim идеально подходит для этой задачи.

32
18.08.2012 21:44:40
Большое спасибо за то, что поделились, что очень приятно учиться на «полезных и не классических» макросах.
Olivier Pons 28.02.2010 14:41:34
%s/\(bar\)(\(.\+\))/\2.\1()/сделал бы это тоже. (Побеги совместимы с :set magic.) Просто для записи. :)
Ipsquiggle 23.03.2010 16:55:32
Если вам не нравятся побеги в стиле vim, используйте \ v, чтобы включить Very Magic:%s/\v(bar)\((.+)\)/\2.\1()/
Ipsquiggle 23.03.2010 16:56:55
@lpsquiggle: ваше предложение не будет обрабатывать сложные выражения с несколькими наборами скобок. например, if bar(foo(xxx)) or wibble(xxx): становится if foo(xxx)) or wibble(xxx.bar(): совершенно неправильно.
Dave Kirby 23.03.2010 17:16:11

Это не ярлыки, но они связаны:

  1. Сделайте capslock дополнительной ESC (или Ctrl)
  2. сопоставить лидера с "," (запятая), с помощью этой команды: let mapleader = ","

Они повышают мою производительность.

20
14.03.2010 19:49:18
Эй, хороший намек на "\"! Гораздо лучше набрать ",", чем "\".
Olivier Pons 15.03.2010 10:09:47
Чтобы сделать Caps Lock дополнительным Esc в Windows (для чего нужен ключ блокировки Caps? «Любой ключ»?), Попробуйте это: web.archive.org/web/20100418005858/http://webpages.charter.net/…
R. Martinho Fernandes 1.04.2010 03:30:07
На Mac вам понадобится PCKeyboardHack - подробности на superuser.com/questions/34223/…
Tom Morris 1.04.2010 08:45:21
В Windows я использую AutoHotKey сCapslock::Escape
Jeromy Anglim 10.01.2011 04:43:47

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

  • Esc - выйти из режима вставки (пропустить, если вы уже находитесь в обычном режиме)
  • v - включить визуальный режим
  • перемещайтесь по файлу, чтобы выбрать нужный текст - визуальный режим покажет вам, какие символы выбраны. Несколько слов w, eи bони полезны (перейти к началу следующего слова, концу следующего слова и началу этого / предыдущего слова соответственно).
  • d- вырезать текст (используйте, yесли хотите скопировать текст)
  • переместиться туда, куда вы хотите, чтобы текст
  • p- вставить (вставляется после текущего символа, Pвставляется перед текущим символом.

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

6
15.06.2011 13:53:46
Что значит «выйти из режима вставки (пропустить, если вы уже находитесь в обычном режиме)»? Каждое действие, которое я выполняю в vim, заканчивается возвращением в обычный режим (если применимо) :) Есть причина, по которой это называется нормальным режимом.
R. Martinho Fernandes 1.04.2010 03:13:30
Я имею в виду, если вы хотите работать в vi / vim, выйдите из режима вставки . Вы не можете быть продуктивным, если ваше первое нажатие клавиши при вводе vi всегда iили <Ins>. Оставайтесь в обычном режиме. Вот где происходит волшебство.
R. Martinho Fernandes 1.04.2010 03:23:14
@Martinho Fernandes Человек, задающий вопрос, кажется, довольно плохо знаком с vi / vim, поэтому я специально разработал ответ на этот вопрос. Я обычно живу в обычном режиме и рекомендую другим.
Hamish Downer 1.04.2010 09:29:32

http://www.viemu.com/a-why-vi-vim.html - хорошая адвокационная статья. Это объясняет силу использования .команды для повторения последнего редактирования.

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

С Vim это ужасно

* yy to copy one line (you almost never want the whole line!)
* [number xx]yy to copy xx lines into the buffer. But you never know

точно, если вы выбрали то, что хотели. Я часто должен сделать [число хх] дд, а затем отменить!

Я уверен, что другие ответы объяснили лучше, но ты делаешь это неправильно. Я часто использую визуальный режим, чтобы выбрать текст для восстановления или удаления, что похоже на ваш пример shift + select, но у Vim есть явное преимущество, потому что ваши руки никогда не покидают домашний ряд, чтобы сделать это. yy - отличная команда, но я часто делаю Vy, если я хочу выдернуть целую строку.

6
16.03.2010 16:11:50

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

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

46
31.03.2010 19:37:33
Если вам нравятся учебники по vim, посмотрите также видео с Дереком Уайеттом . Они превосходны.
Jeromy Anglim 13.01.2011 06:40:20

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

17
31.03.2010 22:44:38
Это первое, о чем я подумал, читая ОП. Очевидно, что плакат никогда не запускал это; Я пробежался по нему, когда впервые изучил vim два года назад, и я понял, что Vim превосходит все остальные редакторы, которые я использовал (включая Emacs, поскольку комбинации клавиш раздражают использование на Mac). ,
dash-tom-bang 24.08.2011 00:47:19

Плагины Vim

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

rails.vim

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

gist.vim

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

space.vim

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

surround.vim

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

supertab.vim

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

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, из которых я многому научился и позаимствовал большинство плагинов, перечисленных здесь.

91
1.04.2010 03:44:29
Волшебная навигация по тестам в классе в rails.vim - это одна из самых общих вещей, которую я хотел бы, чтобы Vim имел, чтобы TextMate полностью работал на всех языках: если я работаю над Person.scala и использую Cmd + T, обычно это первое в списке есть PersonTest.scala.
Tom Morris 1.04.2010 08:50:13
Я думаю, что пришло время заменить FuzzyFinderTextmate на github.com/wincent/Command-T
Gavin Gilmour 15.01.2011 13:44:10
+1 для синтетики. Это, в сочетании с JSLint, сделало мой Javascript намного менее подверженным ошибкам. См superuser.com/questions/247012/... о том , как настроить JSLint для работы с Syntastic.
Nathan Long 1.03.2011 19:07:56
@ Бенсон Большой список! Я бы тоже бросил в snipMate . Очень полезная автоматизация обычных программ. если <tab> мгновенно, если блок и т. д.
AlG 13.09.2011 17:37:55
Я думаю, что nerdcommenter также хороший плагин: здесь . Как следует из названия, он предназначен для комментирования вашего кода.
Stephan 12.05.2012 15:13:57

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

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

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

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

  • I вставить в начале.
  • A добавить в конец.
  • 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 увеличивает / уменьшает число.
  • . повторить последнюю команду (простой макрос)
  • == исправить отступ строки
  • > блок отступа (в визуальном режиме)
  • < блок без отступов (в визуальном режиме)

Запись макроса

  • Нажмите, 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, я хотел бы дать правильную подсветку синтаксиса здесь).

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

207
29.10.2012 18:51:23
Лучше, чем '.есть g;, который прыгает обратно через changelist. Переход к последней отредактированной позиции вместо последней отредактированной строки
naught101 28.04.2012 02:09:21

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

16
15.06.2011 13:44:13
или dfx, dFx, dtx, ytx и т. д., где x - это символ, +1
hhh 14.01.2011 17:09:05
Да! И не забудьте ct (изменить на).
markle976 30.03.2012 13:52:31

В дополнение к большой ответ о grokking VI, следует отметить , что ВИМ действительно добавить некоторые очень VI-подобные функции , которые делают с использованием VI команды лучше. Сначала на ум приходят текстовые объекты: вместо того, {!}fmtчтобы переформатировать текущий абзац, он !apfmtделает то же самое. Он работает, сначала указав, что мы хотим выбрать aтекстовый объект, который является текущим абзацем . Похоже, чтобы изменить текущий строковый литерал ( fooк barдля примера), вместо T"ct"bar(переход к только после того, как предыдущие ", изменений пока только до следующего ", вставок бара ), вы можете сказать ci"bar: изменение внутри (сокровенная) кавычка, вставляя бар .

Мышление в терминах текстовых объектов вместо команд перемещения довольно приятно.

4
15.06.2011 13:52:07
Команды inner и 'a' textobject также хороши тем, что они обрабатывают вложение ваших текстовых объектов. Вложенные кавычки неоднозначны, но для других объектов, таких как фигурные скобки, парены и т. Д., Это очень удобно.
dash-tom-bang 24.08.2011 00:55:26

Визуальный режим

Как уже говорили несколько человек, визуальный режим - это решение вашей проблемы копирования / вставки. Vim дает вам «V», «V» и Cv. Строчная буква 'v' в vim, по сути, такая же, как клавиша Shift в блокноте. Приятно то, что вам не нужно его удерживать. Вы можете использовать любую технику движения, чтобы эффективно перемещаться к начальной (или конечной) точке вашего выбора. Затем нажмите «v» и снова используйте эффективные приемы передвижения, чтобы перейти к другому концу вашего выбора. Тогда «d» или «y» позволяет вырезать или скопировать этот выбор.

Преимущество визуального режима vim перед описанием Джимом Деннисом вырезки / копирования / вставки в vi состоит в том, что вам не нужно точно определять местоположение. Иногда эффективнее использовать быстрое движение, чтобы добраться до общей окрестности того места, куда вы хотите пойти, а затем уточнить это другими движениями, чем придумывать более сложную команду для одного движения, которая приведет вас именно туда, куда вы хотите идти.

Недостаток такого широкого использования визуального режима заключается в том, что он может стать опорой, которую вы используете все время, что мешает вам изучать новые команды vi (m), которые могут позволить вам делать вещи более эффективно. Однако, если вы очень активно изучаете новые аспекты vi (m), это, вероятно, не сильно повлияет на вас.

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

Эффективное использование клавиатуры

Я также не согласен с вашим утверждением, что чередование рук - это самый быстрый способ использования клавиатуры. В нем есть доля правды. Говоря очень широко, повторное использование одной и той же вещи происходит медленно. Этот наиболее важный пример этого принципа заключается в том, что последовательные нажатия клавиш одним и тем же пальцем выполняются очень медленно. Ваше утверждение, вероятно, связано с естественной тенденцией использования преобразования s / finger / hand / в этом паттерне. В какой-то степени это правильно, но на чрезвычайно высоком конце спектра эффективности это неверно.

Просто спросите любого пианиста. Спросите их, быстрее ли разыграть череду нескольких нот чередующимися руками или использовать последовательные пальцы одной руки подряд. Самый быстрый способ набрать 4 нажатия клавиш - это не чередовать руки, а набирать их четырьмя пальцами одной руки в порядке возрастания или убывания (назовите это «бегом»). Это должно быть самоочевидным, как только вы обдумаете эту возможность.

Более сложная проблема оптимизируется для этого. Это довольно легко оптимизировать для абсолютного расстояния на клавиатуре. Vim делает это. На уровне «запуска» оптимизировать гораздо сложнее, но vi (m) с его модальным редактированием дает вам больше шансов сделать это, чем любой немодальный подход (хм, emacs).

На Emacs

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

Vim дает вам непревзойденную эффективность редактирования необработанного текста Emacs дает вам непревзойденную возможность настраивать и программировать редактор

Слепые фанатики vim будут утверждать, что у vim есть язык сценариев. Но это неясный, специальный язык, который был разработан, чтобы служить редактору. В Emacs есть Лисп! Достаточно сказано. Если вы не цените значение этих двух последних предложений или хотите узнать достаточно о функциональном программировании и Лиспе, чтобы развить это понимание, тогда вам следует использовать vim.

Знатоки emacs будут утверждать, что в emacs есть режим viper, и поэтому он является надмножеством vim. Но режим гадюки не является стандартным. Насколько я понимаю, режим viper не используется большинством пользователей emacs. Поскольку это не значение по умолчанию, большинство пользователей emacs, вероятно, не осознают преимущества модальной парадигмы.

На мой взгляд, эти различия являются ортогональными. Я полагаю, что преимущества vim и emacs, как я их сказал, являются действительными. Это означает, что окончательный редактор еще не существует. Вероятно, это правда, что emacs будет самой простой платформой, на которой можно основать лучший редактор. Но модальное редактирование не укоренилось в мышлении emacs. Сообщество emacs может двигаться таким же образом в будущем, но это вряд ли возможно.

Так что если вы хотите чистую эффективность редактирования, используйте vim. Если вы хотите наилучшую среду для написания сценариев и программирования, используйте редактор emacs. Если вам нужны некоторые из них с упором на программируемость, используйте emacs с режимом viper (или программируйте свой собственный режим). Если вы хотите лучшее из обоих миров, вам не повезло на данный момент.

18
1.04.2010 17:00:28

Я являюсь членом Американской ассоциации криптограмм. Раз в два месяца журнал включает в себя более 100 криптограмм разных видов. Примерно 15 из них - «криптарифмы» - различные типы арифметических задач с заменой букв цифрами. Два или три из них - судоку, за исключением букв вместо цифр. Когда сетка будет завершена, девять различных букв будут обозначать слово или слова на некоторой линии, диагонали, спирали и т. Д. Где-нибудь в сетке.

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

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

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

Результат будет выглядеть так:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

Итак, первый шаг в преобразовании этого в числа состоит в том, чтобы составить список отдельных букв. Сначала я делаю копию блока. Я позиционирую курсор в верхней части блока, затем печатаю :y}}p. :переводит меня в командный режим, yдергает следующую команду движения. Поскольку }это переход к концу следующего абзаца, y}дергает абзац. }затем перемещает курсор в конец абзаца и pвставляет то, что мы дернули сразу после курсора. Таким образом, y}}pсоздается копия следующего абзаца и заканчивается курсор между двумя копиями.

Затем я превращаю одну из этих копий в список отдельных букв. Эта команда немного сложнее:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

:снова переводит меня в командный режим. !указывает на то, что содержимое следующего янки должно передаваться через командную строку. }восстанавливает следующий абзац, а затем командная строка использует trкоманду для удаления всего, кроме букв в верхнем регистре, sedкоманду для печати каждой буквы в одной строке и sortкоманду для сортировки этих строк, удаления дубликатов и последующего trудаления новые строки, оставляя девять отдельных букв в одной строке, заменяя девять строк, которые изначально составляли абзац. В этом случае буква: ACELNOPST.

Следующим шагом является создание еще одной копии сетки. А затем использовать эти письма я только идентифицированные для замены каждого из этих букв с цифрой от 1 до 9. Это очень просто: :!}tr ACELNOPST 0-9. Результат:

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

Это может быть решено обычным способом или введено в любой решатель судоку, который вы предпочитаете. Завершенное решение может быть затем преобразовано обратно в буквы с :!}tr 1-9 ACELNOPST.

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

25
15.06.2011 13:39:45
и раздражение вызывает то, что в некоторых дистрибутивах, таких как Ubuntu, есть псевдонимы от слова «vi» до «vim», так что люди действительно не увидят vi. Отличный пример, надо попробовать ... +1
hhh 14.01.2011 17:12:35
Разве vim не проверяет имя, с которого он был запущен, чтобы он мог найти правильный режим?
dash-tom-bang 24.08.2011 00:45:54
Я озадачен этой повторяющейся ошибкой: вы говорите, что вам нужно :перейти в командный режим, но затем неизменно вы указываете команды нормального режима (например y}}p), которые не могут работать из командного режима ?!
sehe 4.03.2012 20:47:43
Мой взгляд на уникальную задачу chars: :se tw=1 fo=(подготовка) VG:s/./& /g(вставка пробелов), gvgq(разделение на отдельные строки), V{:sort u(сортировка и удаление дубликатов)
sehe 4.03.2012 20:56:35