Как заменить все тот же текст внутри заблокированного текста в vim? - PullRequest
1 голос
/ 29 мая 2020

Как изменить этот код:

    dayHour: {
        sunday: {
          openHour: null,
          closeHour: null,
        },
        monday: {
          openHour: null,
          closeHour: null,
        },
        tuesday: {
          openHour: null,
          closeHour: null,
        },
        wednesday: {
          openHour: null,
          closeHour: null,
        },
        thursday: {
          openHour: null,
          closeHour: null,
        },
        ...
     }

на этот код:

dayHour: {
    sunday: {
      openHour: null,
      closeHour: null,
      openMenu: null,
      closeMenu: null
    },
    monday: {
      openHour: null,
      closeHour: null,
      openMenu: null,
      closeMenu: null
    },
    tuesday: {
      openHour: null,
      closeHour: null,
      openMenu: null,
      closeMenu: null
    },
    wednesday: {
      openHour: null,
      closeHour: null,
      openMenu: null,
      closeMenu: null
    },
    thursday: {
      openHour: null,
      closeHour: null,
      openMenu: null,
      closeMenu: null
    },
    ...
  }

Это то, что я пробовал, я блокирую текст:

openHour: null,
closeHour: null

и я не знаю, что делать дальше, чтобы найти и заменить заблокированный текст. У меня есть несколько вопросов по поиску в Google, но я ничего не нашел и даже не знаю, по какому ключевому слову искать. Спасибо

Ответы [ 3 ]

1 голос
/ 29 мая 2020

Это очень распространенный метод: используйте :global для сопоставления нужных вам строк. Затем команды редактирования могут быть введены, например, с помощью :normal

g/closeHour/normal! oopenMenu: null,^McloseMenu: null

Здесь ^M необходимо ввести как ^V<Enter>

Если ваш замещающий текст уже скопирован в регистр , вы также можете указать это:

g/closeHour/normal! ]p

(примечание: изменение normal! ]p на put возможно, но может потребоваться дополнительное исправление отступов, например ='[).

0 голосов
/ 31 мая 2020

Моя попытка использовать подсовпадение:

/openHour\_.\{-}clos.*

:%s//\=submatch(0) . "\r          " . substitute(submatch(0), 'Hour', 'Menu', 'g')/g

Первый поиск с использованием многострочного поиска (нежадное регулярное выражение) \_.\{-}. Мы можем ссылаться на наш поиск просто по //. После этого мы повторно вставляем наш поиск, используя submatch(0) плюс новую строку с некоторыми пробелами "\r ", затем измененную версию нашего поиска с заменой.

Точка . используется для объединения нашей строки .

Ответ @ matt можно изменить на:

:g/closeHour/exec "normal!oopenMenu: null, \<Enter>closeMenu: null"

Используя двойные кавычки, мы можем использовать нажатия клавиш, такие как \<Enter> вместо classi c ^M, который многие пользователи не понимают, поэтому он более разборчивый. Я считаю второе решение @ matt правильным, его легче набирать и переходить прямо к делу.

Вместо того, чтобы копировать нужный текст в любой регистр, если он уже включен в буфере обмена мы можем указать это с помощью: "+]p, таким образом, это будет:

:g/closeHour/normal! "+]p
0 голосов
/ 29 мая 2020

Вы можете использовать эту команду замены:

:%s/\(openHour: null,\n\s*closeHour: null,\?\)/\1\r      openMenu: null,\r      closeMenu: null/

И вы даже можете скопировать отступ:

:%s/\(\s*\)\(openHour: null,\n\s*closeHour: null,\?\)/\1\2\r\1openMenu: null,\r\1closeMenu: null/

Для получения дополнительной информации см. :help :s. Я также могу объяснить команду, если хотите.

...