2012-02-29 32 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"')