2013-06-18 10 views
22

Załóżmy, że mam folder z dużą ilością plików .h i .cpp. I często trzeba wykonać następujące czynności:W Vimie, jak szybko przełączać się między plikami .h i .cpp o tej samej nazwie?

  1. otworzyć plik prefix_SomeReallyLongFileName.h,
  2. wprowadzić pewne zmiany do niego
  3. a następnie otwarty prefix_SomeReallyLongFileName.cpp.

Mogę to zrobić, używając :e <filename> przy użyciu funkcji autouzupełniania, ale ponieważ przedrostek jest taki sam dla wielu plików, staje się to niewygodne.

Czy istnieje szybki sposób otwarcia pliku o tej samej nazwie co plik bieżący, ale o innym rozszerzeniu?

Czy inni ludzie również napotykają tę sytuację, a jeśli tak, jaki jest preferowany sposób nawigacji plików C++ w katalogu? Dzięki.

+1

Nie jestem pewien, czy dzieje się tak z wieloma osobami. Zazwyczaj pliki nagłówkowe znajdują się w osobnym folderze niż pliki źródłowe (na przykład 'include /' i 'src /'), więc to, o co prosisz, nie ma miejsca (chyba że szukasz pliku w '../include/ 'lub' ../ src/'). Zazwyczaj uruchamiam dwa terminale, utrzymuję plik nagłówkowy otwarty w jednym, a plik źródłowy w drugim, ponieważ zazwyczaj przechodzę z jednego pliku do drugiego. – Shahbaz

+2

Możesz wpisać ': e', a następnie naciśnij ctrl-r%. Spowoduje to umieszczenie bieżącej nazwy pliku na linii, a następnie zastąpienie rozszerzenia. –

+3

Podobne pytania [Korzystanie z a.vima dla C++] (http://stackoverflow.com/q/2192152) i [skrypt Vima do przełączania się między nagłówkiem a plikiem implementacji za pomocą cscope] (http://stackoverflow.com/q/5108484). – glts

Odpowiedz

39

Można użyć modyfikatora :r (root) nazwę pliku, który usuwa ostatnie rozszerzenie (sprawdź :h filename-modifiers aby uzyskać więcej informacji)

:e %:r.cpp 

gdzie

  • % jest skrótem dla aktualnego pliku.
  • usuwa rozszerzenie
  • .cpp po prostu dołącza ten ciąg na końcu.

To skutecznie zastępuje rozszerzenie bieżącego pliku innym, a następnie otwiera plik z nowszym rozszerzeniem.


Jeszcze krótsza droga (dzięki uprzejmości Peter Rincker)

:e %<.cpp 

Stosowna dokumentacja w :h extension-removal

+1

Dla mnie, w pliku 'ac',': e%: eh' zamienia się w 'ch' zamiast oczekiwane 'ah' – Shahbaz

+0

@Shahbaz, przepraszam, powinienem używać': r'. Poprawię wpis. – doubleDown

+0

Nie ma problemu, tylko chciałem Cię poinformować (uczę się również) – Shahbaz

19

Według wiki Vima istnieje sporo suggested ways.

będę zarys kilka opcji z artykułu:

  • a.vim lub FSwitch.vim wtyczek
  • użyciu ctags
  • :e %<.c lub :e %<.h. %< reprezentuje bieżący plik bez przedłużenia
  • Szybkie mapowanie nnoremap <F4> :e %:p:s,.h$,.X123X,:s,.cpp$,.h,:s,.X123X$,.cpp,<CR>. Dodaj to do swojej ~/.vimrc.
+3

Inną wtyczką, o której naprawdę warto wspomnieć, jest [* altr *] (http://www.vim.org/scripts/script.php?script_id=4202), lepszy * a.vim *. Obsługuje nie tylko '.h' i' .cpp', ale także inne alternatywy i można je dostosować. – glts

+0

Używam powyższego polecenia, ale używam 'tag' zamiast' e'. Jednak mówi "Nie znaleziono znacznika". Czy to dlatego, że jest wywoływany z pliku '.vimrc', a nie z pliku źródłowego? – Paschalis

+1

@Paschalis ': tag' i': e' są zupełnie innymi poleceniami. ': e' edytuje dany plik, podczas gdy': tag' przeskakuje do danego znacznika. Powyższe polecenie (mapowanie) pobiera zasadniczo bieżącą nazwę pliku, '%' i stosuje pewne sztuczki zastępcze, aby zmienić '.h' ->' .cpp' i '.cpp' ->' .h'. Oznacza to, że polecenie przełącza się między plikiem źródłowym a plikiem nagłówkowym (iz powrotem). Używając ': tag' z tym odwzorowaniem, w zasadzie szukasz nazwy pliku z wyłączonym rozszerzeniem, co nie ma żadnego sensu. Aby uzyskać więcej pomocy, zobacz ': h: znacznik',': h: e' i ': h c_%'. –

6

Zainstaluj "nienaruszony", a następnie użyj ]f i [f, aby przejść do poprzedniego i następnego pliku. Ponieważ źródło i nagłówek mają tę samą nazwę oprócz sufiksu, są to następne i poprzednie pliki.

+1

FYI dla użytkowników google: '] f' i' [f' przechodzą tylko przez pliki w bieżącym katalogu. To odpowiada na pytanie OP, ale nie pomoże tym, którzy dzielą pliki nagłówkowe i źródłowe na różne katalogi itp. – Matthew

1

To jest po prostu za pomocą prostych (?!) vimscript, dzięki czemu można umieścić go w vimrc, teraz pracuje dla .c plików, ale może być modyfikowany na .cpp dość łatwo (oczywiście), to nawet ma jakiś „błąd obsługa "w wewnętrznych instrukcjach if (to chyba bezcelowe), ale jeśli ktoś tego potrzebuje, hej, jest tam! Bez tego jest o wiele krótszy (wystarczy zostawić na przykład :e %<.h), więc wybierz, co chcesz.

function! HeaderToggle() " bang for overwrite when saving vimrc 
let file_path = expand("%") 
let file_name = expand("%<") 
let extension = split(file_path, '\.')[-1] " '\.' is how you really split on dot 
let err_msg = "There is no file " 

if extension == "c" 
    let next_file = join([file_name, ".h"], "") 

    if filereadable(next_file) 
    :e %<.h 
    else 
     echo join([err_msg, next_file], "") 
    endif 
elseif extension == "h" 
    let next_file = join([file_name, ".c"], "") 

    if filereadable(next_file) 
     :e %<.c 
    else 
     echo join([err_msg, next_file], "") 
    endif 
endif 
endfunction 

następnie dodać dodatkowo do vimrc coś wzdłuż tych linii:

let mapleader = "," " <Leader> 
nnoremap <Leader>h :call HeaderToggle()<CR> 

Teraz, gdy jesteś w trybie normalnym, naciśnięcie przecinek , (to jest nasz przycisk <Leader>) następnie h i funkcja z powyższe zostanie wywołane, a będziesz przełączać się między plikami. Tada!

Powiązane problemy