acceso directo de vim para abrir un archivo debajo del cursor en una ventana ya abierta

acceso directo de vim para abrir un archivo debajo del cursor en una ventana ya abierta

En vim puedes abrir un archivo debajo del cursorusando el gfcomando.

También se puede abrir fácilmente ese archivo en una nueva ventana dividida presionando <c-w> f. Esta es una característica realmente interesante y que ahorra tiempo.

Sin embargo, no puedo entender cómo abrir el archivo en una ventana dividida ya abierta (sin crear una nueva).

Respuesta1

Reuní todas las piezas para hacer el truco. La mejor manera es crear una asignación personalizada para todos los comandos:

 map <F8> :let mycurf=expand("<cfile>")<cr><c-w> w :execute("e ".mycurf)<cr><c-w>p

Explicación:

  • map <F8>asigna en "F8" los comandos que siguen
  • let mycurf=expand("<cfile>")obtiene el nombre del archivo debajo del cursor y lo guarda enmycurf
  • <c-w>wcambia el foco a la siguiente ventana dividida abierta
  • execute("e ".mycurf)abre el archivo guardado enmycurf
  • finalmente <c-w>pcambia el foco a la ventana anterior (de donde realmente venimos)

Respuesta2

Busqué la misma función de VIm y descubrí esta solución que funciona de maravilla:

map <F8> :vertical wincmd f<CR>

Página fuente.

Respuesta3

Esto funcionó para mí:

function! OpenFileInPrevWindow()
    let cfile = expand("<cfile>")
    wincmd p
    execute "edit " . cfile
endfunction

nmap ,f :call OpenFileInPrevWindow()<CR>

Respuesta4

Me molestaron bastante las respuestas anteriores de 2013, noabandonartrabajando de manera confiable en las situaciones que me importaban y escribí funciones un poco más sólidas para manejarlas. Específicamente gF(es decir, incluyendo la funcionalidad "ir a número de línea"), como ejemplo:

function! gfriend#goto_cWORD(winmotion)
  let cword = expand("<cWORD>")
  let st = match(cword, '\v\f+:\d+')
  let end = matchend(cword, '\v\f+:\d+')

  if end !=# -1
    let cword = cword[st:end - 1]
  endif

  let bits = split(cword, ':')

  let starting_window = nvim_win_get_number(0)

  " If there's no previous window, create a new one
  wincmd p
  if nvim_win_get_number(0) ==# starting_window
    execute(a:winmotion." ".bits[0])
  else
    execute("e ".bits[0])
  endif

  if bits[1]
    execute(bits[1])
  endif
endfunction

El uso es algo como:

nmap <silent> <Leader>gF \
   :<C-u>call gfriend#goto_cWORD(winwidth(0) >=# 180 ? 'vsp' : 'sp')<CR>

He publicado la cosa (pequeña)a GitHub, desde donde puedes instalarlo como complemento si lo deseas:

Plug 'ELLIOTTCABLE/vim-gfriend'

información relacionada