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
War es hilfreich?

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

     
      
  1. Typ :let @" = expand("%:p") (Der Weg zum Haupt Zwischenablage gezerrt wird.)

  2.   
  3. Öffnen Sie ein neues Fenster mit :sp

  4.   
  5. Typ :e Ctrl+R"

  6.   
  7. Mit den Pfeiltasten nach Circle zurück zu gehen und es zu Platz ändern, und drücken Sie

  8.   
     

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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top