From f1b53e756c0ec4459a4093a18986df5a2f5e324d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E9=87=91=E7=AB=A0?= Date: Tue, 28 Mar 2017 08:54:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9filter=E7=AB=A0=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chapter/Usage.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/chapter/Usage.md b/chapter/Usage.md index b02c394..73e6dac 100644 --- a/chapter/Usage.md +++ b/chapter/Usage.md @@ -413,27 +413,27 @@ set virtualedit=all ### 使用外部程序和过滤器 -免责声明:Vim是单线程的,因此在Vim中以前端线程执行其它的程序时会阻止其它的一切。当然你可以使用Vim程序接口,如Lua,并且使用它的多线程支持,但是在那期间,Vim的处理还是被阻止了。Neovim添加了任务 API 解决了此问题。 +免责声明:Vim是单线程的,因此在Vim中以前端进程执行其它的程序时会阻止其它的一切。当然你可以使用Vim程序接口,如Lua,并且使用它的多线程支持,但是在那期间,Vim的处理还是被阻止了。Neovim添加了任务 API 解决了此问题。 (据说 Bram 正在考虑在Vim中也添加任务控制。如果你使用了较新版本的的Vim,可以看一下 `:helpgrep startjob`。) -使用 `:!` 启动一个新任务。如果你想列出当前工作目录下的所有文件,可以使用 `:!ls`。 用 `|` 来将结果通过管道重定向,如: `:!ls -l | ssort | tail -n5`。 +使用 `:!` 启动一个新任务。如果你想列出当前工作目录下的所有文件,可以使用 `:!ls`。 用 `|` 来将结果通过管道重定向,如: `:!ls -l | sort | tail -n5`。 -没有使用范围时,`:!` 会显示在一个可滚动的窗口中。相反的,如果指定了范围,这些行会被[过滤](https://en.wikipedia.org/wiki/Filter_(software))。这意味着它们会通过管道被重定向到过滤程序的[stdin](https://en.wikipedia.org/wiki/Standard_streams#Standard_input_.28stdin.29),在处理后再通过过滤器的[stdout](https://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29)输出。例如:为接下来的5行文本添加行号,可以使用: +没有使用范围时(译者注:范围就是 `:` 和 `!`之间的内容,`.` 表示当前行,`+4` 表示向下偏移4行,`$`表示最末行等,多行时用 `,`将它们分开,如 `.,$`表示从当前行到末行),`:!` 会显示在一个可滚动的窗口中(译者注:在GVim和在终端里运行的结果稍有不同)。相反的,如果指定了范围,这些行会被[过滤](https://en.wikipedia.org/wiki/Filter_(software))。这意味着它们会通过管道被重定向到过滤程序的[stdin](https://en.wikipedia.org/wiki/Standard_streams#Standard_input_.28stdin.29),在处理后再通过过滤程序的[stdout](https://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29)输出,用输出结果替换范围内的文本。例如:为接下来的5行文本添加行号,可以使用: ``` :.,+4!nl -ba -w1 -s' ' ``` -由于手动添加范围很麻烦,Vim提供了一些辅助方法以方便的添加范围。如果需要一直带着范围的话,你可以在可见模式中先选择,然后再按 `:`。还可以使用 `!` 来采取一个动作,如 `!ip !sort` 可以将当前段落的行进行排序。 +由于手动添加范围很麻烦,Vim提供了一些辅助方法以方便的添加范围。如果需要经常带着范围的话,你可以在可见模式中先选择,然后再按 `:` (译者注:选中后再按 `!` 更方便)。还可以使用 `!` 来取用一个motion的范围,如 `!ipsort` (译者注:原文为 `!ip!sort` ,但经过实验发现该命令执行报错,可能是因为Vim版本的原因造成的,新版本使用 `ip` 选择当前段落后自动在命令后添加了 `!` ,按照作者的写法来看,可能之前的版本没有自动添加 `!` )可以将当前段落的所有行按字母表顺序进行排序。 -使用过滤比较好的一个案例是[Go语言](https://golang.org/)。它的缩进非常个性,甚至还提供了一个名为 `gofmt` 的过滤器来对Go语言的源文件进行正确的缩进。所以Go语言的插件通常会提供一个名为 `:Fmt` 的函数,这个函数只是执行了 `:%!gofmt` 来对整个文件进行缩进。 +一个使用过滤器比较好的案例是[Go语言](https://golang.org/)。它的缩进语法非常个性,甚至还专门提供了一个名为 `gofmt` 的过滤器来对Go语言的源文件进行正确的缩进。Go语言的插件通常会提供一个名为 `:Fmt` 的函数,这个函数就是执行了 `:%!gofmt` 来对整个文件进行缩进。 -人们常用 `:r !prog` 将程序的输出放到当前文件的底端, 这对于脚本来说是很不错的选择,但是在使用的过程中,我发现 `!!ls` 更加方便,它会把输入放到当前行。 +人们常用 `:r !prog` 将prog程序的插入放到当前行的下面,这对于脚本来说是很不错的选择,但是在使用的过程中我发现 `!!ls` 更加方便,它会用输出结果替换当前行的内容。(译者注:前面命令中的 `prog` 只是个占位符,在实际使用中需要替换成其它的程序,如 `:r !ls`,这就与后面的 `!!ls` 相对应了,两者唯一的不同是第一个命令不会覆盖当前行内容,但是第二个命令会) 帮助文档: -``` +```vim :h filter :h :read! ```