Какая у вас самая результативная комбинация с Vim?
Я много слышал о 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 cheat sheet:)
Мой вопрос:
Каким образом вы используете Vim, который делает вас более продуктивным, чем с современным редактором?
Ответы
Ответ 1
Ваша проблема с Vim заключается в том, что вы не grok vi.
Вы говорите обрезка с помощью yy
и жалуетесь, что почти никогда не хотите вырезать целые строки. На самом деле программисты, редактируя исходный код, очень часто хотят работать на целые строки, диапазоны строк и блоков кода. Тем не менее, yy
является лишь одним из многих способов выгрузить текст в буфер анонимной копии (или "зарегистрировать", как он называется в vi).
"Zen" vi заключается в том, что вы говорите на одном языке. Начальный y
является глаголом. Утверждение yy
является синонимом y_
. y
удваивается, чтобы упростить ввод, поскольку это такая общая операция.
Это также можно выразить как dd
P
(удалить текущую строку и вставить копию на место, оставив копию в анонимном регистре в качестве побочного эффекта). Глаголы y
и d
принимают любое движение как своего "субъекта". Таким образом, yW
"дергается отсюда (курсор) до конца текущего/следующего (большого) слова", а y'a
"держится отсюда до строки, содержащей метку с именем" a ".
Если вы понимаете только основные движения вверх, вниз, влево и вправо, то vi будет не более продуктивным, чем копия "блокнота" для вас. (Ладно, у вас все еще будет подсветка синтаксиса и возможность обрабатывать файлы размером более ~ 45 КБ или около того, но работать со мной здесь).
vi имеет 26 "меток" и 26 "регистров". Знак устанавливается на любое местоположение курсора с помощью команды m
. Каждая отметка обозначается одной строчной буквой. Таким образом, ma
устанавливает метку "a" в текущее местоположение, а mz
устанавливает метку "z" . Вы можете перейти к строке, содержащей знак, используя команду '
(одиночная кавычка). Таким образом, 'a
перемещается в начало строки, содержащей метку "a" . Вы можете перейти к точному расположению любой метки с помощью команды `
(backquote). Таким образом, `z
будет перемещаться непосредственно в точное местоположение метки "z" .
Поскольку это "движения", они также могут использоваться в качестве предметов для других "заявлений".
Итак, одним из способов вырезать произвольный выбор текста было бы падение метки (обычно я использую "a" в качестве моей "первой" метки, "z" в качестве моей следующей метки, "b" в качестве другой, e ', как еще один (я не помню, чтобы в течение 15 лет с помощью vi интерактивно использовалось более четырех меток, чтобы создать собственные правила относительно того, как метки и регистры используются макросами, t нарушайте один интерактивный контекст). Затем мы переходим к другому концу нашего искомого текста, мы можем начинать с обоих концов, это не имеет значения. Тогда мы можем просто использовать 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" from "conVerse" ). Как и в случае с другими командами ex, они могут иметь префикс с помощью ссылок/ссылок диапазона. Таким образом, :.,+21g/foo/d
означает "удалить любые строки, содержащие строку" foo "от текущей до следующих 21 строки", в то время как :.,$v/bar/d
означает "отсюда до конца файла, удалите любые строки, которые НЕ содержат строку" бар".
Интересно, что общая команда Unix grep была на самом деле вдохновлена этой командой ex (и названа в честь того, как она была документирована). Команда ex :g/re/p
(grep) заключалась в том, как они документировали, как "глобально" "печатать" строки, содержащие "регулярное выражение" (re). Когда ed и ex, команда :p
была одной из первых, кого кто-то узнал, а часто и первой, используемой при редактировании любого файла. Это было то, как вы напечатали текущее содержимое (обычно только одну страницу, заполненную за один раз, используя :.,+25p
или некоторые такие).
Обратите внимание, что :% g/.../d
или (его повторный /converse аналог: :% v/.../d
являются наиболее распространенными шаблонами использования. Однако есть несколько других команд ex
, которые стоит запомнить:
Мы можем использовать m
для перемещения строк вокруг, а j
- для объединения строк. Например, если у вас есть список, и вы хотите отделить все совпадения файлов (или, наоборот, НЕ соответствующие шаблону), не удаляя их, тогда вы можете использовать что-то вроде: :% g/foo/m$
... и все строки "foo" будут иметь был перенесен в конец файла. (Обратите внимание на другой совет об использовании конца вашего файла в качестве места для царапин). Это сохранит относительный порядок всех строк "foo" , извлекая их из остальной части списка. (Это будет эквивалентно выполнению чего-то вроде: 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d
(скопируйте файл в собственный хвост, отфильтруйте хвост через grep
и удалите все вещи из головы).
Для объединения строк обычно я могу найти шаблон для всех строк, которые необходимо присоединить к их предшественнику (все строки, начинающиеся с "^", а не "^ *" в некоторых списках маркеров, например). В этом случае я бы использовал: :% g/^ /-1j
(для каждой подходящей строки, перейдите на одну строку и присоедините их). (BTW: для списков маркеров, пытающихся найти пулевые строки и присоединяющихся к следующему, не работает по нескольким причинам... он может присоединиться к одной линии пули к другой, и он не будет присоединяться к какой-либо пулевой строке ко всем его продолжения, он будет работать только в матчах).
Практически не стоит упомянуть, что вы можете использовать нашего старого друга s
(substitute) с помощью команд g
и v
(global/converse-global). Обычно вам не нужно это делать. Однако рассмотрим случай, когда вы хотите выполнить подстановку только в строках, соответствующих некоторому другому шаблону. Часто вы можете использовать сложный шаблон с захватами и использовать обратные ссылки для сохранения частей строк, которые вы НЕ хотите изменять. Однако часто бывает проще отделить совпадение от подстановки: :% g/foo/s/bar/zzz/g
- для каждой строки, содержащей "foo" , заменить все "bar" на "zzz". (Кое-что вроде :% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g
будет работать только для тех случаев "бара", которые были PRECEDED "foo" в той же строке, и это было довольно неудобно, и его пришлось бы исказить дальше, чтобы поймать все случаи, когда "bar" предшествует "foo" )
Дело в том, что в наборе ex
имеется больше, чем просто строк P
, s
и d
.
Адреса :
также могут ссылаться на метки. Таким образом, вы можете использовать: :'a,'bg/foo/j
для присоединения любой строки, содержащей строку foo, к ее следующей строке, если она находится между строками между метками "a" и "b". (Да, все предыдущие примеры команд ex
могут быть ограничены подмножествами строк файла путем префикса этих выражений адресации).
Это довольно неясно (я использовал только что-то подобное несколько раз за последние 15 лет). Тем не менее, я буду свободно признавать, что я часто делал итеративно и интерактивно, что, возможно, было бы сделано более эффективно, если бы я нашел время, чтобы придумать правильное заклинание.
Еще одна очень полезная команда vi или ex - :r
для чтения в содержимом другого файла. Таким образом: :r foo
вставляет содержимое файла с именем "foo" в текущей строке.
Более мощной является команда :r!
. Это считывает результаты команды. Это так же, как приостановка сеанса vi, запуск команды, перенаправление ее вывода во временный файл, возобновление сеанса vi и чтение содержимого из temp. файл.
Еще более мощными являются команды !
(bang) и :... !
(ex). Они также выполняют внешние команды и считывают результаты в текущий текст. Тем не менее, они также фильтруют подборку нашего текста с помощью команды! Для этого мы можем отсортировать все строки в нашем файле с помощью 1G!Gsort
(g
- это команда vi "goto", по умолчанию она перейдет к последней строке файла, но может быть префикс номер строки, такой как 1, первая строка). Это эквивалентно варианту ex :1,$!sort
. Писатели часто используют !
с Unix fmt или foldутилиты для переформатирования или "перекоса слов". Очень общий макрос {!}fmt
(переформатировать текущий абзац). Программисты иногда используют его для запуска своего кода или только его частей с помощью отступа или других инструментов переформатирования кода.
Использование команд :r!
и !
означает, что любая внешняя утилита или фильтр можно рассматривать как расширение нашего редактора. Я иногда использовал их со сценариями, которые извлекали данные из базы данных или с помощью команд wget или lynx, которые извлекали данные с сайта или ssh команды, которые извлекают данные из удаленных систем.
Другой полезной командой ex является :so
(сокращение от :source
). Это считывает содержимое файла как последовательность команд. Когда вы начинаете vi, он обычно неявно выполняет файл :source
on ~/.exinitrc
(и Vim обычно делает это на ~/.vimrc
, естественно). Использование этого заключается в том, что вы можете изменить свой профиль в редакторе на лету, просто используя набор макросов, сокращений и настроек редактора. Если вы подлый, вы можете использовать это как трюк для хранения последовательностей команд ex для применения к файлам по запросу.
Например, у меня есть семистрочный файл (36 символов), который запускает файл через wc и вставляет комментарий в стиле C в верхней части файла, содержащего данные о количестве слов. Я могу применить этот "макрос" к файлу с помощью команды типа: vim +'so mymacro.ex' ./mytarget
(параметр командной строки +
для vi и Vim обычно используется для запуска сеанса редактирования с заданным номером строки. Однако малоизвестно, что можно выполнить +
с помощью любой действительной команды ex, например, "исходной" команды, как я сделал здесь: для простого примера у меня есть сценарии, которые вызывают: vi +'/foo/d|wq!' ~/.ssh/known_hosts
to удалите запись из моего файла SSH известных хостов неинтерактивно, пока я перерисовываю набор серверов).
Обычно гораздо проще писать такие "макросы" с помощью Perl, AWK, sed (что, по сути, похоже на grep утилиту, вдохновленную ed).
Команда @
, вероятно, самая неясная команда vi. Изредка преподавая курсы усовершенствования систем в течение почти десятилетия, я встречал очень мало людей, которые когда-либо использовали его. @
выполняет содержимое регистра, как если бы это была команда vi или ex.
Пример. Я часто использую: :r!locate ...
, чтобы найти файл в моей системе и прочитать его имя в моем документе. Оттуда я удаляю любые посторонние хиты, оставляя только полный путь к интересующему меня файлу. Вместо того, чтобы кропотливо Tab проходить через каждый компонент пути (или, что еще хуже, если я застрял на машине без Поддержка завершения табуляции в его копии vi). Я просто использую:
-
0i:r
(чтобы включить текущую строку в действительную команду : r),
-
"cdd
(чтобы удалить строку в регистр "c" ) и
-
@c
выполните эту команду.
Это всего 10 нажатий клавиш (и выражение "cdd
@c
для меня - это макрос пальцев, поэтому я могу напечатать его почти так же быстро, как любое общее шестибуквенное слово).
Отрезвляющая мысль
Я только поцарапал поверхность vi, и ничто из того, что я здесь описал, даже не является частью "улучшений", для которых назван vim! Все, что я описал здесь, должно работать с любой старой копией vi с 20 или 30 лет назад.
Есть люди, которые использовали значительно больше силы vi, чем когда-либо.
Ответ 2
Вы говорите о выборе и копировании текста, я думаю, что вы должны взглянуть на Vim Visual Mode.
В визуальном режиме вы можете выбирать текст с помощью команд Vim, затем вы можете делать все, что хотите, с помощью выделения.
Рассмотрим следующие общие сценарии:
Вам нужно выбрать следующую скобочную скобку.
Вы можете сделать:
-
v%
, если курсор находится в начальной/конечной скобках
-
vib
, если курсор находится внутри блока скобок
Вы хотите выбрать текст между кавычками:
- vi " для двойных кавычек
- vi ' для одиночных кавычек
Вы хотите выбрать фигурный блок (очень распространенный в языках C-стиля):
Вы хотите выбрать весь файл:
Выбор визуального блока - еще одна действительно полезная функция, она позволяет вам выбрать прямоугольную область текста, вам просто нужно нажать Ctrl - V, чтобы запустить его, а затем выберите требуемый текстовый блок и выполните любой тип операции, такой как yank, delete, paste, edit и т.д. Хорошо редактировать текст, ориентированный на столбцы.
Ответ 3
Некоторые советы по производительности:
Интеллектуальные движения
-
*
и #
найдите слово под курсором вперед/назад.
-
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
заменяет текущий char на d
).
-
~
изменяет регистр.
-
J
объединяет две строки
- Ctrl + A/Ctrl + X увеличивает/уменьшает число.
-
.
повторить последнюю команду (простой макрос)
-
==
исправить отступ строки
-
>
блок отступа (в визуальном режиме)
-
<
unindent block (в визуальном режиме)
Макросъемка
- Нажмите
q[ key ]
, чтобы начать запись.
- Затем нажмите
q
, чтобы остановить запись.
- Макрос можно воспроизвести с помощью
@[ key ]
.
Используя очень конкретные команды и движения, VIM может воспроизвести эти точные действия для следующих строк. (например, A для добавления к концу, b
/e
для перемещения курсора к началу или концу слова соответственно)
Пример хорошо построенных настроек
# reset to vim-defaults
if &compatible # only if not set before:
set nocompatible # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif
# display settings
set background=dark # enable for dark terminals
set nowrap # dont wrap lines
set scrolloff=2 # 2 lines above/below cursor when scrolling
set number # show line numbers
set showmatch # show matching bracket (briefly jump)
set showmode # show mode in status bar (insert/replace/...)
set showcmd # show typed command in status bar
set ruler # show cursor position in status bar
set title # show file in titlebar
set wildmenu # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2 # use 2 lines for the status bar
set matchtime=2 # show matching bracket for 0.2 seconds
set matchpairs+=<:> # specially for html
# editor settings
set esckeys # map missed escape sequences (enables keypad keys)
set ignorecase # case insensitive searching
set smartcase # but become case sensitive if you type uppercase characters
set smartindent # smart auto indenting
set smarttab # smart tab handling for indenting
set magic # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode
set tabstop=4 # number of spaces a tab counts for
set shiftwidth=4 # spaces for autoindents
#set expandtab # turn a tabs into spaces
set fileformat=unix # file mode is unix
#set fileformats=unix,dos # only detect unix file format, displays that ^M with dos files
# system settings
set lazyredraw # no redraws in macros
set confirm # get a dialog when :q, :w, or :wq fails
set nobackup # no backup~ files.
set viminfo='20,\"500 # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden # remember undo after quitting
set history=50 # keep 50 lines of command history
set mouse=v # use mouse in visual mode (not normal,insert,command,help mode
# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
syntax on # enable colors
set hlsearch # highlight search (very useful!)
set incsearch # search incremently (search while typing)
endif
# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>
# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on
# file type specific settings
if has("autocmd")
# For debugging
#set verbose=9
# if bash is sh.
let bash_is_sh=1
# change to directory of current file automatically
autocmd BufEnter * lcd %:p:h
# Put these in an autocmd group, so that we can delete them easily.
augroup mysettings
au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab
# Confirm to PEP8
au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
augroup END
augroup perl
# reset (disable previous 'augroup perl' settings)
au!
au BufReadPre,BufNewFile
\ *.pl,*.pm
\ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
# formatoption:
# t - wrap text using textwidth
# c - wrap comments using textwidth (and auto insert comment leader)
# r - auto insert comment leader when pressing <return> in insert mode
# o - auto insert comment leader when pressing 'o' or 'O'.
# q - allow formatting of comments with "gq"
# a - auto formatting for paragraphs
# n - auto wrap numbered lists
#
augroup END
# Always jump to the last known cursor position.
# Don't do it when the position is invalid or when inside
# an event handler (happens when dropping a file on gvim).
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal g`\"" |
\ endif
endif # has("autocmd")
Настройки можно сохранить в ~/.vimrc
или общесистемно в /etc/vimrc.local
, а затем, прочитав из файла /etc/vimrc
, используя:
source /etc/vimrc.local
(вам придется заменить символ комментария #
на "
, чтобы он работал в VIM, я хотел бы дать правильное выделение синтаксиса здесь).
Команды, перечисленные здесь, довольно простые, и основные из них я использую до сих пор. Они уже делают меня более продуктивным, не зная всех причудливых вещей.
Ответ 4
Механизм Control + R очень полезен:-) В режиме вставки или (т.е. в строке :
при наборе команд), продолжите с пронумерованным или названным регистром:
- a - z названные регистры
- " неназванный регистр, содержащий текст последнего удаления или yank
- % текущее имя файла
- # альтернативное имя файла
- * содержимое буфера обмена (X11: первичный выбор)
- + содержимое буфера обмена
- / последний шаблон поиска
- : последняя строка командной строки
- . последний вставленный текст
- - последняя маленькая (меньше строки) delete
- =5*5 вставить 25 в текст (мини-калькулятор)
Подробнее см. :help i_CTRL-R
и :help c_CTRL-R
, а также прокрутите окрестности поблизости для получения дополнительной поддержки CTRL-R.
Ответ 5
Плагины Vim
Здесь есть много хороших ответов, и один замечательный об zen vi. Одна вещь, о которой я не вижу, - это то, что vim чрезвычайно расширяем через плагины. Есть сценарии и плагины, чтобы заставить его делать всевозможные сумасшедшие вещи, которые автор никогда не рассматривал. Вот несколько примеров невероятно удобных плагинов vim:
Rails.vim - это плагин, написанный tpope. Это невероятный инструмент для людей, занимающихся развитием рельсов. Это волшебные контекстно-зависимые вещи, которые позволяют вам легко перейти от метода в контроллере к соответствующему представлению, к модели и вплоть до модульных тестов для этой модели. Он сохранил десятки, если не сотни часов, как разработчик рельсов.
Этот плагин позволяет вам выбрать область текста в визуальном режиме и ввести оперативную команду, чтобы отправить ее на gist.github.com. Это позволяет легко получить доступ к пастебинам, что невероятно удобно, если вы сотрудничаете с кем-то из IRC или IM.
Этот плагин предоставляет специальную функциональность пробелу. Он превращает пробел во что-то аналогичное периоду, но вместо повторения действий он повторяет движения. Это может быть очень удобно для быстрого перемещения по файлу таким образом, который вы определяете "на лету".
Этот плагин дает вам возможность работать с текстом, который определен каким-то образом. Это дает вам объекты, которые обозначают вещи внутри parens, вещи внутри кавычек и т.д. Это может пригодиться для манипулирования разделительным текстом.
Этот script предоставляет функциональные возможности завершения вкладки vim. Материал автозаполнения уже существует в ядре vim, но это приводит его к быстрой вкладке, а не к нескольким различным многопользовательским ярлыкам. Очень удобно, и невероятно интересно использовать. Хотя это не VS intellisense, это отличный шаг и приносит большую функциональность, которую вы хотели бы ожидать от инструмента завершения табуляции.
Этот инструмент выводит внешние команды проверки синтаксиса в vim. Я не использовал его лично, но я слышал об этом немало, и эту концепцию трудно превзойти. Проверка синтаксиса без необходимости делать это вручную - отличная экономия времени и может помочь вам уловить синтаксические ошибки, когда вы их вводите, а не когда вы, наконец, прекратите тестирование.
Прямой доступ к git изнутри vim. Опять же, я не использовал этот плагин, но я вижу утилиту. К сожалению, я в культуре, где svn считается "новым", поэтому я вряд ли увижу git на работе в течение некоторого времени.
Дерево-браузер для vim. Я начал использовать это недавно, и это очень удобно. Он позволяет легко вставлять дерево в вертикальное разделение и открывать файлы. Это отлично подходит для проекта с большим количеством исходных файлов, с которыми вы часто переходите.
Это неподдерживаемый плагин, но все же невероятно полезный. Он предоставляет возможность открывать файлы с использованием "нечеткого" описательного синтаксиса. Это означает, что в редком дереве файлов вам нужно только набрать достаточно символов, чтобы устранить неоднозначность файлов, которые вас интересуют, от остальной части трещины.
Заключение
Существует множество невероятных инструментов для vim. Я уверен, что я только поцарапал поверхность здесь, и вам стоит поискать инструменты, применимые к вашему домену. Сочетание традиционных vi-инструментов, улучшений vim и плагинов, которые еще больше расширяют vim, это один из самых мощных способов редактирования текста, когда-либо созданного. Vim легко так же эффективен, как emacs, eclipse, visual studio и textmate.
Спасибо
Благодаря duwanis для его vim configs из которых я многому научился и заимствовал большинство плагинов, перечисленных здесь.
Ответ 6
.
Повторить последнюю команду изменения текста
Я сохраняю много времени с этим.
Визуальный режим упоминался ранее, но блочный визуальный режим сэкономил мне много времени при редактировании столбцов фиксированного размера в текстовом файле. (доступ с помощью Ctrl-V).
Ответ 7
г
Перейти к последнему отредактированному местоположению (очень полезно, если вы выполнили поиск и хотите вернуться к редактированию)
^ P и ^ N
Завершите предыдущий (^ P) или следующий (^ N) текст.
^ O и ^ I
Перейдите к предыдущему (^O
- "O"
для старого) местоположению или к следующему (^I
- "I"
рядом с "O"
).
Когда вы выполняете поиск, редактируете файлы и т.д., Вы можете перемещаться по этим "прыжкам" вперед и назад.
Ответ 8
Недавно я обнаружил этот сайт: http://vimcasts.org/
Это довольно новый и действительно очень хороший. Парень, который запускает сайт, переключился с textmate на vim, и хосты очень хорошо и лаконично перекликаются с конкретными темами vim. Проверьте это!
Ответ 9
CTRL + A увеличивает число, на котором вы стоите.
Ответ 10
Все в обычном режиме:
f <char> , чтобы перейти к следующему экземпляру определенного символа в текущей строке и ; для повторения.
F <char> , чтобы перейти к предыдущему экземпляру конкретного символа в текущей строке и ; для повторения.
Если использовать разумно, два вышеперечисленных могут сделать вас убийцей - быстрое перемещение по строке.
* слова для поиска следующего экземпляра.
# слова для поиска предыдущего экземпляра.
Ответ 11
Сессия
а. сохранить сеанс
: mks sessionname
б. принудительное сохранение сеанса
: MKS! имя_сеанса
с. load session
gvim или vim -S sessionname
Добавление и вычитание
а. Добавление и вычитание
CTRL-A; Добавьте [count] к номеру или алфавиту в или после курсора. {не в Vi
CTRL-X; вычесть [count] из числа или алфавита символ в курсоре или после него. {не в Vi}
б. Разметка клавиш окна
В окне, Ctrl-A, уже отображенный для выбора всего файла, вам нужно распаковать файл rc. mark mswin.vim CTRL-A отображение в качестве комментария или добавьте свой файл rc с помощью unmap
с. С макросом
Команда CTRL-A очень полезна в макросе. Пример: Для создания нумерованного списка выполните следующие действия.
- Создайте первую запись списка, убедитесь, что она начинается с числа.
- qa - начать запись в буфер 'a'
- Y - отметьте запись
- p - поместите копию записи ниже первой
- CTRL-A - увеличить число
- q - остановка записи
- @a - повторить время yank, put и increment
Ответ 12
На прошлой неделе на работе наш проект унаследовал много кода Python из другого проекта. К сожалению, код не вписывался в нашу существующую архитектуру - все было сделано с глобальными переменными и функциями, которые не работали бы в многопоточной среде.
У нас было ~ 80 файлов, которые нужно было переработать, чтобы быть объектно-ориентированными - все функции переместились в классы, изменились параметры, добавлены импортные объявления и т.д. У нас был список примерно 20 типов исправлений, которые необходимо было сделать для каждый файл. Я бы оценил, что делать это вручную одним человеком может, возможно, 2-4 в день.
Итак, я сделал первый из них вручную, а затем написал vim script для автоматизации изменений. Большинство из них было списком команд 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 script.
После нескольких часов работы над ним у меня был script, который будет делать не менее 95% конверсии. Я просто открываю файл в vim, затем запускаю :source fixit.vim
, и файл преобразуется в мгновение ока.
У нас все еще есть работа по изменению оставшихся 5%, которые не стоили автоматизировать и тестировать результаты, но, проведя день, записывая этот script, я считаю, что мы спасли недели работы.
Конечно, было бы возможно автоматизировать это с помощью языка сценариев, такого как Python или Ruby, но потребовалось бы намного больше времени для записи и было бы менее гибким - последний пример был бы трудным, поскольку только одно из регулярных выражений не было бы способный обрабатывать вложенные скобки, например для преобразования bar(foo(xxx))
в foo(xxx).bar()
. Vim идеально подходит для этой задачи.
Ответ 13
Используйте встроенный файловый проводник! Команда :Explore
и позволяет очень быстро перемещаться по вашему исходному коду. У меня есть это сопоставление в моем .vimrc
:
map <silent> <F8> :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>
Проводник также позволяет делать изменения файлов. Я отправлю некоторые из моих любимых клавиш, нажав <F1>
, вы получите полный список:
- -: наиболее полезно: перейдите в верхний каталог (
cd ..
)
- mf: отметьте файл
- D: удалять отмеченные файлы или файл, на котором курсор включен, если ничего не отмечено.
- R: переименуйте файл, в котором находится курсор.
- d: создать новый каталог в текущем каталоге
- %: создать новый файл в текущем каталоге
Ответ 14
Я являюсь членом Американской ассоциации криптограмм. Журнал раз в два месяца включает более 100 криптограмм разных сортов. Примерно 15 из них являются "криптовыми" - различными типами арифметических задач с буквами, замененными цифрами. Два или три из них являются судоку, за исключением букв вместо цифр. Когда сетка будет завершена, девять различных букв будут содержать слово или слова на некоторой строке, диагонали, спирали и т.д., Где-то в сетке.
Вместо того, чтобы работать с карандашом или печатать проблемы вручную, я загружаю проблемы из области участников вашего сайта.
При работе с этими sudokus я использую vi, просто потому, что я использую средства, которые у vi есть у немногих других редакторов. В основном, преобразование буквенной сетки в пронумерованную сетку, потому что мне легче ее решить, а затем заполненную нумерованную сетку обратно в буквенную сетку, чтобы найти слово или слова решения.
Проблема отформатирована как девять групп из девяти букв, причем -
представляет пробелы, написанные в две строки. Первый шаг - отформатировать их на девять строк по девять символов. В этом нет ничего особенного, просто вставляя восемь строк в соответствующие места.
Результат будет выглядеть следующим образом:
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 есть власть, которая сочетается с очень немногими другими. Самая большая проблема заключается в том, что только очень немногие из учебных руководств vi, веб-сайтов, справочных файлов и т.д. Делают больше, чем едва касаются поверхности того, что возможно.
Ответ 15
Массовые манипуляции с текстом!
Либо через макросы:
- Начните с записи:
qq
- Сделайте материал
- Остановить запись:
q
- Повторите:
@q
(первый раз), @@
после этого.
- Повторите 20 раз:
[email protected]@
Или через регулярные выражения:
- Заменить материал:
:%s/[fo]+/bar/g
(Но будьте осторожны: если вы сделаете последнее, у вас будет две проблемы:).)
Ответ 16
Недавно я обнаружил q:
. Он открывает "командное окно" и показывает самые последние команды ex-mode (командный режим). Вы можете перемещаться, как обычно, в окно, и нажатие <CR>
выполняет команду. Вы можете редактировать и т.д. Тоже. Бесценный, когда вы возитесь с какой-то сложной командой или регулярным выражением, и вы не хотите перепечатывать все это, или сложная вещь, которую вы хотите сделать, - это 3 команды назад. Это почти похоже на bash set -o vi
, но для самого vim (heh!).
См. :help q:
для более интересных бит для перехода назад и вперед.
Ответ 17
Я только что обнаружил Vim omnicompletion на днях, и, хотя я признаю, что я немного туман на то, что делает, у меня были удивительно хорошие результаты, просто затирая либо Ctrl + x Ctrl + u или
Ctrl + n/Ctrl + p в режиме вставки. Это не совсем IntelliSense, но я все еще его изучаю.
Попробуйте! :help ins-completion
Ответ 18
Это не ярлыки, но они связаны:
- Сделайте caplock дополнительным ESC (или Ctrl)
- лидер карты в "," (запятая) с помощью этой команды: let mapleader = ","
Они повышают мою производительность.
Ответ 19
Другим полезным vi "ярлыком", который я часто использую, является "xp". Это заменит символ под курсором следующим символом.
Ответ 20
<Ctrl> + W, V, чтобы разделить экран по вертикали
< & Ctrl GT; + W, W для переключения между окнами
! python% [args] для запуска script Я редактирую в этом окне
ZF в визуальном режиме для сбрасывания произвольных строк
Ответ 21
Визуальный режим
Как уже говорили некоторые другие люди, визуальный режим - это ответ на вашу проблему с копией/вырезанием и вставкой. Vim дает вам "v" , "V" и "C-v". Нижний регистр "v" в vim по существу совпадает с клавишей shift в блокноте. Приятно, что вам не нужно удерживать его. Вы можете использовать любую технику передвижения для эффективного перехода к начальной (или конечной) точке вашего выбора. Затем нажмите "v" и снова используйте эффективные методы перемещения, чтобы перейти к другому концу вашего выбора. Затем 'd' или 'y' позволяет вам отрезать или скопировать этот выбор.
Преимущество визуального режима vim над Джим Деннисом в описании vi/cut/paste в vi заключается в том, что вам не нужно точно определять местоположение. Иногда более эффективно использовать быстрое движение, чтобы добраться до общей близости от того места, куда вы хотите отправиться, а затем уточнить это с помощью других движений, чем придумать более сложную команду с одним движением, которая позволит вам точно туда, куда вы хотите идти.
Недостатком широкомасштабного использования визуального режима является то, что он может стать костылем, который вы используете все время, которое препятствует вам изучать новые vi (m) команды, которые могут позволить вам делать что-то более эффективно. Однако, если вы очень активны в изучении новых аспектов vi (m), то это, вероятно, не сильно повлияет на вас.
Я также еще раз подчеркну, что режимы визуальной линии и визуального блока дают вам варианты этой же темы, которые могут быть очень мощными... особенно режим визуальных блоков.
Об эффективном использовании клавиатуры
Я также не согласен с вашим утверждением, что чередующиеся руки - это самый быстрый способ использовать клавиатуру. В нем есть элемент истины. Говоря в целом, повторное использование одной и той же вещи происходит медленно. Этот наиболее важный пример этого принципа заключается в том, что последовательные нажатия клавиш с одним и тем же пальцем очень медленные. Ваше утверждение, вероятно, связано с естественной тенденцией использовать s/finger/hand/transform на этом шаблоне. В некоторой степени это правильно, но на чрезвычайно высоком конце спектра эффективности это неверно.
Просто спроси любого пианиста. Спросите их, быстрее ли играть последовательность нескольких заметок, чередуя руки или последовательно используя последовательные пальцы одной руки. Самый быстрый способ нажатия клавиш 4 - это не чередовать руки, а набирать их 4 пальцами одной руки в порядке возрастания или убывания (назовем это "бегом" ). Это должно быть само собой разумеющимся, как только вы рассмотрели эту возможность.
Более сложная проблема заключается в оптимизации для этого. Это довольно легко оптимизировать для абсолютного расстояния на клавиатуре. Вим делает это. Это намного сложнее оптимизировать на уровне "run", но vi (m) с его модальным редактированием дает вам больше шансов на то, что вы сможете это сделать, чем любой немодальный подход (гм, emacs) когда-либо мог.
В Emacs
Чтобы фанатики emacs полностью игнорировали весь мой пост из-за этого последнего комментария в скобках, я чувствую, что должен описать корень различия между emacs и vim религиями. Я никогда не говорил в редакционных войнах, и я, вероятно, больше не буду этого делать, но я никогда не слышал, чтобы кто-то описывал различия таким образом, так что вот оно. Разница заключается в следующем компромиссе:
Vim дает вам непревзойденную эффективность редактирования текста
Emacs дает вам непревзойденную способность настраивать и программировать редактор
Слепые vim zealots утверждают, что vim имеет язык сценариев. Но это неясный, специальный язык, предназначенный для обслуживания редактора. Emacs имеет Lisp! Достаточно сказано. Если вы не цените значимость этих последних двух предложений или хотите узнать достаточно о функциональном программировании и Lisp, чтобы развить эту оценку, тогда вы должны использовать vim.
Ревнители emacs будут утверждать, что emacs имеет режим гадюки, и поэтому это надмножество vim. Но режим гадюки не является стандартным. Я понимаю, что режим viper не используется большинством пользователей emacs. Поскольку это не значение по умолчанию, большинство пользователей emacs, вероятно, не развивают истинную оценку преимуществ модальной парадигмы.
По-моему эти различия ортогональны. Я считаю, что преимущества vim и emacs, как я их заявила, являются действительными. Это означает, что окончательный редактор еще не существует. Вероятно, это правда, что emacs будет самой простой платформой для создания конечного редактора. Но модальное редактирование не укоренилось в мышлении emacs. Сообщество emacs могло бы двигаться таким образом в будущем, но это не кажется очень вероятным.
Итак, если вы хотите повысить эффективность редактирования, используйте vim. Если вы хотите, чтобы среда для сценариев и программирования вашего редактора использовала emacs. Если вы хотите, чтобы некоторые из них с акцентом на программируемость, используйте emacs с режимом viper (или запрограммируйте собственный режим). Если вам нужно лучшее из обоих миров, вам пока не повезло.
Ответ 22
Проведите 30 минут, выполняя учебник vim (запустите vimtutor вместо vim в терминале). Вы узнаете основные движения и некоторые нажатия клавиш, это сделает вас по крайней мере столь же продуктивным с vim, как и с текстовым редактором, который вы использовали раньше. После этого хорошо прочитайте ответ Джима Денниса:)
Ответ 23
Я с удивлением обнаружил, что никто не упоминает движение t
. Я часто использую его с списками параметров в форме dt,
или yt,
Ответ 24
Используйте \c
в любом месте поиска, чтобы игнорировать регистр (переопределяя параметры ignorecase или smartcase).
Например. /\cfoo
или /foo\c
будут соответствовать foo
, foo
, foo
, foo
и т.д.
Используйте \c
в любом месте поиска, чтобы принудительно выполнить совпадение.
Например. /\cfoo
или /foo\c
будет соответствовать только foo.
Ответ 25
Как вы используете Vim, который делает вы более продуктивны, чем с помощью современный редактор?
Возможность выполнять сложные, повторяющиеся изменения с очень небольшим количеством нажатий клавиш (часто используя макросы ). Взгляните на VimGolf, чтобы засвидетельствовать силу Vim!
После более чем десяти лет почти ежедневного использования трудно представить, используя любой другой редактор.
Ответ 26
Нечетный никто не упоминал ctags. Загрузите "exuberant ctags" и поставьте его впереди дрянной предустановленной версии, которую вы уже имеете в своем пути поиска. Cd в корне того, над чем вы работаете; например, дистрибутив ядра Android. Введите "ctags -R". для создания индекса исходных файлов в любом месте ниже этого каталога в файле с именем "теги". Это содержит все теги, нотематировать язык и где в директории, в одном файле, поэтому кросс-язычная работа проста.
Затем откройте vim в этой папке и прочитайте: help ctags для некоторых команд. Несколько я часто использую:
-
Поместите курсор на вызов метода и введите CTRL-], чтобы перейти к методу
определение.
-
Введите: ta имя, чтобы перейти к определению имени.
Ответ 27
Автоматический отступ:
gg
(перейдите к началу документа)
=
(отступ времени!)
shift-g
(перейти к концу документа)
В вашем файле .vimrc
вам понадобится отпечаток плагина filetype и, возможно, соответствующие настройки "shiftwidth" и "expandtab".
Ответ 28
Вы спросили о продуктивных ярлыках, но я думаю, что ваш реальный вопрос: стоит ли vim? Ответ на этот вопрос stackoverflow → "Да"
Вы, должно быть, заметили две вещи. Вим силен, и VIM трудно учиться. Большая его часть заключается в ее расширяемости и бесконечном сочетании команд. Не чувствуйте себя подавленным. По-медленнее. Одна команда, по одному плагину за раз. Не переусердствуйте.
Все, что вы вложили в vim, окупится в тысячу раз. Вы будете внутри текстового редактора за многие, многие часы, прежде чем умереть. Vim будет вашим компаньоном.
Ответ 29
Несколько буферов и, в частности, быстрый переход между ними для сравнения двух файлов с :bp
и :bn
(правильно переназначенный на
одиночный Shift + p или Shift + n)
vimdiff
(разбивается на два вертикальных буфера с цветами, чтобы показать различия)
Копировать область с помощью Ctrl + v
И, наконец, завершение заполнения идентификаторов (поиск "mosh_tab_or_complete" ). Это сменщик жизни.
Ответ 30
Согласовано с верхним плакатом - команда : r! очень полезна.
Чаще всего я использую его для "вставки" вещей:
:r!cat
**Ctrl-V to paste from the OS clipboard**
^D
Таким образом, мне не нужно возиться с :set paste
.