2014-07-24 7 views
1

Я ищу замену для команды vim «заменить на символ» - в частности, я хочу, чтобы иметь возможность выбирать текст и заменять каждый символ некоторым символом, который я набираю (сложность: нет режима «винтаж»)Замените замену vim в Sublime

Пример:

Начиная с

I am some text with an arbitrary number: 12358998281

Я хочу простой способ выбрать 12358998281 и превратить его в 99999999999, чтобы сделать результат

I am some text with an arbitrary number: 99999999999

(в Vim, это будет сделано путем перемещения курсора в начало 12358998281, подбирая с ve, затем нажмите r9)

Я могу это сделать, выбрав текст, воспитывающим диалог «найти», убедившись, что «в выборе» и «по регулярному выражению» включены, поиск., а затем вводя мой символ в результирующий мультиспектр. Однако это невероятно трудоемок, и это мешает мне выполнять этот процесс в мультиселективе (например, если 12358998281 существует в нескольких частях файла, я могу быстро заменить все его экземпляры 99999999999, а не выполнять процесс выше, получить подстановку, скопировать ее в буфер обмена, а затем заменить на это).

Есть ли у Sublime команда, которая действует как «замена» vim, которую я могу связать с чем-то, или мне нужно написать макрос, чтобы получить то, что мне нужно? Или я приближаюсь к этому с совершенно неправильного направления?

Более обобщенное мышление об этом - «как я могу сломать выбор в мультиселекцию на всех персонажах», если это помогает.

+0

Вы используете режим vi в Sublime? – Zach

+0

Нет - это то, что я имею в виду с утверждением: «трудность: нет» «старинный» режим (винтажный режим - это имя для vi-mode) –

+0

Ах да, я думаю, я этого не видел :) – Zach

ответ

0

Я в конечном итоге решить это с помощью простой (если безвкусный) плагин:

import sublime_plugin 
import sublime 


class MultiSelectWithinSelectedCommand(sublime_plugin.TextCommand): 
    def run(self, edit): 
     selection = self.view.sel() 
     new_regions = [] 

     for selected_region in selection: 
      if selected_region.empty(): 
       selection.add(self.view.word(selected_region)) 

     for selected_region in selection: 
      if selected_region.a > selected_region.b: 
       region_begin = selected_region.b 

      else: 
       region_begin = selected_region.a 

      for pos in range(selected_region.size()): 
       subregion_begin = region_begin + pos 
       subregion_end = subregion_begin + 1 
       new_regions.append(sublime.Region(subregion_begin, subregion_end)) 

     selection.clear() 
     selection.add_all(new_regions) 

После того, как я застрял это в моем каталоге плагинов, я бы связать команду в файле раскладки, как обычно:

{ "keys": ["alt+f"], "command": "multi_select_within_selected" } 

(с выбранным alt + f произвольно), и lo, multi-select для всех выбранных символов с нажатием клавиши (после чего я могу нажать на свой заменяющий символ).

+0

Ну, если он делает то, что вы искали, и я уверен, что я не видел ничего, что заменяет всех персонажей в выборе одним персонажем, я думаю, вы должны отпустить его в https://sublime.wbond.net/ для другим людям пользоваться. Но CTRL + B - это комбинация клавиш. По крайней мере, на окнах, так что здесь должно быть что-то другое. По-моему, ALT + F свободен по умолчанию. – SEJBR

+0

Да, ctrl + b это то, что я просто вложил все, что попало мне в голову (я привязал его к комбинации ctrl + k), но ваш выбор alt + f намного лучше. Я, вероятно, буду использовать его в Control Package, если у меня есть версия, которая не слишком ужасна. Спасибо за все входные данные. –

0

С помощью этого пакета https://sublime.wbond.net/packages/RegReplace вы можете создавать шаблоны регулярных выражений и связывать их с ярлыками.

Также, если имеется несколько вхождений одного слова, вы можете поместить курсор на любую часть слова и несколько раз нажать CTRL + D. Одно нажатие CTRL + D выберет слово под курсором, каждое другое нажатие будет выбирать следующее вхождение слова.

Вы также можете использовать https://sublime.wbond.net/packages/Expand%20Selection%20to%20Whitespace, чтобы расширить выделение до пробела, если ваше слово содержит некоторые случайные символы, а затем нажмите CTDL + D, чтобы выбрать следующие вхождения слова.

Редактировать: с ярлыками регулярных выражений пакета действительно вам нужно создать регулярные выражения, прежде чем связывать их. Но CTRL + D работает без него. Я не вижу проблемы с использованием «Expand selection to whitespace», а не CTRL + D, как я писал в ответ.

Я проверил использование визуального, как вы писали в вопросе, и это решение кажется намного быстрее. Вам не нужно указывать курсор в начале слова, поскольку он может быть любым в слове и не требуется найти/заменить, так как вы будете мультиизменить все вхождения, удерживая CTRL + D в течение секунды, и вы будете бесплатно отредактировать его.

Вы также можете использовать https://sublime.wbond.net/packages/Expand%20Selection%20to%20Quotes, чтобы выбрать текст внутри цитаты и объединить его с CTRL + D, если стандартный CTRL + D не работает с каким-либо текстом, или если в пробеле выбрано слишком много текста.

+0

Кажется, что это требует, чтобы замена была определена заранее, что свести на нет любые выгоды от ярлыка для этого типа использования. Я ошибаюсь? –

+0

Отметьте отредактированный ответ, так как он слишком длинный для комментариев. – SEJBR

+0

Я могу быть тупым, но я не вижу, как это оборачивается проблемой, поскольку текст замены все еще должен быть предопределен. В моем примере это «9» - с RegReplace, мне пришлось бы отредактировать команду, чтобы иметь «9» в качестве ее замены, прежде чем я действительно смогу ее использовать. В любом случае, я был в состоянии решить эту проблему, заглянув в API-интерфейс Sublime. –

Смежные вопросы