Vim выполняет в функции, ведущие себя по-разному - PullRequest
1 голос
/ 31 августа 2011

Я играю с маленькой функцией 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
  • Выполняет поиск, чтобы найти пробелы
  • Возвращается к исходной строке, если она изменилась

1 Ответ

2 голосов
/ 31 августа 2011

Если вы не хотите перемещать курсор (и никогда не делаете этого), просто установите @/ на правильный шаблон поиска, то есть::1002*

let @/ = '\s\+$'

Примечание: функция должна была переместить курсор.

...