vim 杂谈 - 关于移动

这个专栏的主要目的, 是介绍后台开发, vim, python, 工具, 效率, 项目等等一些所思所想. 欢迎关注及交流.


k-vim 这个项目, 虽然一年只更新一两次, 但是里面很多配置, 都是基于使用中的痛点, 以及 符合自觉 的原则进行的变更.

整体而言, k-vim 虽然做成了一个开箱即用的配置, 但是很多使用者更想知道一些更具体的说明, 包含配置项, 配置原因等等.

之前有个blog有提过一句

Don’t put anything in your .vimrc you don’t understand!

虽然我不是十分赞同(我更倾向于基于一个完备的配置再进行深入了解和 DIY, 毕竟从0打造成本略高).

但是觉得有必要, 写一写, 谈一谈vim中的一些配置的原因.

目测会成系列, 从前到后你也能个性化自己的完整配置. 也可以借鉴一些技巧和插件使用(总共会提及约60+插件)

第一篇, 移动.

HJKL

一谈到移动, 首先想到的是hjkl, 最基本的上下左右

h 左移
l 右移

k 上移
j 下移 (记忆 jump)

当然, 左右只是字符间移动, 上下是行之间的移动

优化HJKL

首先, 为了防止自己情不自禁使用 上下左右 方向键, 可以禁用之.

" 关闭方向键, 强迫自己用 hjkl
map <Left> <Nop>
map <Right> <Nop>
map <Up> <Nop>
map <Down> <Nop>

其次, 当一行超长之后, se wrap, 一行就显示为多行(一个物理行 - 多个展示行), 如果是默认配置, 使用 jk 移动时, 将会是物理行维度的, 而直觉上应该在展示行维度跳转(视觉上), 所以加配置, 使得jk在展示行之间上下跳转

"Treat long lines as break lines (useful when moving around in them)
"se swap之后,同物理行上直接跳
nnoremap k gk
nnoremap gk k
nnoremap j gj
nnoremap gj j

另外, 当上下移动时, 默认光标到顶/到底后, 再用jk时, 光标是贴着终端顶部或底部的, 需要配置, 保证光标距离顶部或底部一定行数, 这样显示视觉效果更好.

" 在上下移动光标时,光标的上方或下方至少会保留显示的行数
set scrolloff=7

单词间移动

wbe, 原先是wWbBeE, 大小写都是有各自含义的, 但是, 更懒的做法, 只用小写wbe, 毕竟, 使用大写WBE, 你还得多按一个shift键, 以及, 肌肉记忆下, 操作的一瞬间, 你很难将你想要的和使用大写还是小写分别代表什么动作, 句子里哪个是标点关联起来.

所以, 直接无视大写吧

w 移到下一个单词 (记忆 next word)
b 移动到单词开头 (记忆 back)
e 移动到单词尾部

关于 0和$, 以及 HML 的优化

0$, 分别是

0 移动到行首
$ 移动到行尾

而, 0, 需要手指离开字母区, $更惨, 还得多按一个shift. 另外其实还有个^的, 实在按不着>_<#

HML 是同屏间, 快速移动到屏幕顶部/中间/底部, 顶部和底部还好, 中间到底在哪? 具体哪一行, 这个是比较范的操作, 非精确操作(不能一次性移动到想要的位置), 所以我的结论是: 废掉

H映射成移动到行首(最左边), 将L映射成移动到行尾(最右边), 和原先hjkl意义同, 且在字母区. 更符合直觉

" Go to home and end using capitalized directions
noremap H ^
noremap L $

行内: fFtT

f/F, 同一行内向前/向后跳转, 而t/T同, 只是会调到目标位置的前面一个字符

我的做法是, 忘掉tT, fF更符合直觉, 真正的指哪到哪, 而且f=find也好记

f  跳转到向前搜索的字母位置
F  跳转到向后搜索的字母位置

在这里, 推荐一个插件(被动生效), 可以高亮显示目标字母: quick-scope A Vim plugin that highlights which characters to target for f, F and family. No mappings are needed.

文件: 关于 ctrl + fbud

ctrl + f/b 下翻/上翻一页, 而ctrl + u/d 下翻/上翻半页.

我的做法是, 忘掉ctrl + f/b, 只用ctrl + u/d

我们经常做的操作是, 不停的上翻/下翻, 连续动作, 一整页太多, 看内容很容易思维上断开, 需要返回去重看, 而半页有一半的东西是连着的; 而对于使用压掌大法ctrl的人来说, 按住ctrl再反复fb, 特别是 b, 特别难按, fb都在左边, 左手太累

ud, 可以将操作放到两手, 也方便(肌肉)记忆

ctrl + u 上翻半页(记忆 up)
ctrl + d 下翻半页(记忆 down)

文件: 头尾和某一行

gg  跳转到文件头
G   跳转到文件尾

:n  精确移动到第几行

记住这三个, 基本够了吧?

分屏移动

ctrl + w + hjkl 是默认分分屏的快捷键, 去掉w更快些

" 分屏窗口移动, Smart way to move between windows
map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l

插件: 标记跳转增强 vim-signature

默认, m + 字母, 可以在当前打一个标记, 然后 反引号+字母 可以跳转到标记行

但是存在的缺点是: 标记不可见, 且反引号实在难按

所以做了些增强

安装这个插件: vim-signature

具体安装/配置/演示: VIM插件: VIM-SIGNATURE(快速标记跳转)

" 交换 单引号/反引号, 使得可以快速使用 单引号 跳到marked位置
nnoremap ' `
nnoremap ` '

其常用的几个快捷键

" 显示marks - 方便自己进行标记和跳转
" m[a-zA-Z] add mark
" '[a-zA-Z] go to mark
" m<Space>  del all marks
" m/        list all marks
" m.        add new mark just follow previous mark

插件: 终极跳转 easymotion

有一个插件, 对跳转做了深入的定制, 那就是: vim-easymotion

安装了之后, 简直想怎么跳就怎么跳. 作为一个必备插件, 大家有必要深入学习下用法, 跳转效率翻倍

之前写的一篇博文介绍: VIM插件: EASYMOTION(快速跳转)

  • 用法1: 跳转到当前光标前后的位置(w/b)
  • 用法2: 搜索跳转(s)
  • 用法3: 行级跳转(jk)
  • 用法4: 行内跳转(hl)
  • 用法5: 重复上一次动作(.)

具体配置及演示见博文

其他

vim中跳转的配置大抵这些就够用了.

下一篇, 将介绍如何快速编辑. 后续还有搜索替换等等一系列内容


vim,linux

1993 Words

2017-03-20 00:00 +0000