Как заменить только в рамках визуального отбора?

27

Как же можно получить ВИМ заменить символ в пределах визуального выделения только и не в другом месте на линии? Пример:

  • Линия: int arr[] = { 00 01 02 03 04 05 05 /* ... lots more like this*/};
  • Визуальный отбор: { 00 01 02 03 04 05 05 /*... lots more like this*/}
  • Команда: :'<,'>s/\ /\,0x/g
  • Ожидаемое: int arr[] = {0x00,0x01,0x02,0x03 /* and so on*/};

Однако после выполнения этих действий фактический результат:

int,0xarr[],0x=,0x{0x00,0x01,0x02,0x03 /* and so on*/};

Есть ли способ изменить приведенную выше команду для получения ожидаемого результата? Не '<и '>определить диапазон , на котором поиск (и заменить) команды работают?

Бхаргав Бхат
источник
2
Я не знаю ответа, но я знаю, что :substituteоператоры работают построчно, что объясняет то, что вы видите в своем примере.
Карл Ингве Лервог

Ответы:

32
:'<,'>s/\%V\ /\,0x/g

%Vсовпадает внутри визуальной области. См :help %V.

VenkatH
источник
1
Следует отметить, что это решение только проверяет, что начало матча находится внутри визуального выбора .
Кристиан Брабандт
7

Там \%Vдля этого смотрите :h %V:

\% V

Подходим внутри визуальной области. Когда Визуальный режим уже был остановлен, сопоставьте область, которую gv выбрал бы. Это совпадение с нулевой шириной. Чтобы убедиться, что весь шаблон находится внутри визуальной области, поместите его в начало и конец шаблона , например:> /\%Vfoo.*bar\%V

Чтобы заменить fooтолько barв выборе, используйте:

:'<,'>s/\%Vfoo\%V/bar/
:'<,'>s/\%Vfoo\%V/bar/g
:'<,'>s/\%Vfoo\%V/bar/cg

В этом конкретном случае:

:'<,'>s/\%V\ \%V/\,0x/g
Десерт
источник
4

Если вы хотите заменить внутри визуального блока , вы можете использовать vis.vimплагин .

http://vim.wikia.com/wiki/Applying_substitutes_to_a_visual_block

Установить:

Загрузите файл vis.vba.gz с http://www.drchip.org/astronaut/vim/index.html#VIS.

# Open vis.vba.gz in Vim 7.1 or later.
vim vis.vba.gz

# Source the open file.
:so %

# Quit Vim
:q

После установки:

ctrl-v to enter visual-block mode
Move to select the block you want
:B s/pattern/newtext/

Когда вы печатаете :B, вы увидите это

:'<,'>B 

Это нормально, просто vim говорит, что команда будет применяться к выбранному в данный момент визуальному блоку.

Более того, вы можете выполнять любую команду Ex для визуального блока, а не только для замены. Например :B !sort.

Кристиан Лонг
источник