Yank Dateiname / Pfad des aktuellen Puffer in Vim
Frage
Unter der Annahme, der aktuelle Puffer eine Datei geöffnet für bearbeiten ist, so :e
E32: No file name
nicht angezeigt.
Ich möchte eine oder alle heftig zu ziehen:
- Der Dateiname genau wie zeigt in der Statuszeile, z.B.
~\myfile.txt
- Eine vollständige Pfad zur Datei, z.B.
c:\foo\bar\myfile.txt
- Nur der Dateiname, z
myfile.txt
Lösung
TL; DR
:let @" = expand("%")
>
Dies wird den Dateinamen in den unamed Registern kopieren, dann können Sie guten alten p
verwenden, um es einzufügen. und natürlich können Sie dies zu einem Schlüssel Karte für einen schnelleren Einsatz.
:nmap cp :let @" = expand("%")<cr>
Sie können dies auch für den vollständigen Pfad verwenden
:let @" = expand("%:p")
Erklärung
Vim verwendet das unbenannte Register Text zu speichern, die gelöscht oder kopiert wurde (gezerrt), ebenfalls, wenn Sie es einfügen liest den Text aus diesem Register.
Mit let
wir können manuell speichern Text in das Register :let @" = "text"
verwenden, aber wir können auch das Ergebnis eines Ausdrucks speichern.
Im obigen Beispiel verwenden wir die Funktion expand
die Platzhalter und Schlüsselwörter erweitert. In unserem Beispiel verwenden wir expand('%')
die aktuellen Dateinamen zu erweitern. Wir können es als expand('%:p')
für die vollständigen Dateinamen ändern.
Siehe :help let
:help expand
:help registers
für Details
Andere Tipps
Fast, was Sie fordern, und es könnte tun: Ctrl+R %
zieht den aktuellen Dateinamen in dem Sie sind (Eingabeaufforderung Editierpuffers, ...). Siehe dieser Vim Tipp mehr.
Wenn Sie den aktuellen Puffer Dateinamen in Ihrem System-Level-Zwischenablage setzen möchten, versuchen Sie das Register @ Ändern +:
" relative path
:let @+ = expand("%")
" full path
:let @+ = expand("%:p")
" just filename
:let @+ = expand("%:t")
Bearbeiten 20140421:
Ich benutze diese häufig, so habe ich einige Abkürzungen. Linux Vims arbeiten anscheinend etwas anders als Mac Vims , so gibt es einen Sonderfall für das auch. Wenn Sie die folgenden in Ihrem ~/.vimrc
setzen:
" 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
Dann zum Beispiel <leader>cf
den relativen Pfad des aktuellen Puffers kopieren (der Standardführer Backslash (\
)). Ich verwende oft diese für Befehle auf einer Datei oder andere Dinge auf der Kommandozeile ausgeführt wird. Ich weiß nicht wirklich nutze den letzten Dateinamen / Verzeichnisnamen oft.
Sie können intuitive Zuordnungen wie <leader>cfr
für relativ, <leader>cfa
für absolute, <leader>cff
für nur Dateinamen, <leader>cfd
für Verzeichnis prüfen.
Wenn Sie :reg
Sie den Namen der aktuellen Datei im %
Register sehen. Sie können es mit "%p
einfügen, zum Beispiel.
Wenn, wie ich, oft Sie auf den ‚alternativen‘ Puffer wechseln, ist es sehr praktisch, dass sein vollständiger Pfad-und-Datei-Name in dem #
Register gesetzt werden. Sie können es mit "#p
einfügen, zum Beispiel.
Hinweis (nur für den Fall ist dieses Verhalten spezifisch für mein Setup.): Ich bin mit VIM 7.4.52 auf Ubuntu 14.04.4 LTS
Die Kombination von Informationen aus einem paar anderen Antworten: Wenn Sie den aktuellen vollständigen Pfad zu einer Datei zerren wollen und legen Sie sie in die Befehlspuffer in einem anderen Fenster, zuerst :let @" = expand("%:p")
tun, dann in einem anderen Fenster und Typ Ctrl+R "
bewegen
Nützlich für das Kopieren einer Datei, während im gleichen Verzeichnis bleiben und die alte offen zu halten. Zum Beispiel:
Start : Bearbeiten von src / com / benatkin / Farbe / Formen / Circle.java
Typ
:let @" = expand("%:p")
(Der Weg zum Haupt Zwischenablage gezerrt wird.)Öffnen Sie ein neues Fenster mit
:sp
Typ
:e Ctrl+R"
Mit den Pfeiltasten nach Circle zurück zu gehen und es zu Platz ändern, und drücken Sie
Ende : Bearbeiten von src / com / benatkin / Farbe / Formen / Square.java
Hier ist meine Lösung:
" 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>
" }}}
Ich verwende xclip X Zwischenablage zuzugreifen, so verwende ich:
nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>