すでに開いているウィンドウでカーソルの下にあるファイルを開くための 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具体的には (つまり、「行番号へ移動」機能を含む)、例として次のようになります。

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'

関連情報