Dies ist eine sehr interessante Frage, aber ich bin mir nicht sicher, ob Ihr vorgeschlagener Ansatz der beste Weg ist! Ich habe eine Antwort versucht, aber diese erste Iteration ist vielleicht nicht perfekt. Ich nehme an, dass eine LaTeX-Umgebung einfach durch \begin
und \end
Befehle begrenzt wird (mein LaTeX ist ein bisschen rostig!).
Zuerst benötigen Sie eine Funktion, um die Umgebung der Cursorposition zurückzugeben.Meine nachfolgende Funktion springt zum vorherigen Befehl \begin
, springt dann zum entsprechenden Befehl \end
, berechnet, ob sich der Cursor innerhalb dieser Region befindet, und setzt den Prozess fort, bis eine enthaltende Umgebung gefunden wird. Es sollte verschachtelte Umgebungen handhaben. Wenn nicht in einer LaTeX-Umgebung, wird eine leere Zeichenfolge zurückgegeben.
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
Jetzt können Sie die Umgebung des Cursors :echo GetTeXEnv()
mit erkundigen.
Um das Verhalten des =
Schlüssel zu ändern, benötigen Sie eine andere Funktion zu schaffen, die &=
in der align-Umgebung zurück, und =
anders:
function! TeXEquals()
return GetTeXEnv() =~ 'align\*\?' ? "&=" : "="
endfunction
Dazu =
in Insert-Modus (für TeX-Dateien neu zuordnen können nur)
autocmd FileType tex inoremap <silent> = <c-r>=TeXEquals()<CR>
Dies scheint in meinem Beispiel LaTeX-Datei zu funktionieren. Lassen Sie es mich wissen, wenn Sie Probleme haben oder Ideen für Verbesserungen haben.
Ich habe den Titel bearbeitet, um LaTeX zu spezifizieren, sonst wäre dies eine sehr weite Frage. Die Methode zum Erkennen einer Codeumgebung unterscheidet sich dramatisch von Sprache zu Sprache. –