Esta es una pregunta muy interesante, pero no estoy seguro de que su enfoque sugerido sea la mejor manera. He intentado una respuesta, pero esta primera iteración puede no ser perfecta. Estoy asumiendo que un entorno LaTeX está simplemente delimitado por los comandos \begin
y \end
(mi LaTeX está un poco oxidado).
Primero necesita una función para devolver el entorno de la posición del cursor.Mi función a continuación salta al comando anterior \begin
, luego salta al comando correspondiente \end
, calcula si el cursor está dentro de esta región y continúa el proceso hasta que se encuentra un entorno que lo contiene. Debe manejar entornos anidados. Si no está en un entorno LaTeX, se devuelve una cadena vacía.
function! GetTeXEnv()
let pos = getpos('.')
let win = winsaveview()
let env = ''
let carry_on = 1
let search_ops = 'bWc'
let b_start = line('.')
while carry_on
keepjumps let b_start = search('\\begin{',search_ops)
let search_ops = 'bW'
" Only accept a match at the cursor position on the
" first cycle, otherwise we wouldn't go anywhere!
let env = matchstr(getline('.'),'\\begin{\zs.\{-}\ze}')
let env_esc = escape(env,'*')
keepjumps let b_end = search('\\end{\s*' . env_esc . '\s*}','Wn')
if b_start == 0
" finished searching; stop
let carry_on = 0
elseif b_end > b_start && b_end < pos[1]
" not inside this env; carry on
let env = ''
elseif b_end > b_start && b_end >= pos[1] && b_start <= pos[1]
" found it; stop
let carry_on = 0
endif
endwhile
call setpos('.',pos)
call winrestview(win)
return env
endfunction
Ahora se puede investigar el entorno del cursor utilizando :echo GetTeXEnv()
.
Para cambiar el comportamiento de la tecla =
, es necesario crear otra función que devuelve &=
en el entorno de alineación, y =
lo contrario:
function! TeXEquals()
return GetTeXEnv() =~ 'align\*\?' ? "&=" : "="
endfunction
A continuación, puede volver a asignar =
en modo de inserción (para archivos TeX solamente)
autocmd FileType tex inoremap <silent> = <c-r>=TeXEquals()<CR>
Esto parece funcionar en mi ejemplo de archivo LaTeX. Avíseme si encuentra algún problema o si tiene alguna idea para mejorar.
He editado el título para especificar LaTeX, de lo contrario, esta sería una pregunta muy amplia. El método para detectar un entorno de código diferirá dramáticamente de un idioma a otro. –