Learn-Vim(the Smart Way) 中文翻译
声明
本文搬运自Github仓库Learn-Vim_zh_cn,并针对部分错别字做出修正。
英文版本仓库地址
本中文版基于2021-10-15英文版进行翻译和更新,基础英文版本保存在 ./The_original_En_version 下,如果后续英文版有更新,可以将最新版本与该版本比对后,再进行差分翻译。
这是什么?
学习 Vim(智能方式) 是一本学习Vim中优秀部分知识的书。
有很多种方法可以去学习Vim:vimtutor就是一个很棒的教程,另外还有help拥有您所想的所有参考信息。但是在日常使用中,对于绝大部分用户的需求而言,vimtutor讲得太浅不能满足需要,而:help所提供的信息又有很多是用不上的。本指南尝试在两者之间搭一座桥,仅重点介绍关键功能,使您尽可能在最短的时间内掌握Vim中最有用的知识。
本指南同时为初学者和高级Vim用户撰写。它从宽泛而简单的概念开始讲,最后落在特殊的、进阶的技巧上。如果您已经是一名进阶用户,我还是鼓励您从头到尾阅读本指南,因为您将了解到一些新的东西。
目录
目录
序言
Ch 0 - 请先阅读
第一部分:聪明地学习Vim
...
Ch24-Vim Runtime
声明
本文搬运自Github仓库Learn-Vim_zh_cn,并针对部分错别字做出修正。
在前面的章节中,我提到Vim会自动查找一些特殊的路径,比如在~/.vim/ 中的 pack/(第23章) compiler/(第19章)。这些都是Vim runtime路径的例子。
除了上面提到的两个,Vim还有更多runtime路径。在本章,您将学习关于Vim runtime路径的高层次概述。本章的目标是向您展示它们什么时候被调用。知道这些知识能够帮您更进一步理解和定制Vim。
Runtime路径
在一台Unix机器中,其中一个vim runtime路径就是 $HOME/.vim/ (如果您用的是其他操作系统,比如Windows,您的路径可能有所不同)。要查看不同的操作系统有什么样的runtime路径,查阅 :h runtimepath。在本章,我将使用 ~/.vim/ 作为默认的runtime路径。
Plugin脚本
Vim有一个runtime路径 plugin,每次Vim启动时都会执行这个路径中的所有脚本。不要把这个名字 “plugin” 和Vim的外部插件(external p ...
Ch23-Vim软件包
声明
本文搬运自Github仓库Learn-Vim_zh_cn,并针对部分错别字做出修正。
在前面的章节中,我提到使用第三方插件管理器来安装插件。从Vim 8开始,Vim自带了一个内置的插件管理器,名叫 软件包(packages)。在本章,您将学习如何使用Vim软件包来安装插件。
要看您的Vim编译版本是否能够使用软件包,运行 :version。然后查看是否有 +packages属性。另外,您也可以运行 :echo has('packages')(如果返回1,表示可以使用软件包)。
包目录
在根目录下查看您是否有一个 ~/.vim 文件夹。如果没有就新建一个。在文件夹里面,创建一个子文件夹取名 pack(~/.vim/pack/)。Vim会在这个子文件夹内自动搜索插件。
两种加载方式
Vim软件包有两种加载机制:自动加载和手动加载。
自动加载
要想让Vim启动时自动加载插件,你需要将它们放置在 start/子目录中。路径看起来像这样:
1~/.vim/pack/*/start/
现在您可能会问,为什么在pack/ 和 start/ 之间有一个 * ?这个星号可以是任意名字。 ...
Ch22-Vimrc
声明
本文搬运自Github仓库Learn-Vim_zh_cn,并针对部分错别字做出修正。
在先前的章节中,您学习了如何使用Vim。在本章,您将学习如何组织和配置Vimrc。
Vim如何找到Vimrc
对于Vimrc,常见的理解是在根目录下添加一个 .vimrc 点文件(根据您使用的操作系统,文件路径名可能不同)。
实际上,Vim在多个地方查找vimrc文件。下面是Vim检查的路径:
$VIMINIT
$HOME/.vimrc
$HOME/.vim/vimrc
$EXINIT
$HOME/.exrc
$VIMRUNTIME/default.vim
当您启动Vim时,它将在上面列出的6个位置按顺序检查vimrc文件,第一个被找到的vimrc文件将被加载,而其余的将被忽略。
首先,Vim将查找环境变量 $VIMINIT。如果没有找到,Vim将检查 $HOME/.vimrc。如果还没找到,VIm就检查 $HOME/.vim/vimrc。如果Vim找到了vimrc文件,它就停止查找,并使用 $HOME/.vim/vimrc。
关于第一个位置,$VIMINIT 是一个环境变量。默认情 ...
Ch21-多文件操作
声明
本文搬运自Github仓库Learn-Vim_zh_cn,并针对部分错别字做出修正。
多文件编辑更新是一个值得掌握、非常有用的编辑工具。前面您已经学会了如何使用 cfdo 命令在多个文本中进行更新。本章,您将学到如何在Vim中进行多文件编辑的更多不同方法。
在多个文件中执行命令的几种方法
要在多个文件中执行命令,Vim有8种方法:
参数列表 (argdo)
缓冲区列表 (bufdo)
窗口列表 (windo)
tab 列表(tabdo)
快速修复列表 (cdo)
文件方式的快速修复列表 (cfdo)
位置列表 (ldo)
文件方式的位置列表 (lfdo)
实际上,大部分时间您可能只会用到1种或2种(就我个人而言,我使用 cdo 和 argdo比其他的多得多),但了解所有可行方法还是很有用的,这样您就可以选择一个最符合您个人编辑风格的方法。
学习所有8个命令可能听起来让人有点打退堂鼓。但实际上,这些命令工作方式很相似。学习了其中一个后,再学习剩余的将容易的多。它们的运行方式都大体相同:分别创建一个列表(列表中的元素根据命令有所不同),然后向列表传递一个您想执行的命令。
...
Ch20-视图、会话和 Viminfo
声明
本文搬运自Github仓库Learn-Vim_zh_cn,并针对部分错别字做出修正。
第20章 视图、会话和 Viminfo
当您做了一段时间的项目后,您可能会发现这个项目逐渐形了成自己的设置、折叠、缓冲区、布局等,就像住了一段时间公寓后,精心装饰了它一样。问题是,关闭 Vim 后,所有的这些更改都会丢失。如果能保留这些更改,等到下次打开 Vim 时,一切恢复如初,岂不美哉?
本章中,您将学习如何使用 视图、会话 和 Viminfo 来保存项目的“快照”。
视图
视图是这三个部分(视图、会话、Viminfo)中的最小子集,它是单个窗口相关设置的集合。如果您长时间在一个窗口上工作,并且想要保留其映射和折叠,您可以使用视图。
我们来创建一个 foo.txt 文件:
12345678910foo1foo2foo3foo4foo5foo6foo7foo8foo9foo10
在这个文件中,做三次修改:
在第 1 行,创建一个手动折叠 zf4j(折叠接下来 4 行)。
更改 number 设置:setlocal nonumber norelativenumber。这会移除窗口左侧 ...
Ch19-编译
声明
本文搬运自Github仓库Learn-Vim_zh_cn,并针对部分错别字做出修正。
编译是许多编程语言的重要主题。在本章中,您将学习如何在 Vim 中编译。此外,您将看到如何利用好 Vim 的 :make 命令。
从命令行编译
您可以使用叹号运算符(!)进行编译。如果您需要使用 g++ 来编译 .cpp 文件,可以运行:
1:!g++ hello.cpp -o hello
但要每次手动指定文件名和输出文件名会非常繁琐和容易出错。而 makefile 是条可行之路。
Make命令
Vim 有运行 makefile 的 :make 命令。当您运行它时,Vim 会在当前目录查找 makefile 并执行它。
在当前目录创建一个文件名为 makefile ,然后添加下列内容:
123456all: echo "Hello all"foo: echo "Hello foo"list_pls: ls
在 Vim 中运行:
1:make
Vim 执行它的方式与从终端运行它的方式相同。:make 命令也接受终端中 make 命令的参数。运行:
...
Ch18-Git
声明
本文搬运自Github仓库Learn-Vim_zh_cn,并针对部分错别字做出修正。
Vim 和 Git 是两种实现不同功能的伟大工具。Vim 用于文本编辑,Git 用于版本控制。
在本章中,您将学习如何将 Vim 和 Git 集成在一起。
差异比较
在上一章中,您看到了如何运行 vimdiff 命令以显示多个文件之间的差异。
假设您有两个文件,file1.txt 和 file2.txt。
file1.txt 的内容如下:
12345678pancakeswafflesapplesmilkapple juiceyogurt
file2.txt 的内容如下:
12345678pancakeswafflesorangesmilkorange juiceyogurt
若要查看两个文件之间的差异,请运行:
1vimdiff file1.txt file2.txt
或者也可以运行:
1vim -d file1.txt file2.txt
vimdiff 并排显示两个缓冲区。左边是 file1.txt,右边是 file2.txt。不同的两行(apples 和 oranges ...
Ch17-折叠
声明
本文搬运自Github仓库Learn-Vim_zh_cn,并针对部分错别字做出修正。
在阅读文件时,经常会有一些不相关的文本会妨碍您理解。使用 Vim 折叠可以隐藏这些不必要的信息。
本章中,您将学习如何使用不同的折叠方法。
手动折叠
想象您正在折叠一张纸来覆盖一些文本,实际的文本不会消失,它仍在那儿。Vim 折叠的工作方式与此相同,它折叠一段文本,在显示时会隐藏起来,但实际上并不会真的删除它。
折叠操作符是z。(折叠纸张时,它看起来也像字母 “z”)。
假设有如下文本:
12Fold meHold me
把光标放在第一行,输入 zfj。Vim 将这两行折叠成一行,同时会看到类似消息:
1+-- 2 lines: Fold me -----
上面的命令分解如下:
zf 是折叠操作符。
j 是用于折叠操作符的动作。
您可以使用 zo 打开/展开已折叠文本,使用 zc 关闭/收缩文本。
折叠是一个操作符,所以它遵循语法规则(动词+名词)。您可以在折叠运算符后,加上一个动作(motion)或文本对象。例如,使用 zfip 可以折叠内部段落;使用 zfG 可以折叠至文件末尾; ...
Ch16-标签
声明
本文搬运自Github仓库Learn-Vim_zh_cn,并针对部分错别字做出修正。
快速转到任意定义处,是文本编辑中一个非常有用的特性。在本章中,您将学习如何使用 Vim 标签来做到这一点。
标签概述
假设有人给了您一个新的代码库:
12one = One.newone.donut
One?donut?呃,对于当时编写代码的开发者而言,这些代码的含义可能显而易见。问题是当时的开发者已经不在了,现在要由您来理解这些费解的代码。而跟随有One 和 donut定义的源代码,是帮助您理解的一个有效方法。
您可以使用fzf 或 grep来搜索它们,但这种情况下,但使用标签将更快。
把标签想象成地址簿:
123Name AddressIggy1 1234 Cool St, 11111Iggy2 9876 Awesome Ave, 2222
当然,标签可不是存储着“姓名-地址”对,而是“定义-地址”对。
假设您在一个目录中有两个 Ruby 文件:
12345678910## one.rbclass One def initialize puts "In ...