在vim中自动在新行插入文本

3

我正在使用vim编辑LaTeX文件。当我在\begin{itemize}环境中时,有没有办法告诉vim在打开新行时自动插入\item

6个回答

6
function CR()
    if searchpair('\\begin{itemize}', '', '\\end{itemize}', '')
        return "\r\\item"
    endif
    return "\r"
endfunction
inoremap <expr><buffer> <CR> CR()

将下面的代码放入你的.vim/ftplugins/tex.vim文件中(或者任何位于.vim/ftplugins/tex目录内的.vim文件):

2

谢谢,这个很好用。虽然我可能有点超前了,但是是否有任何方法可以在自动打开新行时自动添加\item,而不必依赖于alt-I? - Samad Lotia
在vim-latex中,您可以使用“EIT”来启动一个“itemize”环境。vim-latex还提供了其他快捷方式。 - Alok Singhal

1

我黑客了ZyX提供的脚本,得到了这个结果。 它增加了对oO命令的支持。 它不需要LaTeX-VIM。

function AddItem()
  if searchpair('\\begin{itemize}', '', '\\end{itemize}', '')
    return "\\item "
  else
    return ""
  endif
endfunction

inoremap <expr><buffer> <CR> "\r".AddItem()
nnoremap <expr><buffer> o "o".AddItem()
nnoremap <expr><buffer> O "O".AddItem()

另一个修改是 inoremap <expr><buffer> <CR> getline('.') =~ '\item $' ? '<c-w><c-w>' : '<CR>'.AddItem(),如果您按两次<CR>,它会自动删除\item。来自 https://github.com/lervag/vimtex/issues/455 - Hotschke

1

1

我可以按下Ctrl-I,无论是在正常模式还是插入模式下,它都会为我输入。这是我放在我的.vimrc文件中的内容:

:imap <C-i> \item 
:nmap <C-i> o\item 

请注意,在\item的末尾有一个空格。

0

Samad Lotia和ZyX的答案的扩展版本

将此放置在您的~/.vim/after/ftplugin/tex.vim

function! AddItem()
  let [end_lnum, end_col] = searchpairpos('\\begin{', '', '\\end{', 'nW')
  if match(getline(end_lnum), '\(itemize\|enumerate\|description\)') != -1
    return "\\item "
  else
    return ""
  endif
endfunction
inoremap <expr><buffer> <CR> getline('.') =~ '\item $' 
  \ ? '<c-w><c-w>' 
  \ : (col(".") < col("$") ? '<CR>' : '<CR>'.AddItem() )
nnoremap <expr><buffer> o "o".AddItem()
nnoremap <expr><buffer> O "O".AddItem()

改进

  • 自动插入\item也适用于环境enumeratedescription
  • 只有在直接相邻的环境是三个之一(itemize/enumerate/description)时,才会自动插入\item。在以下情况下不会发生
  \begin{itemize}
    \item
       \begin{minipage}
        <CURSOR>
       \end{minipage}
  \end{itemize}
  • 只有在行末才会自动插入\item
  • 通过第二次按下<CR>来删除自动插入的\item。如果想要在这种情况下添加一些缩进,请将'<c-w><c-w>'更改为'<c-w><c-w><c-t>'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接