2012-08-06 14 views
6

Vorrei sapere come attivare una determinata azione quando mi trovo in un determinato ambiente durante la scrittura di codice/latex utilizzando vim. Ad esempio, supponiamo che sto scrivendo tex e all'interno dell'ambiente di allineamento, quindi mi piacerebbe che ogni segno di uguale che inserisco fosse convertito in & =.Azione Vim all'interno dell'ambiente LaTeX

Quello che sto pensando ora è piuttosto ingombrante. Questo è pseudo codice per ciò che è nel mio vimrc. Ecco come appare

Shortcut for environment opens start and end tag for align environment (Using imap) 
The above action also initiates a counter variable, sets it to 1 
If counter is 1, every equals sign I enter should be entered as an &=. 
Shortcut to force counter to zero when I move out of the environment. (Using imap) 

Mi piacerebbe sapere se c'è un modo più semplice per aggirare questo. Questo è solo un esempio. L'idea principale qui è che Vim abbia consapevolezza dell'ambiente.

In attesa di suggerimenti.

+0

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

risposta

2

In genere, dopo questo fatto, affronta questo tipo di problema. Ad esempio, lo scrivo con i normali segni = e quindi selezionalo visivamente l'area e utilizzi :s/=/\&=/g. Se vuoi fare più cose all '"ambiente" dopo il fatto puoi creare una funzione e attivare una chiave per eseguirla. Per esempio:

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

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

Tuttavia, credo che la soluzione è migliore nel caso in cui si torna indietro e modificare in un secondo momento. Il file htmlcomplete in vim gestisce questa situazione in questo modo:

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 

Si può vedere come si usa searchpair per determinare se si trova all'interno delle <style></style> tag. Vedere :help searchpair() per ulteriori informazioni.

+0

Ciao, ci scusiamo per il grande ritardo. Ho avuto molto lavoro da fare e sono stato coinvolto. Questo non è proprio quello che stavo cercando. Non voglio cambiare una volta che ho finito con il codice. Voglio che lo sappia mentre sono dentro. Tuttavia, ho imparato molto dalla tua risposta, quindi grazie. – WiFO215

0

Se stai cercando "consapevolezza ambientale" e se con questo intendi "sono in un file in lattice?" è possibile abilitare il comportamento con un autocommand.

Vim riconosce una vasta gamma di tipi di file ed è possibile assicurarsi che il tipo di file che si sta modificando è riconosciuto per default facendo:

:echo &filetype 

Quando si modifica un file Python, ottengo python di conseguenza. Se avete bisogno di questo solo per il lattice e si ottiene una risposta soddisfacente da quella variabile Vim, è possibile impostare un autocommand che utilizza tale, altrimenti è possibile specificare le estensioni in esso, sarebbe simile a questa:

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

Dove il RedPost, NewFile e Invio alcune possibili interazioni Vim che attivano il tuo MyFunction quando le estensioni di file terminano in .text o .latex

Se quello che ha realmente bisogno è qualche esempio di codice che farà quello descrizione stati, allora forse la risposta di Conner è più adatto.

+2

Per "ambiente", il manifesto indica una particolare regione di un file LaTeX determinata dalla sintassi, non dal tipo di file. –

2

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.