Subversive предоставляет два новых движения оператора, которые упрощают выполнение быстрых замен. Он не содержит сопоставлений по умолчанию и не будет иметь никакого эффекта, пока вы не добавите в него свои собственные карты.
Также посмотрите здесь, если вы предпочитаете посмотреть видеообъяснение этого плагина вместо текста ниже.
Пример конфигурации:
" s for substitute
nmap s <plug> (SubversiveSubstitute)
nmap ss <plug> (SubversiveSubstituteLine)
nmap S <plug> (SubversiveSubstituteToEndOfLine)
Обратите внимание, что в этом случае вы будете затенять клавишу изменения символа s
поэтому вам придется использовать более длинную форму cl
После добавления этих карт вы можете выполнить s<motion>
, чтобы заменить текстовый объект, предоставленный движением, содержимым регистра по умолчанию (или явного регистра, если он предусмотрен). Например, вы можете выполнить siw
, чтобы заменить текущее слово под курсором текущим yank, или sip
, чтобы заменить абзац и т. д.
Еще один интересный оператор, предоставляемый Subversive, позволяет указать как текст для замены, так и диапазон строк, к которому следует применить изменение, используя несколько последовательных движений.
Пример конфигурации:
nmap <leader> s <plug> (SubversiveSubstituteRange)
xmap <leader> s <plug> (SubversiveSubstituteRange)
nmap <leader> ss <plug> (SubversiveSubstituteWordRange)
Если после добавления этой карты вы выполните <leader>s<motion1><motion2>
и введете некоторый текст в подсказку в строке состояния, то текст, заданный motion1
должен быть заменен текстом, который мы ввели в подсказку для каждой строки. предоставлено motion2
. В качестве альтернативы мы также можем выбрать motion1
в визуальном режиме, а затем нажать <leader>s<motion2>
для того же эффекта.
Это может быть очень мощно. Например, вы можете выполнить <leader>siwip
, чтобы заменить все экземпляры текущего слова под курсором, существующие в абзаце под курсором. Или <leader>sl_
чтобы заменить все экземпляры символа под курсором в текущей строке.
Отображение <leader>ss
используется как ярлык для замены текущего слова под курсором. Это позволяет вам, например, выполнить <leader>ssip
, чтобы заменить слово под курсором в текущем абзаце. Обратите внимание, что это соответствует целым словам и отличается от <leader>siwip
(который не требует наличия границ слов для каждого совпадения).
Давайте посмотрим на это в действии:
На этой гифке мы сначала переименовываем локальный параметр foo
, выполнив <leader>ssom
, а затем введя bar
в командной строке (обратите внимание, что om
— это пользовательское движение, которое означает «внешний метод C#» и не предоставляется этим плагином). Также обратите внимание: поскольку мы используем <leader>ss
, текст _foos
не затрагивается, поскольку он не соответствует всему слову. В данном случае это полезно, потому что мы хотим переименовать только параметр внутри функции.
После этого мы переключаемся в визуальный режим и выбираем часть foo
_foos
затем выполняем <leader>sie
и еще раз вводим bar
в командную строку. ie
это снова пользовательское движение, обозначающее entire buffer
(подробности см. в следующем разделе).
После этого мы переходим к Foo
-части AddFoo
, выполняем <leader>seie
и снова вводим Bar
. Затем, наконец, сделайте то же самое для полностью капитализированного FOOS
.
Обратите внимание: если вы используете neovim, вы можете включить опцию inccommand
, чтобы получить предварительный просмотр замены в реальном времени по мере ее ввода (эквивалентно установке g:subversivePromptWithActualCommand
на 1
).
Также обратите внимание, что это движение повторяемо. Если вы запустите <leader>siwip
в одном абзаце, затем перейдете к другому абзацу и нажмите .
тогда та же замена будет применена к новому абзацу под курсором.
Обратите внимание: чтобы действительно воспользоваться преимуществами этих сопоставлений, полезно добавлять собственные текстовые объекты в дополнение к встроенным объектам, таким как текущий абзац ( ip
), текущее предложение ( is
) или текущая строка ( _
). Пользовательские текстовые объекты, такие как текущий уровень отступа, текущий метод, текущий класс, весь буфер, текущая страница прокрутки и т. д., могут здесь очень помочь.
Например, пара действительно простых движений, полезных для подрывной деятельности:
" ie = inner entire buffer
onoremap ie :exec "normal! ggVG" <cr>
" iv = current viewable text in the buffer
onoremap iv :exec "normal! HVL" <cr>
Существуют также другие плагины, которые предоставляют множество пользовательских текстовых объектов, на которые я бы рекомендовал обратить внимание.
Для многих замен вы можете положиться на предварительный просмотр выделенного фрагмента, чтобы понять, что заменяется. Но если вы выполняете большую замену по всему файлу, возможно, вам захочется подтвердить каждую из них. Сделать это можно с помощью следующих карт:
nmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
xmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
nmap <leader> css <plug> (SubversiveSubstituteWordRangeConfirm)
Они работают так же, как карты <leader>s
выше, за исключением того, что каждая замена будет проходить поочередно.
Если вы предоставите явный регистр для любого из приведенных выше движений замены, он не будет запрашивать, а вместо этого будет использовать содержимое данного регистра. Например, "a<leader>siwip
немедленно заменит все экземпляры текущего слова под курсором содержимым регистра a
существующим в текущем абзаце.
Если этого недостаточно, вы также можете использовать следующие заглушки:
nmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
xmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
nmap <leader> ss <plug> (SubversiveSubstituteWordRangeNoPrompt)
Он будет работать идентично предыдущим плагинам, за исключением того, что вместо запроса будет использоваться регистр по умолчанию.
Вы можете сделать это, передав регистр черной дыры одной из подстановочных команд превышения диапазона. Например: "_<leader>siwip
или "_<leader>csiwip
если вы хотите подтверждать каждое удаление.
К сожалению, вы не можете просто ввести пустое значение в приглашение, потому что нет способа отличить этот ввод от отмены через escape (если вы не установите g:subversivePromptWithActualCommand
значение 1
и в этом случае это будет работать нормально)
g:subversivePromptWithCurrent
— если установлено значение 1
, приглашение будет включать заменяемый текст. Это может быть полезно, если вы хотите просто отредактировать его. По умолчанию: 0
g:subversiveCurrentTextRegister
— если установлено, данный регистр будет заполнен заменяемым текстом. Это может быть полезно в качестве альтернативы g:subversivePromptWithCurrent
, так что вы можете нажать <cr>r
в командной строке (при условии, что вы установили для него значение 'r'
), когда хотите его отредактировать, а в противном случае просто набирать текст, когда хотите. полная замена.g:subversivePromptWithActualCommand
— если установлено значение 1
, вместо запроса только текста замены будет предложена собственная команда замены vim. Опытные пользователи vim могут предпочесть это, чтобы они могли самостоятельно настраивать различные флаги замены. По умолчанию: 0
g:subversivePreserveCursorPosition
— если установлено значение 1
, курсор не будет перемещаться при применении замен. По умолчанию установлено значение 0
что соответствует нормальному поведению vim. Если вы также установили vim-abolish, вы также можете добавить что-то похожее на следующее сопоставление:
nmap <leader> <leader> s <plug> (SubversiveSubvertRange)
xmap <leader> <leader> s <plug> (SubversiveSubvertRange)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRange)
Это будет вести себя так же, как и <leader>s
за исключением того, что он выполнит отмену «subvert» вместо использования встроенной команды замены vim. Это применит замену, а также сохранит регистр исходного слова. Например:
В этом случае мы перемещаем курсор поверх foo
, затем выполняем <leader><leader>seie
, затем вводим bar
, который заменяет все экземпляры foo
независимо от регистра.
Это может быть очень удобный способ быстрого переименования.
Как и следовало ожидать, сопоставление <leader><leader>ss
работает аналогичным образом, за исключением того, что оно соответствует только полным словам, включающим границы слов.
И снова есть альтернативные плагины, которые будут использовать регистр по умолчанию вместо приглашения, если вы предпочитаете это:
nmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
xmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRangeNoPrompt)
Обратите внимание: если вы устанавливаете vim-yoink вместе с vim-subversive, то функция замены yoink после вставки будет автоматически работать и с подрывными заменами (одинарным движением). Другими словами, предполагая сопоставления по умолчанию, вы можете выполнить siw
а затем нажать <cn>
/ <cp>
, чтобы переключаться между различными извлечениями из истории yoink.
Subversive также предоставляет плагин для замены вставки в визуальном режиме, чтобы обеспечить замену вставки после:
xmap s <plug> (SubversiveSubstitute)
xmap p <plug> (SubversiveSubstitute)
xmap P <plug> (SubversiveSubstitute)
Теперь, если вы нажмете p
в визуальном режиме, вы сможете переключаться между действиями, как при вставке в обычном режиме.