snipMate

snipMate

我刚刚看到一个关于 Emacs/AUCTeX 的类似问题,所以这个问题就来了。我使用 nvi 进行所有编辑,包括 TeX,它不会改变任何东西。然而,即使使用了近 20 年,我仍然对人们一次又一次向我展示的巧妙技巧感到惊讶。

这是我最喜欢的 nvi 技巧列表(将在接下来的几天内进行编辑和改进):

1)不要忘记使用键映射!还不要忘记,Unix 的全部功能就在您的指尖,因为没有什么比在 nvi 中调用 shell 命令更容易了。这两个想法的结合非常有效。

A)尽管 nvi 没有内置拼写检查器,但这并不意味着我们不能进行拼写检查。实际上,它甚至比大多数“用户友好型编辑器”更简单。这是我见过的最有用的一行.exrc用于 TeX 编辑。

map v :w^M:!ispell %^M:e!^M^M

拼写检查通过按 ESC+v 完成。请注意,喜欢 aspell 而不是 ispell 的人可以输入类似

map v :w^M:!aspell check  %^M:e!^M^M

b)另一个专为 TeX 用户提供的有用的键盘映射。

map ^X :w^M:!make pdf clean %^M^M

它能让你通过按下来发送你最近的编辑Ctrl+Xpdf 查看器上待处理的内容会自动更新。对于 nvi 用户来说几乎是所见即所得。对于想要将其添加到他们的.exrc文件指出 tex-ing 实际上是通过制作实用程序。因此,我的工作目录中确实有我自己的自制 Makefile。Makefile 中描述了目标 pdf 和 clean。

2)nvi 带有相当合理的默认值。然而,精心设计的.exrc可以大大提高编辑效率。这是我的完整.exrc

set autoindent
set autoprint
set cedit=^[
set extended
set file=^[
set number
set ruler
set shiftwidth=4
set showmatch
set showmode
set tabstop=8
set verbose
set wrapmargin=8

map V !}fmt -w 72 ^M
map v :w^M:!ispell %^M:e!^M^M
map ^X :w^M:!make pdf clean-ps %^M^M

可能是最被低估的两个选项,在原版中并不存在编辑器extended选项允许您使用扩展正则表达式(想想egrep)和 cedit=^[^[在详细模式下为 ESC)允许您使用命令历史记录前任模式。

还有另外两个选项我没有.exrc文件,但我发现它非常有用。默认情况下,nvi 搜索区分大小写。我们可以通过设置选项ignorecaseic)来覆盖此行为。由于我倾向于使用扩展正则表达式,因此这对我来说不是必需的功能。第二个非常有用的非默认选项是增量搜索。只需设置searchincr ,您就会看到 nvi 在输入搜索字符串的每个字母时匹配哪些单词。

3)即将使用缩写。

4)缓冲区、标记和类似内容即将推出

5)适合初学者的批量编辑功能即将推出。

编辑:

本次编辑的灵感来自 Stefan Kottwitz 的评论。我最喜欢的 stackexchange 上的 vi/vim 主题是“使用 VIM 时,您最有效的快捷方式是什么?”读到第一个答案“你使用 Vim 的问题在于你不理解 vi”时,我差点从椅子上摔下来。

答案1

免责声明:我通常.tex用 Vim 编辑文件,但我不使用Vim-LaTeX套房。

我不会说以下建议是技巧本身- 它们是由第三方插件提供的 - 但它们实际上帮助我完成了通常的 TeX 工作流程:

snipMate

由 Michael Sanders 创作

来自手册: snipMate.vim旨在成为一个不引人注目的简洁vim脚本,在 Vim 中实现 TextMate 的一些片段功能。片段是一段经常输入的文本,您可以使用触发词后跟 将其插入到文档中<tab>

snipMate它对我帮助很大,主要是因为它提供了多种语言的现成代码片段,包括 TeX。例如,在编辑文件时mydoc.tex,输入

begin<tab>

将扩展为以下形式的环境块

\begin{env}

\end{env}

光标选择单词env。输入环境名称后,<tab>再次点击将光标移至

\begin{env}
   |        
\end{env}

对我来说输入。TeX 的代码片段列表不是很大,但该插件似乎有一个相当简单的语法供我们创建自定义代码片段。以下是用于创建上述代码片段的代码:

# \begin{}...\end{}
snippet begin
\begin{${1:env}}
    ${2}
\end{$1}

到目前为止,一切都很好。

Tabular

由 Matt Wozniski 创建

来自手册:有时,对齐文本很有用。当然,最好让计算机为您完成这项工作,因为手动对齐很快就会变得不愉快。虽然还有其他用于对齐文本的插件,但我尝试过的插件要么难以理解和使用,要么过于简单而无法处理复杂的任务。这个插件旨在让简单的事情变得简单,让困难的事情变得可能,而不会提供不必要的晦涩难懂的界面。它仍在进行中,欢迎批评。

Tabular当我尝试在tabular环境中添加元素时,它对我有很大帮助。它以人类可读的格式组织列。假设我们有以下混乱的条目:

\begin{tabular}{lll}
    Hello world & I love ducks & Vim rocks\\
    Think of a very long entry & How was your day & Quack!
\end{tabular}

这很令人困惑,但Tabular可以帮助我们。我通常进入Visual模式,选择两行,然后发出

:'<,'>Tabularize /&

我们就完成了。新行现在看起来像

\begin{tabular}{lll}
    Hello world                & I love ducks     & Vim rocks\\
    Think of a very long entry & How was your day & Quack!
\end{tabular}

我也可以申请:Tabularize /&,但我更喜欢界定我的范围。 类似的插件Align也可以用于此目的,请参阅我的回答哪个文本编辑器可以使表格脚本更易于阅读

surround

由 Tim Pope 创建

来自手册: Surround.vim都是关于“环境”的:圆括号、方括号、引号、XML 标签等等。该插件提供了映射,可轻松成对删除、更改和添加此类环境。

我通常在编辑其他语言的源代码时使用此插件。假设我将以下文本括在双引号中:

"Hello world"

通过调用cs"',双引号会自动替换为单引号。我决定以不同的方式使用surround,因此我从文档中获取了一个示例并根据我的 TeX 需求进行了调整。首先,我的 中有以下行.vimrc

autocmd FileType tex let b:surround_45 = "``\r''"

请注意,45是的 ASCII 码-。现在我可以简单地调用cs"-我的文本

"Hello world"

变成

``Hello world''

文档中有一些关于 TeX 片段的示例。


对于那些想要尝试我上面列出的插件的人,我强烈推荐使用 awesomepathogen 由 Tim Pope 创建的插件。

来自手册:轻松管理runtimepath。实际上,pathogen.vim可以非常轻松地在自己的私有目录中安装插件和运行时文件。

希望能帮助到你。:)

答案2

我使用过该vim-latex套件,非常喜欢它。不过,我发现以下调整对我编写文档非常有用。

(这些命令对 Linux 用户最有用)

  1. 我喜欢在查看和不查看编译器输出之间“切换”。使用下面的设置,我只需按下即可t在“静默”和“详细”模式之间切换

  2. 我喜欢能够选择要使用的编译方法 - 无论是latex,,pdflatex还是等等。我都可以使用

    • f仅到latex主文件
    • F使用latex->dvips->ps2pdf主文件
    • Ppdflatex在主文件上使用
    • F6查看主pdf文件(调用evince
    • F4查看主dvi文件(调用xdvi
  3. 选择套件的主文件vim-latex需要在当前工作目录中创建一个单独的文件。下面的脚本grep将搜索当前文件%*** mainfilename.tex;如果找不到,则当前文件是主文件;如果找到,则匹配的表达式是主文件

~/.vim/after/ftplugin/tex.vim

" by default make the compile verbose
let g:Myvar="noisy"

" function to compile the mainfile, either verbosely or not
function! CompileMainfile()
    if g:Myvar=="noisy"
    :! MakepdfMainfile.sh %
   else
    "echo "quiet"
    :! MakepdfMainfile.sh % noshow
   endif
endfunction

" latex => dvips => ps2pdf
function! DvipsMainfile()
    if g:Myvar=="noisy"
    :! compileMainfile.sh -d %
   else
    "echo "quiet"
    :! compileMainfile.sh -dq %
   endif
endfunction

" pdflatex
function! PdflatexMainfile()
    if g:Myvar=="noisy"
    :! compileMainfile.sh -p %
   else
    "echo "quiet"
    :! compileMainfile.sh -pq %
   endif
endfunction

" just latex
function! Justlatex()
    if g:Myvar=="noisy"
    :! compileMainfile.sh %
   else
    "echo "quiet"
    :! compileMainfile.sh -q %
   endif
endfunction

" function to toggle between Noisy and Quiet
function! ToggleNQ()
    if g:Myvar=="noisy"
     let g:Myvar="quiet"
     echo "Silent mode ON"
    else
     let g:Myvar="noisy"
     echo "Silent mode OFF"
    endif
endfunction

:map f :w<CR>:call Justlatex()<CR>
:map F :w<CR>:call DvipsMainfile()<CR>
:map P :w<CR>:call PdflatexMainfile()<CR>
:map <F4> :! viewMainDVI.sh %<CR>
:map <F6> :! viewMainPDF.sh %<CR>
:map t :call ToggleNQ() <CR>

/usr/local/bin/compileMainfile.sh

#! /bin/bash
#
# compileMainfile.sh
#
#   December 2011
#
#   Purpose: compile a .tex file either using latex, pdflatex, or
#               latex=> dvips=> ps2pdf, in silent mode or verbose mode
#   examples
#           compileMainfile myfile.tex          # just latex myfile
#           compileMainfile -d myfile.tex       # latex => dvips => ps2pdf
#           compileMainfile -p myfile.tex       # pdflatex myfile
#
#           add the -q flag for SILENT (or quiet) mode
#           compileMainfile -q myfile.tex
#           compileMainfile -qd myfile.tex
#           compileMainfile -qp myfile.tex
#
# See pgs 249 & 250 of BASH COOKBOOK for examples of getopts- really useful!


# argument check
ERROR="Too few arguments : no file name specified"
[[ $# -eq 0 ]] && echo $ERROR && exit  # no args? ... print error and exit

# define functions
function makepdf ()
{
    echo "======================================="
    echo "Main file is $mainFile.tex"
    echo "======================================="
    if [ $quiet -eq 0 ]
    then
        echo "VERBOSE mode on"
        # latex mainFile.tex
        [[ $uselatex -eq 1 ]] && [[ $convertdvips -ne 1 ]] && latex $mainFile
        # latex => dvips => ps2pdf mainFile.tex
        [[ $convertdvips -eq 1 ]] && makepdf.sh $mainFile 1 && echo "DVIPS"
        # pdflatex
        [[ $usepdflatex -eq 1 ]] && pdflatex $mainFile && echo "PDFLATEX"
        egrep 'undefined' $mainFile.log
        egrep 'multiply-defined' $mainFile.log
        egrep '\\end occurred when \\iftrue' $mainFile.log
    else
        echo "SILENT mode on"
        if [ $convertdvips -eq 1 ]
        then
            # latex => dvips => ps2pdf mainFile.tex
            echo "DVIPS"
            nohup makepdf.sh $mainFile 1 &
        elif [ $uselatex -eq 1  ]
        then
            # latex mainFile.tex
            echo "just LaTeX"
            nohup latex $mainFile &
        elif [ $usepdflatex -eq 1 ]
        then
            # pdflatex
            echo "PDFlatex"
            nohup pdflatex $mainFile &
        fi
    fi
}


# set default values of flags
quiet=0
uselatex=1
usepdflatex=0
convertdvips=0

# check flags, and change defaults appropriately
while getopts 'abpqd' OPTION
do
 case $OPTION in 
  q)    quiet=1
   echo "Silent mode ON"
   ;;
  p)    usepdflatex=1
        uselatex=0
   ;;
  d)    convertdvips=1
   ;;
  ?)    printf "Usage: %s: [-a] [-b value] args\n" $(basename $0) >&2
        exit 2
        ;;
 esac 
done

shift $(($OPTIND - 1))

# check we haven't called with -dp 
# which would mean dvips and pdflatex
[[ $usepdflatex -eq 1 ]] && [[ $convertdvips -eq 1 ]] && echo "Option clash: cannot be called with -dp" && exit

# name of MAINFILE
mainFile=$1

# incase we're compiling from within the CHAPTER file
set `grep -F %*** $1 | tr -d "%*" `""
dummy=$1

# delete the file extension
mainFile=${mainFile/%.tex/}
dummy=${dummy/\.*/}

# check the length of the dummy string, if it's 0 then latex the current file
# otherwise latex the referenced latex file
if [ $dummy ]
then
 mainFile=$dummy
fi

# call the makepdf function
makepdf
exit

/usr/local/bin/MakepdfMainfile.sh

#! /bin/bash
#
# December 2011
#
# Purpose:  compile latex->dvips->ps2pdf
#       either silently or verbosely
#
# Options:  noshow
#
# examples: MakepdfMainfile.sh myfile.tex noshow    # silent mode
#       MakepdfMainfile.sh myfile.tex       # verbose mode

# argument check
ERROR="Too few arguments : no file name specified"
[[ $# -eq 0 ]] && echo $ERROR && exit  # no args? ... print error and exit

# assume VERBOSE mode by default
noshow=0
[[ $# -eq 2 ]] && [[ $2 == "noshow" ]] && noshow=1  # otherwise turn on SILENT mode

# name of MAINFILE
mainFile=$1

# incase we're compiling from within the CHAPTER file
set `grep -F %*** $1 | tr -d "%*" `""
dummy=$1

# delete the file extension
mainFile=${mainFile/%.tex/}
dummy=${dummy/\.*/}

# check the length of the dummy string, if it's 0 then latex the current file
# otherwise latex the referenced latex file
if [ $dummy ]
then
 mainFile=$dummy
fi

echo "======================================="
echo "Making PDF : Main file is $mainFile"
echo "======================================="
if [ $noshow -eq 1 ]
then
    echo "SILENT mode on"
    nohup makepdf.sh $mainFile 1 &
else
    echo "VERBOSE mode on"
    makepdf.sh $mainFile 1
    echo "======================================="
    echo "Made PDF : Main file is $mainFile".tex
    echo "======================================="
    egrep 'undefined' $mainFile.log
    egrep 'multiply-defined' $mainFile.log
    egrep '\\end occurred when \\iftrue' $mainFile.log
fi

答案3

表格

我写了很多表格,它们都差不多。我将大部分命令绑定到;word,表格绑定到;tab。它要求输入列数、标题以及是否固定宽度。我当然也使用 Tabularize 插件进行格式化。

function! TableCreator()
        let curline=getline('.')
        call inputsave()
        let cols = input('Enter number of columns: ')
        let caption = input('Caption: ')
        let centering = input('Fixed width? (y/n) :')
        call inputrestore()
        exe "normal a\\begin{table}[!h]\r\\caption{" . caption . "\\label{tab:}}\r\\begin{center}\r\\begin{tabular}{\e"
        let numcols = cols
        while cols > 0
                if centering == 'y'
                        exe "normal ap{4cm}\e"
                else
                        exe "normal ac\e"
                endif
                let cols = cols-1
        endwhile
        exe "normal a}\e"
        let cols = numcols - 1
        exe "normal a\r\r\r\e"
        exe "normal a\\end{tabular}\r\\end{center}\r\\end{table}\\ \\\\"
endfunction

拼写检查

我使用几种不同的语言进行编写,具体取决于我的目标受众。我使用它来方便地在它们之间切换。

" Spell Check
let b:myLang=0
let g:myLangList=["nospell","de","en_gb","en_us"]
function! ToggleSpell()
  let b:myLang=b:myLang+1
  if b:myLang>=len(g:myLangList) | let b:myLang=0 | endif
  if b:myLang==0
    setlocal nospell
  else
    execute "setlocal spell spelllang=".get(g:myLangList, b:myLang)
  endif
  echo "spell checking language:" g:myLangList[b:myLang]
endfunction

答案4

将其保留为与 LaTeX 编辑最相关的插件。

NERD 评论员

作者:Martin Greenfell(又名 scrooloose)

快速注释文本块,自动使用检测到的语言(包括 TeX)的正确注释符号。

它可以在单行模式下使用,

  • \CC将注释掉当前行
  • \CU将取消注释当前行
  • \CSpace将切换当前行的注释状态。

\是默认的领导者“键;您可能对其进行了不同的配置(我个人使用Space)。当然,该命令可以映射到任何想要的,但这些是默认映射。

我也经常(也许更多的通常)在可视多行模式下使用它,先移至第一行,按Shift+V进行可视行选择,再移至最后一行,然后使用上述映射注释整个块。

还有更多可用的功能和命令;请参阅上面链接中的文档。

贡多

经过史蒂夫·洛什

“图形化撤消”。现代 Vim 版本实际上保留了撤消树木在内存中,可以通过g+和直接遍历g-。这可以成为一种“救命稻草”,即使在撤消历史记录中向后走后意外发出输入,也可以挽救文件修改,但使用这些命令遍历树主要是盲目的反复试验过程。

Gundo 打开一个分割,在其中绘制实际的撤消树并让您以图形方式遍历它。这不是我每天都会用到的东西,但当我需要在撤消森林中行走时,它非常有用,尤其是在编写 LaTeX 时。

文德尔

经过格马里克

病原曾经是处理插件的绝对必需品,所有 Vim 用户都应该感谢它。Vundle 是这一概念的一个值得注意的改进,它直接插入 Github 和官方 Vim 脚本目录。

这看起来可能不算什么,但是它允许您保留已安装插件的完整信息~/.vimrc,这使得在机器之间同步设置变得容易得多,并且比使用 Pathogen 更直接地在版本控制中保持所有内容整洁。

更好的彩虹括号

由 kien

此类插件有很多版本。它会将匹配的括号以不同的颜色突出显示。

我没有默认激活它,但有一个映射可以打开和关闭它,以防我在括号和大括号的世界中迷失,这在 LaTeX 中肯定会发生。

LaTeX 盒

我发现,并非只有我一个人发现Vim-LaTeX(又名 LaTeX-suite)在编辑时太重而且干扰性太强。实际上多年来我都默认启用它,但我特意使用的唯一功能是折叠和“智能引号”。另一方面,它的几个功能对我的编辑来说是一个直接且反复的阻碍。

有些人可能喜欢 Vim-LaTeX 方法,但对我来说,LaTeX-Box 轻量级和非侵入式方法更适合,而且它永远不会妨碍我。

LaTeX-Box 支持“智能完成”(感知参考书目条目、标签、环境等的上下文),乳胶集成(例如,对文件更改进行持续编译)、折叠等等。请参阅文档

相关内容