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

1126

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

Olivier Pons
источник
«Использование левой и правой руки поочередно - самый быстрый способ использования клавиатуры». Не для меня, как ни странно. Когда я могу набрать слово одной рукой, я нахожу, что я намного быстрее.
Бен Мордехай

Ответы:

2860

Ваша проблема с 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 ».

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

Таким образом, один из способов вырезать произвольную выделенную часть текста - сбросить метку (я обычно использую « a » в качестве моей «первой» метки, « z » в качестве моей следующей метки, « b » в качестве другой и « e » в качестве еще один (я не помню, чтобы когда-либо интерактивно использовалось более четырех меток за 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 лет назад.

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

Джим Деннис
источник
440
Священный код обезьян, .. это один глубокий ответ. Замечательно, что вы, вероятно, написали в vim примерно 10 нажатий клавиш.
EightyOne Unite
48
@Wahnfieden - «Грок» - это именно то, что я имел в виду: en.wikipedia.org/wiki/Grok (по-видимому, даже в OED - мы, англоязычные, ближе всего к канонической лексике). «Грохнуть» редактора означает, что вы свободно используете его команды ... как если бы они были вашим естественным языком.
Джим Деннис
22
вау, очень хорошо написанный ответ! я не могу согласиться, хотя я @q
часто
63
Превосходный ответ, который полностью искупает действительно ужасный вопрос. Я собираюсь поднять этот вопрос, который, как правило, я бы понизил, просто чтобы этот ответ стало легче найти. (И я парень из Emacs! Но таким образом у меня будет где-то указывать новым людям, которые хотят получить хорошее объяснение того, что опытным пользователям vi нравится находить забаву над vi. Затем я расскажу им об Emacs, и они могут принять решение.)
Брэндон Родс
8
Можете ли вы создать веб-сайт и поместить этот учебник туда, чтобы он не зарывался здесь на stackoverflow. Я еще не читал лучшего введения в vi, чем это.
Марко
504

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

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

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

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

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

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

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

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

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

  • viB
  • vi{

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

  • ggVG

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

CMS
источник
2
У каждого редактора есть что-то вроде этого, это не относится к vim.
Finnw
22
Да, но это была конкретная жалоба автора. Визуальный режим - лучший метод прямого выбора текста и управления им в Vim. И поскольку методы обхода буфера в vim превосходны, выбор текста в vim довольно приятен.
оружие
9
Я думаю, что также стоит упомянуть Ctrl-V, чтобы выбрать блок - то есть произвольный прямоугольник текста. Когда вам это нужно, это спасатель.
Хэмиш Даунер
6
@viksit: я использую Camtasia, но есть много альтернатив: codinghorror.com/blog/2006/11/screencasting-for-windows.html
CMS
3
Кроме того, если у вас есть визуальный выбор и вы хотите настроить его, oпрыгайте на другой конец. Таким образом, вы можете перемещать начало и конец выделения столько, сколько захотите.
Натан Лонг
207

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

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

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

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

vdboor
источник
4
Лучше, чем '.есть g;, который прыгает обратно через changelist. Переход к последней отредактированной позиции вместо последней отредактированной строки
naught101
98

Механизм Control+ Rочень полезен :-) В режиме вставки или командном режиме (т. Е. В :строке при вводе команд) продолжайте с нумерованного или именованного регистра:

  • a- zименованные регистры
  • " безымянный регистр, содержащий текст последнего удаления или янки
  • % текущее имя файла
  • # альтернативное имя файла
  • * содержимое буфера обмена (X11: основной выбор)
  • + содержимое буфера обмена
  • / последний шаблон поиска
  • : последняя командная строка
  • . последний вставленный текст
  • - последнее небольшое (меньше строки) удаление
  • =5*5 вставить 25 в текст (мини-калькулятор)

Смотрите :help i_CTRL-Rи :help c_CTRL-Rдля более подробной информации, и ищите поблизости, чтобы получить больше CTRL-R.

кев
источник
10
К вашему сведению, это относится к Ctrl + R в режиме вставки . В обычном режиме Ctrl + R повторяется.
vdboor
2
+1 для текущего / альтернативного имени файла. Control-Aтакже работает в режиме вставки для последнего вставленного текста, а также Control-@для вставки последнего вставленного текста и немедленного переключения в обычный режим.
Арье Лейб Таурог
91

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

Бенсон
источник
Волшебная навигация по тестам в классе в rails.vim - это одна из самых общих вещей, которую я хотел бы, чтобы Vim имел TextMate абсолютно безупречным для всех языков: если я работаю над Person.scala и использую Cmd + T, обычно это первое в списке есть PersonTest.scala.
Том Моррис
5
Я думаю, что пришло время заменить FuzzyFinderTextmate на github.com/wincent/Command-T
Гэвин Гилмор
2
+1 для синтетики. Это, в сочетании с JSLint, сделало мой Javascript намного менее подверженным ошибкам. См. Superuser.com/questions/247012/… о том, как настроить JSLint для работы с Syntastic.
Натан Лонг
1
@ Бенсон Большой список! Я бы тоже бросил в snipMate . Очень полезная автоматизация обычного кодирования. если <tab> мгновенно, если блок и т. д.
AlG
2
Я думаю, что nerdcommenter также хороший плагин: здесь . Как следует из названия, он предназначен для комментирования вашего кода.
Стефан
53

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

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

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

Cooper6581
источник
3
Кроме того, если вы используете сжатую команду (например, A для добавления в конец) для редактирования текста, vim может повторить то же самое действие для следующей строки, на которой вы нажимаете .клавишу.
vdboor
48

солдат

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

^ P и ^ N

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

^ O и ^ I

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

димба
источник
4
@Kungi `. приведет вас к последнему редактированию `` вернет вас к позиции, в которой вы находились до последнего 'прыжка' - которая / может / также быть позицией последнего редактирования.
Грант Маклин
46

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

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

Ронни Брендель
источник
3
Если вам нравятся учебники по vim, посмотрите также видео с Дереком Уайеттом . Они превосходны.
Джером Энглим
42

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

hcs42
источник
19
... и CTRL-X уменьшает.
InnaM
9
Это удобный ярлык, но до сих пор я НИКОГДА не нашел для него никакого применения.
SolutionYogi
8
если вы запускаете vim на экране и удивляетесь, почему это не работает - ctrl + A, A
matja
13
@SolutionYogi: Учтите, что вы хотите добавить номер строки в начало каждой строки. Решение: ggI1 <пробел> <esc> 0qqyawjP0 <ca> 0q9999 @ q
hcs42
10
Чрезвычайно полезно с Vimperator, где он увеличивает (или уменьшает Ctrl-X) последнее число в URL. Полезно для быстрого серфинга по галереям изображений и т. Д.
синеватый
38

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

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

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

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

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

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

Эрик Смит
источник
6
Ого, я не знал о привязке * и # (поиск вперед / назад по слову под курсором). Это круто. Ф / Ф и т / т а; Команды - это быстрый переход к символам в текущей строке. f / F помещает курсор на указанный символ, в то время как t / T устанавливает его «до» символа (символ непосредственно перед или после него в соответствии с выбранным направлением. Просто повторяет самый последний f / F / t / T прыгать (в том же направлении).
Джим Деннис
10
:) Слоган в верхней части страницы советов на vim.org: «Можете ли вы представить, сколько нажатий клавиш можно было бы сохранить, если бы я знал только команду« * »вовремя?» - Юрген Солк, 19.01.2001 "
Yewge
1
Как упоминал Джим, комбо "t / T" часто так же хорошо, если не лучше, например, ct(сотрет слово и переведет вас в режим вставки, но сохранит парантезы!
PUK
34

сессия

а. сохранить сессию

: mks сессия

б. принудительное сохранение сеанса

: MKS! имя_сеанса

с. загрузить сессию

gvim или vim -S сессия


Сложение и вычитание

а. Сложение и вычитание

CTRL-A; Добавить [число] к номеру или буквенному символу на или после курсора. {не в Vi

CTRL-X; Вычесть [количество] из числа или буквенного символа в или после курсора. {не в Vi}

б. Отмена отображения ключа окна

В окне Ctrl-A уже сопоставлен для всего выбора файла, который необходимо удалить в файле rc. пометьте mswin.vim часть отображения CTRL-A как комментарий или добавьте свой rc-файл с помощью unmap

с. С макросом

Команда CTRL-A очень полезна в макросе. Пример: Используйте следующие шаги, чтобы создать нумерованный список.

  1. Создайте первую запись списка, убедитесь, что она начинается с цифры.
  2. qa - начать запись в буфер 'a'
  3. Y - дергать запись
  4. p - поставить копию записи ниже первой
  5. CTRL-A - увеличить число
  6. q - остановить запись
  7. @a - повторить янки, пут и инкремент
agfe2
источник
1
Есть идеи, какие ярлыки есть в Windows?
Дон Реба
32

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

Дейв Кирби
источник
1
Большое спасибо за то, что поделились, что очень приятно учиться на «полезных и не классических» макросах.
Оливье Понс
%s/\(bar\)(\(.\+\))/\2.\1()/сделал бы это тоже. (Побеги совместимы с :set magic.) Просто для записи. :)
Ipsquiggle
1
Если вам не нравятся побеги в стиле vim, используйте \ v, чтобы включить Very Magic:%s/\v(bar)\((.+)\)/\2.\1()/
Ipsquiggle
@lpsquiggle: ваше предложение не будет обрабатывать сложные выражения с несколькими наборами скобок. например, if bar(foo(xxx)) or wibble(xxx): становится if foo(xxx)) or wibble(xxx.bar(): совершенно неправильно.
Дейв Кирби
28

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

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

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

  • - : самое полезное: перейти в верхний каталог ( cd ..)
  • mf : пометить файл
  • D : Удалить отмеченные файлы или файл, на котором находится курсор, если ничего не отмечено.
  • R : переименовать файл, на котором находится курсор.
  • d : создать новый каталог в текущем каталоге
  • % : Создать новый файл в текущем каталоге
оборота
источник
1
Я всегда думал, что методы по умолчанию для просмотра своего рода отстой для большинства вещей. Это просто медленно просматривать, если вы знаете, куда вы хотите пойти. LustyExplorer из раздела сценариев vim.org является очень необходимым улучшением.
Свен
Ваше второе отображение может быть более простым: карта <silent> <S-F8>: Sexplore <CR>
Телец Олсон
8
Я рекомендую NERDtree вместо встроенного проводника. Это изменило способ, которым я использовал vim для проектов, и сделало меня намного более продуктивным. Просто Google для этого.
kprobst
Я никогда не чувствую необходимости исследовать дерево исходных текстов , я просто использовать :find, :tagи различные родственные нажатия клавиш прыгать. (Может быть, это потому, что исходные деревья, над которыми я работаю, большие и организованы иначе, чем я бы сделал? :))
dash-tom-bang
25

Я являюсь членом Американской ассоциации криптограмм. Раз в два месяца журнал включает в себя более 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 есть сила, которой мало кто соответствует. Самая большая проблема заключается в том, что лишь очень немногие учебные пособия, веб-сайты, файлы справки и т. Д. Делают нечто большее, чем едва касаются поверхности того, что возможно.

Jeff Dege
источник
и раздражение вызывает то, что в некоторых дистрибутивах, таких как Ubuntu, есть псевдонимы от слова "vi" до "vim", чтобы люди не увидели vi. Отличный пример, надо попробовать ... +1
ххх
1
Разве vim не проверяет имя, с которого он был запущен, чтобы он мог найти правильный режим?
dash-tom-bang
3
Я озадачен этой повторяющейся ошибкой: вы говорите, что вам нужно :перейти в командный режим, но затем неизменно вы указываете команды нормального режима (например y}}p), которые не могут работать из командного режима ?!
2012 года
Мой взгляд на уникальные задачи с символами: :se tw=1 fo=(подготовка) VG:s/./& /g(вставка пробелов), gvgq(разделение на отдельные строки), V{:sort u(сортировка и удаление дубликатов)
sehe
23

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

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

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

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

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

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

jqno
источник
5
+1 за ссылку Джейми Завински . (Нет очков, забранных за неспособность связаться с ним, даже). :)
Джим Деннис
1
@ Джим, я даже не знал, что это цитата Джейми Завински :). Я постараюсь запомнить это с этого момента.
jqno
Я нахожу следующий трюк все более полезным ... для случаев, когда вы хотите соединить строки, которые соответствуют (или не соответствуют) некоторому шаблону, с предыдущей строкой: :% g/foo/-1jили, :'a,'z v/bar/-1jнапример, (где первый - «все строки и соответствие шаблону») в то время как последний является «линиями между знаком a и знаком z, которые не соответствуют шаблону»). Часть после шаблона в команде a gили vex может быть любой другой командой ex, -1j - просто относительное перемещение строки и команда соединения.
Джим Деннис
Конечно, если вы называете свой макрос «2», то, когда приходит время его использовать, вам даже не нужно перемещать палец от клавиши «@» к клавише «q». Вероятно, экономит от 50 до 100 миллисекунд каждый раз, прямо здесь. = P
JustJeff
@JustJeff Полностью зависит от вашей раскладки клавиатуры, моя клавиша @ находится на другой стороне клавиатуры от моей клавиши 2.
Саймон Стил
23

Я недавно обнаружил q:. Он открывает «командное окно» и показывает ваши самые последние команды ex-mode (command-mode). Вы можете двигаться как обычно в пределах окна, и нажатие <CR>выполняет команду. Вы также можете редактировать и т.д. Бесценно, когда вы возитесь с какой-то сложной командой или регулярным выражением, и вы не хотите перепечатывать все это, или если сложная вещь, которую вы хотите сделать, это вернуть 3 команды назад. Это почти как Башset -o vi , но для самого vim (хе!).

Смотрите :help q:для более интересных битов для перехода вперед и назад.

Дэвид Папа
источник
22

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

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

Peter Mortensen
источник
20

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

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

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

tfmoraes
источник
Эй, хороший намек на "\"! Гораздо лучше набрать ",", чем "\".
Оливье Понс
2
Чтобы сделать Caps Lock дополнительным Esc в Windows (для чего нужен ключ блокировки Caps? «Любой ключ»?), Попробуйте это: web.archive.org/web/20100418005858/http://webpages.charter.net/…
Р. Мартиньо Фернандес
На Mac вам нужен PCKeyboardHack - подробности на superuser.com/questions/34223/…
Том Моррис,
1
В Windows я использую AutoHotKey сCapslock::Escape
Jeromy Anglim
19

Другой полезный ярлык vi, который я часто использую, это 'xp'. Это заменит символ под курсором следующим символом.

Costyn
источник
3
Xpпойти другим путем
тестер
5
В то время, когда вышел Windows XP, я шутил, что это единственное хорошее применение.
kguest
18

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

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

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

Питер Эллис
источник
2
<Ctrl> + W и j / k позволят вам перемещаться абсолютно (j вверх, k вниз, как с обычным vim). Это замечательно, когда у вас есть 3+ сплитов.
Эндрю Сканелли
1
+1 для zf в визуальном режиме, мне нравится сворачивание кода, но я не знал об этом.
coder_tim
2
после нажатия на мою клавиатуру я вывел, что <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
:help ctrl-wFTW ... сделайте себе одолжение, и заставьте себя попробовать эти вещи, по крайней мере, 15 минут!
Sjas
18

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

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

оборота user307058
источник
17

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

konryd
источник
1
Это первое, о чем я подумал, читая ОП. Очевидно, что плакат никогда не запускал это; Я пробежался по нему, когда впервые изучил vim два года назад, и я понял, что Vim превосходит все остальные редакторы, которые я использовал (включая Emacs, поскольку комбинации клавиш раздражают использование на Mac). ,
dash-tom-bang
16

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

Возможность выполнять сложные повторяющиеся изменения с очень небольшим количеством нажатий клавиш (часто с использованием макросов ). Посмотрите на ВимГольф чтобы увидеть силу Vim!

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

Johnsyweb
источник
16

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

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

кев
источник
16

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

David Corbin
источник
2
или dfx, dFx, dtx, ytx и т. д., где x - это символ, +1
ччч
Да! И не забудьте ct (изменить на).
markle976
16

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

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

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

  • Тип: та имя, чтобы перейти к определению имени.

оборота Bradjcox
источник
14

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

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

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

David Claridge
источник
4
Или просто используйте ": set ai" (авто-отступ), который был в vi с самого начала.
xcramps
14

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

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

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

autodidakto
источник
13

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

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

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

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

Стефано Борини
источник
12

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

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

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

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

Дэвид Волевер
источник
3
Возможно, лучше установить clipboardопцию unnamed( set clipboard=unnamedв вашем .vimrc), чтобы использовать системный буфер обмена по умолчанию. Или , если вы все еще хотите, чтобы система CLIPBOARD отдельно от безымянного регистра, используйте соответствующее название регистр буфера обмена: "*p.
Р. Мартиньо Фернандес
2
Любить это! После того, как я был раздражен, вставляя примеры кода из Интернета, я только начинал чувствовать себя опытным в vim. Это была команда, которую я придумал на месте. Это было, когда VIM полностью зацепил меня.
kevpie
Если вы разрабатываете на Mac, Command + C и Command + V копируйте и вставляйте с использованием системного буфера обмена, переназначение не требуется.
Бен Мордехай,
Только с GVIm ... С консоли вставка без :set pasteне работает так хорошо, если включен автоиндентирование.
Дэвид Вулевер