Ограничение операций разделом кода

10

В моей повседневной работе часто приходится работать с определенной функцией, например с выделением или поиском переменной, но мне никогда не удавалось ограничить область правок / поиска.

Есть ли способ в vim выборочно сказать, найти все ссылки $colorвнутри этих наборов фигурных скобок, или в этом сгибе и т. Д. Если это возможно, было бы идеально, чтобы это было относительно универсально, чтобы его можно было применять к редактированию / замене текста.

Например:

$color = "#fff";
function PickColor () {
  $color = "#bbb";
  $newColors = ["#000", "#fbf", $color];
  foreach ($newColors as $c) {
    if ($c == "#fff") {
       break;
    }
  }
}
$differentColor = $color;

Однако этот код является довольно плохим примером, если бы мне нужно было заменить все экземпляры $ color, как это сделать в контексте функции PickColor. В качестве другого примера, используя #и *Вы можете перейти к следующему экземпляру этого текстового объекта, как бы вы ограничили область поиска только этой функцией (в основном, оборачивая поиск) в противоположность всему файлу, который может охватывать тысячи строк и терять ваше место или неправильно заменяете что-то в другой функции, которой у вас не должно быть?

Кайл Макгилл
источник

Ответы:

15

Вот несколько способов сделать это.

1  | $color = "#fff";
2  | function PickColor () {
3  |     $color = "#bbb";
4  |     $newColors = ["#000", "#fbf", $color];
5  |     foreach ($newColors as $c) {
6  |         if ($c == "#fff") {
7  |             break;
8  |         }
9  |     }
10 | }
11 | $differentColor = $color;

Я изменил ваш пример, чтобы включить номера строк.

Так что теперь вы можете заменить экземпляры $color, скажем $newColor, следующими способами.

Диапазоны номеров строк

:1,11s/\$color/$newColor/g

Это заставляет замену работать в строках 1-11 включительно.

Относительные линейные диапазоны

Поместите курсор в строку 1, затем ...

:.,11s/\$color/$newColor/g

Это говорит о том, что диапазон начинается с текущей строки и заканчивается в строке 11.

Диапазоны визуального выбора

Перейти к строке 1 и нажмите Shift+Vзатем G. Это визуально выбирает строку 1. Затем ...

:'<,'>:s/\$color/$newColor/g

Это ограничивает замену диапазоном, охватываемым вашим выбором. Vim автоматически вставит '<,'>диапазон для вас, когда вы нажимаете :с активным выбором.

Куинси Бауэрс
источник
Я люблю vim, всегда есть чему поучиться и узнать, чтобы сделать жизнь проще и на ежедневной основе :)
Кайл Макгилл
6

Если вам удобно выбрать маршрут для плагинов, есть NrrwRgn .

Вы визуально выбираете блок, а затем запускаете :NRкоманду, которая открывает новый буфер (в разбиении) с выделенным текстом. Вы можете вносить изменения в этот буфер, и когда вы сохраняете его, он также сохраняется в исходном файле.

На мой взгляд, этот плагин очень хорошо решает проблему, позволяя вам сосредоточиться на операциях, которые вы хотите сделать, не задумываясь о том, как применять их к определенному диапазону.

tommcdo
источник
Это один из плагинов, к которому я клянусь ... это как небольшой буфер, который вы можете зафиксировать в своем обычном кодовом файле.
Craigp
3

Вы выбираете интересующий вас блок в режиме визуальной линии (shift + v), а затем вводите :и свою команду, которая теперь будет применяться к блоку.

Так что если вы хотите заменить в выборе, вы можете запустить :s/string/replacement_string

Стефан Дорунга
источник
правильно; например,VaB:s/\$color/replaced/g
wchargin
Только что добавил, хорошая мысль :)
Стефан Дорунга
0

Используйте текстовый объект фигурные скобки '}' и выделите внутри фигурных скобок с помощью 'i}'

на линии с открывающей фигурной скобкой функции:

$<C-V>i}:s/\$color/$newColor/g

сначала перейдите к концу строки (которая будет на или внутри открывающей фигурной скобки), затем перейдите к визуальному выделению, затем выберите с помощью текстового объекта фигурных скобок. «i}» находится внутри фигурных скобок «a}» находится вокруг фигурных скобок.

Для языков, в которых отсутствуют фигурные скобки, Vim Text Object: Definitive Guide предлагает несколько плагинов:

  • Для таких языков, как Python и CoffeeScript, Indent Object предоставляет текстовые объекты на основе уровня отступа: aiвключает текущий уровень отступа и строку выше; iiвключает текущий уровень отступа, исключая строку выше.
  • Ruby Block добавляет поддержку текстовых объектов arи ir, основываясь на наличии endключевого слова.
user50136
источник