Як я можу запустити: підміняти лише частину рядка, а не всю її?


15

У мене такий рядок:

function my_function(argument, another argument, but there are spaces)

Я хочу замінити символи пробілу (усередині імен аргументу) на підкреслення. Таким чином, я хотів би використовувати:

:s/\ /_/g

але як я можу вибрати не застосовувати його до всього рядка, а починаючи з, скажімо, положення курсору? (Або третє слово)?


4
У регулярному вираженні для опису поточної позиції курсору можна використовувати атом \%#. Таким чином, ви можете використовувати: :s/\v(%#.*)@<= /_/g. Який може бути описаний як пробіл, який передує @<=символам ( ) після позиції курсору.
user9433424

1
Ви і Statox обидва запропонували \%#трюк, я прийму його відповідь, якщо ви його не напишете ... Але чи могли б ви хтось із вас пояснити реггекс трохи чіткіше?
Феффе

Відповіді:


15

Ви можете використовувати таке рішення:

Спочатку використовуйте v$для вибору тексту від курсору до кінця рядка. Потім використовуйте таку команду:

:s/\%V\ /_/g

\%VВказують на зміну тексту в раніше візуально обраної області, см :h /\%V.

Якщо я візьму ваш приклад:

function my_function(argument, another argument, but there are spaces)

Якщо мій курсор знаходиться на 40-му стовпці, і я використовую команду, яку я щойно написав, я отримую:

function my_function(argument, another argument,_but_there_are_spaces)

У відповідь на ваш коментар ви також можете використовувати

  • \%# що відповідає позиції курсору
  • \%>23c який відповідає після 23-ї колонки.
  • \%>'m яка відповідає після позиції знака

Дивіться :h /\%#, :h /\%>cі :h /\%>'m.

@ User9433424 дав спосіб використовувати \%#у своєму коментарі. Для візерунка з позначкою ви можете встановити його дотепно, maа потім використовувати:

:s/\%>'a /_/g

Пояснення шаблону, наданого @ User9433424, наступне:

:s/\v(%#.*)@<= /_/
:s/                    substitution command
   \v                  Enable the very magic mode
      %#.*             Any characters from the cursor position
           @<=         Check for matches just before what follows
              space    Followed by a space
               /_/     Substitute the matches by underscores

Ви захочете побачити :h \vі:h /\@<=


Це чудово працює! Але я насправді не звик до візуальних виділень і весь процес здається трохи «важким» ... Ви думаєте, що може бути щось швидше?
Feffe

Так, дозвольте мені оновити свою відповідь :)
statox

Користувач9433424 дав цю підказку безпосередньо перед вами, але ви відповіли, тож я прийму вашу відповідь, якщо це нормально - ви могли б пояснити шаблон регулярного вибору, який він використовує трохи більше? Я все ще борюся з цим ...
Feffe

Я намагався зробити відповідь максимально зрозумілою, але якщо @ User9433424 пише свою власну відповідь, не соромтеся її прийняти.
statox

1
Дуже приємне пояснення регулярного вибору, дякую! І дякую за ваш коментар, чию відповідь прийняти :)
Feffe

5

Ви можете скористатися поглядом позаду ( :h \@<=), щоб переконатися, що є попереднє "(", і межа кінця слова ( :h \>), щоб переконатися, що підміна відбувається там, де ви цього хочете.

Отже, з текстом:

function my_function(argument, another argument, but there are spaces)

виконання команди:

:s/\((.*\)\@<=\> /_/g

буде виробляти:

function my_function(argument, another_argument, but_there_are_spaces)

Це може бути простіше, ніж щоразу розміщувати курсор, за умови, що заміна завжди має відому початкову точку.


2
Заміна не завжди має відомий вихідний пункт: це було лише для ... виправлення дивної серії помилок, зроблених мною. Але ваша відповідь все-таки цікава, дякую!
Feffe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.