Wyświetl bieżącą nazwę pliku do edycji w wierszu polecenia

10

Jak mogę wyświetlić ścieżkę do bieżącego pliku w wierszu poleceń, aby wpisać podobną nazwę pliku? Nie chcę skrótu, który zostałby zastąpiony bieżącą nazwą pliku, chcę edytować nazwę pliku wraz ze ścieżką do katalogu. Na przykład chcę :editplik o podobnej nazwie lub w podobnym katalogu, np

vim src/submodule/frontend/frobnicate2.c

a teraz chcę edytować ../trunk/src/submodule/frontend/frobnicate.ci chcę tylko wstawić ../trunki usunąć 2, a nie ponownie wpisać pełną ścieżkę.

Mogę oczywiście wrócić do powłoki i skorzystać z historii poleceń lub też skopiować i wkleić ścieżkę przez GUI, ale szukam bardziej wydajnego sposobu, który nie wymaga opuszczania Vima.

Gilles „SO- przestań być zły”
źródło

Odpowiedzi:

11

Oprócz wstawiania %rejestru, który sam odkryłeś, możesz także użyć :edit %<Tab>.

Od :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_%

Możesz na przykład użyć:

:edit %.orig

edytować file.txt.orig. Na przykład wpisz :e ../trunk/%, naciśnij, <Tab>aby uzyskać nazwę pliku ze ścieżką względną, i usuń 2przed naciśnięciem <Enter>.

Możesz dodać modyfikatory do ścieżki, aby ją zmodyfikować; Stwierdziłem, :hże jest szczególnie przydatny, pobiera „dirname” (lub „head” w Vim-speak ”) bieżącej ścieżki:

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

Możesz nawet użyć :hwiele razy. Na przykład:

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

Będzie otwarte file/in/a/deeply/file.txt

Istnieje również :ppełna ścieżka, która może być przydatna w twoim przypadku: wpisz :e %:p, naciśnij <Tab>i edytuj ścieżkę według potrzeb. Możesz nawet użyć wielu modyfikatorów, np :e %:p:h. :

Zobacz :help filename-modifierspełną listę.

Uwaga: jeśli ty <Tab>, Vim rozwinie %. Jeśli go użyjesz <C-d>, Vim nie rozwinie %(ale zastąpi %podczas uzupełniania ścieżki).

Martin Tournoij
źródło
5

O. Wyszukaj „nazwę pliku” w :help :! To proste: aby wstawić specjalny r egister , co oznacza aktualną nazwę pliku.CTRL-R %%

Gilles „SO- przestań być zły”
źródło
1
Opierając się na swojej odpowiedzi: aby uzyskać pełną ścieżkę zgodnie z żądaniem PO, zrobiłbyś coś takiego Ctrl-r =expand('%:p'). Używa to rejestru = .
lcd047
3

Jeśli ustawiłeś pathzmienną vim , masz pełną moc :findpolecenia, a mianowicie uzupełnianie nazw plików tabulatorami (bez konieczności określania części katalogu!)

W twoim przypadku coś takiego

set path=./**

może być wszystkim, czego potrzebujesz :fin frob<tab>do pracy. Do krwawych szczegółów :help find, :help file-searching.

Jens
źródło
0

Oto mapowanie, które możesz wypróbować:

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

Zapisuje to bieżące polecenie, a następnie ustawia rejestr „a” na nazwę bieżącego pliku. Następnie ostatnie polecenie jest przywoływane i dołączane do zawartości rejestru „a”. Oczywiście, jeśli masz coś użytecznego w rejestrze „a”, spowoduje to zastąpienie go.

Możesz zmienić zamapowane postacie na coś innego. Lubię używać klawisza Alt, ale nie działa w niektórych terminalach.

Jak wskazał Carpetsmoker w swojej odpowiedzi, możesz zmienić wywołanie funkcji na

expand('%:p')

wymusić pełną ścieżkę.

Szczery
źródło
1
Spowodowałoby to bezcelowe zatarcie rejestru a. Spróbuj czegoś takiego:cnoremap <M-q> <C-r>=fnameescape(expand('%:p'))<CR>
lcd047