Wie füge ich den aktuellen Dateinamen in den Inhalt von Vim ein?


38

Nach einigem Suchen lernte ich :echo @%den aktuellen Dateinamen in der untersten Zeile von vim-screen anzuzeigen.

Ich möchte den Dateinamen (mit und ohne vollständigen Pfad) in den Inhalt der Datei einfügen, ohne ihn zu verlassen vim.

Gibt es eine Möglichkeit, dies zu tun?

Antworten:


27

Ich bin sicher, es gibt andere Möglichkeiten, dies zu tun ... aber der Hauptbefehl, den Sie wollen, ist :r[ead]der, der die Ausgabe eines Befehls in den Puffer einfügt.

So fügen Sie nur den Dateinamen ein:

:r! echo %

Und um den vollständigen Pfad einzuschließen:

:r! echo %:p

Für mehr Information:

:help read
:help filename-modifiers 

37

Der aktuelle Dateiname befindet sich im "%Register, sodass Sie ihn (im Einfügemodus) mit einfügen können <c-r>%. Mit kann der vollständige Pfad eingefügt werden <c-r>=expand("%:p"). Sie können ein Makro daraus erstellen, wenn Sie es häufig verwenden. Weitere ähnliche Tricks finden Sie unter :h expandund :h "=.


Vielleicht verstehe ich das falsch, aber es ist nicht <c-r>als Redo-Befehl abgebildet?
JC Yamokoski

10
Gibt im Einfügemodus an, <c-r>dass das nächste Zeichen ein Register ist.
Kevin

Richtig, danke. Völlig vergessen, in den Einfügemodus zu wechseln ...
JC Yamokoski

Sie können dies auch "%pim normalen oder visuellen Modus tun .
Naught101

15

Wie in zu sehen ist :h registers, "%enthält das Register den aktuellen Dateinamen. Der :pu[t]Befehl fügt den Inhalt eines Registers in den Text ein.

Um den tatsächlichen Dateinamen einzufügen, können Sie im Befehlsmodus einen der folgenden Befehle eingeben:

:put %

oder

"%p

Geben Sie ein, um den Dateinamen mit dem vollständigen Pfad einzufügen

:put=expand('%:p')

im Befehlsmodus.


Mehr Info:

:h pu[t]

Durch Tippen können "rpSie den Inhalt des Registers einfügen "r.


3
Das :put "%:p"scheint bei mir nicht zu funktionieren. Es scheint nur mit expand () zu funktionieren , wie in :put =expand('%:p'):, was es nicht viel weniger umständlich macht als <c-r>=expand('%:p')leider.
Akavel

@akavel Du hast recht, ich aktualisiere die Antwort. Danke! ;) Und tatsächlich sind beide gleich ausführlich.
Braunmagrin

5

Ein einfacher Weg ist zu laufen:

!!echo %
  • !! ersetzt die aktuelle Zeile durch das Ergebnis des darauf folgenden Befehls.

  • % wird durch den Namen der bearbeiteten Datei im Befehl ersetzt, sodass dieser Name effektiv in die bearbeitete Datei eingefügt wird.

Der Dateiname wurde an den Befehl vi (m) übergeben und kann einen relativen oder absoluten Pfad enthalten. Wenn Sie es entfernen und nur den Dateinamen beibehalten möchten, führen Sie es aus

!!basename %

1

Wenn Sie dies häufig tun müssen, kann es nützlich sein, eine Schlüsselsequenz an das zu binden, was Sie möchten, wie unter http://vim.wikia.com/wiki/Insert_current_filename angegeben

Fügt den aktuellen Dateinamen ohne die Erweiterung an der Cursorposition ein, wenn Sie sich im Einfügemodus befinden.

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

So behalten Sie die Erweiterung bei:

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

So fügen Sie den absoluten Pfad des Verzeichnisses ein, in dem sich die Datei befindet:

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

So fügen Sie den relativen Pfad des Verzeichnisses ein, in dem sich die Datei befindet:

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

Die oben genannten Einstellungen wirken sich direkt vimauf die Sitzung aus, oder Sie können sie in .vimrcdas Feld einfügen (wobei der führende Doppelpunkt in der Zeile optional ist).


0

Ich googelte auf einfachste Weise, um den aktuellen Dateinamen (ohne Pfad oder Erweiterung) an der aktuellen Position einzufügen (keine neue Zeile, keine neue Zeile). Ich habe also nach einer Kombination aus vorherigen Antworten und diesem Link gesucht.

Im Einfügemodus :

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

Dann das nächste Mal (mit dem Befehl bereits in der Geschichte):

<C-R>=<UP>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.