mirror of
https://gitlab.com/wsdjeg/vim-galore-zh_cn.git
synced 2025-01-19 03:29:27 +08:00
translating common-problems and technical-quirks
This commit is contained in:
parent
c2540eeb96
commit
6b9c31ddbe
@ -1,11 +1,11 @@
|
|||||||
# Common problems
|
# 常见问题
|
||||||
|
|
||||||
## Editing small files is slow
|
## 编辑小文件很慢
|
||||||
|
|
||||||
## Editing huge files is slow
|
## 编辑大文件很慢
|
||||||
|
|
||||||
## Bracketed paste (or why do I have to set 'paste' all the time?)
|
## 相同部分粘贴 (要不为什么我总要设置‘粘贴’?)
|
||||||
|
|
||||||
## Delays when using escape key in terminal
|
## 使用终端中 Esc 键时的延迟
|
||||||
|
|
||||||
## Function search undo
|
## 无法重复函数中执行的搜索
|
||||||
|
3
chapter/Technical quirks.md
Normal file
3
chapter/Technical quirks.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# 技术怪癖
|
||||||
|
|
||||||
|
## NUL 符用新行表示
|
@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
| 资源名称 | 简介 |
|
| 资源名称 | 简介 |
|
||||||
|----------|-------------|
|
|----------|-------------|
|
||||||
| [七个高效的文本编辑习惯](http://www.moolenaar.net/habits.html) | 作者:Bram Moolenaar(即Vim的作者) |
|
| [七个高效的文本编辑习惯](http://www.moolenaar.net/habits.html) | 作者:Bram Moolenaar(即 Vim 的作者) |
|
||||||
| [七个高效的文本编辑习惯2.0(PDF版)](http://www.moolenaar.net/habits_2007.pdf) | 同上 |
|
| [七个高效的文本编辑习惯2.0(PDF版)](http://www.moolenaar.net/habits_2007.pdf) | 同上 |
|
||||||
| [IBM DeveloperWorks: 使用脚本编写 Vim 编辑器](http://www.ibm.com/developerworks/views/linux/libraryview.jsp?sort_order=asc&sort_by=Title&search_by=scripting+the+vim+editor) | Vim脚本编写五辑 |
|
| [IBM DeveloperWorks: 使用脚本编写 Vim 编辑器](http://www.ibm.com/developerworks/views/linux/libraryview.jsp?sort_order=asc&sort_by=Title&search_by=scripting+the+vim+editor) | Vim 脚本编写五辑 |
|
||||||
| [《漫漫Vim路》](http://learnvimscriptthehardway.stevelosh.com) | 使用魔抓定制Vim插件 |
|
| [《漫漫 Vim 路》](http://learnvimscriptthehardway.stevelosh.com) | 使用魔抓定制 Vim 插件 |
|
||||||
| [《Vim实践 (第2版)》](http://www.amazon.com/Practical-Vim-Edit-Speed-Thought/dp/1680501275/) | 轻取Vim最佳书籍 |
|
| [《 Vim 实践 (第2版)》](http://www.amazon.com/Practical-Vim-Edit-Speed-Thought/dp/1680501275/) | 轻取 Vim 最佳书籍 |
|
||||||
| [Vimcasts.org](http://vimcasts.org/episodes/archive) | Vim录屏演示 |
|
| [Vimcasts.org](http://vimcasts.org/episodes/archive) | Vim录屏演示 |
|
||||||
| [为什么是个脚本都用vi?](http://www.viemu.com/a-why-vi-vim.html) | 常见误区释疑 |
|
| [为什么是个脚本都用 vi?](http://www.viemu.com/a-why-vi-vim.html) | 常见误区释疑 |
|
||||||
| [你不爱vi,所以你不懂Vim](http://stackoverflow.com/a/1220118) | 简明,扼要,准确的干货 |
|
| [你不爱 vi,所以你不懂 Vim ](http://stackoverflow.com/a/1220118) | 简明,扼要,准确的干货 |
|
@ -0,0 +1,18 @@
|
|||||||
|
## 粘贴归类 (要不为什么我总要设置‘粘贴’?)
|
||||||
|
|
||||||
|
粘贴归类模式使得终端虚拟器可以区分键入文本和粘贴文本。
|
||||||
|
|
||||||
|
你是否曾经尝试过向 Vim 粘贴过代码,结果弄得一团糟?
|
||||||
|
|
||||||
|
这只会在你通过 `cmd+v`, `shift-insert`, `middle-click` 等等命令进行粘贴时发生。
|
||||||
|
因为那时你只是在向终端虚拟器里丢文本。Vim 并不知道你在粘贴文本,它天真地认为你是一个熟练的打字员。因此,它尝试排版,但是失败了。
|
||||||
|
|
||||||
|
如果你使用 Vim 命令集里的粘贴,比如 `"+p` ,那这就不会成为问题,因为 Vim 知道你做的是粘贴操作。
|
||||||
|
|
||||||
|
为了解决这个,你需要设置粘贴 `:set paste` ,以便获取粘贴现状。 参考 `:h 'paste'` 和 `:h 'pastetoggle'`.
|
||||||
|
|
||||||
|
如果你已经受够了不停地切换 `'paste'` ,看一看这个不错的插件能为你做什么:[粘贴归类](https://github.com/ConradIrwin/vim-bracketed-paste)。
|
||||||
|
|
||||||
|
插件作者的拓展阅读:[欢迎点击](http://cirw.in/blog/bracketed-paste).
|
||||||
|
|
||||||
|
**Neovim**: Neovim 努力无缝地完成这些工作,并在终端虚拟器支持时自动设定粘贴归类模式。
|
@ -0,0 +1,44 @@
|
|||||||
|
## 使用终端中 Esc 键时的延迟
|
||||||
|
|
||||||
|
如果你生活在命令行里,你可能使用 xterm, gnome-terminal, iTerm2 等等所谓的 _终端虚拟器_。(区别于真正的[终端](https://en.wikipedia.org/wiki/Computer_terminal))
|
||||||
|
|
||||||
|
和宿主终端一样,终端虚拟器使用 [退出序列](https://en.wikipedia.org/wiki/Escape_sequence) (或者叫 _控制序列_)来控制光标移动,更换文本颜色等等。
|
||||||
|
退出序列是一些以退出码(在 [插入符号](https://en.wikipedia.org/wiki/Caret_notation) 中展示为 `^[`)开头的 ASCII 码串。
|
||||||
|
当接收到码串时,终端虚拟器会从 [terminfo](https://en.wikipedia.org/wiki/Terminfo) 数据库中寻找与之匹配的指令。
|
||||||
|
|
||||||
|
为了使问题更清晰,我想先解释一下映射超时。映射超时经常在模糊映射时发生:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
:nnoremap ,a :echo 'foo'<cr>
|
||||||
|
:nnoremap ,ab :echo 'bar'<cr>
|
||||||
|
```
|
||||||
|
|
||||||
|
两个映射都有可能,键入 `,a` ,就会有一秒钟的延迟,因为 Vim 会等待用户会再键入 `b` 还是不会了。
|
||||||
|
|
||||||
|
退出序列也会引起一样的问题:
|
||||||
|
|
||||||
|
- `<esc>` 在返回正常模式或退出指令时被大量使用。
|
||||||
|
- 光标键使用了退出序列进行编码
|
||||||
|
- Vim 运用 <kbd>Alt</kbd> (也被称为 _Meta key_)去发送固定的高位集编码的8位比特,但是很多终端虚拟器不支持(或者默认不启用),而用退出序列代替。
|
||||||
|
|
||||||
|
你可以用 `vim -u NONE -N` 试一试上面所说的,然后键入 `i<c-v><left>` ,你就会看见一串以 `^[`(表征退出码)开头的被输入序列。
|
||||||
|
|
||||||
|
简而言之,区分键入的 `<esc>` 和一个严格意义上的退出序列对 Vim 来说是一个痛苦的过程。
|
||||||
|
|
||||||
|
默认情况下 `:set timeout timeoutlen=1000` ,Vim 会有1秒的延迟在等 _还有吗_ 的模糊映射。
|
||||||
|
对于映射来说,这是一个稳健的值,但是通常为了解决整个问题,你可以自定义键入的超时阈值:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
set timeout " 映射超时
|
||||||
|
set timeoutlen=1000 " 默认值
|
||||||
|
set ttimeout " 键入超时
|
||||||
|
set ttimeoutlen=10 " 察觉不到的小值
|
||||||
|
```
|
||||||
|
|
||||||
|
执行 `:h ttimeout` 你可以找到一个小表格展示这些选项的相互关系。
|
||||||
|
|
||||||
|
如果你在 Vim 和终端虚拟器之间使用的是 tmux ,请将以下一行放入 `~/.tmux.conf`:
|
||||||
|
|
||||||
|
```tmux
|
||||||
|
set -sg escape-time 0
|
||||||
|
```
|
@ -0,0 +1,20 @@
|
|||||||
|
## 编辑大文件很慢
|
||||||
|
|
||||||
|
大文件最大的问题,就是 Vim 会一次性读取整个文件。这一过程的完成取决于内部如何提供缓存空间。
|
||||||
|
([Vim 开发的讨论](https://groups.google.com/forum/#!topic/vim_dev/oY3i8rqYGD4/discussion))
|
||||||
|
|
||||||
|
如果你只是想读取, `tail hugefile | vim -` 会是一个很好的解决方法.
|
||||||
|
|
||||||
|
如果不用语法,设定和插件,你也能生活自理一段时间:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vim -u NONE -N
|
||||||
|
```
|
||||||
|
|
||||||
|
这将使得导航明显提速,因为代价高昂的语法高亮正则表达式不再被使用。你也应该让 Vim 不要使用交换文件和 Vim 信息文件,以避免写入时的长延迟。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vim -n -u NONE -i NONE -N
|
||||||
|
```
|
||||||
|
|
||||||
|
简而言之,真的写入超大文件的时候尽量别用 Vim。 :\
|
@ -0,0 +1,17 @@
|
|||||||
|
## 编辑小文件很慢
|
||||||
|
|
||||||
|
对性能有重大影响的有两个方面:
|
||||||
|
|
||||||
|
1. 复杂的**正则表达式**。尤其是 Ruby 语法文件导致人们过去一直慢慢吞吞。([Debugging syntax files](#debugging-syntax-files)里也有说明。)
|
||||||
|
2. **页面刷新**。一些特性强制所有行都刷新。
|
||||||
|
|
||||||
|
| 典型败笔 | 原因? | 解决方法? |
|
||||||
|
|-----------------|------|-----------|
|
||||||
|
| `:set cursorline` | 导致所有行刷新。 | `:set nocursorline` |
|
||||||
|
| `:set cursorcolumn` | 导致所有行刷新。 | `:set nocursorcolumn` |
|
||||||
|
| `:set relativenumber` | 导致所有行刷新。 | `:set norelativenumber` |
|
||||||
|
| `:set foldmethod=syntax` | 语法文件算减速的话,这无异于刹车。 | `:set foldmethod=manual`, `:set foldmethod=marker` or [FastFold](https://github.com/Konfekt/FastFold) |
|
||||||
|
| `:set synmaxcol=3000` | 根据内部表示规则, Vim 一般不待见对很长的行。这一设定导致3000列时才会把所在行高亮。 | `:set synmaxcol=200` |
|
||||||
|
| matchparen.vim | 使用默认加载。使用正则表达式去匹配括回。 | Disable plugin: `:h matchparen` |
|
||||||
|
|
||||||
|
**注意**: 只有当真的遭遇实质的性能缺陷时,你才需要做这些改进。多数情况下,上面提到的这些方面还都凑合。
|
@ -0,0 +1,8 @@
|
|||||||
|
## 无法重复函数中执行的搜索
|
||||||
|
|
||||||
|
- 一个命令的搜索关键词(`/`, `:代替`, ...)改变了“上一次搜索所用的关键词”。(这个改变保存在 `/` 的注册表里;使用 `:echo @/` 可以打印出来)
|
||||||
|
- 一个简单的文本修改可以用 `.` 再次执行。(这个执行保存在 `.` 的注册表里;使用 `:echo @.` 可以打印出来)
|
||||||
|
|
||||||
|
如果你在一个函数里做以上操作,两件都_not_会是那么回事儿。所以你不能简单地在一个函数里高亮词汇同时再用这个函数做文本修改。
|
||||||
|
|
||||||
|
帮助: `:h function-search-undo`
|
5
chapter/newline-used-for-nul.md
Normal file
5
chapter/newline-used-for-nul.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
## NUL 符用新行表示
|
||||||
|
|
||||||
|
文件中的 NUL 符 (`\0`),在内存中被以新行(`\n`)保存,在缓存空间中显示为 `^@`。
|
||||||
|
|
||||||
|
更多信息请参看 `man 7 ascii` 和 `:h NL-used-for-Nul` 。
|
Loading…
x
Reference in New Issue
Block a user