在vim中连接两行而不移动光标

时间:2012-02-29 19:14:28

标签: vim

如何在vim中加入两行,将光标保留在原始位置而不是跳转到合并点?

例如,将光标放在插入符指示的位置,使用以下两行:

this is ^line one
this is line two

通过 J 合并产生:

this is line one ^this is line two

我如何制作:

this is ^line one this is line two

我尝试了 CTRL-O ''的变体。这些似乎都不起作用。它们到达行的开头,而不是原始光标位置。

3 个答案:

答案 0 :(得分:9)

另一种不会踩踏标记的方法是:

:nnoremap <silent> J :let p=getpos('.')<bar>join<bar>call setpos('.', p)<cr>

更详细,但它可以防止你丢失标记。

  • :nnoremap - 非递归地图
  • <silent> - 按下映射时不要回显任何内容
  • J - 地图关键
  • :let p=getpos('.') - 存储光标位置
  • <bar> - 命令分隔符(地图|,请参阅:help map_bar
  • join - 普通J
  • 的前命令
  • <bar> - ...
  • call setpos('.', p) - 恢复光标位置
  • <cr> - 运行命令

答案 1 :(得分:4)

你可以这样做:

:nnoremap <F2> mbJ`b

这会将以下操作分配给 F2 键:

  1. 也就是说,创建一个标记( m b ,但注意如果您之前设置了b标记,则它会被覆盖!)
  2. J
  3. 跳回上一个标记(` b

答案 2 :(得分:0)

可用于其他porpuses的实用功能

" Utility function that save last search and cursor position
" http://technotales.wordpress.com/2010/03/31/preserve-a-vim-function-that-keeps-your-state/
" video from vimcasts.org: http://vimcasts.org/episodes/tidying-whitespace
if !exists('*Preserve')
    function! Preserve(command)
        try
            " Preparation: save last search, and cursor position.
            let l:win_view = winsaveview()
            let l:old_query = getreg('/')
            silent! execute 'keepjumps ' . a:command
         finally
            " Clean up: restore previous search history, and cursor position
            call winrestview(l:win_view)
            call setreg('/', l:old_query)
         endtry
    endfunction
endif

这里解决方案使用上述功能,其优点是:不占用任何寄存器

" join lines without moving the cursor (gJ prevent adding spaces between lines joined)
nnoremap J :call Preserve("exec 'normal! J'")<cr>
nnoremap gJ :call Preserve("exec 'normal! gJ'")<cr>

BTW:关于如何使用保留功能的更多两个例子

&#34;删除行末尾的额外空格

fun! CleanExtraSpaces()
    call Preserve('%s/\s\+$//ge')
endfun
com! Cls :call CleanExtraSpaces()
au! BufwritePre * :call CleanExtraSpaces()

&#34; Reident整个文件

call Preserve('exec "normal! gg=G"')