2012-02-29 33 views
6

我怎样才能加入VIM两条线和光标停留在它原来的位置,而不是它跳跃到合并点?加入vim的两行不动,光标

例如,采取以下两行用光标在由插入符指示的位置:

this is ^line one 
this is line two 

合并由Ĵ生产:

this is line one ^this is line two 

如何可以产生:

this is ^line one this is line two 

我曾尝试之类的东西CTRL-O''变化。这些似乎都不起作用。他们到了行的开头,而不是原来的光标位置。

回答

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 - 这位前指令f还是正常的J
  • <bar> - ...
  • call setpos('.', p) - 恢复光标位置
  • <cr> - 运行命令
+0

这正是我正在寻找的。谢谢!不过,我只是提出了另外一个要求。你能否快速解释J之后的作品? – cledoux 2012-02-29 20:29:48

+0

呵呵,我按照你的评论编辑它。 :) – 2012-02-29 20:32:52

+0

这是一个愚蠢的一般vimscript问题,但我觉得它是适当的:什么是变量'p'被污染的范围?这是否可能会导致一个奇怪的配置错误?有没有一个很好的理由不会比'p'命名更具体(并且不易发生变量名冲突)? – 2015-02-05 23:03:59

4

你可以不喜欢它:

:nnoremap <F2> mbJ`b 

这就赋予以下操作的F2键:

  1. 也就是说,建立一个标记(b,但注意如果你以前设置的b马克,比它被改写!)
  2. Ĵ OIN线
  3. 跳转回到先前的标记(`b
+0

可能值得指出的“末ONF行

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

删除多余的空格”如果它不会出现在某人身上,那么如果它被设置,这将覆盖'b'标记。 – Kevin 2012-02-29 19:48:36

+0

如果我想在线的开头结束,这将工作。然而,那不是什么。 – cledoux 2012-02-29 20:14:10

+4

这就是为什么你使用',而不是' – 2012-02-29 20:16:53

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:你如何使用保存功能

更多两个例子Reident整个文件

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