LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2735|回复: 9

【已解决】请教vim高手,在latex中注释的问题

[复制链接]
发表于 2008-6-13 11:53:01 | 显示全部楼层 |阅读模式
我喜欢使用vim来编辑各种文档。大家都知道,在latex中,以%开都的行都作为注释行出现,被注释的段落字体颜色都是蓝色(这个可以设置)。
但是,如果我要注释一大段,不能在每行的前面加入%,所以我使用
\iffalse
\fi
语句来添加注释,但是这段注释的文字颜色是不变的,这样以来就不能马上看出来那些文字是被注释掉的。

现在我希望 \iffalse ... \fi 之间的段落在vim中显示注释文字的颜色。

请问如何在配置文件中修改?

谢谢。
发表于 2008-6-13 12:09:36 | 显示全部楼层
这很正常啊,\iffalse ... \fi 之间的文本仍然是 LaTeX 代码,尽管它们不会被用来生成最终的文档。这就和 C 中的 if (0) { ... } 是一个道理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-13 17:14:24 | 显示全部楼层
Post by herberteuler;1861268
这很正常啊,\iffalse ... \fi 之间的文本仍然是 LaTeX 代码,尽管它们不会被用来生成最终的文档。这就和 C 中的 if (0) { ... } 是一个道理。


我希望这部分颜色显示为注释文本的颜色。这样可以明显看出来那一段被注释掉了。
回复 支持 反对

使用道具 举报

发表于 2008-6-13 17:26:28 | 显示全部楼层
Post by telekroc;1861365
我希望这部分颜色显示为注释文本的颜色。这样可以明显看出来那一段被注释掉了。


这个我看明白了,但是我有些怀疑这是否可能。如果你了解编辑器的语法高亮是如何工作的话,你就能明白:它是通过对缓冲区中的文件作出各种分析,并根据预先设计好的规则来为文本添加属性的方式来工作的。我想 vim(也包括 Emacs)的开发者在设计这些规则的时候不太可能会考虑到你提到的这种情况(因为不可能执行并非一定意味着注释),如果是这样的话,除非你来做一个 hack,就无法使用预定义的方式来实现它。
回复 支持 反对

使用道具 举报

发表于 2008-6-13 17:43:43 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2008-6-13 18:12:18 | 显示全部楼层
建立 ~/.vim/after/syntax/tex.vim 文件,加入一行

syn region texComment start="^\\iffalse\s*$" end="^\\fi\s*$" contains=@texCommentGroup


目的是把 \iffalse 行到 \fi 行之间的内容全部当成 texComment,具体参见 vim 手册的 syntax 部分和 /usr/share/vim/syntax/vim.tex 。
回复 支持 反对

使用道具 举报

发表于 2008-6-13 18:14:43 | 显示全部楼层
Post by herberteuler;1861368
这个我看明白了,但是我有些怀疑这是否可能。如果你了解编辑器的语法高亮是如何工作的话,你就能明白:它是通过对缓冲区中的文件作出各种分析,并根据预先设计好的规则来为文本添加属性的方式来工作的。我想 vim(也包括 Emacs)的开发者在设计这些规则的时候不太可能会考虑到你提到的这种情况(因为不可能执行并非一定意味着注释),如果是这样的话,除非你来做一个 hack,就无法使用预定义的方式来实现它。

vim/emacs 的语法高亮是可以自己修改的,他并不真正理解你编辑内容的含义,主要通过正则表达式来分析内容。
5. 定义语法 *:syn-define* *E410*

Vim 理解三种语法项目的类型:

1. 关键字
   它只能包含由 'iskeyword' 选项定义的关键字字符,而且不能包含其它语法项目。
   它必须匹配完整的单词 (在匹配的前后不能有其它的关键字字符)。
   关键词 "if" 只在 "if(a=b)" 里匹配,而不在 "ifdef x" 里匹配。因为 "(" 不是关
   键字字符,但 "d" 是。

2. 匹配
   它匹配单个正规表达式模式。

3. 区域
   它始于 "start" 正规表达式模式的匹配,结束于 "end" 正规表达式模式的匹配。两
者之间可以包含任何文本。其中,"skip" 正规表达式模式可以用来避免 "end" 模式的匹
配。

5. Defining a syntax                                        *:syn-define* *E410*

Vim understands three types of syntax items:

1. Keyword
   It can only contain keyword characters, according to the 'iskeyword'
   option.  It cannot contain other syntax items.  It will only match with a
   complete word (there are no keyword characters before or after the match).
   The keyword "if" would match in "if(a=b)", but not in "ifdef x", because
   "(" is not a keyword character and "d" is.

2. Match
   This is a match with a single regexp pattern.

3. Region
   This starts at a match of the "start" regexp pattern and ends with a match
   with the "end" regexp pattern.  Any other text can appear in between.  A
   "skip" regexp pattern can be used to avoid matching the "end" pattern.
回复 支持 反对

使用道具 举报

发表于 2008-6-13 18:21:48 | 显示全部楼层
Post by mozbug;1861380
vim/emacs 的语法高亮是可以自己修改的,他并不真正理解你编辑内容的含义,主要通过正则表达式来分析内容。


是的。我理解的 hack 即修改这些语法设置。而用户设置是类似 :syntax on 这样的设置,即用户在写 :syntax on 时,不必了解在这一个语句背后发生的事情。修改语法的过程要求用户理解实现的细节,从而事实上是 hack。

补充一下,不像 vim,Emacs 中还可以利用一个函数或表达式来完成对特定模式的搜索。这使得模式搜索更加灵活,因为它们甚至可以根据上下文来对满足相同正则表达式的文本作出不同的响应,而在同时仍然保证代码的可读性。
回复 支持 反对

使用道具 举报

发表于 2008-6-13 18:34:07 | 显示全部楼层
Post by mozbug;1861379
建立 ~/.vim/after/syntax/tex.vim 文件,加入一行

syn region texComment start="^\\iffalse\s*$" end="^\\fi\s*$" contains=@texCommentGroup


目的是把 \iffalse 行到 \fi 行之间的内容全部当成 texComment,具体参见 vim 手册的 syntax 部分和 /usr/share/vim/syntax/vim.tex 。


我想你是指 tex.vim。我对 vim 的脚本不是很在行,但我想这样可能更完备一些:

  1. if exists("tex_treat_iffalse_as_comment")
  2.   syn region texComment start="^\\iffalse\s*$" end="^\\fi\s*$" contains=@texCommentGroup
  3. endif
复制代码

这样貌似可以随时打开/关闭这个功能。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-13 19:00:31 | 显示全部楼层
Post by herberteuler;1861387
我想你是指 tex.vim。我对 vim 的脚本不是很在行,但我想这样可能更完备一些:
  1. if exists("tex_treat_iffalse_as_comment")
  2.   syn region texComment start="^\\iffalse\s*$" end="^\\fi\s*$" contains=@texCommentGroup
  3. endif
复制代码
这样貌似可以随时打开/关闭这个功能。

谢谢herberteuler,现在可以工作了。

特别感谢mozbug,提供了思路。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表