乳胶环境中的Vim作用

乳胶环境中的Vim作用,vim,latex,Vim,Latex,我想知道在使用vim编写代码/latex时,在特定环境中如何触发特定操作。例如,假设我在align环境中编写tex,那么我希望输入的每个等号都转换为&= 我现在所想的相当麻烦。这是vimrc中的伪代码。这是它的样子 Shortcut for environment opens start and end tag for align environment (Using imap) The above action also initiates a counter variable, sets i

我想知道在使用vim编写代码/latex时,在特定环境中如何触发特定操作。例如,假设我在align环境中编写tex,那么我希望输入的每个等号都转换为&=

我现在所想的相当麻烦。这是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具有环境意识


期待您的建议。

我通常在事后处理这类问题。例如,我使用普通的
=
符号编写它,然后在区域中直观地选择它,并使用
:s/=/\&=/g
。如果您想在“环境”中执行多个操作,您可以创建一个函数并触发一个键来执行它。例如:

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

function! s:latexAlign() range
  exe ":'<,'>s/=/\&=/g"
  " add more stuff here...
endfunction
vnoremap la:call latexAlign()
功能!s:latexAlign()范围
exe:“如果您正在寻找“环境意识”,并且您的意思是“我在latex文件中吗?”则可以使用
自动命令启用行为

Vim可以识别大量的文件类型,您可以通过执行以下操作确保默认情况下可以识别您正在编辑的文件类型:

:echo &filetype
编辑Python文件时,我得到的结果是
Python
。如果您仅对latex需要此选项,并且从该Vim变量获得满意的响应,您可以设置一个使用该选项的
自动命令
,否则您可以在其中指定扩展名,如下所示:

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
autocmd BufReadPost,BufNewFile,BufEnter *.tex, *.latex call MyFunction()
其中RedPost、NewFile和Enter是一些可能的Vim交互,当文件扩展名以
.text
.latex
结尾时,它们将触发您的
MyFunction


如果您真正需要的是一些代码示例,这些示例将符合您的描述,那么康纳的答案可能更合适。

这是一个非常有趣的问题,但我不确定您建议的方法是否是最好的方法!我尝试了一个答案,但第一次迭代可能并不完美。我假设LaTeX环境简单地用
\begin
\end
命令来分隔数据(我的乳胶有点生锈了!)

首先,您需要一个函数来返回光标位置的环境。下面的“我的函数”跳转到上一个
\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
然后可以在插入模式下重新映射
=
(仅适用于TeX文件)

autocmd文件类型tex inoremap==TeXEquals()

这似乎在我的示例LaTeX文件中起作用。如果您发现任何问题或有任何改进意见,请告诉我。

By“environment”“,海报是指LaTeX文件的特定区域,由语法决定,而不是文件类型。我编辑了标题以指定LaTeX,否则这将是一个非常广泛的问题。检测代码环境的方法因语言而异。您好,很抱歉耽搁了这么久。我有很多工作要做,所以被赶了上来。这不是我想要的。我不想在完成代码后进行更改。我想让它知道我在里面的时候。不过,我从你的回答中学到了很多,所以谢谢。
function! TeXEquals()
    return GetTeXEnv() =~ 'align\*\?' ? "&=" : "="
endfunction
autocmd FileType tex inoremap <silent> = <c-r>=TeXEquals()<CR>