vim - 在 Vim 中将光标移过长的软环绕行

如果我的问题不是很清楚,我很抱歉。我不知道如何表达它。

我想使用 VIM 为我所在的一些类(class)写论文。我遇到的问题是编辑器中的行格式。如果我没有用回车键明确地打破行尾,当我尝试在文本中移动光标时,如果我有一个跨越多行的句子,它会跳过多行。有什么方法可以使光标能够像在大多数文字处理器中那样在文本中移动?

最佳答案

经常使用的问题

noremap j gj  
noremap k gk 

选项是,它破坏了 <vcount>功能,如果您的文本中有跨多行的行。
示例:您想要 10k (向上 10 行),因为您在侧边栏中使用相对数字,但是有一个 4 行高度的多行。因此,您最终有效地在所需行上方的 6 行( 6k )处,您从相对数字中读取。您必须手动计算!烦人...特别是如果您在当前位置和所需位置之间有多条多线 - 不是 Vim-istic!

我喜欢我的 <vcount>与我的 :relativenumber 一起使用,这就是为什么我写了以下函数和映射来解决与此相关的所有问题。
这些函数让您可以使用 10j 等命令。或 10k正如预期的那样,尽管多行具有使用 gj 的所有优点和 gk作为您的默认移动映射:

编辑: 我刚刚在 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')

来源: http://www.reddit.com/r/vim/comments/2k4cbr/problem_with_gj_and_gk/


我的旧解决方案:

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

https://stackoverflow.com/questions/20975928/

相关文章:

javascript - getHours() 返回不正确的值

awk - 带有 awk 的 pretty-print 表

c# - Html.HiddenFor 在 ASP.NET 中错误地格式化 DateTime

c++ - 格式化 C++ 控制台输出

c# - 在 DataGridView 列中格式化 TimeSpan

swift - 在 Swift 中使用 %@ 格式化字符串

php - 如何使用 PHP 发送 HTML 格式的邮件?

perl - 使用 Perl 进行格式化输出的最佳方式

c# - String.Format 参数顺序烦人

python - 在空格或连字符上拆分?