Я много слышал о Vim , как за, так и против. Похоже, вы должны быть (как разработчик) быстрее с Vim, чем с любым другим редактором. Я использую Vim для выполнения некоторых базовых задач, и в лучшем случае я в 10 раз менее продуктивен с Vim.
Единственные две вещи, о которых вам следует заботиться, когда вы говорите о скорости (вы можете не заботиться о них, но вам следует):
- Использование поочередно левой и правой руки - самый быстрый способ использования клавиатуры.
- Никогда не прикасайтесь к мышке - это второй способ быть максимально быстрым. Вам могут понадобиться годы, чтобы переместить руку, схватить мышь, переместить ее и вернуть ее обратно на клавиатуру (и вам часто приходится смотреть на клавиатуру, чтобы убедиться, что вы правильно вернули руку в нужное место)
Вот два примера, демонстрирующих, почему я гораздо менее продуктивен с 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 делает вас более продуктивным, чем с современным редактором?
Ответы:
Ваша проблема с 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 ) я просто использую:0i:r
(чтобы превратить текущую строку в правильную команду : r ),"cdd
(удалить строку в регистр "c") и@c
выполнить эту команду.Это всего лишь 10 нажатий клавиш (и это выражение
"cdd
@c
для меня фактически является макросом пальца, поэтому я могу набрать его почти так же быстро, как и любое обычное шестибуквенное слово).Отрезвляющая мысль
Я только поверхностно рассмотрел силу vi , и ни одно из того, что я здесь описал, даже не является частью "улучшений", для которых назван vim ! Все, что я здесь описал, должно работать на любой старой копии vi 20 или 30 лет назад.
Есть люди, которые использовали значительно больше силы Ви , чем я когда-либо буду.
источник
@
q
Вы говорите о выделении и копировании текста, я думаю, что вы должны взглянуть на Vim Visual Mode .
В визуальном режиме вы можете выделять текст с помощью команд Vim, затем вы можете делать с выделением все, что захотите.
Рассмотрим следующие распространенные сценарии:
Вам необходимо выбрать следующую подходящую скобку.
Вы могли бы сделать:
v%
если курсор находится в начальной / конечной скобкахvib
если курсор находится внутри блока скобокВы хотите выделить текст между кавычками:
Вы хотите выбрать блок фигурных скобок (очень часто встречается на языках стиля C):
viB
vi{
Вы хотите выбрать весь файл:
ggVG
Визуальный выбор блоков - это еще одна действительно полезная функция, она позволяет вам выделять прямоугольную область текста, вам просто нужно нажать Ctrl-, Vчтобы запустить ее, а затем выбрать нужный текстовый блок и выполнить любой тип операции, такой как yank, delete, вставлять, редактировать и т. д. Замечательно редактировать текст, ориентированный на столбцы .
источник
o
прыгайте на другой конец. Таким образом, вы можете перемещать начало и конец выделения столько, сколько захотите.Некоторые советы по повышению производительности:
Умные движения
*
и#
поиск слова под курсором вперед / назад.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
соединяет две линии.
повторить последнюю команду (простой макрос)==
исправить отступ строки>
блок отступа (в визуальном режиме)<
блок без отступов (в визуальном режиме)Запись макроса
q[ key ]
чтобы начать запись.q
чтобы остановить запись.@[ key ]
.Используя очень специфические команды и движения, VIM может воспроизвести эти точные действия для следующих строк. (например, A для добавления к концу,
b
/e
для перемещения курсора на начало или конец слова соответственно)Пример хорошо построенных настроек
Настройки могут быть сохранены
~/.vimrc
или общесистемными,/etc/vimrc.local
а затем считаны из/etc/vimrc
файла с помощью:(вам придется заменить
#
символ комментария"
на, чтобы он работал в VIM, я хотел бы дать правильную подсветку синтаксиса здесь).Команды, которые я перечислил здесь, довольно простые, и основные, которые я использую до сих пор. Они уже делают меня более продуктивным, без необходимости знать все модные вещи.
источник
'.
естьg;
, который прыгает обратно черезchangelist
. Переход к последней отредактированной позиции вместо последней отредактированной строкиМеханизм Control+ Rочень полезен :-) В режиме вставки или командном режиме (т. Е. В
:
строке при вводе команд) продолжайте с нумерованного или именованного регистра:Смотрите
:help i_CTRL-R
и:help c_CTRL-R
для более подробной информации, и ищите поблизости, чтобы получить больше CTRL-R.источник
Control-A
также работает в режиме вставки для последнего вставленного текста, а такжеControl-@
для вставки последнего вставленного текста и немедленного переключения в обычный режим.Плагины 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, из которых я многому научился и позаимствовал большинство плагинов, перечисленных здесь.
источник
.
Повторите последнюю команду для изменения текстаЯ экономлю много времени с этим.
Визуальный режим упоминался ранее, но блочный визуальный режим сэкономил мне много времени при редактировании столбцов фиксированного размера в текстовом файле. (доступ с помощью Ctrl-V).
источник
.
клавишу.солдат
Перейти к последнему отредактированному местоположению (очень полезно, если вы выполнили поиск и хотите вернуться к редактированию)
^ P и ^ N
Завершите предыдущий (^ P) или следующий (^ N) текст.
^ O и ^ I
Перейти к предыдущему (
^O
-"O"
для старого) местоположению или к следующему (^I
-"I"
только рядом с"O"
). Когда вы выполняете поиск, редактируете файлы и т. Д., Вы можете перемещаться по этим «скачкам» вперед и назад.источник
Я недавно (получил) обнаружил этот сайт: http://vimcasts.org/
Это довольно новый и действительно очень хороший. Парень, который управляет сайтом, переключился с textmate на vim и ведет очень хорошие и краткие чтения конкретных тем vim. Проверьте это!
источник
CTRL+A увеличивает номер, на котором вы стоите.
источник
Все в обычном режиме:
f <char> для перехода к следующему экземпляру определенного символа в текущей строке и ; повторить.
F <char> для перехода к предыдущему экземпляру определенного символа в текущей строке и ; повторить.
При разумном использовании вышеупомянутые два могут быстро убить вас в очереди.
* на слово для поиска следующего экземпляра.
# в слове для поиска предыдущего экземпляра.
источник
ct(
сотрет слово и переведет вас в режим вставки, но сохранит парантезы!сессия
а. сохранить сессию
б. принудительное сохранение сеанса
с. загрузить сессию
Сложение и вычитание
а. Сложение и вычитание
б. Отмена отображения ключа окна
с. С макросом
источник
На прошлой неделе на работе наш проект унаследовал много кода Python от другого проекта. К сожалению, код не вписывался в нашу существующую архитектуру - все это было сделано с глобальными переменными и функциями, которые не будут работать в многопоточной среде.
У нас было ~ 80 файлов, которые нужно было переработать, чтобы они были объектно-ориентированными - все функции переместились в классы, изменились параметры, добавлены операторы импорта и т. Д. У нас был список из примерно 20 типов исправлений, которые необходимо было сделать для каждого файла. Я бы оценил, что, делая это вручную, один человек может делать, может быть, 2-4 в день.
Поэтому я сделал первый вручную, а затем написал скрипт vim для автоматизации изменений. В основном это был список команд vim, например
Последний заслуживает небольшого объяснения:
Для пары более сложных преобразований, таких как генерация всех операторов импорта, я встроил некоторый python в скрипт vim.
После нескольких часов работы над ним у меня был скрипт, который будет выполнять не менее 95% конверсии. Я просто открываю файл в vim и запускаю
:source fixit.vim
и файл преобразуется в мгновение ока.У нас все еще есть работа по изменению оставшихся 5%, которые не стоили автоматизировать, и по тестированию результатов, но, потратив день на написание этого сценария, я считаю, что мы сэкономили недели работы.
Конечно, было бы возможно автоматизировать это с помощью языка сценариев, такого как Python или Ruby, но это заняло бы гораздо больше времени и было бы менее гибким - последний пример был бы сложным, поскольку одно только регулярное выражение не могло бы справиться вложенные скобки, например, для преобразования
bar(foo(xxx))
вfoo(xxx).bar()
. Vim идеально подходит для этой задачи.источник
%s/\(bar\)(\(.\+\))/\2.\1()/
сделал бы это тоже. (Побеги совместимы с:set magic
.) Просто для записи. :)%s/\v(bar)\((.+)\)/\2.\1()/
if bar(foo(xxx)) or wibble(xxx):
становитсяif foo(xxx)) or wibble(xxx.bar():
совершенно неправильно.Используйте встроенный файловый менеджер! Команда есть
:Explore
и позволяет вам очень быстро перемещаться по исходному коду. У меня есть это отображение в моем.vimrc
:Проводник также позволяет вносить изменения в файлы. Я
<F1>
опубликую некоторые из моих любимых клавиш, нажатие даст вам полный список:cd ..
)источник
:find
,:tag
и различные родственные нажатия клавиш прыгать. (Может быть, это потому, что исходные деревья, над которыми я работаю, большие и организованы иначе, чем я бы сделал? :))Я являюсь членом Американской ассоциации криптограмм. Раз в два месяца журнал включает в себя более 100 криптограмм разных видов. Примерно 15 из них - «криптарифмы» - различные типы арифметических задач с заменой букв цифрами. Два или три из них - судоку, за исключением букв вместо цифр. Когда сетка будет завершена, девять различных букв будут обозначать слово или слова на некоторой линии, диагонали, спирали и т. Д. Где-нибудь в сетке.
Вместо того, чтобы работать с карандашом или печатать проблемы вручную, я загружаю проблемы из области членов на их веб-сайте.
При работе с этими судоку я использую vi просто потому, что использую средства, которые есть у vi, которых нет у других редакторов. Главным образом при преобразовании буквенной сетки в пронумерованную сетку, потому что мне легче ее решить, а затем заполненную пронумерованную сетку обратно в буквенную сетку, чтобы найти слово или слова решения.
Проблема отформатирована как девять групп по девять букв
-
s представляет пробелы, записанные в две строки. Первый шаг - отформатировать их в девять строк по девять символов в каждой. В этом нет ничего особенного, просто вставка восьми разрывов строк в соответствующих местах.Результат будет выглядеть так:
Итак, первый шаг в преобразовании этого в числа состоит в том, чтобы составить список отдельных букв. Сначала я делаю копию блока. Я помещаю курсор в верхнюю часть блока, затем печатаю
:y}}p
.:
переводит меня в командный режим,y
дергает следующую команду движения. Поскольку}
это переход к концу следующего абзаца,y}
дергает абзац.}
затем перемещает курсор в конец абзаца иp
вставляет то, что мы дернули сразу после курсора. Такy}}p
создается копия следующего абзаца и заканчивается курсор между двумя копиями.Затем я превращаю одну из этих копий в список отдельных букв. Эта команда немного сложнее:
:
снова переводит меня в командный режим.!
указывает на то, что содержимое следующего янки должно передаваться через командную строку.}
восстанавливает следующий абзац, а затем командная строка используетtr
команду для удаления всего, кроме букв в верхнем регистре,sed
команду для печати каждой буквы в одной строке иsort
команду для сортировки этих строк, удаления дубликатов и последующегоtr
удаления новые строки, оставляя девять отдельных букв в одной строке, заменяя девять строк, которые изначально составляли абзац. В этом случае буквы:ACELNOPST
.Следующим шагом является создание еще одной копии сетки. А затем использовать эти письма я только идентифицированные для замены каждого из этих букв с цифрой от 1 до 9. Это очень просто:
:!}tr ACELNOPST 0-9
. Результат:Затем это можно решить обычным способом или ввести в любой решатель судоку, который вы предпочитаете. Готовое решение может быть преобразовано обратно в буквы с
:!}tr 1-9 ACELNOPST
.В vi есть сила, которой мало кто соответствует. Самая большая проблема заключается в том, что лишь очень немногие учебные пособия, веб-сайты, файлы справки и т. Д. Делают нечто большее, чем едва касаются поверхности того, что возможно.
источник
:
перейти в командный режим, но затем неизменно вы указываете команды нормального режима (напримерy}}p
), которые не могут работать из командного режима ?!:se tw=1 fo=
(подготовка)VG:s/./& /g
(вставка пробелов),gvgq
(разделение на отдельные строки),V{:sort u
(сортировка и удаление дубликатов)Массовые текстовые манипуляции!
Либо через макросы:
qq
q
@q
(в первый раз),@@
после этого.20@@
Или с помощью регулярных выражений:
:%s/[fo]+/bar/g
(Но будьте осторожны: если вы сделаете последнее, у вас будет 2 проблемы :).)
источник
:% g/foo/-1j
или,:'a,'z v/bar/-1j
например, (где первый - «все строки и соответствие шаблону») в то время как последний является «линиями между знаком a и знаком z, которые не соответствуют шаблону»). Часть после шаблона в команде ag
илиv
ex может быть любой другой командой ex, -1j - просто относительное перемещение строки и команда соединения.Я недавно обнаружил
q:
. Он открывает «командное окно» и показывает ваши самые последние команды ex-mode (command-mode). Вы можете двигаться как обычно в пределах окна, и нажатие<CR>
выполняет команду. Вы также можете редактировать и т.д. Бесценно, когда вы возитесь с какой-то сложной командой или регулярным выражением, и вы не хотите перепечатывать все это, или если сложная вещь, которую вы хотите сделать, это вернуть 3 команды назад. Это почти как Башset -o vi
, но для самого vim (хе!).Смотрите
:help q:
для более интересных битов для перехода вперед и назад.источник
На днях я обнаружил, что у Vim есть полное дополнение, и хотя я признаю, что немного сомневаюсь в том, что и для чего, у меня были удивительно хорошие результаты, просто затирая Ctrl+ x Ctrl+ uили Ctrl+ n/ Ctrl+ pв режиме вставки. Это не совсем IntelliSense , но я все еще учусь этому.
Попробуйте!
:help ins-completion
источник
Это не ярлыки, но они связаны:
Они повышают мою производительность.
источник
Capslock::Escape
Другой полезный ярлык vi, который я часто использую, это 'xp'. Это заменит символ под курсором следующим символом.
источник
Xp
пойти другим путем<Ctrl> + W, V для разделения экрана по вертикали
<Ctrl> + W, W для переключения между окнами
! python% [args] для запуска скрипта, который я редактирую в этом окне
ZF в визуальном режиме для складывания произвольных линий
источник
<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) окно:help ctrl-w
FTW ... сделайте себе одолжение, и заставьте себя попробовать эти вещи, по крайней мере, 15 минут!Визуальный режим
Как уже говорили несколько человек, визуальный режим - это решение вашей проблемы копирования / вставки. 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 (или запрограммируйте свой собственный режим). Если вы хотите лучшее из обоих миров, вам не повезло на данный момент.
источник
Потратьте 30 минут на изучение vim (запустите vimtutor вместо vim в терминале). Вы изучите основные движения и некоторые нажатия клавиш, это сделает вас по крайней мере столь же продуктивным с vim, как с текстовым редактором, который вы использовали ранее. После этого, хорошо, прочитайте ответ Джима Денниса снова :)
источник
Возможность выполнять сложные повторяющиеся изменения с очень небольшим количеством нажатий клавиш (часто с использованием макросов ). Посмотрите на ВимГольф чтобы увидеть силу Vim!
После более чем десяти лет почти ежедневного использования трудно представить какой-либо другой редактор.
источник
Используйте в
\c
любом месте поиска, чтобы игнорировать регистр (переопределяя настройки игнорирования или смарт-регистра). Например ,/\cfoo
или/foo\c
будет соответствоватьfoo
,Foo
,fOO
,FOO
и т.д.Используйте в
\C
любом месте поиска, чтобы форсировать совпадение регистра. Например,/\Cfoo
или/foo\C
будет соответствовать только Foo.источник
Я был удивлен, что никто не упомянул это
t
движение. Я часто использую его со списками параметров в формеdt,
илиyt,
источник
Странно, никто не упомянул ctags. Скачайте «exuberant ctags» и поставьте его перед дрянной предустановленной версией, которая уже есть в вашем пути поиска. Cd в корень того, над чем вы работаете; например дистрибутив ядра Android. Типа "ctags -R." создать индекс исходных файлов в любом месте ниже этого каталога в файле с именем «теги». Он содержит все теги, неважно, язык или каталог, в одном файле, поэтому работа с несколькими языками проста.
Затем откройте vim в этой папке и прочитайте: help ctags для некоторых команд. Несколько я часто использую:
Установите курсор на вызов метода и введите CTRL-], чтобы перейти к определению метода.
Тип: та имя, чтобы перейти к определению имени.
источник
Автоматический отступ:
gg
(перейти к началу документа)=
(время отступа!)shift-g
(перейти к концу документа)Вам понадобится в
.vimrc
файле « отступ для плагина типа файла» и, возможно, соответствующие настройки «shiftwidth» и «expandtab».источник
Вы спрашивали о продуктивных ярлыках, но я думаю, что ваш реальный вопрос: стоит ли vim? Ответ на этот вопрос stackoverflow -> «Да»
Вы, должно быть, заметили две вещи. Vim очень силен, а Vim сложен в изучении. Большая часть его силы заключается в его расширяемости и бесконечной комбинации команд. Не чувствую себя подавленным. Идти медленно. Одна команда, один плагин за раз. Не переусердствуйте.
Все те инвестиции, которые вы вложили в vim, окупятся в тысячу раз. Вы будете находиться в текстовом редакторе много, много часов, прежде чем умрете. Vim будет вашим компаньоном.
источник
Несколько буферов и, в частности, быстрый переход между ними для сравнения двух файлов с
:bp
и:bn
(правильно переназначается на один Shift+ pили Shift+ n)vimdiff
режим (разделяется на два вертикальных буфера, с цветами, чтобы показать различия)Область-копия с Ctrl+v
И, наконец, табуляция завершения идентификаторов (поиск по «mosh_tab_or_complete»). Это изменит жизнь.
источник
Договорились с верхним постером - the : r! Команда очень полезна.
Чаще всего я использую его для «вставки» вещей:
Таким образом, мне не нужно возиться
:set paste
.источник
clipboard
опциюunnamed
(set clipboard=unnamed
в вашем .vimrc), чтобы использовать системный буфер обмена по умолчанию. Или , если вы все еще хотите, чтобы система CLIPBOARD отдельно от безымянного регистра, используйте соответствующее название регистр буфера обмена:"*p
.:set paste
не работает так хорошо, если включен автоиндентирование.