2012-02-29 17 views
6

¿Cómo puedo unir dos líneas en vim y dejar el cursor en su posición original en lugar de saltar al punto de fusión?Unir dos líneas en vim sin mover el cursor

Por ejemplo, tome los las dos líneas siguientes con el cursor en la posición indicada por el símbolo de intercalación:

this is ^line one 
this is line two 

Fusión por J produce:

this is line one ^this is line two 

¿Cómo puedo producir:

this is ^line one this is line two 

He intentado cosas como CTRL-O y variaciones de ''. Ninguno de estos parece funcionar. Van al comienzo de la línea, no a la posición original del cursor.

Respuesta

9

Otra manera de no pisar sobre las marcas sería la siguiente:

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

Mucho más detallado, pero le impide perder una marca.

  • :nnoremap - no recursivo mapa
  • <silent> - No echo nada cuando se pulsa el mapeo
  • J - Clave para mapear
  • :let p=getpos('.') - Tienda cursor de posición
  • <bar> - separador de comandos (| para mapas, vea :help map_bar)
  • join - El ex comando f o normal J
  • <bar> - ...
  • call setpos('.', p) - Restaurar posición del cursor
  • <cr> - Ejecutar los comandos
+0

Esto es exactamente lo que estaba buscando. ¡Gracias! Solo una solicitud más, sin embargo. ¿Podrías explicar rápidamente qué está haciendo la pieza después de la J? – cledoux

+0

Heh, lo edité tal como lo comentó. :) –

+0

Esta es una pregunta tonta general vimscript pero me parece que es apropiado: ¿Cuál es el alcance que se está contaminado con la variable 'p'? ¿Es esto algo que potencialmente puede causar un extraño error de configuración? ¿Hay alguna buena razón para no nombrar algo mucho más específico (y menos propenso a la colisión de nombres variables) que 'p'? –

4

Puede hacerlo como:

:nnoremap <F2> mbJ`b 

Esto asigna las siguientes acciones a la F2 clave:

  1. Es decir, crear una marca (mb, pero NOTA si estableció anteriormente la marca b, entonces se sobrescribe!)
  2. J oin las líneas
  3. saltar de nuevo a la marca anterior (`b)
+0

puede valer la pena señalar, en caso de que no se le ocurra a alguien, esto sobrescribirá la marca 'b' si se configuró. – Kevin

+0

Si quisiera terminar al principio de la línea, esto funcionaría. Sin embargo, eso no es lo que. – cledoux

+4

Es por eso que usa ', no ' –

0
función

utilidad que se puede utilizar para otros 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 

Aquí la solución usando la función anterior, su ventaja: Hace no ocupe ningún registro

" 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> 

Por cierto: Más dos ejemplos de cómo se puede utilizar la función de preservar

"Eliminar espacios adicionales al final onf la línea

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

" archivo Reident toda

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