我刚刚看到一个关于 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 搜索区分大小写。我们可以通过设置选项ignorecase
(ic
)来覆盖此行为。由于我倾向于使用扩展正则表达式,因此这对我来说不是必需的功能。第二个非常有用的非默认选项是增量搜索。只需设置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 用户最有用)
我喜欢在查看和不查看编译器输出之间“切换”。使用下面的设置,我只需按下即可t在“静默”和“详细”模式之间切换
我喜欢能够选择要使用的编译方法 - 无论是
latex
,,pdflatex
还是等等。我都可以使用- f仅到
latex
主文件 - F使用
latex->dvips->ps2pdf
主文件 - P
pdflatex
在主文件上使用 - F6查看主
pdf
文件(调用evince
) - F4查看主
dvi
文件(调用xdvi
)
- f仅到
选择套件的主文件
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 支持“智能完成”(感知参考书目条目、标签、环境等的上下文),乳胶集成(例如,对文件更改进行持续编译)、折叠等等。请参阅文档。