Jak wstawić bieżącą nazwę pliku do zawartości w Vimie?

38

Po kilku poszukiwaniach dowiedziałem się, że :echo @%wyświetla aktualną nazwę pliku w dolnym wierszu vim-screen.

Chciałbym zrzucić nazwę pliku (z pełną ścieżką i bez) do zawartości pliku bez wychodzenia vim.

Czy jest na to jakiś sposób?

Mtk
źródło

Odpowiedzi:

27

Jestem pewien, że istnieją inne sposoby, aby to zrobić ... ale głównym poleceniem, które chcesz, jest :r[ead]wstawienie wyniku polecenia do bufora.

Tak więc, aby wstawić tylko nazwę pliku:

:r! echo %

Aby uwzględnić pełną ścieżkę:

:r! echo %:p

Po więcej informacji:

:help read
:help filename-modifiers 
JC Yamokoski
źródło
37

Bieżąca nazwa pliku znajduje się w "%rejestrze, więc możesz ją wstawić (w trybie wstawiania) za pomocą <c-r>%; pełną ścieżkę można wstawić za pomocą <c-r>=expand("%:p"). Możesz zrobić z niego makro, jeśli często go używasz. Aby uzyskać więcej podobnych sztuczek, zobacz :h expandi :h "=.

Kevin
źródło
Może źle to interpretuję, ale nie jest <c-r>mapowane jako polecenie powtórzenia?
JC Yamokoski,
10
W trybie wstawiania <c-r>określa, że ​​następny znak jest rejestrem.
Kevin
Cześć, dzięki. Całkowicie zapomniałem przejść do trybu wstawiania ...
JC Yamokoski
Możesz to również zrobić "%pw trybie normalnym lub wizualnym.
naught101
15

Jak widać :h registers, "%rejestr zawiera bieżącą nazwę pliku. :pu[t]Polecenie wstawia zawartość rejestru do tekstu.

Aby wstawić rzeczywistą nazwę pliku, możesz wpisać dowolny z nich w trybie poleceń:

:put %

lub

"%p

Aby wstawić nazwę pliku z pełną ścieżką, wpisz

:put=expand('%:p')

w trybie komend.


Więcej informacji:

:h pu[t]

Wpisując "rp, możesz wkleić zawartość rejestru "r.

braunmagrin
źródło
3
To :put "%:p"chyba nie działa dla mnie. Wydaje się, że działa tylko z funkcją expand () , jak w :put =expand('%:p'):, co czyni go nie mniej kłopotliwym niż <c-r>=expand('%:p')niestety.
akavel
@akavel Masz rację, zaktualizuję odpowiedź. Dziękuję Ci! ;) I rzeczywiście, oba są równie gadatliwe.
braunmagrin
5

Prostym sposobem jest uruchomienie:

!!echo %
  • !! zastępuje bieżący wiersz wynikiem następującego po nim polecenia.

  • % jest zastąpiony nazwą edytowanego pliku w poleceniu, aby skutecznie wstawić tę nazwę do edytowanego pliku.

Nazwa pliku została przekazana do komendy vi (m) i może zawierać ścieżkę względną lub bezwzględną. Jeśli chcesz go usunąć i zachować tylko nazwę pliku, uruchom

!!basename %
jlliagre
źródło
1

Jeśli musisz to robić często, przydatne może być powiązanie sekwencji klawiszy z tym, co chcesz, zgodnie z http://vim.wikia.com/wiki/Insert_current_filename

wstawia bieżącą nazwę pliku bez rozszerzenia w pozycji kursora, gdy jesteś w trybie wstawiania.

:inoremap \fn <C-R>=expand("%:t:r")<CR>

Aby zachować rozszerzenie, użyj:

:inoremap \fn <C-R>=expand("%:t")<CR>

Aby wstawić bezwzględną ścieżkę do katalogu, plik jest w użyciu:

:inoremap \fn <C-R>=expand("%:p:h")<CR>

Aby wstawić ścieżkę względną katalogu, plik jest używany:

:inoremap \fn <C-R>=expand("%:h")<CR>

Powyżej wszystko działa bezpośrednio vimdla sesji lub można je umieścić w .vimrc(gdzie dwukropek na linii jest opcjonalny).

Randall
źródło
0

Google szukałem najprostszego sposobu wstawienia bieżącej nazwy pliku (bez ścieżki lub rozszerzenia) do bieżącej pozycji (bez nowej linii, bez zastępowania bieżącej linii). Więc łącząc poprzednie odpowiedzi i ten link , właśnie tego szukałem.

W trybie wstawiania :

<C-R>=expand("%:t:r")

Następnym razem (z poleceniem już w historii):

<C-R>=<UP>
kub1x
źródło