Найти в Дзене
Vim

VimScript 13 [Локальные буферы и сопоставления]

| ч12. тренируем пальцы | Содержание | ч14. Автокоманды | Теперь давайте уделим несколько минут тому, чтобы вернуться к трем вещам, о которых мы уже говорили: сопоставления (*noremap), сокращения (*abbrev), параметры (set), но с изюминкой. Мы собираемся установить каждую эту вещь, но только для отдельного буфера. Истинная сила этой идеи станет очевидной позже, но нам нужно заложить основу уже сейчас. Итак откройте два файла, каждый в своем отдельном окне. Я назову их foo и bar, но ты можешь называть их как угодно. Поместите немного текста в каждый из них. Сопоставления Переключитесь на файл foo и выполните следующие команды: :nnoremap <leader>d dd
:nnoremap <buffer> <leader>x dd Теперь оставайтесь в файле foo, убедитесь, что вы находитесь в обычном режиме, и введите [ <leader>d ]. Vim удалит строку. В этом нет ничего нового. Теперь находясь все еще в файле foo, введите [<leader>x ]. Vim снова удалит строку. Это все еще имеет смысл, потому что мы сделали соответствующее
Оглавление

| ч12. тренируем пальцы | Содержание | ч14. Автокоманды |

Теперь давайте уделим несколько минут тому, чтобы вернуться к трем вещам, о которых мы уже говорили: сопоставления (*noremap), сокращения (*abbrev), параметры (set), но с изюминкой. Мы собираемся установить каждую эту вещь, но только для отдельного буфера.

Истинная сила этой идеи станет очевидной позже, но нам нужно заложить основу уже сейчас.

Итак откройте два файла, каждый в своем отдельном окне. Я назову их foo и bar, но ты можешь называть их как угодно. Поместите немного текста в каждый из них.

Сопоставления

Переключитесь на файл foo и выполните следующие команды:

:nnoremap <leader>d dd
:nnoremap <buffer> <leader>x dd

Теперь оставайтесь в файле foo, убедитесь, что вы находитесь в обычном режиме, и введите [ <leader>d ]. Vim удалит строку. В этом нет ничего нового.

Теперь находясь все еще в файле foo, введите [<leader>x ]. Vim снова удалит строку. Это все еще имеет смысл, потому что мы сделали соответствующее сопоставление [<leader>x ] и [ dd ]

Теперь же давайте перейдём к файлу bar. В обычном режиме введите [<leader>d]. Опять же, ничего удивительного Vim удаляет текущую строку.

А вот и трюк: Находясь в файле bar, введите [<leader>x ].

Вместо того, чтобы удалить всю строку целиком, Vim просто удалил один символ! Что же случилось?

Вторая наша команда [ :nnoremap <buffer> <leader>x dd ] сказала Vim, что бы он учитывал это сопоставление только в том буфере в котором мы его определили.

Когда мы ввели [<leader>x ] в файле bar, Vim не смог найти соответствующее сопоставление, поэтому он отработал как две отдельные команды: <leader>(которая сама по себе ничего не делает) и [ x ] (обычная команда для удаления одного символа).

Локальный лидер

В нашем примере мы использовали [<leader>x ] для нашего сопоставления в локальном буфере, но это плохой тон. Когда вы создаете сопоставление, которое применяется только к определенным буферам, вы должны использовать <localleader> вместо <leader>. ( Кстати о лидерах мы говорили тут)

Использование двух лидеров для разных клавиш обеспечивает своего рода "пространство имен". Таким образом используя разных лидеров, мы точно будем знать где должно произойти изменение.

Это особенно важно, когда вы пишете плагин который будет использован другими людьми. Используя <localleader>для локальных сопоставлений вы не позволите вашему плагину перезаписать значение чужого <leader>.

Настройки

Ранее мы говорили о параметрах настройки с помощью set . Некоторые параметры всегда применяются ко всему Vim, но другие могут быть установлены для каждого буфера отдельно.

Переключитесь на файл foo и выполните следующую команду:

:setlocal wrap

Теперь переключитесь на файл bar и выполните эту команду:

:setlocal nowrap

Уменьшите окно Vim, и вы увидите, что строки в foo нем переносятся, а строки в bar нет.

Давайте попробуем другой вариант. Переключитесь на foo. И выполните эту команду:

:setlocal number

Теперь переключитесь в bar и выполните эту команду:

:setlocal nonumber

Теперь у нас есть номера строк внутри foo, но не внутри bar.

Не все параметры можно использовать с [ setlocal ] Чтобы узнать, какой конкретный параметр можно установить локально, прочитайте :help setlocal

Я немного упустил то, как на самом деле работают локальные настройки. Потом, в упражнениях, вы узнаете больше об их специфике.

Скрытие

Прежде чем мы продолжим, давайте рассмотрим очень интересное свойство локальных сопоставлений. Переключитесь на foo и выполните следующие команды:

:nnoremap <buffer> Q x
:nnoremap Q dd

Теперь введите < Q >. Что происходит?

Когда вы нажмете < Q >, Vim запустит первое сопоставление, а не второе, потому что первое сопоставление более специфично, чем второе.

Переключитесь на файл bar и введите < Q >, чтобы увидеть, что Vim использует второе сопоставление, потому что оно не затеняется первым в этом буфере.

Упражнения

Прочти: help local-options.

Прочти: help setlocal.

Прочти: help map-local.

| ч12. тренируем пальцы | Содержание | ч14. Автокоманды |