Difference between revisions of "Vim (简体中文)"

From ArchWiki
Jump to navigation Jump to search
 
(55 intermediate revisions by 9 users not shown)
Line 1: Line 1:
 
[[Category:Development (简体中文)]]
 
[[Category:Development (简体中文)]]
 
[[Category:Text editors (简体中文)]]
 
[[Category:Text editors (简体中文)]]
[[Category:简体中文]]
+
[[de:Vim]]
 
[[en:Vim]]
 
[[en:Vim]]
 
[[es:Vim]]
 
[[es:Vim]]
[[de:Vim]]
 
 
[[it:Vim]]
 
[[it:Vim]]
 
[[ja:Vim]]
 
[[ja:Vim]]
 
[[lt:Vim]]
 
[[lt:Vim]]
 
[[ru:Vim]]
 
[[ru:Vim]]
[[zh-TW:Vim]]
+
[[zh-hant:Vim]]
{{TranslationStatus (简体中文)|Vim|2014-06-01|212653}}
+
{{Related articles start (简体中文)}}
 +
{{Related|List of applications/Documents#Vi_text_editors}}{{Broken section link}}
 +
{{Related articles end}}
 +
{{TranslationStatus (简体中文)|Vim|2018-3-1|468006}}
 +
[[Wikipedia:Vim_(text_editor)|Vim]]是一个终端文本编辑器。作为[[Wikipedia:Vi|Vi]]的一个扩展版本,它具有以下附加功能:语法突出显示,全面的帮助系统,本地脚本(vimscript),文本选择的可视模式和文件比较(vimdiff)。
 +
 
 +
==安装==
 +
 
 +
[[安装]]下面两个软件包中的一个:
  
[[Wikipedia:Vim_(text_editor)|Vim]]是UNIX文本编辑器[[Wikipedia:Vi|Vi]]的加强版本,拥有额外的功能来帮助编辑代码。一些Vim的增强功能包括比较文件(vimdiff),语法高亮,一个全面的帮助系统,本地脚本(Vimscript),和方便选择的可视化模式。
+
* {{Pkg|vim}} — 提供Python 2/3, Lua, Ruby 和 Perl 解释器支持,但没有 GTK/X 支持
 +
* {{Pkg|gvim}} — 除了提供和{{ic|vim}}一样的功能外,还提供GTK/X支持。
  
Vim专攻全键盘操作,并非如nano或pico一样的简单编辑器,需要耗费大量的时间才能熟练使用。
+
{{注意|
 +
* {{Pkg|vim}}包不包含 [[Xorg]] 支持。具体而言,Vim缺失 {{ic|+clipboard}} 特性,因而不能够使用 ''primary'' 和 ''clipboard'' [[Clipboard|剪贴板]]。{{Pkg|gvim}}同时提供命令行版本带{{ic|+clipboard}}的Vim。
 +
* 非官方源[[Unofficial user repositories#herecura|herecura]]也提供数个Vim/gVim变种版本: {{ic|vim-cli}} {{ic|vim-gvim-common}} {{ic|vim-gvim-gtk}} {{ic|vim-gvim-qt}} {{ic|vim-rt}} 和 {{ic|vim-tiny}}。
 +
}}
  
==安装==
+
==用法==
  
为获得命令行版本,请安装:
+
有关如何使用Vim的基本概述,请遵循vim教程运行'''vimtutor'''(控制台版本)或'''gvimtutor'''(图形界面版本)。
  
* {{Pkg|vim-minimal}}包是一个轻量级版本
+
Vim包含了一个广泛的帮助系统,可以用{{ic|:h ''subject''}}命令来访问。''subject''可以是命令,配置选项,热键绑定,插件等。使用{{ic|:h}}命令(不带任何''subject'')来获取帮助系统的相关信息以及在不同的主题之间切换。
* {{Pkg|vim}}获得Python 2, Lua和Ruby解释支持,但没有GTK/X 支持
 
* {{Pkg|vim-python3}}包比上面的{{ic|vim}}包多了Python 3的解释支持
 
  
为获得图形界面版本,请安装:
+
==配置==
* {{Pkg|gvim}}包提供和{{ic|vim}}一样的功能
 
* {{Pkg|gvim-python3}}包比上面{{ic|gvim}}包的多了Python 3的解释支持
 
  
{{注意|非官方源[[Unofficial user repositories#herecura-stable|herecura-stable]] 也提供许多Vim/gVim变种版本: {{ic|vim-cli}} {{ic|vim-gvim-common}} {{ic|vim-gvim-gtk}} {{ic|vim-gvim-qt}} {{ic|vim-rt vim-tiny}}.}}
+
Vim的用户特定配置文件位于主目录{{ic|~/.vimrc}},当前用户的Vim文件位于{{ic|~/.vim/}};全局配置文件为{{ic|/etc/vimrc}},全局Vim文件位于{{ic|/usr/share/vim/}}
  
==使用==
+
{{注意|常用的功能,如语法高亮在 {{ic|defaults.vim}} 中启用,当没有 {{ic|~.vimrc}} 时加载。将 {{ic|1=skip_defaults_vim=1}} 添加到 {{ic|/etc/vimrc}}以完全禁用加载 {{ic|defaults.vim}}。 [https://github.com/vim/vim/issues/1033]
 +
}}
  
这里只介绍基本的Vim操作。此外,可以使用{{ic|vimtutor}}或{{ic|gvimtutor}}学习这些内容,它大约花费你25至30分钟。
+
===剪贴板===
  
Vim有以下四种模式:
+
Vim命令如 {{ic|:yank}} 或 {{ic|:paste}} 使用未命名寄存器,默认情况下对应于 {{ic|"*}} 寄存器。如果 {{ic|+clipboard}} 功能可用,{{ic|"*}} 寄存器发送到X中的 {{ic|PRIMARY}} 缓冲区。
* 命令模式:键入的内容被解释为命令。
 
* 插入模式:键入的内容被插入文件中。
 
* 可视模式:通过键盘选择、剪切、复制文本。
 
* Ex模式:使用更多命令(例如:存储文件、替换文本等)。
 
  
===简单的文本编辑===
+
要更改默认寄存器,您可以 {{ic|1=:set clipboard=unnamedplus}} 使用 {{ic|"+}} 寄存器。{{ic|"+}} 寄存器对应于X中的 {{ic|CLIPBOARD}} 缓冲区。
  
如果通过以下命令启动Vim:
+
欲见更多信息,请参见 {{ic|:help 'clipboard'}}。
$ vim somefile.txt
 
  
你会看到一个空白文档(假定{{ic|somefile.txt}}不存在,否则会显示其内容)。现在还不能进行编辑,因为Vim处在命令行模式。该模式下可以使用键盘执行Vim命令。
+
{{提示|可以创建复制和粘贴操作的自定义快捷方式。参见例如 [http://superuser.com/a/189198] 用于绑定 {{ic|ctrl + c}},{{ic|ctrl + v}} 和 {{ic|ctrl + x}}。}}
  
{{注意|Vim是典型的'''UNIX风格'''的软件——其学习曲线非常陡峭,但是掌握之后便能体会到其功能之强大。另外要注意,所有命令都区分大小写。某些命令对应的大写版本代表「激进版本」(如{{ic|s}}替换一个字符,{{ic|S}}替换一整行),而有时大小写则是完全不同的命令(如{{ic|j}}代表光标下移,{{ic|J}}代表合并两行)。}}
+
===语法高亮===
  
要插入文本,将光标定位至插入位置(在光标之前),然后按{{ic|i}}进入插入模式。如果用大写({{ic|I}})的命令就会在行首插入内容,{{ic|a}}在光标位置后,{{ic|A}}在行尾。
+
启用语法高亮(Vim支持许多语言的语法高亮):
  
按{{ic|Esc}}即可返回命令行模式。
+
:filetype plugin on
 +
:syntax on
  
===光标移动===
 
  
Vim中的确可以使用方向键移动光标,然而这并非'''Vim的本意'''。如果这么做,你就要把右手从字母区移动到方向键,然后再移动回来,'''太慢了'''。
+
===自动换行显示===
  
在Vim中,以{{ic|h}}左移光标,{{ic|j}}键向下移动光标,{{ic|k}}上移光标,{{ic|l}}右移光标:
+
{{ic|wrap}}默认是开启的,这会使Vim在一行文本的长度超过窗口宽度时,自动将放不下的文本显示到下一行。{{ic|wrap}}只会影响文本的显示,文本本身不会被改变。
{{bc|  k<br>h  l<br>  j}}
 
而{{ic|^}}移动光标至行首,{{ic|$}}则移至行尾。
 
{{注意|{{ic|^}}和{{ic|$}}通常在正则表达式中匹配行首和行尾。正则表达式是一种很强大的工具,在*nix系统中被广泛使用。虽然这些快捷键对你可能有点陌生,但以后你会明白其中的道理。}}
 
  
{{ic|w}}{{ic|W}}键用于跳过一个单词,其区别在于后者认定的单词通常比前者更长(例如:下划线和斜杠都会被认做单词的一部分)。{{ic|b}}{{ic|B}}将光标前移动一个单词,{{ic|e}}和{{ic|E}}用于将光标移至当前单词的末尾,这两个操作区别同上。
+
自动换行显示一般在该行窗口能容纳下的最后一个字符发生,即使刚好是在一个单词的中间。更为智能的自动换行显示可以用{{ic|linebreak}}来控制。当用{{ic|set linebreak}}开启时,自动换行发生在字符串选项{{ic|breakat}}中列出来的字符之后。默认情况下,{{ic|breakat}}包含空格和一些标点符号(参考{{ic|:help breakat}})。
{{ic|(}}将光标移至当前句子的句首,{{ic|)}}至句末。如果需要移动更远的距离,{{ic|{}}可移至段首,{{ic|<nowiki>}</nowiki>}}至段尾。
 
{{ic|H}}将光标移至当前屏幕上显示的第一行,{{ic|M}}至屏幕中央,{{ic|L}}则是至屏幕上的最后一行。{{ic|gg}}将光标移至文件的开始,{{ic|G}}至文件结尾。{{ic|Ctrl+D}},或 {{ic|<C-d>}}可以一屏一屏地翻页。
 
  
===重复命令===
+
被换行的字符一般在下一行的开头开始显示,没有任何相应的缩进。[https://retracile.net/wiki/VimBreakIndent breakindent] 指示Vim在换行时将缩进考虑在内,因而新行将与原本要显示的文本有相同的缩进。{{ic|breakindent}}行为可以用{{ic|breakindentopt}}选项来调整,比如说在Python文件中,新行将在原本缩进的基础上再缩进4个空格(更多细节参考{{ic|:help breakindentopt}}):
  
如果一个命令前缀了数字 ''n'',那么这个命令就会执行 ''n'' 次(有些命令的行为可能有所不同,例如{{ic|s}})。例如,按下{{ic|3i}},输入「Help! 」,然后按下{{ic|Esc}},会输入「Help! Help! Help! 」。{{ic|<nowiki>2}</nowiki>}}将光标后移两个自然段。对下面将要讲到的命令,该技巧十分常用。
+
autocmd FileType python set breakindentopt=shift:4
  
===删除===
+
===使用鼠标===
  
{{ic|x}}命令删除光标所在处的字符,{{ic|X}}删除光标前的字符。使用上面的技巧,{{ic|6x}}会删除6个字符。用{{ic|.}}(半角句号)可以重复前一个命令。所以,假如你有多个「foobar」,但决定将其修改为「foo」,那么,将光标移动至「b」处,键入{{ic|3x}},移动至下一个单词的「b」处,按下{{ic|.}}即可。
+
Vim可以使用鼠标,但只在某些终端上起作用:
 +
*基于[[xterm]]/[[urxvt]]的终端模拟器
 +
*带有{{Pkg|gpm}}的Linux控制台(更多细节请参阅[[Console mouse support]])
 +
*[[PuTTY]]。
  
{{ic|d}}代表你将要删除一些内容,在按下{{ic|d}}之后,你需要继续指定需要删除的内容。这时你可以搭配移动光标的命令。{{ic|dW}}可以删除至下一个单词,{{ic|d^}}可以删至行首。删除命令也可以前缀数字,如{{ic|3dW}}可以删除光标之后的三个单词。大写的{{ic|D}}可以删除至行尾(等同于{{ic|d$}}),{{ic|dd}}可以删除整行。
+
要开启这个功能,将下面这行代码加入{{ic|~/.vimrc}}中:
  
{{ic|cw}}可以删除并替换当前单词,这个命令将删除单词并进入插入模式。{{ic|r}}可以替换单个字符。
+
set mouse=a
  
===撤销与恢复===
+
{{ic|1=mouse=a}} 选项在 {{ic|defaults.vim}} 中设置。
  
Vim内置了剪贴板(也叫缓冲区)。使用{{ic|u}}撤销命令,{{ic|Ctrl+r}}可恢复之前撤销的命令。
+
{{注意| 如果可以访问X服务器,复制/粘贴将使用{{ic|"*}} 寄存器,参见[[#剪贴板|剪贴板]]。按住{{ic|shift key}}键可以使用xterm处理鼠标按钮。}}
  
===可视模式===
+
===跨行移动光标===
  
命令行模式按{{ic|v}}进入可视模式。该模式下通过光标移动选择文本,选取后按 {{ic|y}} 可以把文本提取到缓冲区(即复制),{{ic|c}} 可以剪切。之后可以使用{{ic|p}}在光标后粘贴,{{ic|P}}粘贴在光标前。{{ic|V}}是行选取模式,以行为单位进行选取。{{ic|Ctrl+v}}是块选取模式,可以选取一块矩形区域中的文本。
+
默认情况下,在行首按{{ic|}}或者在行尾按{{ic|}}不能将光标移动至上一行或下一行。
  
{{注意|删除的内容将存储在缓冲区,可以通过粘贴命令提取。}}
+
如要改变默认行为,将{{ic|1=set whichwrap=b,s,<,>,[,]}}加至你的{{ic|~/.vimrc}}文件中。
  
===搜索和替换===
+
==文件合并==
  
在文件中搜索单词或字母的话,按下 {{ic|/}},输入搜索内容,按下回车。{{ic|n}}查找下一处匹配,{{ic|N}}查找上一处。
+
Vim自带了一个文件差异编辑器(一个用来显示多个文件之间的差异还可以方便的将其合并的程序)。用''vimdiff''来启动它——指定所需文件即可:{{ic|vimdiff ''file1'' ''file2''}}。以下是''vimdiff''-specific命令的清单。
  
替换文本需要使用{{ic|:s/}}命令(注意冒号),格式为{{ic|:[范围]s/[原字符串]/[新字符串]/[参数]}}。例如:
 
 
{| class="wikitable"
 
{| class="wikitable"
! 命令 !! 作用
+
! 行为            !! 快捷键
 +
|-
 +
| 下一差异        || {{ic|]c}}
 
|-
 
|-
| :s/xxx/yyy/ || 将当前行中的第一个「xxx」替换为「yyy」
+
| 上一差异        || {{ic|[c}}
 
|-
 
|-
| :s/xxx/yyy/g || 将当前行中的所有「xxx」替换为「yyy」
+
| 差异导入        || {{ic|do}}
 
|-
 
|-
| :s/xxx/yyy/gc || 同上,但每次替换都会询问
+
| 差异导出        || {{ic|dp}}
 
|-
 
|-
| :%s/xxx/yyy/g || 将整个文件中的所有「xxx」替换为「yyy」
+
| 打开折叠        || {{ic|zo}}
|}
+
|-
 
+
| 关闭折叠        || {{ic|zc}}
可以用{{ic|:g/}}命令匹配字符串(注意冒号),并对每个匹配执行同一操作。格式为:{{ic|[范围]:g/[模式串]/[命令]}}。例如:
 
{| class="wikitable"
 
! 命令 !! 作用
 
 
|-
 
|-
| :g/^#/d || 删除所有以「#」打头的行
+
| 重新扫描文件    || {{ic|:diffupdate}}
 
|-
 
|-
| :g/^$/d || 删除所有空行
+
| 窗口切换        || {{ic|Ctrl+w+w}}
 
|}
 
|}
  
===保存和退出===
+
==技巧和建议==
  
要在Ex模式执行保存和退出,Ex模式命令都以{{ic|:}}打头。{{ic|:w}}保存文件,{{ic|:w [文件名]}}可以指定文件名。{{ic|:q}}退出,{{ic|:q!}}放弃修改并退出。{{ic|:x}}保存并退出(等同于{{ic|:wq}})。
+
===显示行号===
  
===其他命令===
+
使用{{ic|:set number}}来显示行号。默认显示绝对行号,可用{{ic|:set relativenumber}}开启相对行号。
  
# {{ic|s}}删除光标处字符并进入插入模式,{{ic|S}}删除当前行并进入插入模式。
+
使用{{ic|:''line number''}} or {{ic|''line number''gg}}跳转到指定行号。跳转都记录在一个跳转列表中,更多细节参考{{ic|:h jump-motions}}
# {{ic|o}}在当前行后插入空行并进入插入模式,{{ic|O}}在当前行前插入空行并进入插入模式。
 
# {{ic|yy}}复制当前行。
 
# {{ic|cc}}删除当前行并进入插入模式。
 
# {{ic|*}}与{{ic|#}}可以搜索当前光标下的单词,后者是向前搜索。
 
  
==配置==
+
===拼写检查===
  
用户配置文件为{{ic|~/.vimrc}},相关的文件位于{{ic|~/.vim/}};全局配置文件为{{ic|/etc/vimrc}},相关的文件位于{{ic|/usr/share/vim/}}。
+
Vim有拼写检查的功能,用下面的命令开启:
  
Arch Linux默认的Vim全局配置十分简陋,与其它发行版的默认配置文件并不相同。如果需要常用的功能(如语法高亮、打开文件时回到上一次的光标位置等),可以使用配置文件范例替换之:
+
set spell
  
# mv /etc/vimrc /etc/vimrc.bak
+
Vim默认只安装了英语字典。更多字典可以通过搜索vim-spell在[[Official repositories (简体中文)|官方软件仓库]]中找到。其他字典可以在[http://ftp.vim.org/vim/runtime/spell/ Vim的FTP archive]中找到。把下载的字典文件存入{{ic|~/.vim/spell/}}中,并使用以下命令启用:{{ic|1=:setlocal spell spelllang=''en_us''}}(将{{ic|''en_us''}} 换成所需的字典的名称)。
# cp /usr/share/vim/vim74/vimrc_example.vim /etc/vimrc
 
  
===文件备份===
 
  
编辑文件后,Vim默认会在文件所在目录建立名为{{ic|文件名~}}的备份文件。为避免备份文件弄乱文件夹,许多用户在配置文件中加入下面内容,使Vim在指定文件夹生成备份:
+
{| class="wikitable"
 +
! 行为                          !! 快捷键
 +
|-
 +
| 下一个拼写错误                || {{ic|]s}}
 +
|-
 +
| 上一个拼写错误                || {{ic|[s}}
 +
|-
 +
| 拼写纠正建议                  || {{ic|1=z=}}
 +
|-
 +
| 拼写正确,添加到用户正确字典      || {{ic|zg}}
 +
|-
 +
| 在会话中当作正确拼写      || {{ic|zG}}
 +
|-
 +
| 拼写错误,添加到用户错误字典      || {{ic|zw}}
 +
|-
 +
| 在会话中当作正确拼写      || {{ic|zW}}
 +
|-
 +
| 重新进行拼写检查              || {{ic|:spellr}}
 +
|}
  
  set backupdir=~/.vim/backup,/tmp
+
{{小贴士|
 +
* 如果需要针对两种语言进行拼写检查(例如英语与德语),在{{ic|~/.vimrc}}或{{ic|/etc/vimrc}}中添加{{ic|1=set spelllang=''en,de''}}并重启Vim即可。
 +
* 您可以通过使用FileType插件和用于文件类型检测的自定义规则,为任意文件类型(例如''.txt'')启用拼写检查。 要对以''.txt''结尾的任何文件启用拼写检查,请创建文件 {{ic|/usr/share/vim/vimfiles/ftdetect/plaintext.vim}},并将 {{ic|autocmd BufRead,BufNewFile *.txt setfiletype plaintext}} 插入该文件。接下来,将 {{ic|1=autocmd FileType plaintext setlocal spell spelllang=''en_us''}} 插入到{{ic|~/.vimrc}} 或 {{ic|/etc/vimrc}} 中,然后重新启动Vim。
  
也有人选择直接关闭该功能:
+
* 如果想只对LaTeX(或TeX)文档起用拼写检查,在{{ic|~/.vimrc}}或{{ic|/etc/vimrc}}添加{{ic|1=autocmd FileType '''tex''' setlocal spell spelllang=''en_us''}},重启Vim即可。至于非英语语言,替换上述语句中的{{ic|en_us}}为相应语言代码即可。}}
  
set nobackup
+
===记录光标位置===
set nowritebackup
 
set noswapfile    ! (additionally disable swap files)
 
  
===环绕搜索===
+
Vim可以记录上次打开某一文件时的光标位置,并在下次打开同一文件时将光标移动到该位置。要开启该功能,在配置文件{{ic|~/.vimrc}}中加入以下内容:
  
环绕搜索的意思是,搜索字符串时,从光标处向下搜索到文件尾后,返回文件头继续搜索(反之,向上搜索到文件头后,返回末尾搜索)。开启的命令为:
+
augroup resCur
 +
  autocmd!
 +
  autocmd BufReadPost * call setpos(".", getpos("'\""))
 +
augroup END
  
set wrapscan
+
===用 vim 替代 vi===
  
===拼写检查===
+
创建一个[[alias]],如下:
  
set spell
+
{{bc|1=alias vi=vim}}
  
设置后Vim会高亮拼写错误的单词。将光标移至错误单词,输入{{ic|1=z=}}查看建议拼写。
+
或者,如果你想输入{{ic|sudo vi}}而得到{{ic|vim}},安装{{AUR|vi-vim-symlink}},它将移除{{ic|vi}}并用一个符号链接{{ic|vim}}代替。
  
Vim默认只安装了英语字典,其他字典需要从[[Official repositories (简体中文)|官方软件仓库]]安装。检查可用语言包:
+
=== DOS/Windows回车问题 ===
  
# pacman -Ss vim-spell
+
打开MS-DOS或Windows下创建的文本文件时,经常会在每行行末出现一个{{ic|^M}}。这是因为Linux使用Unix风格的换行,用一个换行符(LF)来表示一行的结束,但在Windows、MS-DOS中使用一个回车符(CR)接一个换行符(LF)来表示,因而回车符就显示为{{ic|^M}}。
  
此外,还可以从[http://ftp.vim.org/vim/runtime/spell/ Vim FTP archive]获取字典。把下载的字典文件存入{{ic|~/.vim/spell}},然后将以下内容加入配置文件:{{ic|:setlocal spell spelllang<nowiki>=</nowiki>LL}}
+
可使用下面的命令删除文件中的回车符:
  
{{小贴士|
+
:%s/^M//g
* 如果想只对LaTeX(或TeX)文档起用拼写检查,在{{ic|~/.vimrc}}或{{ic|/etc/vimrc}}添加{{ic|autocmd FileType tex setlocal spell spelllang<nowiki>=</nowiki>en_us}},重启Vim即可。至于非英语语言,替换上述语句中的{{ic|en_us}}为相应语言代码即可。
 
* 如果需要针对两种语言进行拼写检察(例如英语与德语),在{{ic|~/.vimrc}}或{{ic|/etc/vimrc}}中添加{{ic|1=set spelllang=en,de}}并重启Vim即可。
 
* 利用FileType插件和自建规则,可以对任意文件类型开启拼写检查。例如,要开启对扩展名为{{ic|.txt}}的文件的拼写检查,创建文件{{ic|/usr/share/vim/vimfiles/ftdetect/plaintext.vim}},添加内容{{ic|autocmd BufRead,BufNewFile *.txt    setfiletype plaintext}},然后在{{ic|~/.vimrc}}或{{ic|/etc/vimrc}}添加{{ic|autocmd FileType plaintext setlocal spell spelllang<nowiki>=</nowiki>en_us}},重启vim即可。}}
 
  
===代码高亮===
+
注意,{{ic|^}}代表控制字符。输入{{ic|^M}}的方法是按下{{ic|Ctrl+v,Ctrl+m}}。
  
Vim支持许多语言的代码高亮:
+
另一个解决方法是,安装 {{pkg|dos2unix}},然后执行 {{ic|dos2unix <文件名>}}。
  
:filetype plugin on
+
{{注意| 另一个简单的方法是更改 {{ic|fileformat}} 设置。 {{ic|<nowiki>set ff=unix</nowiki>}} 以转化DOS/Windows行尾为Unix行尾。要做到相反,只要 {{ic|<nowiki>set ff=dos</nowiki>}},就可以将Unix行尾转换成DOS/Windows行尾。}}
:syntax on
 
  
===使用鼠标===
+
===gVim窗口底部的空格===
 +
如果[[window manager (简体中文)|窗口管理器]]设置为忽略窗口大小提示,gVim会将非功能区域填充为GTK主题背景色。
  
Vim可以使用鼠标:
+
解决方案是调整gVim在窗口底部保留的空间大小。将下面的代码加入 {{ic|~/.vimrc}}中:
  
  set mouse=a
+
  set guiheadroom=0
  
{{注意|
+
{{注意|如果将其设为0,将无法看到底部的水平滚动条。}}
* 这个方法在PuTTY中同样适用。
 
* 在PuTTY中,通常的高亮/复制行为有所不同,因为在使用鼠标时,Vim会进入可视模式。为了用能鼠标选中文本,需要同时按住{{ic|Shift}}键。
 
}}
 
  
===跨行移动光标===
+
== 插件 ==
  
默认情况下,在行首按{{ic|←}}或者在行尾按{{ic|→}}不能将光标移动至上一行或下一行。如果需要修改的话:
+
向Vim添加插件可以提高您的效率。 插件可以改变Vim的界面,添加新命令,代码完成支持,使用Vim集成其他程序和实用程序,添加对其他语言的支持等等。
  
set whichwrap=b,s,<,>,[,]
+
{{小贴士|有关常用插件的列表,请参阅 [http://vimawesome.com/ Vim Awesome]}}
  
===vimrc范例===
+
=== 安装 ===
  
一个配置文件范例:[[Vim/.vimrc]]。
+
==== 使用内置包管理器 ====
更多范例参见[[#其他资源]]。
 
  
==文件合并(Vimdiff)==
+
Vim 8增加了加载原生第三方插件的可能性。可以通过在〜/.vim/pack/foo中存储第三方软件包来使用此功能。
  
Vim自带了一个文件差异编辑器(diff,用来合并文件差异的工具)。vimdiff可以打开多个窗口显示不同文件,按行高亮其差异。这时你只有两个模式:插入模式用以编辑文件,或者屏幕模式切换不同的窗口或行。从终端中调用它的命令为:{{ic|vimdiff 文件1 文件2}}。基本操作:
+
==== 使用插件管理器 ====
  
{| class="wikitable"
+
插件管理器允许以类似的方式安装和管理插件,而与在何种平台上运行Vim无关。它本身是一个插件,其功能是作为其他Vim插件包管理器。
!快捷键                              !!行为说明
 
|-
 
|{{ic|]c}}                          ||下一差异
 
|-
 
|{{ic|[c}}                          ||上一差异
 
|-
 
|{{ic|Ctrl+w+w}}                    ||切换窗口
 
|-
 
|{{ic|i}}                            ||进入插入模式
 
|-
 
|{{ic|Esc}}                          ||退出插入模式
 
|-
 
|{{ic|p}}                            ||粘贴一整行
 
|-
 
|{{ic|do}}                          ||差异导入(修改当前窗口的文件)
 
|-
 
|{{ic|dp}}                          ||差异导出(修改另一个文件)
 
|-
 
|{{ic|zo}}                          ||展开文本
 
|-
 
|{{ic|zc}}                          ||折叠文本
 
|-
 
|{{ic|<nowiki>:</nowiki>diffupdate}} ||重新检查文件差异
 
|-
 
|{{ic|yy}}                          ||复制一整行
 
|-
 
|{{ic|:wq}}                          ||保存并退出当前窗口
 
|-
 
|{{ic|:wqa}}                        ||保存并退出所有窗口
 
|-
 
|{{ic|:q!}}                          ||不保存退出
 
|}
 
  
编辑完成之后重命名:
+
* [https://github.com/gmarik/Vundle.vim Vundle]是现在最流行的Vim插件管理器。
mv file file.bck
+
* [https://github.com/junegunn/vim-plug Vim-plug]是一个极简的Vim插件管理器,有许多的特性,比如按需插件加载和并行升级。
mv file.pacnew file
+
* [https://github.com/tpope/vim-pathogen pathogen.vim]是一个简单的用于管理Vim的runtimepath的插件。
检察新文件是否正确,然后删除备份:
+
* [https://github.com/Shougo/dein.vim Dein.vim] 是一个替代 [https://github.com/Shougo/neobundle.vim NeoBundle] 的插件管理器,可以在这里找到 {{AUR|vim-dein-git}}.
rm file.bck
 
  
==Vim 建议==
+
==== 使用Arch软件库 ====
  
一些实用技巧。
+
{{Grp|vim-plugins}}分类下有许多插件。 使用{{ic|pacman -Sg vim-plugins}}来列出可用的插件,然后你可用pacman[[安装]]。
  
===显示行号===
+
=== cscope ===
  
# 使用{{ic|:set number}}显示行号。
+
[http://cscope.sourceforge.net/ Cscope]是用于浏览项目的工具。 通过导航到字/符号/函数并调用cscope(通常使用快捷键),它可以找到:调用函数的函数,函数定义等等。
# 使用{{ic|:set relativenumber}}显示相对行号。
 
# 使用{{ic|:<行号>G}}跳到指定行。
 
  
===跨行替换===
+
[[安装]]{{Pkg|cscope}}包。
  
下面的命令可以替换特定行中的内容:
+
将cscope默认文件复制到Vim将自动读取的位置:
  
  :''n'',''n''s/one/two/g
+
  mkdir -p ~/.vim/plugin
 +
wget -P ~/.vim/plugin http://cscope.sourceforge.net/cscope_maps.vim
  
例如,替换3、4两行中的'one'为'two':
+
{{注意|在Vim的7.x版本中,你可能需要在{{ic|~/.vim/plugin/cscope_maps.vim}}中取消下列行的注释来启用cscope快捷键:
 +
{{bc|1=
 +
set timeoutlen=4000
 +
set ttimeout
 +
}}}}
  
:3,4s/one/two/g
+
创建一个文件,该文件包含了你希望cscope索引的文件的清单(cscope可以操作很多语言,下面的例子用于寻找C++中的''.c''、''.cpp''和''.h''文件):
  
===记录光标位置===
+
cd ''/path/to/projectfolder/''
 +
find . -type f -print | grep -E '\.(c(pp)?|h)$' > cscope.files
  
Vim可以记录上次打开某一文件时的光标位置,并在下次打开同一文件时将光标移动到该位置。要开启该功能,在配置文件{{ic|~/.vimrc}}中加入以下内容:
+
创建cscope将读取的数据文件:
  
<pre>
+
cscope -bq
if has("autocmd")
 
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
 
endif
 
</pre>
 
  
另见:[http://vim.wikia.com/wiki/Restore_cursor_to_file_position_in_previous_editing_session Vim Wiki上的相关内容]。
+
{{注意|必须从当前路径浏览工程文件,也可以设置{{ic|$CSCOPE_DB}}变量指向{{ic|cscope.out}}文件,并导出。}}
  
===GVim窗口底部的空格===
+
默认快捷键:
如果[[window manager (简体中文)|窗口管理器]]设置为忽略窗口大小渲染窗口,GVim会将空白区域填充为GTK主题背景色,看起来会比较难看。
 
  
一个解决方法是通过 {{ic|.vimrc}} 禁用菜单栏,这样 gvim 窗口就能正常显示,填充整个空间:
+
  Ctrl-\ and
set go-=m "remove menubar
+
      c: Find functions calling this function
 +
      d: Find functions called by this function
 +
      e: Find this egrep pattern
 +
      f: Find this file
 +
      g: Find this definition
 +
      i: Find files #including this file
 +
      s: Find this C symbol
 +
      t: Find assignments to
  
解决办法是手动设置背景色。将以下内容加入{{ic|~/.gtkrc-2.0}}:
+
可随意改变这些快捷键。
  
style "vimfix" {
+
==== Taglist ====
  bg[NORMAL] = "#242424" # GVim Normal主题的背景色
 
}
 
widget "vim-main-window.*GtkForm" style "vimfix"
 
  
===用 vim 替代 vi===
+
[http://vim-taglist.sourceforge.net/ Taglist]提供源码文件的结构概览,使你能更高效的浏览不同语言的源文件。
  
{{bc|1=alias vi=vim}}
+
[[安装]]{{Pkg|vim-taglist}}包。
  
==疑难解答==
+
将下列设置添入文件{{ic|~/.vimrc}}:
  
===行末的"^M"===
+
let Tlist_Compact_Format = 1
打开MS-DOS或Windows下创建的文本文件时,经常会在每行行末出现一个「^M」。这时由于MS-DOS/Windows换行符与UNIX的不同导致的。
+
let Tlist_GainFocus_On_ToggleOpen = 1
 +
let Tlist_Close_On_Select = 1
 +
nnoremap <C-l> :TlistToggle<CR>
  
解决方案:
+
== 参阅 ==
使用下列命令替换掉「^M」:
 
 
 
{{bc|:%s/^M//g}}
 
 
 
注意,「^」代表控制字符。输入「^M」的方法是:{{ic|Ctrl+Q}}
 
 
 
另一个方法是,安装 {{pkg|dos2unix}},然后执行 {{ic|dos2unix <文件名>}}。
 
 
 
==其他资源==
 
  
 
=== 官方资源 ===
 
=== 官方资源 ===
Line 312: Line 282:
 
* [http://www.vim.org/ Vim主页]
 
* [http://www.vim.org/ Vim主页]
 
* [http://vimdoc.sourceforge.net/ Vim文档]
 
* [http://vimdoc.sourceforge.net/ Vim文档]
* [http://vim.wikia.com Vim Tips Wiki@wikia]
+
* [http://vim.wikia.com Vim Wiki]
 +
* [http://www.vim.org/scripts/ Vim脚本]
  
 
=== 教程 ===
 
=== 教程 ===
Line 318: Line 289:
 
* [http://www.swaroopch.com/notes/Vim_zh-cn 中文版《A Byte of Vim》]
 
* [http://www.swaroopch.com/notes/Vim_zh-cn 中文版《A Byte of Vim》]
 
* [http://usalug.org/vi.html vi教程和参考指南]
 
* [http://usalug.org/vi.html vi教程和参考指南]
* [http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html vi-vim图片作弊条]
+
* [https://www.danielmiessler.com/study/vim/ vim Tutorial and Primer]
* [http://vimcasts.org/ Vimcasts] - ogg格式的视频教程
+
* [http://usalug.org/vi.html vi Tutorial and Reference Guide]
* [http://www.derekwyatt.org/vim/vim-tutorial-videos/vim-novice-tutorial-videos/ 教学视频] - 从入门到精通,各种视频教程
+
* [http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html Graphical vi-Vim Cheat Sheet and Tutorial]
* [http://blog.interlinked.org/tutorials/vim_tutorial.html Vim的介绍和教程]
+
* [http://blog.interlinked.org/tutorials/vim_tutorial.html Vim Introduction and Tutorial]
 +
* [http://www.openvim.com/ Open Vim] - Vim教学工具集合
 +
* [http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/ Learn Vim Progressively]
 +
* [http://benmccormick.org/learning-vim-in-2014/ Learning Vim in 2014]
 +
* [http://www.moolenaar.net/habits.html Seven habits of effective text editing]
 +
* [http://bencrowder.net/files/vim-fu/ Basic Vim Tips]
 +
 
 +
==== 视频 ====
 +
 
 +
* [http://vimcasts.org/ Vimcasts] - ogg格式的视频教程。
 +
* [http://derekwyatt.org/vim/tutorials/ Vim Tutorial Videos] - 从入门到精通,各种视频教程
 +
 
 +
==== 游戏 ====
 +
 
 +
* [http://vim-adventures.com/ Vim Adventures]
 +
* [http://vimgolf.com/ VimGolf]
  
 
=== 配置范例 ===
 
=== 配置范例 ===
Line 328: Line 314:
 
* [http://amix.dk/vim/vimrc.html A detailed configuration from Amir Salihefendic]
 
* [http://amix.dk/vim/vimrc.html A detailed configuration from Amir Salihefendic]
 
* [http://www.jukie.net/~bart/conf/vimrc Bart Trojanowski]
 
* [http://www.jukie.net/~bart/conf/vimrc Bart Trojanowski]
 +
* [https://github.com/spf13/spf13-vim Steve Francia's Vim Distribution]
 +
* [https://github.com/W4RH4WK/dotVim W4RH4WK's Vim configuration]
 +
* [https://www.askapache.com/linux/fast-vimrc/ Fast vimrc/colorscheme from askapache]
 +
* [https://gist.github.com/anonymous/c966c0757f62b451bffa Basic .vimrc]
 +
* [http://www.usevim.com/ Usevim]
  
=== 其他 ===
+
==== 颜色方案 ====
  
* [http://www.gentoo-wiki.info/HOWTO_VIM HOWTO Vim] -- Gentoo Wiki的Vim介绍,本文基于该文修改而来。
+
* [http://bytefluent.com/vivify/ Vivify]
* [http://bytefluent.com/vivify/ Vivify] - Vim 颜色编辑器 ColorScheme Editor for Vim
+
* [https://linuxtidbits.wordpress.com/2014/10/14/vim-customize-installed-colorschemes/ Vim colorscheme customization]

Latest revision as of 06:10, 18 February 2019

翻译状态: 本文是英文页面 Vim翻译,最后翻译时间:2018-3-1,点击这里可以查看翻译后英文页面的改动。

Vim是一个终端文本编辑器。作为Vi的一个扩展版本,它具有以下附加功能:语法突出显示,全面的帮助系统,本地脚本(vimscript),文本选择的可视模式和文件比较(vimdiff)。

安装

安装下面两个软件包中的一个:

  • vim — 提供Python 2/3, Lua, Ruby 和 Perl 解释器支持,但没有 GTK/X 支持
  • gvim — 除了提供和vim一样的功能外,还提供GTK/X支持。
注意:
  • vim包不包含 Xorg 支持。具体而言,Vim缺失 +clipboard 特性,因而不能够使用 primaryclipboard 剪贴板gvim同时提供命令行版本带+clipboard的Vim。
  • 非官方源herecura也提供数个Vim/gVim变种版本: vim-cli vim-gvim-common vim-gvim-gtk vim-gvim-qt vim-rtvim-tiny

用法

有关如何使用Vim的基本概述,请遵循vim教程运行vimtutor(控制台版本)或gvimtutor(图形界面版本)。

Vim包含了一个广泛的帮助系统,可以用:h subject命令来访问。subject可以是命令,配置选项,热键绑定,插件等。使用:h命令(不带任何subject)来获取帮助系统的相关信息以及在不同的主题之间切换。

配置

Vim的用户特定配置文件位于主目录~/.vimrc,当前用户的Vim文件位于~/.vim/;全局配置文件为/etc/vimrc,全局Vim文件位于/usr/share/vim/

注意: 常用的功能,如语法高亮在 defaults.vim 中启用,当没有 ~.vimrc 时加载。将 skip_defaults_vim=1 添加到 /etc/vimrc以完全禁用加载 defaults.vim[1]

剪贴板

Vim命令如 :yank:paste 使用未命名寄存器,默认情况下对应于 "* 寄存器。如果 +clipboard 功能可用,"* 寄存器发送到X中的 PRIMARY 缓冲区。

要更改默认寄存器,您可以 :set clipboard=unnamedplus 使用 "+ 寄存器。"+ 寄存器对应于X中的 CLIPBOARD 缓冲区。

欲见更多信息,请参见 :help 'clipboard'

提示: 可以创建复制和粘贴操作的自定义快捷方式。参见例如 [2] 用于绑定 ctrl + cctrl + vctrl + x

语法高亮

启用语法高亮(Vim支持许多语言的语法高亮):

:filetype plugin on
:syntax on


自动换行显示

wrap默认是开启的,这会使Vim在一行文本的长度超过窗口宽度时,自动将放不下的文本显示到下一行。wrap只会影响文本的显示,文本本身不会被改变。

自动换行显示一般在该行窗口能容纳下的最后一个字符发生,即使刚好是在一个单词的中间。更为智能的自动换行显示可以用linebreak来控制。当用set linebreak开启时,自动换行发生在字符串选项breakat中列出来的字符之后。默认情况下,breakat包含空格和一些标点符号(参考:help breakat)。

被换行的字符一般在下一行的开头开始显示,没有任何相应的缩进。breakindent 指示Vim在换行时将缩进考虑在内,因而新行将与原本要显示的文本有相同的缩进。breakindent行为可以用breakindentopt选项来调整,比如说在Python文件中,新行将在原本缩进的基础上再缩进4个空格(更多细节参考:help breakindentopt):

autocmd FileType python set breakindentopt=shift:4

使用鼠标

Vim可以使用鼠标,但只在某些终端上起作用:

要开启这个功能,将下面这行代码加入~/.vimrc中:

set mouse=a

mouse=a 选项在 defaults.vim 中设置。

注意: 如果可以访问X服务器,复制/粘贴将使用"* 寄存器,参见剪贴板。按住shift key键可以使用xterm处理鼠标按钮。

跨行移动光标

默认情况下,在行首按或者在行尾按不能将光标移动至上一行或下一行。

如要改变默认行为,将set whichwrap=b,s,<,>,[,]加至你的~/.vimrc文件中。

文件合并

Vim自带了一个文件差异编辑器(一个用来显示多个文件之间的差异还可以方便的将其合并的程序)。用vimdiff来启动它——指定所需文件即可:vimdiff file1 file2。以下是vimdiff-specific命令的清单。

行为 快捷键
下一差异 ]c
上一差异 [c
差异导入 do
差异导出 dp
打开折叠 zo
关闭折叠 zc
重新扫描文件 :diffupdate
窗口切换 Ctrl+w+w

技巧和建议

显示行号

使用:set number来显示行号。默认显示绝对行号,可用:set relativenumber开启相对行号。

使用:line number or line numbergg跳转到指定行号。跳转都记录在一个跳转列表中,更多细节参考:h jump-motions

拼写检查

Vim有拼写检查的功能,用下面的命令开启:

set spell

Vim默认只安装了英语字典。更多字典可以通过搜索vim-spell在官方软件仓库中找到。其他字典可以在Vim的FTP archive中找到。把下载的字典文件存入~/.vim/spell/中,并使用以下命令启用::setlocal spell spelllang=en_us(将en_us 换成所需的字典的名称)。


行为 快捷键
下一个拼写错误 ]s
上一个拼写错误 [s
拼写纠正建议 z=
拼写正确,添加到用户正确字典 zg
在会话中当作正确拼写 zG
拼写错误,添加到用户错误字典 zw
在会话中当作正确拼写 zW
重新进行拼写检查 :spellr
提示:
  • 如果需要针对两种语言进行拼写检查(例如英语与德语),在~/.vimrc/etc/vimrc中添加set spelllang=en,de并重启Vim即可。
  • 您可以通过使用FileType插件和用于文件类型检测的自定义规则,为任意文件类型(例如.txt)启用拼写检查。 要对以.txt结尾的任何文件启用拼写检查,请创建文件 /usr/share/vim/vimfiles/ftdetect/plaintext.vim,并将 autocmd BufRead,BufNewFile *.txt setfiletype plaintext 插入该文件。接下来,将 autocmd FileType plaintext setlocal spell spelllang=en_us 插入到~/.vimrc/etc/vimrc 中,然后重新启动Vim。
  • 如果想只对LaTeX(或TeX)文档起用拼写检查,在~/.vimrc/etc/vimrc添加autocmd FileType tex setlocal spell spelllang=en_us,重启Vim即可。至于非英语语言,替换上述语句中的en_us为相应语言代码即可。

记录光标位置

Vim可以记录上次打开某一文件时的光标位置,并在下次打开同一文件时将光标移动到该位置。要开启该功能,在配置文件~/.vimrc中加入以下内容:

augroup resCur
  autocmd!
  autocmd BufReadPost * call setpos(".", getpos("'\""))
augroup END

用 vim 替代 vi

创建一个alias,如下:

alias vi=vim

或者,如果你想输入sudo vi而得到vim,安装vi-vim-symlinkAUR,它将移除vi并用一个符号链接vim代替。

DOS/Windows回车问题

打开MS-DOS或Windows下创建的文本文件时,经常会在每行行末出现一个^M。这是因为Linux使用Unix风格的换行,用一个换行符(LF)来表示一行的结束,但在Windows、MS-DOS中使用一个回车符(CR)接一个换行符(LF)来表示,因而回车符就显示为^M

可使用下面的命令删除文件中的回车符:

:%s/^M//g

注意,^代表控制字符。输入^M的方法是按下Ctrl+v,Ctrl+m

另一个解决方法是,安装 dos2unix,然后执行 dos2unix <文件名>

注意: 另一个简单的方法是更改 fileformat 设置。 set ff=unix 以转化DOS/Windows行尾为Unix行尾。要做到相反,只要 set ff=dos,就可以将Unix行尾转换成DOS/Windows行尾。

gVim窗口底部的空格

如果窗口管理器设置为忽略窗口大小提示,gVim会将非功能区域填充为GTK主题背景色。

解决方案是调整gVim在窗口底部保留的空间大小。将下面的代码加入 ~/.vimrc中:

set guiheadroom=0
注意: 如果将其设为0,将无法看到底部的水平滚动条。

插件

向Vim添加插件可以提高您的效率。 插件可以改变Vim的界面,添加新命令,代码完成支持,使用Vim集成其他程序和实用程序,添加对其他语言的支持等等。

提示: 有关常用插件的列表,请参阅 Vim Awesome

安装

使用内置包管理器

Vim 8增加了加载原生第三方插件的可能性。可以通过在〜/.vim/pack/foo中存储第三方软件包来使用此功能。

使用插件管理器

插件管理器允许以类似的方式安装和管理插件,而与在何种平台上运行Vim无关。它本身是一个插件,其功能是作为其他Vim插件包管理器。

  • Vundle是现在最流行的Vim插件管理器。
  • Vim-plug是一个极简的Vim插件管理器,有许多的特性,比如按需插件加载和并行升级。
  • pathogen.vim是一个简单的用于管理Vim的runtimepath的插件。
  • Dein.vim 是一个替代 NeoBundle 的插件管理器,可以在这里找到 vim-dein-gitAUR.

使用Arch软件库

vim-plugins分类下有许多插件。 使用pacman -Sg vim-plugins来列出可用的插件,然后你可用pacman安装

cscope

Cscope是用于浏览项目的工具。 通过导航到字/符号/函数并调用cscope(通常使用快捷键),它可以找到:调用函数的函数,函数定义等等。

安装cscope包。

将cscope默认文件复制到Vim将自动读取的位置:

mkdir -p ~/.vim/plugin
wget -P ~/.vim/plugin http://cscope.sourceforge.net/cscope_maps.vim 
注意: 在Vim的7.x版本中,你可能需要在~/.vim/plugin/cscope_maps.vim中取消下列行的注释来启用cscope快捷键:
set timeoutlen=4000
set ttimeout

创建一个文件,该文件包含了你希望cscope索引的文件的清单(cscope可以操作很多语言,下面的例子用于寻找C++中的.c.cpp.h文件):

cd /path/to/projectfolder/
find . -type f -print | grep -E '\.(c(pp)?|h)$' > cscope.files

创建cscope将读取的数据文件:

cscope -bq
注意: 必须从当前路径浏览工程文件,也可以设置$CSCOPE_DB变量指向cscope.out文件,并导出。

默认快捷键:

 Ctrl-\ and
      c: Find functions calling this function
      d: Find functions called by this function
      e: Find this egrep pattern
      f: Find this file
      g: Find this definition
      i: Find files #including this file
      s: Find this C symbol
      t: Find assignments to

可随意改变这些快捷键。

Taglist

Taglist提供源码文件的结构概览,使你能更高效的浏览不同语言的源文件。

安装vim-taglist包。

将下列设置添入文件~/.vimrc:

let Tlist_Compact_Format = 1
let Tlist_GainFocus_On_ToggleOpen = 1
let Tlist_Close_On_Select = 1
nnoremap <C-l> :TlistToggle<CR>

参阅

官方资源

教程

视频

游戏

配置范例

颜色方案