it-swarm.com.ru

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

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

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

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

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

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

С Vim это ужасно

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

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

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

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

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

Мой вопрос:

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

1127
Olivier Pons

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

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

"Дзен" в vi означает, что вы говорите на языке. Начальное y является глаголом. Оператор yy является синонимом y_. y удваивается, чтобы его было легче набирать, поскольку это такая распространенная операция.

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

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

vi имеет 26 "отметок" и 26 "регистров". Для любой позиции курсора устанавливается метка с помощью команды m. Каждый знак обозначается одной строчной буквой. Таким образом, ma устанавливает метку ' a ' в текущем местоположении, а mz устанавливает ' z отметка. Вы можете перейти к строке, содержащей метку, с помощью команды ' (одинарная кавычка). Таким образом, 'a перемещается в начало строки, содержащей метку ' a '. Вы можете перейти к точному местоположению любой метки, используя команду ` (backquote). Таким образом, `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 "именованных" регистров путем префикса ссылки "объект" с " (модификатор двойной кавычки). Таким образом, если я использую "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 была на самом деле вдохновлена ​​этой ex командой (и названа в честь способа, которым она была задокументирована). Команда ex:g/re/p (grep) документировала, как "глобально" "печатать" строки, содержащие "регулярное выражение" (re). Когда использовались 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 (global/converse-global). Обычно вам не нужно этого делать. Однако рассмотрим случай, когда вы хотите выполнить подстановку только в строках, соответствующих другому шаблону. Часто вы можете использовать сложный шаблон с захватами и использовать обратные ссылки, чтобы сохранить части строк, которые вы НЕ хотите изменять. Однако часто будет легче отделить совпадение от подстановки: :% g/foo/s/bar/zzz/g - для каждой строки, содержащей "foo", заменить все "bar" на "zzz". (Что-то вроде :% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g будет работать только для случаев с теми экземплярами "bar", которые были ПРЕДУСМОТРЕНЫ "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. файл.

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

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

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

Например, у меня есть файл из семи строк (36 символов), который пропускает файл через wc и вставляет комментарий в стиле C в начало файла, содержащего данные подсчета Word. Я могу применить этот "макрос" к файлу с помощью команды вроде: 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 лет назад.

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

2862
Jim Dennis

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

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

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

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

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

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

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

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

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

  • viB
  • vi{

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

  • ggVG

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

505
CMS

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

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

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

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

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

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

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

  • cW = изменить до конца Word
  • 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
vdboor

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

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

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

98
kev

Плагины Vim

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

Rails.vim

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

Gist.vim

Этот плагин позволяет вам выбрать область текста в визуальном режиме и набрать быструю команду, чтобы опубликовать ее на Gist.github.com . Это обеспечивает легкий доступ к Pastebin, что невероятно удобно, если вы сотрудничаете с кем-то через 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 config , из которого я многому научился и позаимствовал большинство плагинов, перечисленных здесь.

91
Benson

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

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

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

53
Cooper6581

ГИ

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

^ P и ^ N

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

^ O и ^ I

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

48
dimba

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

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

46
Ronny Brendel

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

42
hcs42

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

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

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

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

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

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

38
Eric Smith

Сессия

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

: 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 - повторить янки, пут и инкремент
34
agfe2

На прошлой неделе на работе наш проект унаследовал много 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
Dave Kirby

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

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

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

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

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

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

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

Задача отформатирована в виде девяти групп из девяти букв, причем -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
Jeff Dege

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

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

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

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

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

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

23
jqno

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

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

23
David Pope

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

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

22
Svend

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

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

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

20
tfmoraes

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

19
Costyn

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

Как уже говорили несколько человек, визуальный режим - это решение вашей проблемы копирования/вставки. Vim дает вам v, V и C-v. Строчная буква "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 имеет LISP! Достаточно сказано. Если вы не цените значение этих двух последних предложений или хотите узнать достаточно о функциональном программировании и LISP, чтобы развить эту оценку, то вам следует использовать vim.

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

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

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

18
user307058

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

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

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

18
Peter Ellis

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

17
konryd

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

16
David Corbin

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

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

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

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

16
Bradjcox

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

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

16
kev

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

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

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

16
Johnsyweb

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

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

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

14
autodidakto

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

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

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

14
David Claridge

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

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

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

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

13
Stefano Borini

Согласился с верхним постером - команда : r! очень полезна.

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

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

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

12
David Wolever

cit - очистить содержимое тега при переходе в режим вставки

yit - скопировать содержимое тега

10
Sanek

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

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

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

10
William Pursell

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

:%s

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

10
Eric Ryan Harrison

Вы можете использовать\= в строке подстановки, и это то, что я делаю очень часто.

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

# CSSLINT
# PHPCS
# Charlie
# Delta

Если он начинается на первой строке, вы можете сделать

:1,6s/#/\=line(".")/g

Чтобы преобразовать его в

1 CSSLINT
2 PHPCS
3 Charlie
4 Delta

Если это не начинается в первой строке, просто посчитайте:

:16,20s/#/\=line(".") - 15/g

Больше информации на: help sub-replace-expression

10
kguest

Вот еще один сайт , который я нашел полезным при изучении Vim. Это тоже весело! :)

VIM Adventures - это онлайн-игра, основанная на сочетаниях клавиш VIM (команды, движения и операторы). Это игра "Zelda встречает редактирование текста". Это игра-головоломка для отработки и запоминания команд VIM (конечно, старый добрый ВП также рассматривается). Это простой способ научиться VIM без крутой кривой обучения.

9
Alex Lockwood

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

Перейти в файл, пока его путь

gf

получить полный путь к существующему файлу

:r!echo %:p

получить каталог существующего файла

:r!echo %:p:h

запустить код:

:!Ruby %:p

Рубиновые сокращения:

ab if_do if end<esc>bi<cr><esc>xhxO
ab if_else if end<esc>bi<cr><esc>xhxO else<esc>bhxA<cr> <esc>k$O
ab meth def method<cr>end<esc>k<esc>:s/method/
ab klas class KlassName<cr>end<esc>k<esc>:s/KlassName/
ab mod module ModName<cr>end<esc>k<esc>:s/ModName/

запустить текущую программу:

   map ,rby :w!<cr>:!Ruby %:p<cr>

проверьте синтаксис текущей программы:

   map ,c :w!<cr>:!Ruby -c %:p<cr>

запустить все спецификации для текущей программы спецификаций:

   map ,s :w!<cr>:!rspec %:p<cr>

взломать IRB:

   map ,i :w!<cr>:!irb<cr>

rspec сокращений:

   ab shared_examples shared_examples_for "behavior here" do<cr>end
   ab shared_behavior describe "description here" do<cr>  before :each do<cr>end<cr>it_should_behave_like "behavior here"<cr><bs>end<cr>
   ab describe_do describe "description here" do<cr>end
   ab context_do describe "description here" do<cr>end
   ab it_do it "description here" do<cr>end
   ab before_each before :each do<cr>end<cr>

Сокращения рельсов:

аутентификация пользователя:

     ab userc <esc>:r $VIMRUNTIME/Templates/Ruby/c-users.rb<cr>
     ab userv <esc>:r $VIMRUNTIME/Templates/Ruby/v-users.erb<cr>
     ab userm <esc>:r $VIMRUNTIME/Templates/Ruby/m-users.rb<cr>

открыть визуально выбранный URL в Firefox:

"function
   function open_url_in_firefox:(copy_text)
     let g:open_url_in_firefox="silent !open -a \"firefox\" \"".a:copy_text."\""
     exe g:open_url_in_firefox
   endfunction

"abbreviations
   map ,d :call open_url_in_firefox:(expand("%:p"))<cr>
   map go y:call open_url_in_firefox:(@0)<cr> 

rspec: запустить спецификацию, содержащую текущую строку:

"function
   function run_single_rspec_test:(the_test)
     let g:rake_spec="!rspec ".a:the_test.":".line(".")
     exe g:rake_spec
   endfunction

"abbreviations
   map ,s :call run_single_rspec_test:(expand("%:p"))<cr>

rspec-Rails: запустить спецификацию, содержащую текущую строку:

"function
   function run_single_Rails_rspec_test:(the_test)
     let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")."\""
     exe g:rake_spec
   endfunction

"abbreviations
   map ,r :call run_single_Rails_rspec_test:(expand("%:p"))<cr>

rspec-Rails: запустить спецификацию, содержащую текущую строку с отладкой:

"function
   function run_spec_containing_current_line_with_debugging:(the_test)
     let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")." -d\""
     exe g:rake_spec
   endfunction

"abbreviations
   map ,p :call run_spec_containing_current_line_with_debugging:(expand("%:p")) <cr>

hTML

"abbreviations

  "ab htm <html><cr><tab><head><cr></head><cr><body><cr></body><cr><bs><bs></html>
   ab template_html <script type = 'text/template' id = 'templateIdHere'></script>
   ab script_i <script src=''></script>
   ab script_m <script><cr></script>
   ab Tpage <esc>:r ~/.vim/templates/pageContainer.html<cr>
   ab Ttable <esc>:r ~/.vim/templates/listTable.html<cr>

"function to render common html template

   function html:() 
     call feedkeys( "i", 't' )
     call feedkeys("<html>\<cr>  <head>\<cr></head>\<cr><body>\<cr> ", 't')
     call feedkeys( "\<esc>", 't' )
     call feedkeys( "i", 't' )
     call include_js:()
     call feedkeys("\<bs>\<bs></body>\<cr> \<esc>hxhxi</html>", 't')
   endfunction

javascript

"jasmine.js
  "abbreviations
   ab describe_js describe('description here', function(){<cr>});
   ab context_js context('context here', function(){<cr>});
   ab it_js it('expectation here', function(){<cr>});
   ab expect_js expect().toEqual();
   ab before_js beforeEach(function(){<cr>});
   ab after_js afterEach(function(){<cr>});

"function abbreviations

   ab fun1 function(){}<esc>i<cr><esc>ko
   ab fun2 x=function(){};<esc>hi<cr>
   ab fun3 var x=function(){<cr>};

"method for rendering inclusion of common js files

   function include_js:()
     let includes_0  = "  <link   type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/jasmine-1.1.0\/jasmine.css'\/>"
     let includes_1  = "  <link   type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/screen.css'\/>"
     let includes_2  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jquery-1.7.2\/jquery-1.7.2.js'><\/script>"
     let includes_3  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/underscore\/underscore.js'><\/script>"
     let includes_4  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/backbone-0.9.2\/backbone.js'><\/script>"
     let includes_5  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine.js'><\/script>"
     let includes_6  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine-html.js'><\/script>"
     let includes_7  = "<script>"
     let includes_8  = "  describe('default page', function(){ "
     let includes_9  = "it('should have an html tag', function(){ "
     let includes_10 = "  expect( $( 'head' ).html() ).not.toMatch(\/^[\\s\\t\\n]*$\/);"
     let includes_11  = "});"
     let includes_12 = "});"
     let includes_13 = "$(function(){"
     let includes_14 = "jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );"
     let includes_15 = "jasmine.getEnv().execute();"
     let includes_16 = "});"
     let includes_17 = "\<bs>\<bs><\/script>"

     let j = 0

     while j < 18
       let entry = 'includes_' . j
       call feedkeys( {entry}, 't' )
       call feedkeys( "\<cr>", 't' )
       let j = j + 1
     endwhile

   endfunction

"jquery

  "abbreviations

     ab docr $(document).ready(function(){});
     ab jqfun $(<cr>function(){<cr>}<cr>);
9
kikuchiyo
Ctrl-w Ctrl-f ............ open file under cursor in new window
Ctrl-6 ................... alternate file
'0 ....................... open last file
:x ....................... close if save
7
SergioAraujo

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

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
Vesa Nieminen

Проигнорируем вопрос на мгновение (мой ответ ниже), пару вещей, которые могут помочь с вашими проблемами с 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
DrAl

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
Dan Olson

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

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

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

6
Hamish Downer

Как насчет дальнейших сочетаний клавиш?


Поместите в свой .vimrc:
nnoremap;:

Таким образом, ввести commmandmode гораздо проще: ;q или ;w работают, вместо этого просто :q или :w.

Два нажатия клавиш вместо трех, и вам это понадобится очень часто.


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

Но ОГРОМНОЕ улучшение для программистов используя vi.

5
sjas

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

например.

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

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

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

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

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

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

5
Larry Watanabe

Вы можете искать содержимое регистра.

Предположим, что ваш регистр x содержит

строка для поиска

Чтобы найти эту строку, вы должны набрать в обычном режиме
/CTRL-rxENTER

Он вставит содержимое регистра x.

4
Luc M

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

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

4
wolverian

Есть множество трюков Vim, но на данный момент, что мне действительно нравится Ctrl+A как мне случается иметь дело с неким st ** d кодом, индексом массива жесткого кода.

3
lang2

Серия команд vim ggVGg? применяет шифр Rot13 к тексту в вашем текущем документе.

Gung vf zl zbfg cebqhpgvir fubegphg fvapr V nyjnlf glcr va Ebg13.

3
cytinus

Быстрая обрезка и перезапись части строки:

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

Вы можете использовать следующие команды:

ct<identifier> для прямой резки.

cT<identifier> для обратной резки.

Где символ в строке, до которой вы хотите вырезать.

Пример: Допустим, это строка, которую вы хотите отредактировать, и курсор находится на I.

Hi There. I am a Coder and I code in : Python and R.

Вы хотите сократить до : и перезаписать с I am a programmer, введите: ct:, затем введите I am a programmer. Это приведет к: Hi There. I am a programmer: Python and R.

Быстрое удаление части строки:

Как и выше, следующие команды удаляют содержимое из текущей позиции курсора до "идентификатора".

dt<identifier> для прямого удаления

dT<identifier> для обратного удаления

Надеюсь, это полезно и вам.

2
dabsingh

умное завершение табуляции ^^

http://vim.wikia.com/wiki/Smart_mapping_for_tab_completion

1
David Lam

nnoremap q; q: в моем .vimrc сохраняет поток при создании сложного поиска и замены.

0
sjas