現在のバッファが編集用に開かれているファイルであると仮定すると、:e
は表示されませんE32: No file name
。
1つまたはすべてをヤンクしたい:
- ステータス行に表示されるとおりのファイル名。例:
~\myfile.txt
- ファイルへのフルパス、例えば
c:\foo\bar\myfile.txt
- ただファイル名、例えば
myfile.txt
現在のバッファが編集用に開かれているファイルであると仮定すると、:e
は表示されませんE32: No file name
。
1つまたはすべてをヤンクしたい:
~\myfile.txt
c:\foo\bar\myfile.txt
myfile.txt
回答:
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
はこちら
unnamedplus
、あなたのクリップボードの使用などlet @+ = expand("%")
"%:h"
ファイル名なしの完全パスを取得するために使用します。
ほとんどあなたが求めていること、そしてそれはそうするかもしれません:Ctrl+R %
現在のファイル名をあなたがいる場所に引き出します(コマンドプロンプト、編集バッファ、...)。詳しくはVimのヒントをご覧ください。
Ctrl+R %
insert
モードでも機能しますが、edit
モードでCtrl+R
はやり直しを意味します。
現在のバッファのファイル名をシステムレベルのクリップボードに入れたい場合は、レジスタを@ +に変更してみてください。
" 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
ディレクトリなど、より直感的なマッピングを検討することもできます。
"*
と"+
あなたがプラットフォームをチェックし、ちょうど使用で済ますことができますので、等価です@+
他のいくつかの回答からの情報を組み合わせる:ファイルへの現在のフルパスをヤンクして別のウィンドウのコマンドバッファーに入れたい場合は、最初にを実行し:let @" = expand("%:p")
、次に別のウィンドウに移動してと入力しCtrl+R "
ます。
同じディレクトリにいて古いファイルを開いたままファイルをコピーするのに便利です。例えば:
開始:src / com / benatkin / paint / shapes / Circle.javaの編集
タイプ
:let @" = expand("%:p")
(パスはメインクリップボードバッファーにヤンクされます。)で新しいウィンドウを開く
:sp
タイプ
:e Ctrl+R"
矢印キーを使用してCircleに戻り、それをSquareに変更して、<CR>を押します。
終了:src / com / benatkin / paint / shapes / Square.javaの編集
これが私の解決策です:
" 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>
" }}}
Xclipを使用してXのクリップボードにアクセスするため、以下を使用します。
nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>