сочетание клавиш vim для открытия файла под курсором в уже открытом окне

сочетание клавиш vim для открытия файла под курсором в уже открытом окне

В vim вы можете открыть файл под курсоромс помощью gfкоманды.

Также можно легко открыть этот файл в новом разделенном окне, нажав <c-w> f. Это действительно удобная и экономящая время функция.

Однако я не могу понять, как открыть файл в уже открытом разделенном окне (не создавая новое).

решение1

Я собрал все части вместе, чтобы сделать трюк. Лучший способ — создать пользовательское сопоставление для всех команд:

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

Объяснение:

  • map <F8>отображает на "F8" команды, которые следуют за
  • let mycurf=expand("<cfile>")получает имя файла под курсором и сохраняет его вmycurf
  • <c-w>wизменяет фокус на следующее открытое разделенное окно
  • execute("e ".mycurf)открывает файл, сохраненный вmycurf
  • наконец-то <c-w>pпереключает фокус на предыдущее окно (откуда мы собственно и пришли)

решение2

Я поискал ту же функцию VIm и нашел это решение, которое работает как часы:

map <F8> :vertical wincmd f<CR>

Исходная страница.

решение3

Мне это помогло:

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

nmap ,f :call OpenFileInPrevWindow()<CR>

решение4

Я был достаточно раздражен из-за ответов выше от 2013 года, непокидатьнадежно работая в ситуациях, которые меня интересовали, и написал немного более надежные функции для их обработки. Для gFконкретно (т.е. включая функциональность "goto linenumber"), как пример:

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

Использование примерно такое:

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

Я опубликовал (крошечную) вещьна GitHub, откуда вы можете установить его как плагин, если захотите:

Plug 'ELLIOTTCABLE/vim-gfriend'

Связанный контент