2012-08-06 11 views
6

Ich würde gerne wissen, wie ich eine bestimmte Aktion auslösen könnte, wenn ich in einer bestimmten Umgebung bin, wenn ich Code/Latex mit vim schreibe. Nehmen wir zum Beispiel an, ich schreibe tex und in der align-Umgebung, dann möchte ich, dass jedes eingegebene Gleichheitszeichen in & = konvertiert wird.Vim Aktion in der LaTeX Umgebung

Was ich jetzt denke, ist ziemlich umständlich. Das ist Pseudocode für das, was in meinem vimrc ist. So sieht es aus

Ich würde gerne wissen, ob es einen einfacheren Weg gibt, um dies zu umgehen. Dies ist nur ein Beispiel. Die Hauptidee hier ist für vim, Umweltbewusstsein zu haben.

Wir freuen uns auf Ihre Vorschläge.

+0

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. –

Antwort

2

Ich allgemein angehen diese Art von Problem nach der Tat. Zum Beispiel schreibe ich es mit den normalen = Zeichen und dann wählen Sie es visuell den Bereich und verwenden Sie :s/=/\&=/g. Wenn Sie nachher mehrere Dinge mit der "Umgebung" machen wollen, können Sie eine Funktion erstellen und einen Schlüssel auslösen, um sie auszuführen. Zum Beispiel:

vnoremap <leader>la :call <SID>latexAlign()<cr> 

function! s:latexAlign() range 
    exe ":'<,'>s/=/\&=/g" 
    " add more stuff here... 
endfunction 

Allerdings denke ich, Ihre Lösung ist besser, falls Sie zurück gehen und es später bearbeiten. Die htmlcomplete Datei in vim behandelt diese Situation wie folgt aus:

let stylestart = searchpair('<style\>', '', '<\/style\>', "bnW") 
let styleend = searchpair('<style\>', '', '<\/style\>', "nW") 
if stylestart != 0 && styleend != 0 
    if stylestart <= curline && styleend >= curline 
     let start = col('.') - 1 
     let b:csscompl = 1 
     while start >= 0 && line[start - 1] =~ '\(\k\|-\)' 
     let start -= 1 
     endwhile 
    endif 
endif 

Sie können sehen, wie es verwendet searchpair, um zu bestimmen, ob es innerhalb der <style></style>-Tags ist. Weitere Informationen finden Sie unter :help searchpair().

+0

Hallo, Entschuldigung für die große Verzögerung. Ich hatte viel zu tun und wurde eingeholt. Dies ist nicht ganz das, was ich gesucht habe. Ich möchte nicht ändern, sobald ich mit dem Code fertig bin. Ich will es wissen, während ich drinnen bin. Ich habe jedoch viel von Ihrer Antwort gelernt, also danke. – WiFO215

0

Wenn Sie nach "Umweltbewusstsein" suchen und wenn Sie damit meinen "Bin ich in einer Latex-Datei?" Sie könnten aktivieren Verhalten mit einem autocommand.

Vim erkennt eine Fülle von Dateitypen und Sie können den Dateityp standardmäßig Sie, indem Sie erkannt bearbeiten ist sicher:

:echo &filetype 

Beim Bearbeiten eines Python-Datei, bekomme ich python als Ergebnis. Wenn Sie dies nur für Latex benötigen und Sie erhalten eine zufriedenstellende Antwort von diesem Vim Variable, könnten Sie ein autocommand festlegen, dass verwendet, sonst können Sie die Erweiterungen darin angeben, würde es so aussehen:

autocmd BufReadPost,BufNewFile,BufEnter *.tex, *.latex call MyFunction() 

Wo die RedPost, NewFile und Enter sind einige mögliche Vim-Interaktionen, die Ihre MyFunction, wenn die Dateierweiterungen enden in .text oder .latex

auslösen Wenn das, was brauchen, ist man wirklich einige Codebeispiel, das Ihre Beschreibung heißt es, wird tun, was dann vielleicht Conners Antwort ist besser geeignet.

+2

Mit "Umgebung" bezeichnet das Poster eine bestimmte Region einer LaTeX-Datei, die durch die Syntax und nicht durch den Dateityp bestimmt wird. –

2

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.

Verwandte Themen