Yank Dateiname / Pfad des aktuellen Puffers in Vim

186

Angenommen, der aktuelle Puffer ist eine Datei, die zum Bearbeiten geöffnet ist und daher :enicht angezeigt wird E32: No file name.

Ich möchte einen oder alle ziehen:

  • Der Dateiname genau wie in der Statuszeile angezeigt, z ~\myfile.txt
  • Ein vollständiger Pfad zur Datei, z c:\foo\bar\myfile.txt
  • Nur der Dateiname, z myfile.txt
Davetapley
quelle
In die Zwischenablage: vi.stackexchange.com/questions/3686/…
Ciro Santilli 法轮功 冠状 病 六四 事件 20

Antworten:

206

TL; DR

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

Dadurch wird der Dateiname in das unbenannte Register kopiert . Anschließend können Sie ihn mit good old peinfügen. und natürlich können Sie dies einem Schlüssel zur schnelleren Verwendung zuordnen.

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

Sie können dies auch für den vollständigen Pfad verwenden

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

Erläuterung

Vim verwendet das unbenannte Register , um gelöschten oder kopierten (gerissenen) Text zu speichern. Wenn Sie es einfügen, wird der Text aus diesem Register gelesen.

Mit können letwir Text manuell im Register speichern, :let @" = "text"aber wir können auch das Ergebnis eines Ausdrucks speichern.

Im obigen Beispiel verwenden wir die Funktion, expanddie Platzhalter und Schlüsselwörter erweitert. In unserem Beispiel erweitern wir expand('%')den aktuellen Dateinamen. Wir können es wie expand('%:p')für den vollständigen Dateinamen ändern .

Siehe :help let :help expand :help registersfür Details

JD Frias
quelle
23
Cool hat dies gerade zu meinem vimrc hinzugefügt: noremap <silent> <F4>: let @ + = expand ("%: p") <CR>
ThePosey
9
Unter Windows sollten Sie stattdessen Folgendes verwenden: let @ * = expand ("%"), wenn Sie möchten, dass es in der Windows- Zwischenablage angezeigt wird.
KFL
15
Wenn Sie unnamedplusals Zwischenablage verwendenlet @+ = expand("%")
Kevin Cox
4
Verwenden Sie "%:h"diese Option , um den vollständigen Pfad ohne den Dateinamen abzurufen.
Polymorphix
Verwandte, insbesondere wenn Sie das Verzeichnis ohne Dateinamen benötigen - stackoverflow.com/a/2233924/1882064
arcseldon
94

Fast das, wonach Sie fragen, und es könnte auch funktionieren: Ctrl+R %Zieht den aktuellen Dateinamen an Ihre Position (Eingabeaufforderung, Bearbeitungspuffer, ...). Weitere Informationen finden Sie in diesem Vim-Tipp .

dwc
quelle
1
Wenn Sie den Bearbeitungsmodus verlassen, können Sie den Dateinamen hinzufügen: ctrl- "ctrl-% p
stefanB
13
Ctrl+R %funktioniert im insertModus - aber im editModus Ctrl+Rbedeutet Wiederholen.
Kevin Panko
3
Was stefanB bedeutete, war "% p für den Normal- / Befehlsmodus. Das ist dasselbe wie <Cr>% im Einfüge- / cmdline-Modus.
greywh
Nur um es wieder zusammenzufassen oder anders zu formulieren: Die Antworten für greywh und dwc lauten "Einfügen aus Register%". Einer macht dies für den Einfügemodus, der andere für den normalen Modus. In macvim scheint das% -Register nicht überschrieben werden zu können.
Eric Hu
Gibt es den gleichen einfachen Befehl, um Leinen zu erhalten? ) Danke für die Lösung
itsnikolay
71

Wenn Sie den aktuellen Pufferdateinamen in die Zwischenablage auf Systemebene einfügen möchten, ändern Sie das Register in @ +:

" relative path
:let @+ = expand("%")

" full path
:let @+ = expand("%:p")

" just filename
:let @+ = expand("%:t")

Bearbeiten 20140421: Ich verwende diese häufig, daher habe ich einige Verknüpfungen erstellt. Linux Vims funktionieren anscheinend etwas anders als Mac Vims , daher gibt es auch dafür einen Sonderfall. Wenn Sie Folgendes in Ihre ~/.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

Dann wird beispielsweise <leader>cfder relative Pfad des aktuellen Puffers kopiert (der Standardleiter ist backslash ( \)). Ich benutze diese oft, um Befehle in einer Datei auszuführen oder andere Dinge in der Befehlszeile zu tun. Ich verwende den letzten Dateinamen / Verzeichnisnamen nicht oft.

Sie könnten intuitivere Zuordnungen in Betracht ziehen <leader>cfr, <leader>cfaz. B. für relativ, für absolut, <leader>cffnur für Dateinamen, <leader>cfdfür Verzeichnis.

Anthony Panozzo
quelle
2
Auf Windows und Mac "*und "+sind gleichwertig, so dass Sie auf die Plattformprüfungen verzichten und einfach verwenden können@+
Gabe Moothart
1
Seltsamerweise scheint dies in einer Vimscript-Funktion nicht zu funktionieren: "echo bufname ('%: p')" ist leer, aber Sie können dies mit dem längeren "fnamemodify (bufname ('%'), ': p') beheben. ) "
David Ljung Madison Stellar
6

In diesem :regFall wird der Name der aktuellen Datei im %Register angezeigt. Sie können es "%pzum Beispiel mit einfügen .

Wenn Sie wie ich häufig zum 'alternativen' Puffer wechseln, ist es sehr praktisch, dass der vollständige Pfad- und Dateiname in das #Register eingetragen wird. Sie können es "#pzum Beispiel mit einfügen .

Hinweis (nur für den Fall, dass dies ein für mein Setup spezifisches Verhalten ist): Ich verwende VIM 7.4.52 unter Ubuntu 14.04.4 LTS.

Robert
quelle
4

Kombinieren von Informationen aus einigen anderen Antworten: Wenn Sie den aktuellen vollständigen Pfad zu einer Datei ziehen und in einem anderen Fenster in den Befehlspuffer einfügen möchten, tun Sie dies zuerst :let @" = expand("%:p"), wechseln Sie dann in ein anderes Fenster und geben Sie ein Ctrl+R ".

Nützlich zum Kopieren einer Datei, während Sie im selben Verzeichnis bleiben und die alte geöffnet lassen. Beispielsweise:

Start : Bearbeiten von src / com / benatkin / paint / shape / Circle.java

  1. Typ :let @" = expand("%:p") (Der Pfad wird zum Hauptpuffer der Zwischenablage gezogen.)

  2. Öffne ein neues Fenster mit :sp

  3. Art :e Ctrl+R"

  4. Verwenden Sie die Pfeiltasten, um zu Kreis zurückzukehren und ihn in Quadrat zu ändern, und drücken Sie <CR>

Ende : Bearbeiten von src / com / benatkin / paint / formen / Square.java

Benjamin Atkin
quelle
1

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>
" }}}
Jabba
quelle
-1

Ich benutze xclip, um auf die Zwischenablage von X zuzugreifen, also benutze ich:

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>
user189557
quelle
"+ oder" * machen dasselbe nativ in vim, ohne einen externen Befehl verwenden zu müssen.
Dorian B.