Rufen Sie den aktuellen Dateinamen für die Edition in der Befehlszeile auf

10

Wie kann ich den Pfad zur aktuellen Datei in der Befehlszeile aufrufen, um einen ähnlichen Dateinamen einzugeben? Ich möchte keine Abkürzung, die durch den aktuellen Dateinamen ersetzt wird. Ich möchte den Dateinamen mit seinem Verzeichnispfad bearbeiten. Zum Beispiel möchte ich :editeine Datei mit einem ähnlichen Namen oder in einem ähnlichen Verzeichnis, z

vim src/submodule/frontend/frobnicate2.c

und jetzt möchte ich bearbeiten ../trunk/src/submodule/frontend/frobnicate.c, und ich möchte nur den vollständigen Pfad einfügen ../trunkund entfernen 2, nicht erneut eingeben.

Ich kann natürlich zur Shell zurückkehren und deren Befehlsverlauf verwenden, oder ich könnte den Pfad durch die GUI kopieren und einfügen, aber ich suche nach einem effizienteren Weg, bei dem Vim nicht verlassen werden muss.

Gilles 'SO - hör auf böse zu sein'
quelle

Antworten:

11

%Sie können das Register nicht nur so einfügen , wie Sie es selbst entdeckt haben, sondern auch verwenden :edit %<Tab>.

Von :help cmdline-special:

In Ex commands, at places where a file name can be used, the following
characters have a special meaning.  These can also be used in the expression
function `expand()`.

        %       Is replaced with the current file name.           :_% c_%

So können Sie beispielsweise Folgendes verwenden:

:edit %.orig

zu bearbeiten file.txt.orig. Für Ihr Beispiel würden Sie eingeben :e ../trunk/%, drücken <Tab>, um den Dateinamen mit dem relativen Pfad abzurufen, und den entfernen, 2bevor Sie drücken <Enter>.

Sie können dem Pfad einige Modifikatoren hinzufügen, um ihn zu ändern. Ich fand :hes besonders nützlich, es bekommt den "dirname" (oder "head" in Vim-speak ") des aktuellen Pfades:

:edit file/in/a/deeply/nested/subdirectory/here.txt
:edit %:h/in_same_dir_as_above.txt

Sie können sogar :hmehrfach verwenden. Zum Beispiel:

:edit %:h:h:h/file.txt

Wird Öffnen file/in/a/deeply/file.txt

Es gibt auch :peinen, der Ihnen den vollständigen Pfad gibt und der in Ihrem Fall nützlich sein könnte: Geben Sie den Pfad ein :e %:p, drücken Sie ihn <Tab>und bearbeiten Sie ihn wie gewünscht. Sie können sogar mehrere Modifikatoren verwenden, z :e %:p:h.

Siehe :help filename-modifiersfür die vollständige Liste.

Hinweis: Wenn Sie dies <Tab>tun, wird Vim das erweitern %. Wenn Sie verwenden <C-d>, erweitert Vim das nicht %(ersetzt es jedoch, %während Sie den Pfad vervollständigen).

Martin Tournoij
quelle
5

Oh. Suche nach "Dateiname" in :help :! Es ist ganz einfach: der besonderen einfügen r egister , den aktuellen Dateinamen bedeuten.CTRL-R %%

Gilles 'SO - hör auf böse zu sein'
quelle
1
Aufbauend auf Ihrer Antwort: Um den vollständigen Pfad wie vom OP angefordert zu erhalten, würden Sie so etwas tun Ctrl-r =expand('%:p'). Dies verwendet das Register = .
lcd047
3

Wenn Sie Ihre vim- pathVariable festgelegt haben, haben Sie die volle Leistung des :findBefehls, nämlich die Tab-Vervollständigung von Dateinamen (ohne den Verzeichnisteil angeben zu müssen!).

In deinem Fall so etwas wie

set path=./**

kann alles sein, was Sie brauchen, um :fin frob<tab>zu arbeiten. Für die blutigen Details, :help find, :help file-searching.

Jens
quelle
0

Hier ist eine Zuordnung, die Sie ausprobieren können:

cnoremap <a-q> <c-c>:let @a=expand('%')<CR>:<Up><c-r>a

Dadurch wird der aktuelle Befehl gespeichert und das Register 'a' auf den Namen der aktuellen Datei gesetzt. Dann wird der letzte Befehl abgerufen und an den Inhalt des 'a'-Registers angehängt. Wenn Sie etwas Nützliches im 'a'-Register haben, wird es natürlich überschrieben.

Möglicherweise möchten Sie die zugeordneten Zeichen in etwas anderes ändern. Ich benutze gerne die Alt-Taste, aber es funktioniert in einigen Terminals nicht.

Wie Carpetsmoker in seiner Antwort hervorhob, können Sie den Funktionsaufruf in ändern

expand('%:p')

den vollen Weg erzwingen.

Frank
quelle
1
Dies würde das Register sinnlos auslöschen a. Versuchen Sie stattdessen so etwas:cnoremap <M-q> <C-r>=fnameescape(expand('%:p'))<CR>
lcd047