現在のバッファが編集用に開いているファイルであると仮定すると、:e
は表示されませんE32: No file name
。
次の1つまたはすべてをヤンクしたいと思います。
- ステータス行に表示されているファイル名。例:
~\myfile.txt
- ファイルへのフルパス。例:
c:\foo\bar\myfile.txt
- ファイル名だけ、例えば
myfile.txt
TL; DR
:let @" = expand("%")
>>
これにより、ファイル名が名前のないレジスタにコピーされ、古き良きものを使用p
して貼り付けることができます。もちろん、これをキーにマップして、すばやく使用することもできます。
:nmap cp :let @" = expand("%")<cr>
フルパスにも使用できます
:let @" = expand("%:p")
説明
Vimは名前のないレジスターを使用して、削除またはコピー(ヤンク)されたテキストを保存します。同様に、貼り付けると、このレジスターからテキストが読み取られます。
を使用すると、を使用しlet
て手動でテキストをレジスタに格納できます:let @" = "text"
が、式の結果を格納することもできます。
expand
上記の例では、ワイルドカードとキーワードを展開する関数を使用しています。この例ではexpand('%')
、現在のファイル名を展開するために使用します。expand('%:p')
完全なファイル名は変更できます。
詳細はこちら:help let
:help expand
:help registers
をご覧ください
ほぼあなたが求めているものであり、それが行う可能性があります:Ctrl+R %
現在のファイル名を現在の場所にプルします(コマンドプロンプト、編集バッファーなど)。詳細については、このVimのヒントを参照してください。
現在のバッファファイル名をシステムレベルのクリップボードに入れたい場合は、レジスタを@+に変更してみてください。
" relative path
:let @+ = expand("%")
" full path
:let @+ = expand("%:p")
" just filename
:let @+ = expand("%:t")
20140421を編集:私はこれらをよく使用するので、いくつかのショートカットを作成しました。LinuxVimsはMacVimsとは明らかに動作が少し異なるため、そのための特別なケースもあります。あなたがあなたの中に以下を入れた場合~/.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
。
実行:reg
すると、レジスタに現在のファイルの名前が表示%
されます。"%p
たとえば、で貼り付けることができます。
私のように、「代替」バッファに頻繁に切り替える場合は、そのフルパスとファイル名を#
レジスタに入れると非常に便利です。"#p
たとえば、で貼り付けることができます。
注(これが私のセットアップに固有の動作である場合に備えて):Ubuntu14.04.4LTSでVIM7.4.52を使用しています。
他のいくつかの回答からの情報を組み合わせる:ファイルへの現在のフルパスをヤンクして別のウィンドウのコマンドバッファーに入れたい場合は、最初に実行して: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の編集
回答はNeovim/Ubunutuでテストされています。
:let @+=@%
私の知る限り、レジスタにはすでに相対ファイルパスが含まれているため、レジスタの内容をお気に入りのクリップボードを表すレジスタに%
移動するのと同じくらい簡単です。%
このSOの回答は、あるレジスタから別のレジスタへのコピーを扱います。
私にはかなり簡単に思えます。覚えにくいものは必要ありませんexpand()
。
これが私の解決策です:
" 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>
" }}}
現在開いているファイル名のパスを単純にヤンクしたい場合は、次のように押します。
私はそれを私のvimcに入れました:
nnoremap yl :let @" = expand("%:p")<cr>
xclipを使用してXのクリップボードにアクセスするので、次を使用します。
nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>