Questa è una domanda molto interessante, ma non sono sicuro che il tuo approccio suggerito sia il modo migliore! Ho tentato una risposta, ma questa prima iterazione potrebbe non essere perfetta. Suppongo che un ambiente LaTeX sia semplicemente delimitato dai comandi \begin
e \end
(il mio LaTeX è un po 'arrugginito!).
Innanzitutto è necessaria una funzione per restituire l'ambiente alla posizione del cursore.La mia funzione qui sotto salta al precedente comando \begin
, quindi salta al comando corrispondente \end
, calcola se il cursore si trova all'interno di questa regione e continua il processo finché non viene trovato un ambiente contenente. Dovrebbe gestire gli ambienti nidificati. Se non si trova in un ambiente LaTeX, viene restituita una stringa vuota.
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
Ora si può domandare l'ambiente del cursore usando :echo GetTeXEnv()
.
Per modificare il comportamento del tasto =
, è necessario creare un'altra funzione che restituisce &=
nell'ambiente align, e =
altrimenti:
function! TeXEquals()
return GetTeXEnv() =~ 'align\*\?' ? "&=" : "="
endfunction
Quindi è possibile rimappare =
in modalità di inserimento (per i file TeX solo)
autocmd FileType tex inoremap <silent> = <c-r>=TeXEquals()<CR>
Questo sembra funzionare nel mio file LaTeX di esempio. Fammi sapere se trovi qualche problema o hai qualche idea di miglioramento.
fonte
2012-08-06 18:33:10
Ho modificato il titolo per specificare LaTeX, altrimenti questa sarebbe una domanda molto ampia. Il metodo di rilevamento di un ambiente di codice differirà notevolmente da una lingua all'altra. –