В Vim много команд, а это значит, что вы можете достичь одной и той же цели разными способами. Поэтому новичку трудно научиться выполнять задачу редактирования с меньшим количеством нажатий клавиш. В этом руководстве я поделюсь своим рабочим процессом команды Vim и дам вам несколько рекомендаций о том, как эффективно перемещать/редактировать текст в Vim.
Методические рекомендации
Вот несколько общих правил моего рабочего процесса.
- Не используйте клавиши со стрелками и мышь.
- Используйте относительный скачок (например:
5k 12j) для вертикального перемещения внутри экрана. - Используйте
CTRL-U CTRL-D CTRL-B CTRL-F gg Gдля вертикального перемещения за пределами экрана. - Используйте слово-движение (
w W b B e E ge gE) для перемещения по горизонтали на короткое расстояние. - Используйте
f F t T 0 ^ $ , ;для горизонтального движения на средние и большие расстояния. - По возможности используйте
operator + motion/text-object(например:ci{ d5j).
Если вы не знакомы с некоторыми из этих концепций, сначала изучите базовые команды vim.
Примеры
Вот 4 реальных ситуации, с которыми я столкнулся при создании веб-сайта со списком задач с помощью javascript. Вы можете сначала подумать о том, как вы достигнете цели редактирования, а затем увидеть мой подход.
Примечания:
^илиvуказывает на положение курсора.- Слева есть номер строки и относительный номер строки.
Ситуация 1
Цель: заменить activeList на this и добавить ; в конце строки.
// current mode: Normal
2 if(this.sortMethod == 'Name') {
1 activeList.uncheckedTodo.sort(sortWithName)
189 }
^
Мой подход -cwthis<ESC>A;<ESC>.
-: Перейти на 1 строку вверх по первому непустому символуcwthis: измените слово и введитеthis.<ESC>: Выйти из режима вставки.A;<ESC>: перейти в конец строки, ввести;и выйти из режима вставки.

Ситуация 2
Цель: заменить i-s+1 на d и добавить new перед Date(y, m, d).
// current mode: Normal
454 console.log(Date(y, m, i-s+1));
^
Мой подход Wct)d<C-o>FDnew <ESC>. (<C-o> означает CTRL-O)
W: Перейти на одно слово вперед, игнорируя символ.ct)d: измените до появления)вправо и введитеd.<C-o>: Выполните одну команду в обычном режиме, а затем вернитесь в режим вставки.FD: Перейдите к вхождениюDслева.new <ESC>: введитеnewи выйдите из режима вставки.

Ситуация
Цель: добавить строку activeList.sortMethod = 'Date'; ниже document.querySelector('.sort-date')....
// current mode: Insert
1 document.querySelector('.sort-name').addEventListener('click', () => {
343 activeList.sortMethod = 'Name';
1 activeList.update(); ^
2 })
3
4 document.querySelector('.sort-date').addEventListener('click', () => {
5 activeList.update();
6 })
Мой подход <ESC>yy4jpci'Date<ESC>.
<ESC>: Выйти из режима вставки.yy: скопировать текущую строку.4j: Перейти на 4 строку вниз.p: Вставьте строку, которую мы только что выдернули.ci'Date<ESC>: Измените содержимое внутри '', введитеDateи выйдите из режима вставки.

Ситуация 4
Цель: переместить весь блок //sort (строка 200 ~ 207) в начало функции update().
// current mode: Normal
8 update() {
7 this.checkedTodo.forEach((todo) => {
6 this.element.insertBefore(todo.element, todoCreator.nextSibling);
5 });
4 this.uncheckedTodo.forEach((todo) => {
3 this.element.insertBefore(todo.element, todoCreator.nextSibling);
2 });
1 v
200 // sort
1 if(this.sortMethod == 'Name') {
2 this.uncheckedTodo.sort(sortWithName);
3 }
4 else if(this.sortMethod == 'Date') {
5 this.uncheckedTodo.sort(sortWithDate);
6 }
7
8 createCalendar(currentYear, currentMonth, this);
9 }
Мой подход dap8kp.
dap: Удалить вокруг абзаца.8k: Поднимитесь на 8 строк вверх.p: Вставьте абзац, который мы только что удалили.

Заключительные слова
Если вы только начинаете изучать операторы Vim, движения, может потребоваться некоторое время, чтобы подумать о том, какие команды использовать в каждой ситуации. Однако, если вы продолжите практиковать и использовать их, вы будете становиться все быстрее и быстрее. Через некоторое время вы разовьете мышечную память для использования этих команд.