Я играю с маленькой функцией Vim, которая подсвечивает пробелы.
Но команда execute
ведет себя не так, как при непосредственном вызове.
Итак, функция выглядит так:
function! ShowWhitespace()
execute "/\\s\\+$"
endfunction
И это отображается как:
command! SW call ShowWhitespace()
Когда выполняется :SW
, он просто ищет и возвращает курсор туда, где есть пробелы.
Однако , когда я делаю это в командной строке:
:exe "/\\s\\+$"
Он правильно выделяет пробелы. Я также проверяю, что highlightsearch
всегда включен, так что это не проблема его включения или выключения.
В качестве примечания, мне нужно иметь это в функции, потому что я хочу, чтобы для гибкости были добавлены другие вещи, которые еще не были добавлены (например, переключение).
Почему это ведет себя иначе в функции, чем ее непосредственное выполнение? Я написал множество функций в Vim и никогда не видел, чтобы эта работа отличалась от других.
РЕДАКТИРОВАТЬ И РЕШЕНИЕ:
Так что, похоже, Vim не любит иметь функции, изменяющие поиск. При выходе из функции шаблоны поиска очищаются (как указано :help function-search-undo
.
Это может выглядеть уродливо, но в первую очередь делает то, что я искал:
command! -bang Ws let orig_line = line('.') | exe ((<bang>0)?":set hls!":":set hls") | exe '/\s\+$' | exe orig_line
Объяснено по крупицам:
- Сопоставляет (принимающую взрыв) команду
Ws
со следующими действиями:
- сохраняет исходную строку, в которой находится курсор
- в зависимости от взрыва или без взрыва (например,
:Ws!
или :Ws
) он устанавливает highlightsearch
- Выполняет поиск, чтобы найти пробелы
- Возвращается к исходной строке, если она изменилась