Для моего редактирования LaTeX в vim я записал несколько полезных макросов и обернул их в функции / команды.У меня есть один, который меняет тип среды Latex, например, когда у меня есть:
\begin{itemize}
\item First
\item Second
\end{itemize}
Я просто ввожу :ChangeEnv enumerate
с курсором где-то в среде, чтобы перейти от itemize к перечислению.
Код в моем ftplugin / tex.vim выглядит следующим образом:
function! ChangeEnv(newenv)
let l:save = @e
let @e = a:newenv
let l:line = getline('.')
" Fake change to restore undo
normal ix
normal x
if match(l:line, '\\begin{') != -1
normal mz_%f{lci}e'zf{l.`z:delma z
else
normal my?\\begin{^M_mz%f{lci}^Re^['zf{l.`y:delma yz
endif
let @e = l:save
endfunction
command -nargs=1 ChangeEnv :silent call ChangeEnv(<f-args>)
Первая часть (после if match(...
), предназначенная, если курсор находится на \begin{...}
части среды, работает отличнопока я могу внести изменение и отменить его, курсор остается там, где и должен.
Вторая часть, предназначенная для внутренней среды, также прекрасно работает, но когда изменение отменено, курсор переходит напервый символ строки \ begin.
Часть normal ix
и normal x
предназначена для того, чтобы гарантировать, что позиция курсора восстанавливается после und (у меня это здесь: Restor Cursor Position )
Мой вопрос: почему он не работает для второго макроса?Есть ли какая-то ошибка?
Чтобы избавить вас от деконструкции макроса, выполните следующие действия:
my
- установите отметку y
в текущей позиции ?\\begin{^M
- поиск назад в начале среды и переходить туда _mz
- перейти к первому символу этой строки и установить z
метку %
- Перейтив соответствие \end{...
окружения (это часть плагина matchit vim, поставляется с vim, но не активна по умолчанию). f{l
- Перейти к {
и на один символ вправо ci}
- Изменить внутренний {...} ^Re^[
- Вставить содержимое регистра e
, в котором сохранено имя нового окружения, и вернуться в обычный режим 'z'
- перейти к началу строки знака z
(\begin{...
) f{l.
- перейти к {
, на один шаг вправо и повторить последнее изменение `y
- перейти к отметке y
, начальная позиция :delma yz
- удалить y
и z
mark
Отмена действий не является нарушением условий сделки, тем не менее, я бы по крайней мере хотел бы знать, почему она так себя ведет.
Заранее спасибо.