如何在Vim中直观地移动光标?(非按行移动)

18
如果某些行太长,会被强制换行。例如,通常一行很长的话,就会看起来像这样。
1 first line
2 this is the long second line of the file
3 third line.

但是,如果vim的窗口太窄,它会看起来像这样。
1 first line
2 this is the long
  second line of the file
3 third line

问题出在这里。

假设vim光标位于“第三行”的“t”之前。如果我输入“k”,光标将移动到文件“第二行”的“s”之前。之后,如果我再次输入“k”,光标将移动到“第一行”的“f”处!而不是“this is the long”中的“t”。我想要的是光标移动到“this is the long”中的“t”,这对我来说更加直观。我该如何设置我的vim才能像这样工作?


2
你所描述的“当前”行为非常不寻常;我正试图弄清楚vim如何能够实现这一点。确认一下,你目前的行为是这样的,在第3行的“t”字母之前,如果你按下'k'键一次,它会上移一行到第2行的“s”字母之前,但如果你再按一次,它会上移两行到第1行的“f”字母之前? - David Pope
5个回答

33
在 Vim 中,gjgk 命令移动的是屏幕上的行而不是文件中的行。这听起来很可能符合您的描述。
您可以像这样修改键:
:map j gj
:map k gk

7
只是一个提醒,你可能需要考虑使用 :noremap:nnoremap,在这里可以了解更多信息:http://learnvimscriptthehardway.stevelosh.com/chapters/05.html。 - Travis Northcutt

5
不,如果某些行太长并且你已经开启了“自动换行”,它们将被显示为“两行”,但它们之间不会有换行符。如果使用“set nowrap”关闭“自动换行”,您将看到效果。
通常情况下,按“k”和“j”可以向上或向下移动。如果要浏览换行的行,请使用“gk”或“gj”,或者像一些人喜欢的那样,将其映射到例如光标键。
nmap <up> gk
nmap <down> gj

2

在vim中以自然的方式移动是可能的。

我所做的,也建议你这样做,是修改(或创建)你的“〜/ .vimrc”文件并添加这两行:

map <C-Up> g<Up>
map <C-Down> g<Down>

这将把控制键加上和控制键向下映射为移动命令(这与控制键向右和控制键向左移动长行相一致)

如果您添加这另外两行,您可以使用同样的命令在插入模式下移动:

imap <C-Up> <C-[> g<Up> i
imap <C-Down> <C-[> g<Down> i

(VIM太棒了!)

Greg Ruo


这会对行的移动产生负面影响,就像你执行i一样。请使用Ctrl-O - Pod

0

这个答案是从@mario-rossi的答案中衍生出来的(向他致敬),稍作修改。

我使用普通的上下箭头键,而不是CTRL+上下箭头键。并且在插入模式映射中,我需要删除一个多余的空格,以避免一种偏移行为。

将以下内容放入您的~/.vimrc文件中:

" When a long line is wrapped, the "gk" and "gj" allow you to move up and down
" a visual line, while normal "k" and "j" move a physical line.
" The following settings map "gk" and "gj" to cursor <up> and <down>.
map <up> gk
map <down> gj
" And the following lines enables same <up> and <down> behavior in INSERT mode
imap <up> <C-[> <up>i
imap <down> <C-[> <down>i

0

vim.fandom.com 中获取了以下内容:

有几种情况需要重新映射向上和向下的移动。首先,您可能应该重新映射k/j和箭头(/)。其次,您应该选择需要重新映射的vim模式。基本模式包括Normal(nmap),Insert(i命令后的as,imap)和Select(v命令后的as,vmap)。要重新映射所有三种模式:

nnoremap j gj
nnoremap k gk
vnoremap j gj
vnoremap k gk
nnoremap <Down> gj
nnoremap <Up> gk
vnoremap <Down> gj
vnoremap <Up> gk
inoremap <Down> <C-o>gj
inoremap <Up> <C-o>gk

还有一个重要的操作模式(如 dj 或 y4k),重新映射操作符(omap)会严重破坏 Vim 的使用体验和习惯,不建议使用。

个人而言,我更喜欢仅重新映射插入模式,以保持我的编辑习惯不变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接