web-dev-qa-db-ja.com

Yankファイル名/ Vimの現在のバッファーのパス

現在のバッファが編集用に開かれたファイルであると仮定すると、:eは表示されませんE32: No file name

次のいずれかまたはすべてをヤンクしたい:

  • ステータス行に表示されているとおりのファイル名。 ~\myfile.txt
  • ファイルへのフルパス、例えばc:\foo\bar\myfile.txt
  • ファイル名だけ、例えばmyfile.txt
171
dukedave

TL; DR

:let @" = expand("%")>

これにより、ファイル名がunamedレジスタにコピーされます。その後、古いpを使用して貼り付けることができます。そしてもちろん、これをキーにマッピングして、すばやく使用することができます。

:nmap cp :let @" = expand("%")<cr>

これをフルパスに使用することもできます

:let @" = expand("%:p")

説明

Vimはunnamed registerを使用して、削除またはコピー(ヤンク)されたテキストを保存します。同様に、ペーストすると、このレジスタからテキストが読み込まれます。

letを使用すると、_:let @" = "text"_を使用してテキストをレジスタに手動で保存できますが、式の結果を保存することもできます。

上記の例では、ワイルドカードとキーワードを展開する関数expandを使用しています。この例では、expand('%')を使用して現在のファイル名を展開します。完全なファイル名のexpand('%:p')として変更できます。

詳細については_:help let_ _:help expand_ _:help registers_をご覧ください

192
JD Frias

あなたが求めているほとんどのこと、そしてそれはするかもしれません:Ctrl+R %は、現在のファイル名を現在の場所(コマンドプロンプト、編集バッファ、...)に取り込みます。 このVimのヒント を参照してください。

86
dwc

現在のバッファファイル名をシステムレベルのクリップボードに入れたい場合は、レジスタを@ +に変更してみてください。

" relative path
:let @+ = expand("%")

" full path
:let @+ = expand("%:p")

" just filename
:let @+ = expand("%:t")

編集20140421:これらをよく使用するため、いくつかのショートカットを作成しました。 Linux VimsはMac Vimsとは少し動作が異なるようです そのため、特別なケースもあります。以下を~/.vimrcに入れた場合:

" copy current file name (relative/absolute) to system clipboard
if has("mac") || has("gui_macvim") || has("gui_mac")
  " relative path  (src/foo.txt)
  nnoremap <leader>cf :let @*=expand("%")<CR>

  " absolute path  (/something/src/foo.txt)
  nnoremap <leader>cF :let @*=expand("%:p")<CR>

  " filename       (foo.txt)
  nnoremap <leader>ct :let @*=expand("%:t")<CR>

  " directory name (/something/src)
  nnoremap <leader>ch :let @*=expand("%:p:h")<CR>
endif

" copy current file name (relative/absolute) to system clipboard (Linux version)
if has("gui_gtk") || has("gui_gtk2") || has("gui_gnome") || has("unix")
  " relative path (src/foo.txt)
  nnoremap <leader>cf :let @+=expand("%")<CR>

  " absolute path (/something/src/foo.txt)
  nnoremap <leader>cF :let @+=expand("%:p")<CR>

  " filename (foo.txt)
  nnoremap <leader>ct :let @+=expand("%:t")<CR>

  " directory name (/something/src)
  nnoremap <leader>ch :let @+=expand("%:p:h")<CR>
endif

次に、例えば<leader>cfは現在のバッファの相対パスをコピーします(デフォルトのリーダーはバックスラッシュ(\)です)。ファイルでコマンドを実行したり、コマンドラインで他のことをしたりするためによく使用します。最後のファイル名/ディレクトリ名を実際に頻繁に使用することはありません。

<leader>cfrは相対、<leader>cfaは絶対、<leader>cffはファイル名のみ、<leader>cfdはディレクトリのような、より直感的なマッピングを検討できます。

62
Anthony Panozzo

:regを実行すると、%レジスタに現在のファイルの名前が表示されます。たとえば、"%pで貼り付けることができます。

私のように、「代替」バッファに頻繁に切り替える場合、そのフルパスとファイル名を#レジスタに入れると非常に便利です。たとえば、"#pで貼り付けることができます。

注(これが私のセットアップに固有の動作である場合):私はVIM 7.4.52をUbuntu 14.04.4 LTSで使用しています。

5
Robert

他のいくつかの回答からの情報を組み合わせます:ファイルへの現在のフルパスをヤンクして別のウィンドウのコマンドバッファーに入れたい場合は、最初に:let @" = expand("%:p")を実行し、次に別のウィンドウに移動してCtrl+R "と入力します。

同じディレクトリに残り、古いディレクトリを開いたままにしてファイルをコピーするのに便利です。例えば:

開始:編集src/com/benatkin/Paint/shapes/Circle.Java

  1. タイプ:let @" = expand("%:p")(パスはメインクリップボードバッファーにヤンクされます。)

  2. :spで新しいウィンドウを開きます

  3. タイプ:e Ctrl+R"

  4. 矢印キーを使用してCircleに戻り、Squareに変更し、<CR>を押します

終了:編集src/com/benatkin/Paint/shapes/Square.Java

4
Benjamin Atkin

私の解決策は次のとおりです。

" filename / dirname of the current file {{{
    " copy result to the system clipboard and echo the result
    " the cb> Prompt means the clipboard
    " *f*ile *n*ame, ex. init.vim
    map <Leader>fn :let @+ = expand("%:t") \| echo 'cb> ' . @+<CR>
    " *f*ile *p*ath, ex. /home/user/nvim/init.vim
    map <Leader>fp :let @+ = expand("%:p") \| echo 'cb> ' . @+<CR>
    " *d*irectory *p*ath, ex. /home/user/nvim
    map <Leader>dp :let @+ = expand("%:p:h") \| echo 'cb> ' . @+<CR>
    " *d*irectory *n*ame, ex. nvim
    map <Leader>dn :let @+ = expand("%:p:h:t") \| echo 'cb> ' . @+<CR>
" }}}
1
Jabba

Xclipを使用してXのクリップボードにアクセスするので、次を使用します。

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>
0
user189557