Merge pull request #12 from Laotree/master

Miscellaneous>>杂项
This commit is contained in:
Wang Shidong 2017-05-22 12:07:52 +08:00 committed by GitHub
commit 4f3bd768b4
15 changed files with 241 additions and 0 deletions

View File

@ -0,0 +1,11 @@
# 常见问题
## 编辑小文件很慢
## 编辑大文件很慢
## 相同部分粘贴 (要不为什么我总要设置‘粘贴’?)
## 使用终端中 Esc 键时的延迟
## 无法重复函数中执行的搜索

14
chapter/Miscellaneous.md Normal file
View File

@ -0,0 +1,14 @@
# 杂项
## 附加资源
## Vim 配置集合
## 内置插件
## 映射大写锁定键CapsLock到控制键Ctrl
## 复活节彩蛋
## 为什么用 hjkl 移动光标?

View File

@ -0,0 +1,3 @@
# 技术怪癖
## NUL 符用新行表示

View File

@ -0,0 +1,12 @@
## 附加资源
| 资源名称 | 简介 |
|----------|-------------|
| [七个高效的文本编辑习惯](http://www.moolenaar.net/habits.html) | 作者Bram Moolenaar即 Vim 的作者) |
| [七个高效的文本编辑习惯2.0PDF版](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 脚本编写五辑 |
| [《漫漫 Vim 路》](http://learnvimscriptthehardway.stevelosh.com) | 使用魔抓定制 Vim 插件 |
| [《 Vim 实践 (第2版)》](http://www.amazon.com/Practical-Vim-Edit-Speed-Thought/dp/1680501275/) | 轻取 Vim 最佳书籍 |
| [Vimcasts.org](http://vimcasts.org/episodes/archive) | Vim录屏演示 |
| [为什么是个脚本都用 vi](http://www.viemu.com/a-why-vi-vim.html) | 常见误区释疑 |
| [你不爱 vi所以你不懂 Vim ](http://stackoverflow.com/a/1220118) | 简明,扼要,准确的干货 |

View File

@ -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 努力无缝地完成这些工作,并在终端虚拟器支持时自动设定粘贴归类模式。

View File

@ -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
```

13
chapter/easter-eggs.md Normal file
View File

@ -0,0 +1,13 @@
## 复活节彩蛋
| 命令 | 消息 |
|-----------|---------|
| `:Ni!` | `你需要灌木丛?` |
| `:h 'sm'` | `注意:这个缩写是限制级` |
| `:h 42` | `生命,宇宙和一切的意义是什么?不幸的是, 道格拉斯·亚当斯Douglas Adams唯一知道这个问题的人现在已经死了。所以现在你可能会想知道死亡的意思是什么……` |
| `:h UserGettingBored` | `什么时候用户会按同一个键42次好吧我只是开个玩笑 :-)` |
| `:h bar` | `这不是一个烟斗。` |
| `:h holy-grail` | `亚瑟,你终究找到了!` |
| `:h map-modes` | `:nunmap 命令在修道院外也能用.` |
| `:help!` | `E478别怕` (故障? 在使用模块帮助时 (`模块类型=帮助`) 这和 `:h help.txt` 一个效果。) |
| `:smile` | `试一试这个表情 ;-) 添加于 7.4.1005.` |

View File

@ -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。 :\

View File

@ -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 [快速折叠](https://github.com/Konfekt/FastFold) |
| `:set synmaxcol=3000` | 根据内部表示规则, Vim 一般不待见对很长的行。这一设定导致3000列时才会把所在行高亮。 | `:set synmaxcol=200` |
| matchparen.vim           | 使用默认加载。使用正则表达式去匹配括回。 | 禁用插件: `:h matchparen` |
**注意**: 只有当真的遭遇实质的性能缺陷时,你才需要做这些改进。多数情况下,上面提到的这些方面还都凑合。

View File

@ -0,0 +1,8 @@
## 无法重复函数中执行的搜索
- 一个命令的搜索关键词(`/`, `:代替`, ...)改变了“上一次搜索所用的关键词”。(这个改变保存在 `/` 的注册表里;使用 `:echo @/` 可以打印出来)
- 一个简单的文本修改可以用 `.` 再次执行。(这个执行保存在 `.` 的注册表里;使用 `:echo @.` 可以打印出来)
如果你在一个函数里做以上操作两件都_not_会是那么回事儿。所以你不能简单地在一个函数里高亮词汇同时再用这个函数做文本修改。
帮助: `:h function-search-undo`

View File

@ -0,0 +1,30 @@
## 映射大写锁定键CapsLock到控制键Ctrl
大写锁定键属于键盘上最少用到的按键,但是它要比控制键更加容易按到,
因为它位于你手放在键盘时的[起始行](https://raw.githubusercontent.com/mhinz/vim-galore/master/contents/images/content-homerow.png)。
如果你敲很多代码的话映射大写锁定键CapsLock到控制键Ctrl可以有效降低
[重复使力伤害](https://de.wikipedia.org/wiki/Repetitive-Strain-Injury-Syndrom) (ps:为什么将 jk 映射为 esc而不是 jj重复点击同一个按键对手指伤害很大)。
友情提示:当你习惯这个设定后,你就离不开它了。
**OSX**:
`System Preferences -> Keyboard -> Keyboard Tab -> Modifier Keys`. 变更
"CapsLock" 为 "Control"。
**Linux**:
为了使按键生效,请把以下几行放入 `~/.xmodmap` 文件:
remove Lock = Caps_Lock
keysym Caps_Lock = Control_L
add Control = Control_L
用以下命令使之生效<br> `$ xmodmap ~/.xmodmap`
替代方法有[caps2esc](https://github.com/oblitum/caps2esc) 或者
[xcape](https://github.com/alols/xcape)。
**Windows**:
请参看 [superuser.com: 在Windows8.1映射大写锁定键到控制键](http://superuser.com/questions/764782/map-caps-lock-to-control-in-windows-8-1)。

View File

@ -0,0 +1,5 @@
## NUL 符用新行表示
文件中的 NUL 符 `\0`),在内存中被以新行(`\n`)保存,在缓存空间中显示为 `^@`
更多信息请参看 `man 7 ascii``:h NL-used-for-Nul`

View File

@ -0,0 +1,20 @@
## 内置插件
出乎很多人的意料Vim自己默认加载了大把大把的插件。启动 Vim 后,用`:scriptnames`查看所有加载的源文件
这些文件多数永远不会被用到,所以请禁止如你所见的以下插件。
这些插件仍旧会在源文件列出但是当Vim启动时只有第一行会被读取而之后的配置命令和日志都不会执行。
| 插件 | 禁用 | 帮助 |
|------------|-------------------------------------|------|
| 2html | `let g:loaded_2html_plugin = 1` | `:h 2html` |
| getscript | `let g:loaded_getscriptPlugin = 1` | `:h pi_getscript` |
| gzip | `let g:loaded_gzip = 1` | `:h pi_gzip` |
| logipat | `let g:loaded_logipat = 1` | `:h pi_logipat` |
| matchparen | `let g:loaded_matchparen = 1` | `:h pi_paren` |
| netrw | `let g:loaded_netrwPlugin = 1` | `:h pi_netrw` |
| rrhelper | `let g:loaded_rrhelper = 1` | `:e $VIMRUNTIME/plugin/rrhelper.vim` |
| spellfile | `let g:loaded_spellfile_plugin = 1` | `:h spellfile.vim` |
| tar | `let g:loaded_tarPlugin = 1` | `:h pi_tar` |
| vimball | `let g:loaded_vimballPlugin = 1` | `:h pi_vimball` |
| zip | `let g:loaded_zipPlugin = 1` | `:h pi_zip` |

View File

@ -0,0 +1,18 @@
## Vim 配置集合
Vim 配置集合是集成多多种插件以及相关配置的组合。
高阶用户总是知道如何构建自己的编辑器,所以配置集合一般是针对初学者。
如果你想要尝试,那么将面临一个辩证的想法:加入很多额外的东西来学习 Vim 是否会让这变得更加简单。
我知道很多人不想在配置编辑器上花过多时间(但实际上,当你卡住时,你就会不停地花时间定制自己的 vimrc
因此,想要节约时间,那么就因该真正的去了解和学习 Vim 原生功能,只有这样你才能中获益。
再次强调一下:“一个程序员应当懂得他的工具”。
总之,如果你知道自己在做什么,你也许能从以下几个 Vim 配置集合中获得一些灵感。
- [cream](http://cream.sourceforge.net)
- [janus](https://github.com/carlhuda/janus.git)
- [spacevim](https://github.com/SpaceVim/SpaceVim)
- [spf13](https://github.com/spf13/spf13-vim)

View File

@ -0,0 +1,8 @@
## 为什么用hjkl移动光标
当 [Bill Joy](https://en.wikipedia.org/wiki/Bill_Joy) 创建[vi](https://en.wikipedia.org/wiki/Vi)Vim 的前身时, 他的工作是在一台[ADM-3A](https://en.wikipedia.org/wiki/ADM-3A)完成的,而这个机器没有用别的键控制光标,而正是如你猜到的 hjkl 作为光标控制键。
键盘布局: [请点击](https://raw.githubusercontent.com/mhinz/vim-galore/master/contents/images/content-adm-3a-layout.jpg)
这也告诉了我们为什么 Unix 系统会以`~`代表主目录。