在Vim中的长软换行中移动光标

wsewodh2  于 2022-11-11  发布在  其他
关注(0)|答案(5)|浏览(212)

如果我的问题不是很清楚,我很抱歉。我不知道该怎么表达。
我想用VIM来写一些我所参加的课程的论文。我遇到的问题是编辑器中的行格式。如果我没有明确地用回车键断开行尾,当我试图在文本中移动光标时,如果我有一个跨越多行的句子,它会跳过多行。有没有什么方法可以使光标能够像在大多数文字处理器中那样在文本中移动?

wf82jlnq

wf82jlnq1#

经常使用的问题

noremap j gj  
noremap k gk

选项的一个缺点是,如果您的文本中有跨多行的行,则它会中断<vcount>功能。
示例:你想要10k(向上10行),因为你在边栏中使用了相对数字,但是有一个4行高的多行。因此,你实际上在6行结束(6k),你从你的相对数字中读取。你必须手动计算!讨厌...特别是如果你有多个多线之间你的当前位置和你想要的位置-不是Vim-istic
我喜欢我的<vcount>函数和我的:relativenumber在一起,这就是为什么我写了下面的函数&Map来解决与此相关的所有问题。
这些函数使您可以按预期使用10j10k等命令,尽管存在多行,但具有使用gjgk作为默认移动Map的所有优点:

**编辑:**我刚刚在reddit上找到了下面这个,它比我自己的解决方案好太多了。这是最短的版本:

nnoremap <expr> j v:count ? 'j' : 'gj'
nnoremap <expr> k v:count ? 'k' : 'gk'
  • (如果您使用noremap而不是nnoremap,则此操作在可视模式和正常模式下均有效)*

“较长”版本,以便更好地理解和完整:

nnoremap <expr> k (v:count == 0 ? 'gk' : 'k')
nnoremap <expr> j (v:count == 0 ? 'gj' : 'j')
nnoremap <silent> j :<C-U>call Down(v:count)<CR>
vnoremap <silent> j gj

nnoremap <silent> k :<C-U>call Up(v:count)<CR>
vnoremap <silent> k gk

function! Down(vcount)
  if a:vcount == 0
    exe "normal! gj"
  else
    exe "normal! ". a:vcount ."j"
  endif
endfunction

function! Up(vcount)
  if a:vcount == 0
    exe "normal! gk"
  else
    exe "normal! ". a:vcount ."k"
  endif
endfunction
2w2cym1i

2w2cym1i2#

这是因为默认的jk动作跨越了 * 物理线 *,而不是可见的、软 Package 的 * 屏幕线 *(当你有:set wrap时)。你可以使用gjgk命令来实现这一点。
如果您想默认为该行为,可以通过将以下代码放入~/.vimrc中来重新Map默认键:

noremap j gj
noremap k gk
6pp0gazn

6pp0gazn3#

您是否尝试过在vim命令行中执行以下操作:

:set nowrap
hrirmatl

hrirmatl4#

解决方案,我发现在互联网上的工作与向上和向下箭头:

imap <silent> <Down> <C-o>gj
imap <silent> <Up> <C-o>gk
nmap <silent> <Down> gj
nmap <silent> <Up> gk
3zwjbxry

3zwjbxry5#

我已经找到了这个解决方案的另一个版本,它不仅仅是在物理或虚拟行中移动,它还在跳转列表中添加了大于5行的跳转,允许我们使用Ctrl-o和Ctrl-i。

" source: https://www.vi-improved.org/vim-tips/
nnoremap <expr> j v:count ? (v:count > 5 ? "m'" . v:count : '') . 'j' : 'gj'
nnoremap <expr> k v:count ? (v:count > 5 ? "m'" . v:count : '') . 'k' : 'gk'

它使用嵌套的三元运算符将跳转添加到跳转列表

相关问题