2013-12-11 2 views
2

Я пытаюсь сделать что-то очень простое в одном слое Ex: Оберните строку HTML в PHP echo.Vim: Заменить всю строку с чем-то

<p>Greetings</p> 
*run command* 
echo "<p>Greetings</p>"; 

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

Я сделал свою работу, используя эту команду

:s/\v(.*)/echo "\1";/g 

Однако это делает поиск Vim для и, следовательно, выдвигают на первый план все, что соответствует. * (= Ничего). Таким образом, весь файл выделен, и я должен вручную очистить последний поиск или найти какой-то мусор, чтобы очистить его.

Итак, подведем итоги: Есть ли существующий заполнитель или способ ссылки на текущую строку во время команды Ex?

+1

, чтобы очистить шаблон поиска впоследствии использовать: nohlrsearch – bjhaid

ответ

4

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

:s/\v(.*)/echo "\1";/g | noh 

Это будет по-прежнему CLOBBER последний шаблон поиска; для полной нейтрализации, использование:

:s/\v(.*)/echo "\1";/g | call histdel('search', -1) | let @/ = histget('search', -1) | nohlsearch 

В качестве альтернативы, вы можете переключиться на функцию нижнего уровня, чтобы избежать согласования:

:call setline('.', 'echo "' . getline('.') . '";') 

PS: Вы можете упростить шаблон поиска; нет необходимости явно что-то захватывать; посмотрите на многие другие ответы, как упростить его.

+0

я перепробовал все решения здесь и ваши единственные, кто Очищает выделение успешно. Также очень интересно посмотреть на некоторые из функций нижнего уровня! Спасибо :) – krystah

+1

Спасибо! Я поражен тем, как много ответов на ваш вопрос привлекает, и как большинство из них упускают из виду. Попробуйте в следующий раз лучше выразить свою проблему (я знаю, что это сложно); кажется, это было не совсем ясно (я тоже должен был прочитать это дважды). –

+0

Я буду помнить об этом! Спасибо, начальник. ^^ – krystah

0

Похоже, что (.*) потребляет все, включая разрывы строк. Попробуйте что-то вроде:

:s/\v(.*)\n/echo "\1";/g 
+1

Я не вижу смысла использовать глобальный флаг здесь;) –

3

это будет делать:

:s/.*/echo "&";/ 
+0

Разве это не совсем короткий способ сделать замену (избегая группы захвата)? Как это избежать, после чего весь текст в буфере согласован? –

+0

Да, & было красивое сокращение для \ 0, по крайней мере, мне нравится =) – krystah

+0

@IngoKarkat О, я пропустил часть 'noh' ... – Kent

0

Да, вы можете обратиться к текущей строке с точкой. Например, «.s/a/b /» заменяет только текущую строку, или «3, .s/a/b /» заменяет все строки между третьим и текущим. Если вы не размещаете линейный диапазон перед «s», то только текущая строка («.») Принимается автоматически.

Но это не ваша проблема. Вим не меняет другие линии, не так ли? Таким образом, замена ограничивается текущей строкой, как и должно быть. Проблема в том, что Vim после поиска шаблона выделяет этот шаблон во всем файле. И вы не можете этого сделать, кроме поиска мусора, как вы предлагаете себя.

0

Я хотел бы использовать ...

:s!.*!echo "&";! 

... для этой работы, так как это красиво и короткие, а потом ...

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

У меня есть следующее отображение в my .vimrc как раз для таких случаев:

nnoremap <Leader>/ :<C-U>nohlsearch<CR> 

Это позволяет мне, чтобы очистить выделение, набрав \/.

См:

0

Держу пари, если вы смотрите в источнике для vim-surround там будет что-то там. Или просто установите этот плагин!

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