Использование нескольких курсоров - это не вещь Vimmer
Как я сказал в комментариях, использование нескольких курсоров (даже с плагином) на самом деле не «следует Vim», я полностью понимаю, что это привлекательно для кого-то из Sublime-Text, но вы часто можете найти альтернативы, которые по крайней мере так же эффективно со встроенными функциями Vim.
Конечно, найти эти альтернативные решения не всегда просто, а иногда это требует времени, но с вашим опытом работы с Vim это станет проще, и вы увидите, что со временем несколько курсоров покажутся вам совершенно бесполезными.
Это круто, но как найти альтернативный способ?
Универсального ответа не существует, так как это во многом зависит от того, что вы пытаетесь сделать, я просто попытаюсь дать несколько советов о первых вещах, которые нужно попробовать:
Точечная команда .
Команда Dot, вероятно, является одним из самых мощных инструментов в Vim, она просто позволяет нам повторить последнее изменение. Я не мог объяснить это лучше, чем Дрю Нейл в своей « Практической игре» . Я думаю, что каждый Vimmer должен рассмотреть возможность прочтения этой книги.
Сила этой команды в том, что последнее изменение может быть действием, работающим над символом, строкой или целым файлом. Например, изменение может быть ограничено моментом, когда вы входите в режим вставки, и моментом, когда вы возвращаетесь в нормальный режим.
Имея это в виду, легко сделать то, что вы хотели сделать с мультикурсором:
Сначала давайте настроим нашу среду: напишем, как вы предложили
\section[]{}
Затем внесите повторяемое изменение
. Курсор включен }
, нажмите, F[
чтобы вернуться к [
персонажу. Затем войдите в режим вставки с помощью i
и введите My first section in this book
и вернитесь в нормальный режим с помощью ESC
:
\section[My first section in this book]{}
И тут возникает волшебная часть: давайте напечатаем f{
курсор, чтобы навести курсор на {
персонажа, и нажмите, .
чтобы повторить последнее изменение:
\section[My first section in this book]{My first section in this book}
Вся задача команды dot состоит в том, чтобы научиться вносить повторяемые изменения: она будет сопровождаться переходом на Vim, но основная задача - понять, как вносить изменения с повторяемостью.
Например, чтобы вставить точку с запятой в конце строки, которую вы предпочитаете использовать
A;
вместо $a;
. Почему?
Потому что A;
создает атомарное действие, поэтому, когда вы будете использовать .
в другой строке, независимо от того, где вы находитесь в строке, вы вставите точку с запятой в конце. Принимая во внимание, что при использовании $a;
вы разделяете ваши изменения на две части, $a
и, ;
если вы используете .
его, вы вставляете точку с запятой в текущую позицию курсора.
ПРИМЕЧАНИЕ Формула магии в Vim есть n.
. Действительно крутой рабочий процесс:
- найдите место, где вы хотите внести изменения
/pattern
- сделайте свое повторяемое редактирование
- используйте,
n
чтобы перейти к следующему месту для редактирования
- использовать,
.
чтобы повторить редактирование
- повторите два последних шага: Ты король мира (или хотя бы правок)
макрос
Макросы - это еще один чрезвычайно важный инструмент в Vim, поскольку он позволяет записывать последовательность нажатий клавиш и повторять их, как если бы вы набирали их снова.
В качестве примера я буду использовать ваш второй вариант использования:
variable1 = 2
my_variable2 = 12
var3 = 14
Еще раз важно научиться делать ваши макросы эффективными (я приведу контрпример сразу после):
variable1.someStuff = 2
my_variable2 = 12
var3 = 14
- Теперь вы можете использовать макрос, чтобы повторить ваше редактирование. Поскольку вы находитесь на правой линии для редактирования, вы можете просто выполнить макрос с помощью
@q
. Поскольку мы хотим выполнить его дважды, вы можете использовать его, 2@q
и вы получите следующий результат:
variable1.someStuff = 2
my_variable2.someStuff = 12
var3.someStuff = 14
ПРИМЕЧАНИЕ 1. Как вы могли заметить, использование 0ea
в начале макроса было действительно важным. Действительно, если бы вы поместили курсор в конец первого слова перед записью макроса и повторным его выполнением, ваш результат был бы следующим:
variable1.someStuff = 2
my_variable2 = 12.someStuff
var3 = 14.someStuff
В качестве вашего курсора текст был бы вставлен в положение курсора после изменения строки (т.е. в конце строки в этом случае)
ПРИМЕЧАНИЕ 2 Макросы чрезвычайно эффективны, и вы можете даже создавать рекурсивные макросы, когда вам удобно с ними. Здесь ваш макрос мог бы быть:
`0ea.someStuff<Esc>j@q`
Финал @q
вызвал бы макрос сам по себе вместо использования 2@q
; Вы бы просто использовали, @q
и вся работа была бы сделана.
визуальный блок
Вот еще одна хитрость, которая не относится напрямую к вашему случаю использования, но может быть очень полезна для одновременного редактирования большого количества строк. Давайте возьмем этот фрагмент кода CSS:
li.one a{ background-image: url('/images/sprite.png'); }
li.two a{ background-image: url('/images/sprite.png'); }
li.three a{ background-image: url('/images/sprite.png'); }
Что если вы переместили спрайтов из images
в components
?
Ну, вы можете навести курсор на i
оф images
и нажать <C-v>
. Это запустит режим визуального блока, который позволяет выбирать блоки. Теперь вы можете напечатать, t/
чтобы выбрать слово, которое вы хотите изменить, и 2j
выбрать все вхождения слова.
После этого вам просто нужно набрать, c
чтобы изменить слово, а затем components
. Когда вы выйдете из режима вставки, вы увидите:
li.one a{ background-image: url('/components/sprite.png'); }
li.two a{ background-image: url('/components/sprite.png'); }
li.three a{ background-image: url('/components/sprite.png'); }
Глобальная команда
Глобальная команда - это инструмент, который позволяет применять команду ex mode к строкам, соответствующим шаблону, еще раз, это хороший способ применить одно и то же изменение в другом месте без необходимости использования нескольких курсоров.
Синтаксис следующий:
:[range] g / pattern / command
Для более подробной информации о [range]
параметре, пожалуйста, смотрите :h :range
. Я не буду подробно описывать это здесь, я просто напомню, что %
представляет весь файл, '<,'>
представляет последний выбор и 1,5
представляет строки с 1 по 5 файла.
Этот параметр определяет строки, которые будут обрабатываться глобальной командой. Если диапазон не указан, то глобальная команда будет использовать %
по умолчанию.
Аргумент [pattern] - это шаблон поиска, который вы привыкли использовать в поисковой системе. Поскольку он объединяет историю поиска, вы можете оставить это поле пустым, а глобальная команда будет использовать последний шаблон поиска в истории поиска.
Наконец, параметр [command] - это команда ex, к которой вы, вероятно, привыкли.
Теперь поведение глобальной команды довольно просто:
- Итерация по всем строкам, определенным в параметре [range]
- Если текущая строка соответствует определенному шаблону, примените команду
Поскольку параметр [command] является командой ex, вы можете делать много вещей. Давайте возьмем следующий псевдокод, который не очень интересен и содержит много сообщений отладки:
var myList = null
var i = 0
myList = new List()
echo "List instantiated"
for (i=0; i<10; i++)
myList.Add(i)
echo i . " added to the list"
echo "end of for loop"
Теперь предположим, что вы уверены, что этот код работает, и хотите удалить эти бесполезные echo
операторы:
Вы можете применить свою глобальную команду ко всему файлу, так что вам придется добавлять к ней команду %
(или ни с чем, поскольку %
это диапазон по умолчанию).
Вы знаете, что все строки, которые вы хотите удалить, соответствуют шаблону echo
Вы хотите удалить эти строки, поэтому вам придется использовать команду, :delete
которая также может быть сокращена доd
Так что вам просто нужно использовать следующую функцию:
:%global/echo/delete
Который также может быть сокращен как
:g/echo/d
Обратите внимание, что %
исчез, global
сокращенно как g
и delete
как d
. Как вы можете себе представить, результат:
var myList = null
var i = 0
myList = new List()
for (i=0; i<10; i++)
myList.Add(i)
ПРИМЕЧАНИЕ 1. Важным моментом, который мне потребовалось некоторое время, чтобы понять, является то, что
normal
команда является командой ex, что означает, что вы можете использовать ее с глобальной командой. Это может быть действительно мощным: скажем, я хочу дублировать все строки, содержащие эхо, мне не нужен макрос или даже волшебная формула n.
. Я могу просто использовать
:g/echo/normal YP
И вуаля:
var myList = null
var i = 0
myList = new List()
echo "List instantiated"
echo "List instantiated"
for (i=0; i<10; i++)
myList.Add(i)
echo i . " added to the list"
echo i . " added to the list"
echo "end of for loop"
echo "end of for loop"
ПРИМЕЧАНИЕ 2. «Эй, а если я захочу использовать мою команду в строках, которые не соответствуют определенному шаблону?»
global
имеет противоположную vglobal
сокращенную команду, v
которая работает точно так же, global
за исключением того, что команда будет применена к строкам, которые не соответствуют параметру [pattern]. Таким образом, если мы применим
:v/echo/d
На нашем предыдущем примере мы получаем:
echo "List instantiated"
echo i . " added to the list"
echo "end of for loop"
Команда delete
была применена к строкам, которые не содержались echo
.
Здесь я надеюсь, что эти несколько советов дадут вам идеи о том, как избавиться от вашего плагина с несколькими курсорами и использовать Vim способом Vim ;-)
Как вы можете себе представить, эти примеры довольно просты и предназначены для демонстрации того, что когда вы следуете Vim, вам действительно редко нужны несколько курсоров. Мой совет будет, когда вы столкнетесь с ситуацией, когда вы думаете, что это будет полезно, запишите ее и потратьте некоторое время спустя, чтобы найти лучшее решение. В 99% случаев вы в конечном итоге найдете более быстрый / более эффективный способ сделать это.
Также я повторюсь еще раз, но я действительно призываю вас прочитать «
Практический Vim » Дрю Нила, потому что эта книга не о «Как сделать то или иное в Vim», а о «Как научиться мыслить в Vim» что позволит вам построить собственное решение ваших будущих проблем в хорошем смысле.
PS Особая благодарность @Alex Stragies за его работу по редактированию и исправления, которые он внес в этот длинный пост.