2012-08-06 17 views
6

vimを使用してコード/ラテックスを書くときに、特定の環境内にいるときに、どのような動作を引き起こすかを知りたいと思います。たとえば、私がtexを書いていて、環境の中で整列しているとしたら、入力したすべての等号を& =に変換したいと思います。LaTeX環境内のVimアクション

私が今考えていることは、やや面倒です。これは私のvimrcにあるものの擬似コードです。ここに見えるのは

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) 

これを回避する方法があるかどうかを知りたいと思います。これは単なる例です。ここでの主なアイデアは、vimが環境を意識していることです。

あなたのご提案をお待ちしています。

+0

LaTeXを指定するタイトルを編集しました。そうしないと、非常に広い質問になります。コード環境を検出する方法は、言語ごとに劇的に異なります。 –

答えて

2

私は事実の後でこの種の問題に一般的に取り組んでいます。たとえば、普通の=の記号で書いてから、それを視覚的に選択して:s/=/\&=/gを使用します。事実の後に "環境"に複数のことをしたい場合は、関数を作成し、それを実行するキーをトリガーすることができます。例:

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

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

しかし、あなたが戻って後で編集する場合は、あなたの解決策は良いと思います。 vimの中htmlcompleteファイルには、このようなこのような状況を処理します。

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 

あなたはそれが<style></style>タグの内側にあるかどうかを判断するためにsearchpairをどのように使用するかを見ることができます。詳細は、:help searchpair()を参照してください。

+0

こんにちは、大変申し訳ありません。やりたいことがたくさんありました。 これは私が探していたものではありません。一度コードを書き終えば、私は変更したくありません。私が内部にいる間に知りたい。しかし、私はあなたの答えから多くを学んだので、ありがとう。 – WiFO215

0

"環境意識"を探している場合、それが "私はラテックスファイルですか?" の動作をautocommandで有効にすることができます。

Vimは、ファイルの種類の富を認識し、あなたが編集しているファイルの種類を実行して、デフォルトで認識されていることを確認することができます

:echo &filetype 

Pythonのファイルを編集するとき、私は結果としてpythonを取得します。

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

:あなたが唯一のラテックスのためにこれを必要とし、そのVimの変数から満足のいく回答を得た場合、あなたはそれに拡張子を指定することができ、それ以外の場合は次のようになり、という使用autocommandを設定することができますRedPost、NEWFILEと入力しますが、あなたが本当に必要なことは何あなたの説明の状態、そして多分コナーの答えを行いますいくつかのコード例であれば、ファイルの拡張子が.textまたは.latex

で終了したときに、あなたのMyFunctionをトリガーするいくつかの可能なVimの相互作用でありますより適しています。

+2

「環境」とは、LaTeXファイルの特定の領域を意味し、ファイルタイプではありません。 –

2

これは非常に興味深い質問ですが、あなたの提案したアプローチが最良の方法であるかどうかはわかりません。私は答えを試みましたが、この最初の反復は完璧ではないかもしれません。私は、LaTeX環境が\begin\endコマンドで区切られていると仮定しています(私のLaTeXは少し錆びます!)。

まず、カーソル位置の環境を返す関数が必要です。以下の関数は、前の\beginコマンドにジャンプし、一致する\endコマンドにジャンプし、カーソルがこの領域内にあるかどうかを計算し、含まれている環境が見つかるまでプロセスを続行します。ネストされた環境を処理する必要があります。 LaTeX環境にない場合、空の文字列が返されます。

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 

今、あなたは、:echo GetTeXEnv()を使用してカーソルの環境を問い合わせることができます。

=キーの動作を変更するには、そうでない場合は、別のalign環境で &=を返す関数、および =を作成する必要があります。

function! TeXEquals() 
    return GetTeXEnv() =~ 'align\*\?' ? "&=" : "=" 
endfunction 

次にあなたがTeXのファイルに対して挿入モードで=を(再マッピングすることができますのみ)

autocmd FileType tex inoremap <silent> = <c-r>=TeXEquals()<CR> 

これは私の例のLaTeXファイルで動作するようです。何か問題がある場合はお知らせください。改善のためのアイデアがあります。

関連する問題