Використання декількох курсорів не є річчю Віммера
Як я вже говорив у коментарях із використанням декількох курсорів (навіть із плагіном) насправді не "слідує за способом Vim", я повністю розумію, що це привабливо для когось із Sublime-Text, але часто можна знайти альтернативи, які є принаймні настільки ж ефективні із вбудованими функціями Vim.
Звичайно, знайти ці альтернативні рішення не завжди просто, а іноді потрібен час, але це стане простішим з вашим досвідом Vim, і ви побачите, що з часом кілька курсорів вам здадуться абсолютно марними.
Це здорово, але як я можу знайти альтернативний спосіб?
Універсальної відповіді немає, оскільки це багато залежить від того, що ви намагаєтеся зробити, я просто спробую дати кілька підказків про перші речі, які слід спробувати:
Командна точка .
Команда Dot є, мабуть, одним із найпотужніших інструментів Vim, вона просто дозволяє повторити останню зміну. Я не міг пояснити це краще, ніж Дрю Ніл у своєму практичному Vim . Я думаю, що кожен Віммер повинен розглянути можливість прочитання цієї книги.
Сила цієї команди полягає в тому, що остання зміна може бути дією, що працює над символом, рядком або цілим файлом. Наприклад, зміна може бути обмежена моментом введення режиму вставки та моментом повернення до звичайного режиму.
Зважаючи на це, легко зробити те, що ви хотіли зробити з мультикурсором:
Спочатку давайте налаштуємо наше середовище: напишемо так, як ви запропонували
\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}
Усі завдання команди крапки - це навчитися робити повторювані зміни: це буде з виправленням 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'); }
Глобальна команда
Глобальна команда - це інструмент, який дозволяє застосувати команду колишнього режиму на лініях, що відповідають шаблону, і це ще раз хороший спосіб застосувати одну і ту ж зміну на іншому місці, не потребуючи кількох курсорів.
Синтаксис такий:
:[range] g / pattern / command
Детальніше про [range]
параметр див :h :range
. Я не буду деталізувати це тут, я просто нагадаю, що %
представляє весь файл, '<,'>
представляє останній вибір і 1,5
представляє рядки 1 - 5 файлу.
Цей параметр визначає рядки, які будуть оброблятися глобальною командою. Якщо діапазон не вказаний, глобальна команда буде використовувати %
за замовчуванням.
Аргумент [pattern] - це шаблон пошуку, як ви звикли користуватися пошуковою системою. Оскільки вона інтегрує історію пошуку, ви можете залишити це поле порожнім, а глобальна команда використає останній шаблон пошуку в історії пошуку.
Нарешті, параметр [command] - це колишня команда, як ви, ймовірно, звикли.
Зараз поведінка глобальної команди досить проста:
- Ітерація через усі рядки, визначені параметром [діапазон]
- Якщо поточний рядок відповідає заданому шаблону, застосуйте команду
Оскільки параметр [command] є колишньою командою, ви можете зробити багато речей. Візьмемо наступний псевдо-код, який не дуже цікавий і містить багато повідомлень про налагодження:
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
команда - це колишня команда, що означає, що ви можете використовувати її з глобальною командою. Це може бути справді потужним: скажімо, що я хочу дублювати всі рядки, що містять відлуння, мені не потрібен макрос або навіть магічна формула 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 за його роботу з редагування та виправлення, які він вніс на цю довгу посаду.