Vim のヤンク ファイル名 / 現在のバッファーのパス
質問
現在のバッファが編集用に開かれているファイルであると仮定すると、 :e
表示されない E32: No file name
.
次のいずれかまたはすべてをヤンクしたいと考えています。
- ステータス行に表示されるファイル名とまったく同じです。
~\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:
私は、一般的にこれらを使用するので、私はいくつかのショートカットを作成しました。 LinuxのVIMSは明らかに<少し異なるマックVIMSよりも動作します/ A>ので、同様にそのための特別な場合があります。あなたは~/.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
でそれを貼り付けることができます。
注(念のため、これは私のセットアップに固有の動作です):。私はUbuntuの14.04.4 LTSにVIM 7.4.52を使用しています。
他のいくつかの回答から得た情報を組み合わせると、次のようになります。ファイルへの現在のフルパスをヤンクして、それを別のウィンドウのコマンドバッファに置きたい場合は、まず次のようにします。 :let @" = expand("%:p")
, 、別のウィンドウに移動して次のように入力します。 Ctrl+R "
.
同じディレクトリに留まり、古いファイルを開いたままにしてファイルをコピーする場合に便利です。例えば:
始める:編集 src/com/benatkin/paint/shapes/Circle.java
タイプ
:let @" = expand("%:p")
(パスはメインのクリップボード バッファーにヤンクされます。)新しいウィンドウを開く
:sp
タイプ
:e Ctrl+R"
矢印キーを使用して円に戻り、正方形に変更し、<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>
" }}}
私はXのクリップボードにアクセスするためにXCLIP使用するので、私が使用します:
nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>