31、Vim实用功能全解析

Vim实用功能全解析

1. TOhtml命令

TOhtml命令比2html.vim脚本更加灵活,因为你可以指定想要转换的精确行范围。例如,要转换缓冲区中第25行到第44行,输入:

:25,44TOhtml

使用gvim进行HTML转换的一个优势在于,其图形用户界面(GUI)能够准确检测颜色,并创建正确对应的HTML指令。虽然这些方法在非GUI环境中仍然有效,但结果的准确性较难保证,实用性可能也不高。

需要你自己管理新创建的文件,Vim只是创建一个缓冲区,不会为你保存文件。建议制定一个管理策略,用于保存和同步文本文件的HTML版本。比如,可以创建一些自动命令来触发HTML文件的创建和保存。

保存后的HTML文件可以在任何Web浏览器中查看。有些人可能不熟悉如何在浏览器中打开本地系统的文件,其实很简单,几乎所有浏览器都在“文件”菜单中提供了“打开文件”选项,点击后会显示文件选择对话框,你可以通过它找到包含HTML文件的文件夹。如果打算经常使用此功能,建议为所有文件建立书签。

2. 文件差异对比(vimdiff)

文件不同版本之间的变化通常很细微,而能让你一眼看清精确差异的工具可以节省大量时间。Vim将著名的Unix diff命令集成到了一个非常强大的可视化界面中,可通过vimdiff命令调用。

有两种等效的方式来调用此功能:
- 作为独立命令:

$ vimdiff old_file new_file
  • 作为Vim的选项:
$ vim -d old_file new_file

通常,第一个要比较的文件是旧版本,第二个是新版本,但这只是一种约定,实际上也可以颠倒顺序。

vimdiff的输出有一些关键特征:
- 在第4行,左侧行有一个右侧行没有的深色块,这是一个高亮显示的单词,表示两行之间存在差异。同样,在第32行,右侧行有一个左侧行没有的高亮单词。
- 在两侧的第11行,Vim创建了一个15行的折叠。因为这两个文件中的这15行是相同的,所以Vim将它们折叠起来,以最大化屏幕上有用的“差异”信息。
- 左侧的第41 - 42行被高亮显示,而在右侧的相应位置,连字符(-)表示这些行缺失。从这一点开始,行号会有所不同,因为右侧少了两行,但两个文件中的对应行仍然水平对齐。

所有类Unix的Vim安装都带有vimdiff功能,因为diff命令是Unix标准。非Unix的Vim安装应该带有Vim自己版本的diff。只要能生成标准的diff输出,Vim允许使用其他diff命令进行替换。

diffexpr变量定义了默认vimdiff行为的替换表达式,通常以脚本的形式实现,该脚本会操作以下变量:
| 变量名 | 说明 |
| ---- | ---- |
| v:fname_in | 要比较的第一个输入文件 |
| v:fname_new | 要比较的第二个文件 |
| v:fname_out | 捕获diff输出的文件 |

3. 撤销操作的进阶(分支撤销)

除了可以随意撤销任意数量的编辑操作外,Vim还提供了一种有趣的功能,称为分支撤销。

要使用此功能,首先要决定对撤销编辑操作的控制程度。可以使用undolevels选项来定义在一个编辑会话中可以撤销的更改数量,默认值是1000,这对大多数用户来说可能已经足够。如果需要与vi兼容,可以将undolevels设置为零:

:set undolevels=0

在vi中,撤销命令u基本上是在文件的当前状态和最近一次更改之间切换。第一次撤销会恢复到最后一次更改之前的状态,下一次撤销则会重新执行被撤销的更改。Vim的行为与此大不相同,因此命令的实现方式也不同。

Vim的撤销命令u不是切换最近一次更改,而是按照最近的更改顺序,将文件状态回滚,回滚的更改数量由undolevels选项定义。由于撤销命令u只能向后移动,所以需要一个命令来向前滚动并“重做”更改。Vim通过redo命令(或CTRL - R键)来实现这一功能,CTRL - R键可以接受一个数字前缀,以便一次重做多个更改。

当使用redo(CTRL - R)和undo(u)命令在更改之间前后滚动时,Vim会维护一个文件状态的映射,并知道何时已经执行了最后一次可能的撤销操作。当所有可能的撤销操作完成后,Vim会重置文件的修改状态,这样就可以不使用!后缀直接退出。虽然这对一般用户交互来说好处不大,但在幕后脚本编写中,当文件的修改状态很重要时,这个功能就更有用了。

对于大多数用户来说,简单地撤销和重做更改就足够了。但考虑一个更复杂的场景,如果你对一个文件进行了七次更改,然后撤销了三次,到目前为止一切正常。但现在,假设在撤销了七次更改中的三次后,你进行了一个与Vim更改记录中下一个向前更改不同的更改,Vim会将更改历史中的这一点定义为一个分支,从该分支会出现不同的更改路径。有了这个路径,你现在可以按时间顺序前后移动,并且在分支点可以沿着任何记录的更改路径向前移动。

如果想了解如何像操作树一样导航更改的更完整描述,可以使用Vim的帮助命令:

:help usr_32.txt
4. 恢复编辑位置

大多数文本编辑器从文件的第1行第1列开始编辑。也就是说,每次启动编辑器时,文件被加载,编辑从第1行开始。如果你多次编辑一个文件并逐步推进,那么从上次编辑结束的位置开始新的编辑会话会更方便,Vim可以实现这一点。

有两种不同的方法可以保存编辑会话信息以供将来使用:viminfo选项和mksession命令。

4.1 viminfo选项

Vim使用viminfo选项来定义保存编辑会话信息的内容、方式和位置。该选项是一个用逗号分隔参数的字符串,它告诉Vim要保存多少信息以及保存的位置。viminfo的一些子选项定义如下:
- <n :告诉Vim为每个寄存器保存最多n行。如果不指定此选项的值,则会保存所有行。但如果你经常编辑非常大的文件并进行大量更改,可能会导致viminfo文件变得非常大,从而在启动Vim时出现长时间延迟。建议指定一个合理且有用的限制,例如50。
- /n :要保存的搜索模式历史记录项的数量。如果未指定,Vim将使用history选项中的值。
- :n :要保存的命令行历史记录中最大命令数量。如果未指定,Vim将使用history选项中的值。
- 'n :Vim维护信息的最大文件数量。如果定义了viminfo选项,此参数是必需的。

Vim在viminfo文件中保存以下内容:
- 命令行历史记录
- 搜索字符串历史记录
- 输入行历史记录
- 寄存器
- 文件标记(例如,通过mx创建的标记会被保存,重新编辑文件时可以通过输入’x移动到该标记位置)
- 最后一次搜索和替换模式
- 缓冲区列表
- 全局变量

这个选项对于在不同编辑会话之间保持连续性非常有用。例如,如果你正在编辑一个大文件并更改一个模式,搜索模式和光标在文件中的位置会被记住。在新会话中继续搜索时,只需输入n即可移动到搜索模式的下一个出现位置。

4.2 mksession命令

Vim使用mksession命令保存特定于会话的所有编辑信息。sessionoptions选项包含一个逗号分隔的字符串,用于指定要保存会话的哪些组件。这种保存编辑会话信息的方式比viminfo更全面,但也更具体。以这种方式保存会话信息特定于当前编辑会话中的所有文件、缓冲区、窗口等,mksession会保存这些信息,以便可以重建整个会话。所有正在编辑的文件以及所有选项的设置,甚至窗口大小都会被保存,重新加载这些信息时可以精确重现会话。相比之下,viminfo只按文件恢复编辑信息。

要以这种方式保存会话,输入:

:mksession [filename]

其中filename指定保存会话信息的文件。Vim会创建一个脚本文件,稍后使用source命令执行该脚本时,就可以重建会话。(如果未指定文件名,默认文件名是Session.vim)。例如,如果你使用以下命令保存会话:

:mksession mysession.vim

之后可以使用以下命令重新建立会话:

:source mysession.vim

可以保存的会话组件及其在sessionoptions选项中的参数如下:
| 参数 | 说明 |
| ---- | ---- |
| blank | 空窗口 |
| buffers | 隐藏和未加载的缓冲区 |
| curdir | 当前目录 |
| folds | 手动创建的折叠、打开/关闭的折叠以及本地折叠选项 |
| globals | 全局变量(以大写字母开头且包含至少一个小写字母) |
| help | 帮助窗口 |
| localoptions | 窗口本地定义的选项 |
| options | 通过:set设置的选项 |
| resize | Vim窗口的大小 |
| sesdir | 会话文件所在的目录 |
| slash | 文件名中的反斜杠替换为正斜杠 |
| tabpages | 所有标签页 |
| unix | Unix行尾格式 |
| winpos | Vim窗口在屏幕上的位置 |
| winsize | 缓冲区窗口在屏幕上的大小 |

例如,如果你想保存一个会话以保留所有缓冲区、所有折叠、全局变量、所有选项、窗口大小和窗口位置的所有信息,可以使用以下命令定义sessionoptions选项:

:set sessionoptions=buffers,folds,globals,options,resize,winpos
5. 长行处理

Vim允许处理几乎无限长度的行。你可以选择让这些行自动换行到多个屏幕行,这样无需水平滚动就能看到整行内容;也可以让每行文本显示在一个屏幕行上,通过向右滚动来查看隐藏部分。

5.1 单行显示模式(nowrap)

如果你希望每行文本只显示在一个屏幕行上,可以关闭wrap选项:

set nowrap

在nowrap模式下,Vim会根据屏幕宽度显示尽可能多的字符。可以将屏幕看作一个视口或窗口,通过它查看宽行内容。例如,一个100字符的行对于80列宽的屏幕来说多了20个字符。Vim会根据屏幕第一列显示的字符,确定100字符行中哪些字符不显示。如果屏幕第一列是该行的第5个字符,那么第1 - 4个字符在可见屏幕左侧,因此不可见;第5 - 84个字符可见;第85 - 100个字符在屏幕右侧,也不可见。

当你在长行中左右移动时,Vim会管理行的显示。Vim会以sidescroll字符数为最小单位左右移动该行。你可以通过以下方式设置其值:

set sidescroll=n

其中n是要滚动的列数。建议将sidescroll设置为1,因为现代PC有足够的处理能力来实现逐列平滑移动屏幕。如果屏幕响应变慢,可以适当增大该值以减少屏幕重绘。

sidescroll值定义了最小移动量。Vim会根据移动命令进行足够的移动。例如,输入w会将光标移动到行中的下一个单词。但Vim对移动的处理有点复杂。如果下一个单词部分可见(在右侧),Vim会移动到该单词的第一个字符,但不会移动该行。下一个w命令会将该行向左移动,直到光标位于下一个单词的第一个字符上,但仅移动到足以显示该第一个字符的位置。

你可以使用sidescrolloff选项控制这种行为。sidescrolloff定义了光标左右两侧要保留的最小列数。例如,如果你将sidescrolloff设置为10,当光标接近屏幕两侧时,Vim会至少保留10个字符的上下文。这样,当你在一行中左右移动时,光标永远不会距离屏幕两侧小于10列,因为Vim会移动足够的文本以保持该上下文。这可能是在nowrap模式下配置Vim的更好方法。

Vim通过listchar选项提供了方便的视觉提示。listchar定义了当Vim的list选项设置时如何显示字符。该选项还提供了两个设置,用于控制是否使用字符来指示长行在可见屏幕左右两侧是否还有更多字符。例如:

set listchars=extends:>
set listchars+=precedes:<

这会告诉Vim,如果长行在可见屏幕左侧还有更多字符,在第一列显示<;如果在右侧还有更多字符,在最后一列显示>。

5.2 换行显示模式(wrap)

如果你希望不滚动就能看到整行内容,可以使用wrap选项让Vim对行进行换行:

set wrap

在wrap模式下,非常长的行如果不能完全显示在屏幕上,会在第一个位置显示单个字符@,直到光标和文件的位置调整到可以完全显示该行。

6. 命令和选项缩写

Vim中有很多命令和选项,建议先按名称学习这些命令和选项。几乎所有命令和选项(至少是那些有多个字符的)都有相关的缩写形式。这些缩写可以节省时间,但在使用时要确保知道自己缩写的是什么,否则可能会得到意想不到的结果。

随着经验的积累,使用一些命令和选项的缩写形式可以节省时间。Vim通常会采用类似Unix的选项缩写方式,并允许使用命令的最短唯一初始子字符串作为缩写。

常见命令的一些缩写如下:
| 缩写 | 完整命令 |
| ---- | ---- |
| n | next |
| prev | previous |
| q | quit |
| se | set |
| w | write |

常见选项的一些缩写如下:
| 缩写 | 完整选项 |
| ---- | ---- |
| ai | autoindent |
| bg | background |
| ff | fileformat |
| ft | filetype |
| ic | ignorecase |
| li | list |
| nu | number |
| sc | showcommand |
| sm | showmatch |
| sw | shiftwidth |
| wm | wrapmargin |

当你对命令和选项非常熟悉时,使用缩写形式可以节省时间。但在脚本编写和使用.vimrc或.gvimrc文件设置会话时,从长远来看,使用完整的命令和选项名称可能更节省时间。使用完整名称时,配置文件和脚本更易于阅读和调试。

7. 实用小技巧

这里介绍几个值得记住和使用的技巧,其中一些基本vi和Vim都提供。

7.1 快速交换字符

常见的打字错误是两个字符输入顺序错误。将光标定位到第一个错误字符上,然后输入xp(删除字符,放置字符)即可交换这两个字符。

7.2 快速交换行

如果你想交换两行,可以将光标定位到上面一行,然后输入ddp(删除行,将行放置在当前行之后)。

7.3 快速获取帮助

不要忘记Vim的内置帮助功能。快速按下F1功能键会将屏幕分割,并显示在线帮助的介绍。

7.4 查找最近执行的命令

在最简单的形式下,你可以在命令行中使用箭头键访问最近执行的命令。使用箭头键上下移动时,Vim会显示最近的命令,你可以对其中任何一个进行编辑。无论是否编辑命令,按下ENTER键即可执行该命令。

你还可以通过在命令行中输入CTRL - F来调用Vim的内置命令历史编辑功能。此时会打开一个小的“命令”窗口(默认高度为7),你可以使用正常的Vim移动命令在其中导航,也可以像在正常的Vim缓冲区中一样进行搜索和更改。

考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值