烦恼一般都是想太多了。

0%

IdeaVim的的一些使用

虽然使用了 IdeaVim 来在 Android Studio 来进行代码的编辑其实很多地方还是用得不是非常的顺溜。很多 VIM 相关的知识也忘记得差不多了。比如很多 Idea 本身提供的方法快捷键实在是无法满足我的需求,所以很有必要了解一下更多详细的内容。这是一个翻译文档,但是会很有用的。原文地址

移动和操作符

移动命令可以在操作符命令后使用,这样就可以在移动过的文本上进行操作。进行操作的文本就是在移动前的位置,和移动后位置之间的文本。操作符通常用来进行改变或者删除文本。下面是一些可用的操作符:

  • c change
  • d delete
  • y yank to register(不会改变文本)
  • ~ 大小写切换(需要启用 tildeop)
  • g~ 大小写切换
  • gu 转换为小写,后面可以跟移动命令。可以试试 guw guk
  • gU 转换为大写。
  • ! 外部命令
  • 右移

  • < 左移

如果移动和操作前都有一个计数,那么这两个计数会相乘。例如 2d3w 会删除 6 个单词。

在操作应用后,光标通常位于进行操作的文本左面。如 yfe 不会移动光标,但 yFe 会移动光标。

操作会影响整行,或者在移动前后位置间的文本。通常,在行间移动会影响行(面向行),而在行内的移动则会影响字符(面向字符)。然而,这也有一些例外。

对于面向字符的移动可能是包含性的或排他性的。如果是包含性的,那么移动开始和结束位置都会包含在操作中。而如果是排他性的,最后一个字符到行结束都不会包含在操作中。面向行的移动总是包含起始和结束位置。

Which motions are linewise, inclusive or exclusive is mentioned below. There
are however, two general exceptions:

  1. If the motion is exclusive and the end of the motion is in column 1, the
    end of the motion is moved to the end of the previous line and the motion
    becomes inclusive. Example: “}” moves to the first line after a paragraph,
    but “d}” will not include that line.
  2. If the motion is exclusive, the end of the motion is in column 1 and the
    start of the motion was at or before the first non-blank in the line, the
    motion becomes linewise. Example: If a paragraph begins with some blanks
    and you do “d}” while standing on the first non-blank, all the lines of
    the paragraph are deleted, including the blanks. If you do a put now, the
    deleted lines will be inserted below the cursor position.

Instead of first giving the operator and then a motion you can use Visual
mode: mark the start of the text with “v”, move the cursor to the end of the
text that is to be affected and then hit the operator. The text between the
start and the cursor position is highlighted, so you can see what text will
be operated upon. This allows much more freedom, but requires more key
strokes and has limited redo functionality. See the chapter on Visual mode

左右移动

  • h <Left> CTRL-H <BS>左移一个字符
  • l <Right> <Space> 右移一个字符
  • 0 行的第一个字符
  • <Home>
  • ^行内第一个非空白字符
  • $ <End> 行尾。但在命令前加上计数的时候,会向下前进 count - 1 行。
  • g_行内最后一个非空白字符。加上 count 计数时会向下前进 count -1 行。
  • g0 g<Home> 当开开启 wrap 设置时。会走到屏幕上显示的当前行的第一个字符。当行的长度大于屏幕宽度的时候,这和 0 的效果不同。
  • g^wrap 为 on 时,移动到屏幕上第一个非空白字符。
  • gmg0 类似。走动屏幕中央(当字符不够到屏幕中间是,尽可能多的移动)
  • g$ g<End> 移动到屏幕右边
  • |前进到某一列 5l
  • f{char} 前进到 char 字符出现的地方。如果前面加上 count,则会前进到第 count 次出现的地方。如 2fi
  • F{char} 同上,不过是由右至左移动。
  • t{char} 和 f 命令类似,不过不包括查找的那个字符。
  • T{char} 和 F 命令类似,不过不包括查找的那个字符。
  • ; 重复上一个 f, F, T, t 命令 count 次。
  • ,;,不过是从右至左移动。

上面这些命令会移动光标动行内特定的列。

上下移动

  • k <Up> <CTRL-P> 向上一行
  • j <Down> <CTRL-J> <NL> <CTRL-N> 向下一行
  • gk g<Up> 在屏幕上显示的行上进行移动。在 wrap on 的时候与 k 的效果不同。
  • gj g<Down> 同上 ,不过往下移动。
  • - 移动到往上 count 行的第一个非空白字符
  • - CTRL-M <CR> 向下移动 count 行到第一个非空白字符
  • _ <underscore> 向下移动 count - 1 行到第一个非空白字符
  • G 前面加上 count,移动到指定行的第一个非空白字符。如果不加 count,移动到最后一行。
  • <C-End> 前进到第 count 行,最后一个字符。默认会到最后一行。
  • <C-Home> gg 前进到第 count 行。如果没有 count,会走到第一行的第一个非空白字符。
  • :[range] 指定行号。多个行号的话使用最后一个。
  • {count}% 移动到文件的百分比处的行的第一个非空白字符
  • :[range]go[to] [count] [count]go。前进到缓冲区内的 count 字节处。 count 默认是 1,表示文件的开始。[range] 表示从指定的 byte 处开始。

    单词移动

  • <S-Right> w 按单词前进到下一个单词首。

  • <C-Right> W 按单词前进。就我尝试而言,W 只会把空白当作单词分隔附,而 w 会将各种符号都当作分隔符。
  • e E 到单词尾部。E 同 W的意义。
  • <S-Left> b 按词回退到词首。
  • <C-Left> B 按词回退到词首。
  • ge gE 左移到词尾
  • [w VIM 中没有这个命令。驼峰式右移一个词
  • [b VIM 中没有这个命令。驼峰式左移一个词
  • ]w VIM 中没有这个命令。驼峰式右移到词尾。
  • ]b VIM 中没有这个命令。驼峰式左移到词尾。

    文本对象移动

有三种类型的文本对象。

  • 句子。句子的定义是:从当前位置到以 ., !, ?结束,同时后面跟着空格或Tab,或者是行尾。在 ., !, ? 和后面的空白或行结束间可能有多个封闭的 ), ], }, ", '。一个段和节的界限也是句子的界限。在 cpoptions 中如果出现了 J 标志,那么在上述的三个标点符号后至少要跟两个空白;多个 Tabs 不会被识别为空白。句子的定义不能被更改。
  • 段落。一个段落在每个空行后开始,或者在 paragraphs选项中的字符对标记的段落宏后开始。默认的是 IPLPPPQPP LIpplpipbp,对应了宏 .IP.LP 等。(这是些 nroff 的宏,所以 . 必须在第一列)。一个节的界限也是段落的界限。 注意:段落并不包含第一列是 {, } 的情况。 注意:只包含空白符的行也不是一个段落的界限
  • 节。节从第一列是 <C-L> 处开始,或者从定义节的宏处开始,这些宏在 sections 选项定义。默认的是 SHNHH HUnhsh,定义了节从 nroff 宏 .SH, .NH, .H, .HU, .nh, .sh。处开始。

], ] 命令在第一列是 {, } 处结束。在 C 程序中用来找到函数的开始和结束非常的有用。注意:这命令的第一个字符决定了搜索的风向,第二个字符决定了寻找的括号类型。

  • ( 按句回退。
  • ) 按句前进
  • g( 按句回退到句末。
  • g) 按句前进到句末。
  • { 按段落回退
  • } 按段落前进
  • ]] 按节前进到第一列是 { 的位置。如果是在一个操作符后使用,那么就会走到 } 在第一列的地方。
  • ][ 到下一个首列是 } 的位置。
  • [[ 到前一个首列是 { 的位置。
  • [] 到前一个首列是 } 的位置

文本对象选择

这些命令只能是在 Visual 模式或者在操作符后使用。以 a 开头的命令会选择一个对象(包括空白),i 开始的命令不包含空白(或者仅仅只是空白)。i 开头的命令选择的文本总是比 a 少。

  • a" 双引号字符串
  • a' 单引号字符串
  • `a`` 反引号内的字符
  • aw 一个单词。
  • iw 单词间的空白会也被看作单词。
  • aW
  • iW
  • as
  • is
  • ap
  • ip
  • a] a[ 一个 [] 块。
  • i] i[
  • a) a( ab 一个语句块。哈哈就是 () 中的内容了,比如函数参数可以一下子删除。
  • i) i( ib
  • a> a< 一个 <> 块。xml 文件内用。
  • i> i<
  • a} a{ aB 一个 {} 块。删除函数体也很有用
  • i} i{ iB

    标记

    跳转

    更多动作

  • ]m 下一个方法的开始。

  • ]M 下一个方法的结束。
  • [m 上一个方法的开始。
  • [M 上一个方法的结束。
  • H Head 屏幕顶部
  • M Middle 屏幕中部
  • L 屏幕底部