ヤンクファイル名/ Vimの現在のバッファのパス


188

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

1つまたはすべてをヤンクしたい:

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


回答:


209

TL; DR

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

これにより、ファイル名がunamedレジスタにコピーされ、古き良きものpを使用して貼り付けることができます。もちろん、これをキーにマップして、より迅速に使用できます。

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

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

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

説明

Vimは、名前のないレジスターを使用して、削除またはコピー(ヤンク)されたテキストを格納します。同様に、ペーストすると、このレジスターからテキストが読み取られます。

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

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

詳細:help let :help expand :help registersはこちら


23
Coolがこれを私のvimrcに追加しました:noremap <silent> <F4>:let @ + = expand( "%:p")<CR>
ThePosey

9
Windowsでは、Windowsクリップボードに入れたい場合は、代わりに:let @ * = expand( "%")を使用する必要があります
KFL 2013

15
あなたが使用している場合はunnamedplus、あなたのクリップボードの使用などlet @+ = expand("%")
ケビン・コックス

4
"%:h"ファイル名なしの完全パスを取得するために使用します。
Polymorphix 2015

-あなたは、ファイル名なしでディレクトリが必要な場合は特に、関連stackoverflow.com/a/2233924/1882064
arcseldon

94

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


1
編集モードを終了するときに、ファイル名を追加できます:
ctrl-

13
Ctrl+R %insertモードでも機能しますが、editモードでCtrl+Rはやり直しを意味します。
ケビンパンコ2010年

3
何stefanBが意味することは、「ノーマル/コマンド・モード用の%pだった<CR>%で、挿入/ cmdlineを-モードと同じだそれ。。
graywh

単に要約したり、別の言い方をすると、graywhとdwcの両方に対する答えは「レジスター%から貼り付け」です。1つは挿入モードでこれを行い、もう1つは通常モードで行います。macvimでは、%レジスターは上書きできないようです。
Eric Hu

行番号を取得する同じ簡単なコマンドはありますか?)thx for solution
itsnikolay

73

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

" 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ディレクトリなど、より直感的なマッピングを検討することもできます。


2
WindowsとMac上の"*"+あなたがプラットフォームをチェックし、ちょうど使用で済ますことができますので、等価です@+
ゲイブMoothart

1
奇妙なことに、これはvimscript関数では機能しないようです: "echo bufname( '%:p')"は空白ですが、これは "fnamemodify(bufname( '%')、 ':p' ) "
David Ljung Madison Stellar

6

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

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

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


4

他のいくつかの回答からの情報を組み合わせる:ファイルへの現在のフルパスをヤンクして別のウィンドウのコマンドバッファーに入れたい場合は、最初にを実行し: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の編集


1

これが私の解決策です:

" 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

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

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

"+または" *は、外部コマンドを使用せずに、vimでネイティブに同じことを行います。
ドリアンB.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.