Я не могу понять, как установить переменную, равную количеству совпадений в файле.
я пробовал это
let a=execute('%s/<++>//ne')
но это не сработает (выдает эту ошибку:
Error detected while processing function myfunctions#Tab:
line 2:
E523: Not allowed here
). Мне нужна переменная с количеством совпадений для регулярного выражения, и я не могу найти способ использовать функцию execute() с командой замены. (execute('%s/test//ne')
тоже выдает ошибку).
Обновлено: я пытаюсь запустить это внутри функции, которая называется сопоставлением <expr>
. Полное тело функции выглядит следующим образом (управляющие символы вставлены правильно):
function! myfunctions#Tab()
let a=execute('%s/<++>//ne')
if a > 0
return "/<++>^M:noh^Mc4l"
else
return "^I"
endif
endfunction
Цель состоит в том, чтобы вставить вкладку, если шаблон <++> не существует, а если он существует, то найти его и заменить. Я сопоставил это так:
inoremap <expr> <tab> myfunctions#Tab()
Если вы посмотрите на :help E523
, вы увидите, что он находится под опцией 'secure'
, что наводит меня на мысль, что вы пытаетесь выполнить эту операцию где-то, где применяется песочница. Можете ли вы отредактировать вопрос и добавить больше контекста того, где у вас возникли проблемы с этим утверждением?
Пробовал nvim -u NONE
не получилось. @DoktorOSwaldo EDIT: я имею в виду, что это все еще выдавало мне ту же ошибку
Причина, по которой вы сталкиваетесь с этой ошибкой, заключается в том, что функция, вызываемая в сопоставлении <expr>
, ограничена и не может изменять текущий буфер.
Будьте очень осторожны с побочными эффектами! Выражение вычисляется при получении символов, вы вполне можете сделать команду неработоспособной.
По этой причине блокируется:
- Изменение буферного текста textlock.
- Редактирование другого буфера.
- Команда
:normal
.- Перемещение курсора разрешено, но потом восстанавливается.
Что вызывает эту ситуацию, так это ваша команда :s
. Несмотря на то, что вы используете флаг /n
, который не изменяет буфер, команда :s
обычно вносит изменения и поэтому полностью блокируется textlock
.
Если то, что вы пытаетесь сделать, это перейти к следующему <++>
на вкладке, то лучший вариант — использовать функцию search()
, которая переместит ваш курсор к следующему совпадению и вернет номер строки (ненулевой), если совпадение был найден.
Поскольку отображение <expr>
не сохраняет движение курсора, вместо этого вы должны использовать обычное отображение.
Однако это быстро становится сложным... Оказывается, это одно из самых сложных сопоставлений, чтобы сделать правильно...
Но суть в том, что вам нужно временно выйти из режима вставки с помощью CTRL-\ CTRL-O
и вызвать свою функцию. Там вы можете сделать свой search()
. Если поиск совпадает, вам нужно будет вызвать :stopinsert
, чтобы прервать временный выход из режима вставки (по сути, сделав его постоянным). Затем вы можете запустить команду c4l
, но вам нужно сделать это с помощью feedkeys()
, так как в конце она оставит вас в обычном режиме.
Если совпадений нет и вы хотите вставить символ табуляции, вы можете использовать feedkeys()
, чтобы вставить символ табуляции.
Собираем все вместе:
function! myfunctions#Tab()
if search('<++>')
stopinsert
call feedkeys('c4l', 'n')
else
call feedkeys("\t", 'n')
endif
endfunction
inoremap <silent> <Tab> <C-\><C-o>:call myfunctions#Tab()<CR>
На самом деле есть лучший способ определить это сопоставление, используя режим выбора. Я опубликую обновление позже, чтобы решить эту проблему. Но, надеюсь, это уже полезно.
скорее всего из-за плагина. попробуйте то же самое, если вы запускаете vim/nvim с помощью
nvim -u NONE
. (Он работает на моей машине)