Nazwa pliku Yank / ścieżka bieżącego bufora w Vimie

188

Zakładając, że bieżący bufor jest plikiem otwartym do edycji, więc :esię nie wyświetla E32: No file name.

Chciałbym wyszarpać jeden lub wszystkie z:

  • Nazwa pliku dokładnie taka sama jak w wierszu stanu, np ~\myfile.txt
  • Pełna ścieżka do pliku, np c:\foo\bar\myfile.txt
  • Tylko nazwa pliku, np myfile.txt
Davetapley
źródło
Do schowka: vi.stackexchange.com/questions/3686/...
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

209

TL; DR

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

Spowoduje to skopiowanie nazwy pliku do nienazwanego rejestru , a następnie możesz użyć starego, dobrego, paby go wkleić. i oczywiście możesz przypisać to do klucza w celu szybszego użycia.

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

możesz także użyć tego dla pełnej ścieżki

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

Wyjaśnienie

Vim używa rejestru nienazwanego do przechowywania tekstu, który został usunięty lub skopiowany (szarpany), podobnie po wklejeniu czyta tekst z tego rejestru.

Za pomocą letmożemy ręcznie przechowywać tekst w rejestrze za pomocą, :let @" = "text"ale możemy również zapisać wynik wyrażenia.

W powyższym przykładzie używamy funkcji, expandktóra rozwija symbole wieloznaczne i słowa kluczowe. w naszym przykładzie używamy expand('%')do rozszerzenia bieżącej nazwy pliku. Możemy go zmodyfikować tak, jak expand('%:p')w przypadku pełnej nazwy pliku.

Zobacz :help let :help expand :help registersszczegóły

JD Frias
źródło
23
Cool właśnie dodał to do mojego vimrc: noremap <silent> <F4>: let @ + = expand ("%: p") <CR>
ThePosey
9
W systemie Windows zamiast tego należy użyć: let @ * = expand („%”), jeśli chcesz, aby znajdował się w schowku systemu Windows .
KFL
15
Jeśli używasz unnamedplusjako schowkalet @+ = expand("%")
Kevin Cox
4
Użyj, "%:h"aby uzyskać pełną ścieżkę bez nazwy pliku.
Polymorphix,
Powiązane, w szczególności jeśli potrzebujesz katalogu bez nazwy pliku - stackoverflow.com/a/2233924/1882064
arcseldon
94

Prawie o co prosisz, a może to zrobić: Ctrl+R %pobiera bieżącą nazwę pliku do miejsca, w którym się znajdujesz (wiersz polecenia, bufor edycji, ...). Zobacz ten poradnik Vima, aby uzyskać więcej.

dwc
źródło
1
po wyjściu z trybu edycji możesz dodać nazwę pliku: ctrl- "ctrl-% p
stefanB
13
Ctrl+R %działa w inserttrybie - ale w edittrybie Ctrl+Roznacza ponawianie.
Kevin Panko
3
StefanB miał na myśli „% p dla trybu normalnego / polecenia. To samo co <Cr>% w trybie wstawiania / cmdline.
graywh
Wystarczy powtórzyć lub podać inaczej: odpowiedzi zarówno dla graywh, jak i dwc brzmią „wklej z rejestru%”. Jeden robi to dla trybu wstawiania, drugi dla trybu normalnego. W systemie Macvim wygląda na to, że rejestru% nie można zastąpić.
Eric Hu
czy istnieje takie samo proste polecenie, aby uzyskać numer bielizny? ) dzięki za rozwiązanie
itsnikolay
73

Jeśli chcesz umieścić bieżącą nazwę pliku bufora w schowku na poziomie systemu, spróbuj zmienić rejestr na @ +:

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

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

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

Edytuj 20140421: Często ich używam, więc stworzyłem kilka skrótów. Linux Vims najwyraźniej działają nieco inaczej niż Mac Vims , więc jest to również specjalny przypadek. Jeśli umieścisz w swoim ~/.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

Na przykład <leader>cfskopiuje ścieżkę względną bieżącego bufora (domyślną linią wiodącą jest ukośnik odwrotny ( \)). Często używam ich do uruchamiania poleceń w pliku lub robienia innych rzeczy w wierszu poleceń. Tak naprawdę nie używam często ostatniej nazwy pliku / katalogu.

Możesz rozważyć bardziej intuicyjne odwzorowania, takie jak <leader>cfrwzględne, <leader>cfabezwzględne, <leader>cfftylko nazwa pliku <leader>cfdlub katalog.

Anthony Panozzo
źródło
2
Na Windows i Mac "*i "+są równoważne, dzięki czemu można zrezygnować z kontroli na pomoście i wystarczy użyć@+
Gabe Moothart
1
Co dziwne, wydaje się, że to nie działa w funkcji vimscript: „echo bufname ('%: p')” jest puste, ale można to naprawić dłuższym „fnamemodify (bufname ('%'), ': p' ) ”
David Ljung Madison Stellar
6

Jeśli to zrobisz :reg, zobaczysz nazwę bieżącego pliku w %rejestrze. Możesz go "%pna przykład wkleić .

Jeśli, podobnie jak ja, często przełączasz się na bufor „alternatywny”, bardzo przydatne jest umieszczenie w #rejestrze jego pełnej ścieżki i nazwy pliku . Możesz go "#pna przykład wkleić .

Uwaga (na wypadek, gdyby było to zachowanie specyficzne dla mojej konfiguracji): Używam VIM 7.4.52 na Ubuntu 14.04.4 LTS.

Robert
źródło
4

Łączenie informacji z kilku innych odpowiedzi: Jeśli chcesz zszarpać bieżącą pełną ścieżkę do pliku i umieścić ją w buforze poleceń w innym oknie, najpierw zrób :let @" = expand("%:p"), a następnie przejdź do innego okna i wpisz Ctrl+R ".

Przydatne do kopiowania pliku podczas pozostawania w tym samym katalogu i utrzymywania starego otwartego. Na przykład:

Rozpocznij : Edycja src / com / benatkin / paint / shapes / Circle.java

  1. Typ :let @" = expand("%:p") (ścieżka zostaje wciągnięta do głównego bufora schowka).

  2. Otwórz nowe okno za pomocą :sp

  3. Rodzaj :e Ctrl+R"

  4. Za pomocą klawiszy strzałek wróć do Okręgu i zmień go na Kwadrat, a następnie naciśnij klawisz <CR>

Koniec : edycja src / com / benatkin / paint / shapes / Square.java

Benjamin Atkin
źródło
1

Oto moje rozwiązanie:

" 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
źródło
-1

Korzystam z xclipa, aby uzyskać dostęp do schowka X, więc używam:

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>
użytkownik189557
źródło
„+ lub” * rób to samo natywnie w vimie bez konieczności używania zewnętrznego polecenia.
Dorian B.,