vim 如何将文本向上移动一行(不是 ctrl--e)
ctrl-e LZ 知道,有没有如同 gj gk 移动光标一样,移动文本的命令 展开
Vim 里有几种类型的移动命令,概念比较容易混淆。
移动一般是指移动光标的位置。比如最基本的 j, k 就是移动命令,Vim 术语是“移动(Motion)”。对于比较长的行,在 Vim 里可能显示不下,根据是否自动换行(选项 wrap 控制),这些行可能会显示成许多行。这时 显示行(display line) 和 逻辑行(line) 就有可能不一致,j,k 是针对逻辑行移动的(因此可能看上去像是移动一个自然段),gj, gk 是针对显示行。
另一种“移动”是指移动屏幕,它不移动光标本身。而是类似上下翻页。比如 <ctrl-F> 和 <ctrl-b> 分别对应向下和向上翻页,是您说的 <ctrl-e> 也是这类命令。Vim 术语叫“滚动(Scroll)”。
您既然这么问,那么所谓的“移动文本”,可能不是上面两种意思,而是交换当前行和其它行的位置。这种改变文本内容的行为,在 Vim 里都属于“编辑(Edit)”。
已经有人给出的 ddP 大约是对的,但应该是 ddkP。dd 是删除当前(逻辑)行。这时由于下面的行会向上补,光标实际会落到这行下面那行,因此在 P (粘贴)之前需要用 k 先向上先移动一下。
另外 Vim 命令
:move
是移动文本的,可以简写成 :m,m 后面可跟一个行号,表示移动到指定行号之后。行号也可以用相对行号,比如 +2, -4 之类的。这样
:m -2
就是把当前行移动到此行向上数 2 行之后。实际结果就是向上移动了一行。
用命令一般没 ddkP 方便,但好处是如果你想把连续几行向前挪,可以先选中要挪的部分,然后按 : 并输入上面的命令,这样 Vim 会自动变成:
:'<,'>m -2
m 前面那些是用来表示选中范围的。这个命令的实际效果是把选中的那些行一并向上移动一行。
由于 Vim 大部分命令都是针对逻辑行的,因此可以先关掉自动换行(方法是 :set nowrap),避免产生混乱。
如果您的需要不是这样,可以追问举例具体描述一下。
2024-11-19 广告
或 dd 那行 再 p
你说的自然段就是一行,只不过没有换行,是编辑器自动换行的。