Jaki jest twój najbardziej produktywny skrót w Vimie?


1126

Dużo słyszałem o Vimie , zarówno o zaletach, jak i wadach. Wydaje się, że powinieneś być (jako programista) szybszy w Vimie niż w jakimkolwiek innym edytorze. Używam Vima do robienia podstawowych rzeczy i jestem co najmniej 10 razy mniej wydajny z Vimem.

Jedyne dwie rzeczy, na które powinieneś zwrócić uwagę, gdy mówisz o prędkości (możesz nie dbać o nie wystarczająco, ale powinieneś) to:

  1. Używanie alternatywnie lewej i prawej ręki jest najszybszym sposobem korzystania z klawiatury.
  2. Nigdy nie dotykaj myszy, to drugi sposób na jak najszybsze. Przesunięcie ręki, złapanie myszy, przesunięcie i przywrócenie jej z powrotem na klawiaturę zajmuje wieki (często trzeba patrzeć na klawiaturę, aby upewnić się, że prawidłowo ułożyła ona rękę we właściwym miejscu)

Oto dwa przykłady pokazujące, dlaczego jestem mniej produktywny w Vimie.

Kopiuj / Wytnij i wklej. Ciągle to robię. We wszystkich współczesnych edytorach naciskasz Shift lewą ręką i przesuwasz kursor prawą ręką, aby zaznaczyć tekst. Następnie Ctrl+ Ckopie, należy przesunąć kursor i Ctrl+ Vpast.

Z Vimem to okropne:

  • yy aby skopiować jedną linię (prawie nigdy nie chcesz całej linii!)
  • [number xx]yyaby skopiować xxlinie do bufora. Ale nigdy nie wiesz dokładnie, czy wybrałeś to, czego chciałeś. Często muszę [number xx]ddwtedy ucofnąć!

Inny przykład? Wyszukaj i zamień.

  • W PSPad : Ctrl+ fnastępnie wpisz to, czego szukasz, a następnie naciśnij Enter.
  • W Vim: /wpisz, co chcesz wyszukać, a jeśli \przed każdym znakiem specjalnym są jakieś znaki specjalne, naciśnij Enter.

I wszystko w Vimie jest takie: wydaje się, że nie wiem, jak sobie z tym poradzić.

NB: Już odczytać Vima oszukiwać arkusz :)

Moje pytanie brzmi:

W jaki sposób korzystasz z Vima, dzięki czemu jesteś bardziej produktywny niż we współczesnym edytorze?


„Używanie alternatywnie lewej i prawej ręki jest najszybszym sposobem korzystania z klawiatury”. Dziwnie nie dla mnie. Kiedy mogę wpisać słowo jedną ręką, stwierdzam, że jestem znacznie szybszy.
Ben Mordecai,

Odpowiedzi:


2860

Twój problem z Vimem polega na tym, że nie grokujesz vi .

Wspominasz o cięciu yyi narzekasz, że prawie nigdy nie chcesz przecinać całych linii. W rzeczywistości programiści, edytując kod źródłowy, bardzo często chcą pracować na całych liniach, zakresach linii i blokach kodu. Jest to jednak yytylko jeden z wielu sposobów wciągnięcia tekstu do anonimowego bufora kopii (lub „rejestracji”, jak to się nazywa w vi ).

„Zen” vi polega na tym, że mówisz językiem. Inicjał yjest czasownikiem. Oświadczenie yyjest synonimem y_. yJest podwojona do ułatwienia pisania, ponieważ jest to takie wspólne działanie.

Można to również wyrazić jako dd P(usuń bieżący wiersz i wklej kopię z powrotem na miejsce; pozostawiając kopię w rejestrze anonimowym jako efekt uboczny). Te yi d„Czasowniki” wziąć każdy ruch jako „podmiot”. Zatem yW„ciągnij stąd (kursor) do końca bieżącego / następnego (dużego) słowa” i y'a„ciągnij stąd do wiersza zawierającego znak o nazwie„ a ”.

Jeśli rozumiesz tylko podstawowe ruchy kursora w górę, w dół, w lewo i w prawo, vi nie będzie dla ciebie bardziej produktywne niż kopia „notatnika”. (W porządku, nadal będziesz miał podświetlanie składni i możliwość obsługi plików większych niż piddling ~ 45 KB lub więcej; ale pracuj tutaj ze mną).

vi ma 26 „znaków” i 26 „rejestrów”. Znak jest ustawiany w dowolnym miejscu kursora za pomocą mpolecenia. Każdy znak jest oznaczony pojedynczą małą literą. W ten sposób maustawia znak „ a ” na bieżącą lokalizację i mzustawia znak „ z ”. Możesz przejść do wiersza zawierającego znak, używając polecenia '(pojedynczy cudzysłów). W ten sposób 'aprzechodzi na początek linii zawierającej znak „ a ”. Możesz przejść do dokładnej lokalizacji dowolnego znaku za pomocą polecenia `(cudzysłów). W ten sposób `zprzejdzie bezpośrednio do dokładnej lokalizacji znaku „ z ”.

Ponieważ są to „ruchy”, można je również wykorzystać jako tematy innych „stwierdzeń”.

Tak więc jednym ze sposobów wycinania dowolnego tekstu byłoby upuszczenie znaku (zwykle używam „ a ” jako mojego „pierwszego” znaku, „ z ” jako mojego następnego znaku, „ b ” jako innego, a „ e ” jako innego jeszcze inny (nie przypominam sobie, aby kiedykolwiek interaktywnie używać więcej niż czterech znaków w ciągu 15 lat używania vi ; jeden tworzy własne konwencje dotyczące używania znaków i rejestrów przez makra, które nie zakłócają interaktywnego kontekstu). na drugim końcu pożądanego tekstu; możemy zacząć od drugiego końca, to nie ma znaczenia. Następnie możemy po prostu użyć d`ado wycięcia lub .y`a kopiowania. W ten sposób cały proces ma narzut 5 naciśnięć klawiszy (sześć, jeśli zaczęliśmy od „insert” „tryb i potrzebneEsctryb komend out). Po wycięciu lub skopiowaniu wklejanie kopii jest jednym naciśnięciem klawisza:p

Mówię, że jest to jeden ze sposobów wycinania lub kopiowania tekstu. Jest to jednak tylko jeden z wielu. Często możemy bardziej zwięźle opisać zakres tekstu bez przesuwania kursora i upuszczania znaku. Na przykład, jeśli jestem w akapicie tekstu, mogę użyć {i }przejść odpowiednio na początek lub koniec akapitu. Aby przenieść akapit tekstu, wycinam go { d}(3 naciśnięcia klawiszy). (Jeśli zdarzyło mi się być w pierwszej lub ostatniej linii akapitu, mogę po prostu użyć odpowiednio d}lub d{.

Pojęcie „akapit” domyślnie przyjmuje coś, co zwykle jest intuicyjnie uzasadnione. Dlatego często działa zarówno dla kodu, jak i dla prozy.

Często znamy jakiś wzorzec (wyrażenie regularne), który oznacza jeden lub drugi tekst, który nas interesuje. Wyszukiwanie do przodu lub do tyłu to ruchy w vi . Dlatego mogą być również używane jako „podmioty” w naszych „oświadczeniach”. Więc mogę użyć, d/fooaby wyciąć z bieżącej linii do następnej linii zawierającej ciąg „foo” i y?barskopiować z bieżącej linii do najnowszej (poprzedniej) linii zawierającej „pasek”. Jeśli nie chcę całych linii, nadal mogę korzystać z ruchów wyszukiwania (jako własnych instrukcji), porzucić moje znaki i używać `xpoleceń w sposób opisany wcześniej.

Oprócz „czasowników” i „przedmiotów” vi ma także „przedmioty” (w gramatycznym znaczeniu tego terminu). Do tej pory opisałem tylko użycie anonimowego rejestru. Jednak mogę użyć dowolnego z 26 rejestrów „nazwanych”, poprzedzając odwołanie do „obiektu” "(modyfikatorem podwójnego cudzysłowu). Zatem jeśli "addużywam, wycinam bieżącą linię do rejestru „ a ”, a jeśli "by/fooużywam, szarpię kopię tekstu stąd do następnego wiersza zawierającego „foo” do rejestru „ b ”. Aby wkleić z rejestru po prostu poprzedzić pastę z tej samej sekwencji Modyfikator: "apwkleja Kopię „ ” zarejestrować”"bPwkleja kopię z „ b ” do przed bieżącą linią.

To pojęcie „przedrostków” dodaje także analogi gramatyczne „przymiotniki” i „przysłówki” do naszego języka „manipulacji tekstem”. Większość poleceń (czasowników) i ruchów (czasowników lub obiektów, w zależności od kontekstu) może również przyjmować przedrostki numeryczne. 3Joznacza „połącz trzy kolejne wiersze” i d5}„usuń z bieżącego wiersza do końca piątego akapitu stąd”.

To wszystko poziom pośredni vi . Żaden z nich nie jest specyficzny dla Vima i istnieją vi bardziej zaawansowane sztuczki w vi, jeśli jesteś gotowy, aby się ich nauczyć. Jeśli opanujesz tylko te pośrednie pojęcia, prawdopodobnie odkryjesz, że rzadko musisz pisać makra, ponieważ język manipulacji tekstem jest wystarczająco zwięzły i ekspresyjny, aby robić większość rzeczy z łatwością za pomocą „rodzimego” języka edytora.


Próbki bardziej zaawansowanych sztuczek:

Istnieje wiele :poleceń, w szczególności :% s/foo/bar/gtechnika globalnego zastępowania. (To nie jest zaawansowane, ale :mogą być inne polecenia). Cały :zestaw poleceń historycznie odziedziczył poprzednie wcielenia vi jako narzędzia ed (edytor linii), a później ex (rozszerzony edytor linii). W rzeczywistości vi jest tak nazwany, ponieważ jest to interfejs wizualny ex .

:polecenia zwykle działają nad wierszami tekstu. ed i ex zostały napisane w czasach, gdy ekrany terminali były rzadkie, a wiele terminali było urządzeniami typu „teletype” (TTY). Dlatego często drukowano kopie tekstu przy użyciu poleceń za pomocą bardzo zwięzłego interfejsu (częste prędkości połączenia wynosiły 110 bodów lub mniej więcej 11 znaków na sekundę - co jest wolniejsze niż szybka maszyna do pisania; opóźnienia występowały często na interaktywne sesje dla wielu użytkowników; dodatkowo często motywowano się do oszczędzania papieru).

Tak więc składnia większości :poleceń obejmuje adres lub zakres adresów (numer linii), po którym następuje polecenie. Oczywiście można użyć literalnych numerów linii: :127,215 s/foo/baraby zmienić pierwsze wystąpienie „foo” na „słupek” na każdej linii między 127 a 215. Można również użyć niektórych skrótów, takich jak .lub odpowiednio $dla bieżącej i ostatniej linii. Można również użyć względnych prefiksów +i -odnieść się do przesunięć odpowiednio przed lub przed linią bieżącą. A zatem: :.,$joznacza „od bieżącej linii do ostatniej linii, połącz je wszystkie w jedną linię”. :%jest synonimem :1,$(wszystkie linie).

:... gI :... vpolecenia ponieść jakieś wytłumaczenie, ponieważ są one bardzo silne. :... gjest prefiksem dla „globalnie” zastosowania kolejnego polecenia do wszystkich wierszy, które pasują do wzorca (wyrażenie regularne), podczas gdy :... vstosuje takie polecenie do wszystkich wierszy, które NIE pasują do danego wzorca („v” z „conVerse”). Podobnie jak w przypadku innych komend ex , można je poprzedzić adresowaniem / odniesieniami zakresu. Oznacza :.,+21g/foo/dto zatem „usuń wszystkie wiersze zawierające ciąg„ foo ”z bieżącego do kolejnych 21 wierszy”, a jednocześnie :.,$v/bar/d„od tego miejsca do końca pliku usuń wszystkie wiersze, które NIE zawierają ciągu„ pasek ”.

Interesujące jest to, że popularna komenda uniksowa grep została zainspirowana tym poleceniem ex (i nosi nazwę po sposobie, w jaki została udokumentowana). Ex komenda :g/re/p(grep) był sposób udokumentowane, jak „globalnie” „Drukuj” linie zawierające „wyrażenia regularnego” (RE). Kiedy użyto ed i ex , :ppolecenie było jednym z pierwszych, które ktokolwiek się nauczył, i często pierwszym, którego użyto podczas edycji dowolnego pliku. W ten sposób wydrukowałeś bieżącą zawartość (zwykle tylko jedną stronę zapełnioną na raz za pomocą :.,+25plub jakąś taką).

Zauważ, że :% g/.../dlub (jego odpowiednik reVerse / conVerse: :% v/.../dsą najczęstszymi wzorcami użytkowania. Istnieje jednak kilka innych expoleceń, o których warto pamiętać:

Możemy używać mdo przesuwania linii i jłączenia linii. Na przykład, jeśli masz listę i chcesz oddzielić wszystkie elementy pasujące (lub odwrotnie NIE pasujące do jakiegoś wzoru) bez ich usuwania, możesz użyć czegoś takiego: :% g/foo/m$... i wszystkie linie „foo” zostaną przeniesione do koniec pliku. (Zwróć uwagę na drugą wskazówkę dotyczącą używania końca pliku jako miejsca na zarysowania). Pozwoli to zachować względną kolejność wszystkich wierszy „foo”, po wyodrębnieniu ich z reszty listy. (Byłoby to równoważne z zrobieniem czegoś takiego: 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d(skopiuj plik do własnego ogona, przefiltruj ogon grepi usuń wszystkie rzeczy z głowy).

Aby połączyć linie zwykle, mogę znaleźć wzór dla wszystkich linii, które muszą być połączone z ich poprzednikiem (na przykład wszystkie linie, które zaczynają się od „^” zamiast „^ *” na niektórych listach punktowanych). W takim przypadku użyłbym: :% g/^ /-1j(dla każdej pasującej linii, przejdź o jedną linię w górę i dołącz do nich). (BTW: na listach kulach próbuje szukać linii kulach i przystąpić do następnego nie praca dla paru powodów ... może przyłączyć jedną linię kula do drugiego, a nie będzie dołączyć dowolną linię kula do wszystkich z jego kontynuacje; będzie działać tylko parami na meczach).

Prawie nie trzeba wspominać, że możesz użyć naszego starego przyjaciela s(zamiennik) z poleceniami gi v(global / converse-global). Zwykle nie musisz tego robić. Zastanów się jednak nad przypadkiem, w którym chcesz wykonać podstawienie tylko w wierszach pasujących do innego wzorca. Często możesz użyć skomplikowanego wzorca z przechwytywaniem i użyć referencji wstecznych, aby zachować fragmenty linii, których NIE chcesz zmienić. Jednak często łatwiej będzie oddzielić dopasowanie od podstawienia: :% g/foo/s/bar/zzz/g- dla każdej linii zawierającej „foo” zamień wszystkie „bar” na „zzz”. (Coś jak:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/gdziałałby tylko w przypadkach tych przypadków „bar”, które WSTĘPNE były przez „foo” w tej samej linii; jest już dość niewygodny i musiałby zostać zmasakrowany, aby złapać wszystkie przypadki, w których „bar” poprzedzał „foo”)

Chodzi o to, że istnieje więcej niż tylko p, si dlinii w exzestawie poleceń.

Te :adresy mogą również odnosić się do znaków. Zatem możesz użyć: :'a,'bg/foo/jdo połączenia dowolnej linii zawierającej ciąg foo z kolejną linią, jeśli leży ona między liniami między znakami „ a ” i „ b ”. (Tak, wszystkie powyższe exprzykłady poleceń można ograniczyć do podzbiorów wierszy pliku, poprzedzając je tego rodzaju wyrażeniami adresującymi).

To dość niejasne (użyłem czegoś takiego tylko kilka razy w ciągu ostatnich 15 lat). Przyznam jednak, że często robiłem rzeczy iteracyjnie i interaktywnie, co prawdopodobnie można by zrobić bardziej efektywnie, gdybym poświęcił czas na wymyślenie właściwej inkantacji.

Innym bardzo przydatnym poleceniem vi lub ex jest :rodczytanie zawartości innego pliku. Zatem: :r foowstawia zawartość pliku o nazwie „foo” w bieżącym wierszu.

Potężniejsze jest :r!polecenie. To odczytuje wyniki polecenia. To tak samo, jak zawieszanie sesji vi , uruchamianie polecenia, przekierowywanie danych wyjściowych do pliku tymczasowego, wznawianie sesji vi i wczytywanie zawartości z temp. plik.

Jeszcze bardziej potężny jesteś !(huk) i :... !( ex huk) poleceń. Wykonują one również zewnętrzne polecenia i odczytują wyniki w bieżącym tekście. Jednak filtrują również zaznaczenie naszego tekstu za pomocą polecenia! W ten sposób możemy posortować wszystkie wiersze w naszym pliku za pomocą 1G!Gsort( Gjest to polecenie vi „goto”; domyślnie przechodzi do ostatniego wiersza pliku, ale może być poprzedzone numerem wiersza, takim jak 1, pierwszy wiersz). Jest to równoważne wariantowi ex:1,$!sort . Pisarze często używają !uniksowych narzędzi fmt lub fold do przekształcania lub „zawijania tekstu” zaznaczeń tekstu. Bardzo częstym makrem jest{!}fmt(ponownie sformatuj obecny akapit). Programiści czasami używają go do uruchamiania kodu lub tylko jego części za pomocą wcięć lub innych narzędzi do formatowania kodu.

Użycie poleceń :r!i !oznacza, że ​​każde zewnętrzne narzędzie lub filtr można traktować jako rozszerzenie naszego edytora. Czasami używałem ich ze skryptami, które wyciągały dane z bazy danych, lub z poleceniami wget lub lynx , które ściągały dane ze strony internetowej, lub poleceniami ssh , które wyciągały dane ze zdalnych systemów.

Innym przydatnym poleceniem ex jest :so(skrót od :source). Czyta zawartość pliku jako serię poleceń. Kiedy zaczynasz vi normalnie, domyślnie, wykonuje on :sourcena ~/.exinitrcpliku (a Vim zwykle robi to na ~/.vimrc, oczywiście). Wykorzystanie tego polega na tym, że możesz zmienić profil edytora w locie, po prostu pozyskując nowy zestaw makr, skrótów i ustawień edytora. Jeśli jesteś podstępny, możesz nawet użyć tego jako sztuczki do przechowywania sekwencji poleceń ex edycji, aby zastosować je do plików na żądanie.

Na przykład mam plik z siedmioma wierszami (36 znaków), który uruchamia plik przez wc i wstawia komentarz w stylu C u góry pliku zawierającego dane o liczbie słów. Mogę zastosować to „makro” do pliku za pomocą polecenia takiego jak:vim +'so mymacro.ex' ./mytarget

( +Opcja vi i Vim z wiersza poleceń jest zwykle używana do rozpoczęcia sesji edytowania pod danym numerem wiersza. Jednak mało znany jest fakt, że można podążać +za dowolnym prawidłowym poleceniem / wyrażeniem ex , takim jak polecenie „źródło” jako Zrobiłem to tutaj; dla prostego przykładu mam skrypty, które wywołują: vi +'/foo/d|wq!' ~/.ssh/known_hostsaby usunąć wpis z mojego znanego pliku hostów SSH w sposób nieinteraktywny, gdy ponownie obrazuję zestaw serwerów).

Zazwyczaj o wiele łatwiej jest pisać takie „makra” przy użyciu Perla, AWK, sed (co w rzeczywistości przypomina grep, narzędzie zainspirowane poleceniem ed ).

@Komenda jest prawdopodobnie najbardziej niejasny vi poleceń. Od czasu do czasu ucząc zaawansowanych kursów administracji systemów przez prawie dekadę, spotkałem bardzo mało osób, które kiedykolwiek z nich korzystały. @wykonuje zawartość rejestru tak, jakby to była komenda vi lub ex .
Przykład: często używam: :r!locate ...do znalezienia jakiegoś pliku w moim systemie i odczytania jego nazwy do mojego dokumentu. Stamtąd usuwam wszelkie obce trafienia, pozostawiając tylko pełną ścieżkę do pliku, który mnie interesuje. Zamiast żmudnego Tabprzeszukiwania każdego elementu ścieżki (lub gorzej, jeśli utknąłem na komputerze bez obsługi uzupełniania tabulacji w kopii vi ) Używam po prostu:

  1. 0i:r(aby zmienić bieżącą linię w poprawną komendę : r ),
  2. "cdd (aby usunąć wiersz z rejestru „c”) i
  3. @c wykonać to polecenie.

To tylko 10 naciśnięć klawiszy (a wyrażenie "cdd @cto dla mnie makro palca, więc mogę wpisać je prawie tak szybko, jak każde zwykłe sześcioliterowe słowo).


Trzeźwa myśl

Podszedłem tylko na powierzchnię mocy vi i nic z tego, co tu opisałem, nie jest nawet częścią „ulepszeń”, od których pochodzi vim ! Wszystko, co tu opisałem, powinno działać na każdej starej kopii vi sprzed 20 lub 30 lat.

Są ludzie, którzy wykorzystali znacznie więcej mocy vi niż kiedykolwiek.


440
Święte kodowane małpy ... to jedna szczegółowa odpowiedź. Wspaniałe jest to, że prawdopodobnie napisałeś in vim po około 10 naciśnięciach klawiszy.
EightyOne Unite

48
@Wahnfieden - grok jest dokładnie tym, co miałem na myśli: en.wikipedia.org/wiki/Grok (Najwyraźniej nawet w OED --- najbliższy nam anglofony do kanonicznego leksykonu). „Grok” edytora oznacza płynne posługiwanie się jego poleceniami… tak jakby były Twoim naturalnym językiem.
Jim Dennis

22
wow, bardzo dobrze napisana odpowiedź! nie mogłem się więcej zgodzić, chociaż @często używam polecenia (w połączeniu z q: rekordem makro)
knittl

63
Znakomita odpowiedź, która całkowicie wyzwala naprawdę okropne pytanie. Mam zamiar głosować za tym pytaniem, które normalnie oddałbym za głos, tylko po to, aby odpowiedź była łatwiejsza do znalezienia. (I jestem facetem z Emacsa! Ale w ten sposób będę miał miejsce, aby wskazać nowych ludzi, którzy chcą dobrego wyjaśnienia, co użytkownicy vi power czerpią z zabawy z vi. Następnie powiem im o Emacsie i będą mogli zdecydować.)
Brandon Rhodes

8
Czy możesz stworzyć stronę internetową i umieścić tam ten samouczek, aby nie został tu zakopany przy przepełnieniu stosu. Muszę jeszcze przeczytać lepsze wprowadzenie do vi, a potem to.
Marko

504

Mówisz o zaznaczaniu i kopiowaniu tekstu, myślę, że powinieneś spojrzeć na tryb wizualny Vima .

W trybie wizualnym możesz zaznaczać tekst za pomocą poleceń Vima, a następnie możesz robić, co chcesz z zaznaczeniem.

Rozważ następujące typowe scenariusze:

Musisz wybrać następny pasujący nawias.

Mógłbyś:

  • v% jeśli kursor znajduje się w nawiasie początkowym / końcowym
  • vib jeśli kursor znajduje się w bloku nawiasu

Chcesz zaznaczyć tekst między cytatami:

  • vi ” dla podwójnych cytatów
  • vi ” dla pojedynczych cytatów

Chcesz wybrać nawias klamrowy (bardzo powszechny w językach w stylu C):

  • viB
  • vi{

Chcesz wybrać cały plik:

  • ggVG

Wizualny wybór bloku to kolejna bardzo przydatna funkcja, która pozwala wybrać prostokątny obszar tekstu, wystarczy nacisnąć Ctrl- Vaby go uruchomić, a następnie wybrać żądany blok tekstu i wykonać dowolną operację, taką jak szarpnięcie, usunięcie, wklej, edytuj itp. Świetnie jest edytować tekst zorientowany na kolumny .


2
Każdy edytor ma coś takiego, nie jest specyficzne dla vima.
finnw

22
Tak, ale była to konkretna skarga na plakat. Tryb wizualny jest najlepszą metodą Vima do bezpośredniego zaznaczania tekstu i manipulacji. A ponieważ metody przechodzenia przez bufor vima są doskonałe, wybór tekstu w vimie jest dla mnie przyjemnością.
pistolety

9
Myślę, że warto również wspomnieć o Ctrl-V, aby wybrać blok - tj. Dowolny prostokąt tekstu. Kiedy go potrzebujesz, ratuje życie.
Hamish Downer

6
@viksit: Używam Camtasia, ale istnieje wiele alternatyw: codinghorror.com/blog/2006/11/screencasting-for-windows.html
CMS

3
Ponadto, jeśli masz wybór wizualny i chcesz go dostosować, oprzeskoczy na drugi koniec. Możesz więc dowolnie przesuwać początek i koniec zaznaczenia.
Nathan Long

207

Kilka wskazówek dotyczących wydajności:

Inteligentne ruchy

  • *i #wyszukaj słowo pod kursorem do przodu / do tyłu.
  • w do następnego słowa
  • W do następnego słowa oddzielonego spacją
  • b / e do początku / końca bieżącego słowa. ( B/ tylko Edla spacji oddzielonych)
  • gg / G przeskocz na początek / koniec pliku.
  • % przejdź do pasującego {..} lub (..) itp.
  • { / } przejdź do następnego akapitu.
  • '. przeskocz z powrotem do ostatnio edytowanej linii.
  • g; przeskocz z powrotem do ostatnio edytowanej pozycji.

Szybkie polecenia edycji

  • I wstaw na początku.
  • A dołącz do końca.
  • o / O otwórz nową linię po / przed bieżącym.
  • v/ V/Ctrl+V tryb wizualny (aby zaznaczyć tekst!)
  • Shift+R zamień tekst
  • C zmień pozostałą część linii.

Łączenie poleceń

Większość poleceń akceptuje wielkość i kierunek, na przykład:

  • cW = zmiana do końca słowa
  • 3cW = zmień 3 słowa
  • BcW = aby rozpocząć pełne słowo, zmień pełne słowo
  • ciW = zmień wewnętrzne słowo.
  • ci" = zmiana wewnętrzna pomiędzy „..”
  • ci( = zmień tekst pomiędzy (..)
  • ci<= zmień tekst pomiędzy <..> (wymaga set matchpairs+=<:>vimrc)
  • 4dd = usuń 4 linie
  • 3x = usuń 3 znaki
  • 3s = zamień 3 znaki.

Przydatne polecenia programisty

  • rzamień jeden znak (np. rdzamienia bieżący znak na d).
  • ~ zmienia wielkość liter.
  • J łączy dwie linie
  • Ctrl + A / Ctrl + X zwiększa / zmniejsza liczbę.
  • . powtórz ostatnie polecenie (proste makro)
  • == napraw wcięcie linii
  • > blok wcięcia (w trybie wizualnym)
  • < nieindent blok (w trybie wizualnym)

Nagrywanie makr

  • Naciśnij, q[ key ]aby rozpocząć nagrywanie.
  • Następnie naciśnij, qaby zatrzymać nagrywanie.
  • Makro można odtwarzać za pomocą @[ key ].

Używając bardzo specyficznych poleceń i ruchów, VIM może odtworzyć dokładnie te akcje dla następnych linii. (np. A dla append-to-end, b/ eaby przesunąć kursor odpowiednio na początek lub koniec słowa)

Przykład dobrze zbudowanych ustawień

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

Ustawienia można zapisać w ~/.vimrcsystemie lub w /etc/vimrc.localcałym systemie, a następnie odczytać z /etc/vimrcpliku za pomocą:

source /etc/vimrc.local

(będziesz musiał zamienić #znak komentarza "na, aby działał w VIM, chciałem tutaj odpowiednio podświetlić składnię).

Polecenia, które tu wymieniłem, są dość podstawowe, a głównych z nich używam do tej pory. Już teraz sprawiają, że jestem bardziej produktywny, bez konieczności poznawania wszystkich wymyślnych rzeczy.


4
Lepiej niż '.jest g;, co skacze z powrotem przez changelist. Przechodzi do ostatnio edytowanej pozycji, zamiast ostatnio edytowanej linii
naught101

98

Control+ RMechanizm jest bardzo przydatna :-) W każdym wkładka trybie lub trybie poleceń (czyli na :linii komend podczas typowania), przejdź do numerowaną lub nazwie zarejestrować:

  • a- zwymienione rejestry
  • " rejestr bez nazwy, zawierający tekst ostatniego usunięcia lub szarpnięcia
  • % aktualna nazwa pliku
  • # alternatywna nazwa pliku
  • * zawartość schowka (X11: wybór podstawowy)
  • + zawartość schowka
  • / ostatni wzorzec wyszukiwania
  • : ostatni wiersz poleceń
  • . ostatni wstawiony tekst
  • - ostatnie małe (mniej niż wiersz) usunięcie
  • =5*5 wstaw 25 do tekstu (mini-kalkulator)

Zobacz :help i_CTRL-Ri :help c_CTRL-Rwięcej szczegółów, i węsz w pobliżu, aby uzyskać więcej dobroci CTRL-R.


10
Do Twojej wiadomości odnosi się to do Ctrl + R w trybie wstawiania . W trybie normalnym Ctrl + R jest powtarzane.
vdboor

2
+1 za aktualną / alternatywną nazwę pliku. Control-Adziała również w trybie wstawiania ostatniego wstawionego tekstu, a także Control-@do wstawiania ostatnio wstawionego tekstu i natychmiastowego przejścia do trybu normalnego.
Aryeh Leib Taurog

91

Wtyczki Vima

Jest tu wiele dobrych odpowiedzi i jedna niesamowita o zen vi. Jednej rzeczy, o której nie widzę, to to, że vim jest wyjątkowo rozszerzalny poprzez wtyczki. Istnieją skrypty i wtyczki, dzięki którym robi różne szalone rzeczy, których autor nigdy nie rozważał. Oto kilka przykładów niezwykle przydatnych wtyczek vim:

rails.vim

Rails.vim to wtyczka napisana przez tpope. To niesamowite narzędzie dla osób rozwijających szyny. Robi magiczne kontekstowe rzeczy, które pozwalają łatwo przejść z metody w kontrolerze do powiązanego widoku, do modelu, a następnie do testów jednostkowych dla tego modelu. Zaoszczędził dziesiątki, jeśli nie setki godzin, jako programista szyn.

gist.vim

Ta wtyczka pozwala wybrać region tekstu w trybie wizualnym i wpisać szybkie polecenie, aby opublikować go na gist.github.com . Pozwala to na łatwy dostęp do pastebin, co jest niezwykle przydatne, jeśli współpracujesz z kimś przez IRC lub IM.

space.vim

Ta wtyczka zapewnia specjalną funkcjonalność spacji. Zmienia spację w coś analogicznego do kropki, ale zamiast powtarzania akcji powtarza ruchy. Może to być bardzo przydatne do szybkiego poruszania się po pliku w sposób zdefiniowany na bieżąco.

surround.vim

Ta wtyczka umożliwia pracę z tekstem, który jest w pewien sposób rozdzielany. Daje ci obiekty, które oznaczają rzeczy w parenach, rzeczy w cudzysłowach itp. Może się przydać do manipulowania tekstem ograniczonym.

supertab.vim

Ten skrypt zapewnia fantazyjną funkcjonalność uzupełniania tabulatorów. Funkcje autouzupełniania są już w rdzeniu vima, ale dzięki temu można przejść do szybkiej karty, a nie do wielu różnych skrótów. Bardzo poręczny i niezwykle przyjemny w użyciu. Chociaż nie jest to inteligencja VS, jest to świetny krok i zapewnia wiele funkcji, których można oczekiwać od narzędzia do uzupełniania kart.

syntastic.vim

To narzędzie przenosi zewnętrzne polecenia sprawdzania składni do vima. Nie korzystałem z niego osobiście, ale słyszałem o nim świetne rzeczy, a koncepcja jest trudna do pokonania. Sprawdzanie składni bez konieczności ręcznego wykonywania tej czynności pozwala zaoszczędzić czas i może pomóc w wychwyceniu błędów składniowych podczas ich wprowadzania, a nie kiedy w końcu przestajesz testować.

fugitive.vim

Bezpośredni dostęp do git od wewnątrz vima. Ponownie nie użyłem tej wtyczki, ale widzę narzędzie. Niestety jestem w kulturze, w której svn jest uważany za „nowy”, więc prawdopodobnie nie zobaczę gita w pracy przez dłuższy czas.

nerdtree.vim

Przeglądarka drzew dla vima. Zacząłem używać tego niedawno i jest to naprawdę przydatne. Pozwala na umieszczenie widoku drzewa w pionowym podziale i łatwe otwieranie plików. Jest to idealne rozwiązanie dla projektu z dużą ilością plików źródłowych, między którymi często przeskakujesz.

FuzzyFinderTextmate.vim

Jest to nieobsługiwana wtyczka, ale nadal niezwykle przydatna. Umożliwia otwieranie plików przy użyciu „rozmytej” składni opisowej. Oznacza to, że w rzadkim drzewie plików wystarczy wpisać wystarczającą liczbę znaków, aby rozróżnić pliki, które są zainteresowane od reszty cruft.

Wniosek

Istnieje wiele niesamowitych narzędzi dostępnych dla vima. Jestem pewien, że zarysowałem tu tylko powierzchnię i warto poszukać narzędzi odpowiednich dla Twojej domeny. Połączenie tradycyjnego potężnego zestawu narzędzi vi, ulepszeń vima i wtyczek, które rozszerzają vim jeszcze bardziej, jest to jeden z najpotężniejszych sposobów edycji tekstu, jaki kiedykolwiek wymyślono. Vim jest równie potężny jak emacs, eclipse, studio graficzne i partner tekstowy.

Dzięki

Dzięki duwanis za jego konfiguracje vim, z których wiele się nauczyłem i pożyczyłem większość wymienionych tutaj wtyczek.


Magiczna nawigacja testów w klasie w rails.vim jest jedną z bardziej ogólnych rzeczy, które chciałbym, aby Vim miał TextMate absolutnie w każdym języku: jeśli pracuję na Person.scala i wykonuję Cmd + T, zwykle jest to pierwsza rzecz na liście jest PersonTest.scala.
Tom Morris,

5
Myślę, że już czas, aby FuzzyFinderTextmate zaczął być zastępowany przez github.com/wincent/Command-T
Gavin Gilmour

2
+1 dla Syntastic. To w połączeniu z JSLint sprawiło, że mój Javascript jest znacznie mniej podatny na błędy. Zobacz superuser.com/questions/247012/... o tym, jak skonfigurować JSLint do pracy z Syntastic.
Nathan Long

1
@Benson Świetna lista! Chciałbym wrzucić w snipMate również. Bardzo pomocna automatyzacja popularnych elementów kodowania. if <tab> instant if block, itp.
AlG

2
Myślę, że nerdcommenter to także dobra wtyczka: tutaj . Jak sama nazwa wskazuje, służy do komentowania kodu.
Stephan

53

. Powtórz ostatnie polecenie zmiany tekstu

Z tym oszczędzam dużo czasu.

Tryb wizualny został wspomniany wcześniej, ale tryb wizualny blokowy zaoszczędził mi dużo czasu podczas edycji kolumn o stałym rozmiarze w pliku tekstowym. (dostępne za pomocą Ctrl-V).


3
Dodatkowo, jeśli użyjesz zwięzłego polecenia (np. A dla append-at-end) do edycji tekstu, vim może powtórzyć dokładnie tę samą akcję dla następnego wiersza, na którym naciskasz .klawisz.
vdboor

48

żołnierz amerykański

Przejdź do ostatnio edytowanej lokalizacji (bardzo przydatne, jeśli przeprowadziłeś wyszukiwanie i chcesz wrócić do edycji)

^ P i ^ N

Uzupełnij poprzedni (^ P) lub następny (^ N) tekst.

^ O i ^ I

Przejdź do poprzedniej ( ^O- "O"dla starej) lokalizacji lub do następnej ( ^I- "I"tuż obok "O"). Podczas wyszukiwania, edycji plików itp. Możesz poruszać się po tych „skokach” do przodu i do tyłu.


4
@Kungi `. zabierze Cię do ostatniej edycji `` zabierze Cię z powrotem do pozycji, w której byłeś przed ostatnim 'skokiem' - która / może / również będzie pozycją ostatniej edycji.
Grant McLean


42

CTRL+A zwiększa liczbę, na której stoisz.


19
... i zmniejszenia CTRL-X.
innaM

9
To fajny skrót, ale jak dotąd NIGDY nie znalazłem dla niego żadnego zastosowania.
SolutionYogi

8
jeśli uruchomisz vima na ekranie i zastanawiasz się, dlaczego to nie działa - ctrl + A, A
matja

13
@SolutionYogi: Zastanów się, czy chcesz dodać numer linii na początku każdej linii. Rozwiązanie: ggI1 <spacja> <esc> 0qqyawjP0 <ca> 0q9999 @ q
hcs42

10
Niezwykle przydatne w Vimperatorze, gdzie zwiększa (lub zmniejsza, Ctrl-X) ostatnią liczbę w adresie URL. Przydatne do szybkiego przeglądania galerii zdjęć itp.
niebiesko

38

Wszystko w trybie normalnym:

f <char>, aby przejść do następnego wystąpienia określonego znaku w bieżącym wierszu, oraz ; powtarzać.

F <char>, aby przejść do poprzedniego wystąpienia określonego znaku w bieżącym wierszu i ;powtarzać.

Jeśli użyjesz ich inteligentnie, powyższe dwa mogą sprawić, że zabijesz się szybko w linii.

* na słowie, aby wyszukać następną instancję.

# na słowie, aby wyszukać poprzednie wystąpienie.


6
Whoa, nie wiedziałem o powiązaniu * i # (szukaj słowa pod kursorem). To trochę fajne. F / F i t / T oraz; polecenia to szybkie przeskakiwanie do znaków w bieżącym wierszu. f / F umieść kursor na wskazanym znaku, podczas gdy t / T przesuwa go tylko do „znaku” (znak tuż przed nim lub po nim zgodnie z wybranym kierunkiem; po prostu powtarza najnowsze f / F / t / T skacz (w tym samym kierunku)
Jim Dennis

10
:) Slogan na górze strony ze wskazówkami na vim.org: „Czy możesz sobie wyobrazić, ile naciśnięć klawiszy można było zapisać, gdybym tylko znał polecenie„ * ”na czas?” - Juergen Salk, 1/19/2001 "
Yewge

1
Jak wspomniał Jim, kombinacja „t / T” jest często tak samo dobra, jeśli nie lepsza, na przykład, ct(usuwa słowo i wprowadza cię w tryb wstawiania, ale zachowaj nawiasy!
puk

34

Sesja

za. Zapisz sesję

: mks nazwa sesji

b. wymuś sesję oszczędzania

: mks! nazwa sesji

do. ładowanie sesji

gvim lub vim -S nazwa sesji


Dodawanie i odejmowanie

za. Dodawanie i odejmowanie

CTRL-A; Dodaj [liczba] do liczby lub znaku alfabetu na kursorze lub za nim. {nie w Vi

CTRL-X; Odejmij [liczba] od liczby lub znaku alfabetu przy kursorze lub za nim. {not in Vi}

b. Odznaczanie klucza okna

W oknie Ctrl-A jest już zamapowany na wybór całego pliku, który musisz usunąć mapowanie w pliku rc. zaznacz mswin.vim CTRL-A część odwzorowującą jako komentarz lub dodaj plik rc przy pomocy unmap

do. Z Makro

Polecenie CTRL-A jest bardzo przydatne w makrze. Przykład: wykonaj następujące czynności, aby utworzyć listę numerowaną.

  1. Utwórz pierwszy wpis na liście, upewnij się, że zaczyna się on od liczby.
  2. qa - rozpocznij nagrywanie do bufora „a”
  3. Y - szarpnij wpis
  4. p - umieść kopię wpisu poniżej pierwszego
  5. CTRL-A - zwiększ liczbę
  6. q - zatrzymaj nagrywanie
  7. @a - powtórz czasy szarpnięcia, puta i przyrostu

1
Masz pojęcie, jakie są skróty w systemie Windows?
Don Reba

32

W zeszłym tygodniu w pracy nasz projekt odziedziczył wiele kodu Python z innego projektu. Niestety kod nie pasował do naszej istniejącej architektury - wszystko zostało wykonane przy użyciu globalnych zmiennych i funkcji, które nie działałyby w środowisku wielowątkowym.

Mieliśmy ~ 80 plików, które należało przerobić, aby były zorientowane obiektowo - wszystkie funkcje przeniesiono do klas, zmieniono parametry, dodano instrukcje importu itp. Mieliśmy listę około 20 rodzajów poprawek, które należało wykonać w każdym pliku. Oceniłbym, że robiąc to ręcznie jedna osoba mogłaby zrobić może 2-4 dziennie.

Więc zrobiłem pierwszy ręcznie, a potem napisałem skrypt vim, aby zautomatyzować zmiany. Większość z nich to lista poleceń vima, np

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

Ten ostatni zasługuje na trochę wyjaśnienia:

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

Dla kilku bardziej złożonych transformacji, takich jak generowanie wszystkich instrukcji importu, osadziłem trochę Pythona w skrypcie vim.

Po kilku godzinach pracy nad nim miałem skrypt, który wykona co najmniej 95% konwersji. Po prostu otwieram plik w vimie, a następnie uruchamiam, :source fixit.vima plik jest przekształcany w mgnieniu oka.

Nadal pracujemy nad zmianą pozostałych 5%, co nie było warte automatyzacji i testowaniem wyników, ale spędzając dzień na pisaniu tego skryptu, szacuję, że zaoszczędziliśmy tygodnie pracy.

Oczywiście możliwe byłoby zautomatyzowanie tego za pomocą języka skryptowego, takiego jak Python lub Ruby, ale pisanie zajęłoby znacznie więcej czasu i byłoby mniej elastyczne - ostatni przykład byłby trudny, ponieważ sam regex nie byłby w stanie obsłużyć wsporniki zagnieżdżone, na przykład konwertować bar(foo(xxx))do foo(xxx).bar(). Vim był idealny do tego zadania.


1
Bardzo dziękuję za udostępnianie, które naprawdę miło jest uczyć się z makr „przydatnych i nie klasycznych”.
Olivier Pons

%s/\(bar\)(\(.\+\))/\2.\1()/też by to zrobił. (Ucieczki są kompatybilne :set magic.) Tylko dla nagrania. :)
Ipsquiggle

1
Jeśli nie lubisz ucieczek w stylu vima, użyj \ v, aby włączyć Very Magic:%s/\v(bar)\((.+)\)/\2.\1()/
Ipsquiggle 23.03.10

@ lpsquiggle: Twoja sugestia nie obsługuje złożonych wyrażeń z więcej niż jednym zestawem nawiasów. np. if bar(foo(xxx)) or wibble(xxx): staje if foo(xxx)) or wibble(xxx.bar(): się całkowicie błędne.
Dave Kirby

28

Skorzystaj z wbudowanego eksploratora plików! Polecenie :Exploreto pozwala bardzo szybko poruszać się po kodzie źródłowym. Mam te mapowania w moim .vimrc:

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

Eksplorator umożliwia także modyfikowanie plików. Wyślę niektóre z moich ulubionych klawiszy, naciśnięcie <F1>da ci pełną listę:

  • - : Najbardziej przydatne: Przejdź do górnego katalogu ( cd ..)
  • mf : Zaznacz plik
  • D : Usuń zaznaczone pliki lub plik, na którym znajduje się kursor, jeśli nic nie jest zaznaczone.
  • R : Zmień nazwę pliku, na którym znajduje się kursor.
  • d : Utwórz nowy katalog w bieżącym katalogu
  • % : Utwórz nowy plik w bieżącym katalogu

1
Zawsze myślałem, że domyślne metody przeglądania są do niczego. Przeglądanie jest powolne, jeśli wiesz, gdzie chcesz iść. LustyExplorer z sekcji skryptu vim.org jest bardzo potrzebną poprawą.
Svend

Twoje drugie mapowanie może być prostsze: mapa <cicha> <S-F8>: Sexplore <CR>
Taurus Olson

8
Polecam NERDtree zamiast wbudowanego eksploratora. Zmieniło to sposób, w jaki korzystałem z vima do projektów i zwiększyło moją produktywność. Po prostu google.
kprobst

Nigdy nie czuję potrzebę zbadania drzewa źródłowego, po prostu użyć :find, :tagi różnych związanych z klawiszy, aby skakać. (Może to dlatego, że drzewa źródłowe, nad którymi pracuję, są duże i zorganizowane inaczej niż bym to zrobił? :))
dash-tom-bang

25

Jestem członkiem American Cryptogram Association. Dwumiesięcznik zawiera ponad 100 różnych kryptogramów. Około 15 z nich to „kryptowaluty” - różne rodzaje problemów arytmetycznych z literami zastępowanymi cyframi. Dwa lub trzy z nich to sudokus, z wyjątkiem liter zamiast cyfr. Po zakończeniu siatki dziewięć różnych liter przeliteruje słowo lub słowa, w pewnej linii, po przekątnej, spirali itp., Gdzieś na siatce.

Zamiast pracować ołówkiem lub ręcznie wpisywać problemy, pobieram problemy z obszaru członków ich witryny.

Podczas pracy z tymi sudokusami używam vi, po prostu dlatego, że korzystam z udogodnień, które vi ma tak niewiele innych edytorów. Głównie podczas przekształcania literowanej siatki w numerowaną siatkę, ponieważ łatwiej mi rozwiązać, a następnie wypełnioną numerowaną siatkę z powrotem w siatkę z literami, aby znaleźć słowo lub słowa rozwiązania.

Problem jest sformatowany jako dziewięć grup po dziewięć liter, z - s oznacza puste miejsca, zapisane w dwóch wierszach. Pierwszym krokiem jest sformatowanie ich w dziewięć wierszy po dziewięć znaków każdy. Nie ma w tym nic specjalnego, wystarczy wstawić osiem podziałów wierszy w odpowiednich miejscach.

Wynik będzie wyglądał następująco:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

Pierwszym krokiem w konwersji tego na liczby jest utworzenie listy różnych liter. Najpierw robię kopię bloku. Ustawiam kursor na górze bloku, a następnie piszę :y}}p. :przełącza mnie w tryb dowodzenia, yszarpnie następne polecenie ruchu. Ponieważ }jest to przejście do końca następnego akapitu, y}ciągnie akapit. }następnie przesuwa kursor na koniec akapitu i pwkleja to, co szarpnęliśmy tuż za kursorem. Więcy}}p tworzy kopię następnym akapicie, a kończy się z kursorem między dwiema kopiami.

Następnie przekształcam jedną z tych kopii w listę wyraźnych liter. To polecenie jest nieco bardziej złożone:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

:ponownie wprowadza mnie w tryb poleceń. !wskazuje, że zawartość następnego szarpnięcia powinna być poprowadzona przez linię poleceń. }yankuje następny akapit, a linia poleceń następnie używa trkomendy rozebrać się wszystkiego z wyjątkiem dużych liter, sedpolecenie, aby wydrukować każdą literę na jednej linii, a sortpolecenie, aby uporządkować te linie, usuwanie duplikatów, a następnie trwycina znaki nowej linii, pozostawiając dziewięć różnych liter w jednym wierszu, zastępując dziewięć linii, które pierwotnie stanowiły akapit. W takim przypadku litery to:ACELNOPST .

Następnym krokiem jest zrobienie kolejnej kopii siatki. A następnie użyć litery Właśnie zidentyfikowanych zastąpić każdego z tych listów od cyfry od 1 do 9. To proste: :!}tr ACELNOPST 0-9. Wynik to:

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

Można to rozwiązać w zwykły sposób lub wprowadzić dowolny solver sudoku. Gotowe rozwiązanie można następnie przekonwertować na litery za pomocą:!}tr 1-9 ACELNOPST .

W vi jest moc, którą dopasowuje bardzo niewiele innych. Największym problemem jest to, że tylko bardzo niewiele samouczków vi, stron internetowych, plików pomocy itp. Robi więcej niż ledwo dotyka powierzchni tego, co jest możliwe.


irytujące jest to, że niektóre dystrybucje, takie jak ubuntu, mają pseudonimy od słowa „vi” do „vim”, więc ludzie tak naprawdę nie zobaczą vi. Doskonały przykład, spróbuj ... +1
hhh

1
Czy vim nie sprawdza nazwy, od której został uruchomiony, aby mógł wejść w odpowiedni „tryb”?
dash-tom-bang

3
Zaskakuje mnie ten powtarzający się błąd: mówisz, że musisz :przejść do trybu poleceń, ale niezmiennie określasz polecenia trybu normalnego (jak y}}p), które nie mogą działać z trybu poleceń ?!
patrz

Moje podejście do wyjątkowej postaci znaków: :se tw=1 fo=(przygotowanie) VG:s/./& /g(wstawianie spacji), gvgq(podział na osobne linie), V{:sort u(sortowanie i usuwanie duplikatów)
patrz

23

Masowe manipulacje tekstem!

Albo poprzez makra:

  • Zacznij od nagrania: qq
  • Robić coś
  • Zatrzymaj nagrywanie: q
  • Powtórz: @q(po raz pierwszy), @@potem.
  • Powtórz 20 razy: 20@@

Lub poprzez wyrażenia regularne:

  • Zamień rzeczy: :%s/[fo]+/bar/g

(Ale uwaga: jeśli zrobisz to drugie, będziesz mieć 2 problemy :).)


5
+1 za odniesienie do Jamiego Zawińskiego . (Nawet nie odebrano punktów za brak połączenia, nawet). :)
Jim Dennis

1
@Jim Nawet nie wiedziałem, że to cytat Jamiego Zawińskiego :). Spróbuję to teraz zapamiętać.
jqno

Uważam, że następująca sztuczka jest coraz bardziej przydatna ... w przypadkach, w których chcesz połączyć linie, które pasują (lub które NIE pasują) do jakiegoś wzoru do poprzedniej linii: :% g/foo/-1jlub :'a,'z v/bar/-1jna przykład (gdzie pierwsza to „wszystkie linie i pasujące do wzorca” podczas gdy ten ostatni to „linie między znakiem a i znakiem z, które nie pasują do wzorca”). Część po tupot w komendzie a glub vex może być dowolną inną komendą ex, -1j to tylko względny ruch linii i polecenie łączenia.
Jim Dennis

oczywiście, jeśli nazwiesz swoje makro „2”, to kiedy przyjdzie czas na jego użycie, nie musisz nawet przesuwać palca z klawisza „@” na klawisz „q”. Prawdopodobnie oszczędza od 50 do 100 milisekund za każdym razem. = P
JustJeff

@JustJeff Zależy całkowicie od układu klawiatury, klawisz @ znajduje się po drugiej stronie klawiatury od klawisza 2.
Simon Steele,

23

Niedawno odkryłem q:. Otwiera „okno poleceń” i pokazuje ostatnie polecenia w trybie ex (tryb poleceń). Możesz poruszać się jak zwykle w oknie, a naciśnięcie <CR>powoduje wykonanie polecenia. Możesz także edytować itp. Bezcenne, gdy masz do czynienia z jakimś skomplikowanym poleceniem lub wyrażeniem regularnym i nie chcesz przepisać całej rzeczy lub jeśli złożona rzecz, którą chcesz zrobić, to 3 polecenia wstecz. To prawie jak bashset -o vi , ale dla samego vima (he!).

Zobacz :help q:więcej interesujących fragmentów dotyczących przechodzenia tam i z powrotem.


22

Niedawno odkryłem omijanie Vima i choć przyznaję, że jestem trochę mętny w tym, co robi, miałem zaskakująco dobre wyniki, łącząc Ctrl+ x Ctrl+ ulub Ctrl+ n/ Ctrl+ pw trybie wstawiania. To nie jest całkiem IntelliSense , ale wciąż się tego uczę.

Wypróbuj to! :help ins-completion


20

Nie są to skróty, ale są powiązane:

  1. Zmień Capslock w dodatkowy ESC (lub Ctrl)
  2. mapuj lidera na „,” (przecinek), za pomocą tego polecenia: let mapleader = ","

Zwiększają moją wydajność.


Hej, miła wskazówka na temat „\”! Znacznie lepiej wpisać „” niż „\”.
Olivier Pons,

2
Aby Caps Lock był dodatkowym klawiszem Esc w systemie Windows (do czego służy
R. Martinho Fernandes,

Na Macu potrzebujesz PCKeyboardHack - szczegóły na superuser.com/questions/34223/…
Tom Morris

1
W systemie Windows używam AutoHotKey zCapslock::Escape
Jeromy Anglim

19

Innym przydatnym „skrótem” vi, którego często używam, jest „xp”. Spowoduje to zamianę znaku pod kursorem na następny znak.


3
Xpiść w drugą stronę
tester

5
Mniej więcej w tym czasie, kiedy pojawiła się Windows XP, żartowałem, że to jedyne dobre zastosowanie.
kguest

18

<Ctrl> + W, V, aby podzielić ekran w pionie
<Ctrl> + W, W, aby przełączać się między oknami

! python% [args], aby uruchomić skrypt, który edytuję w tym oknie

ZF w trybie wizualnym do składania dowolnych linii


2
<Ctrl> + W i j / k pozwolą ci nawigować absolutnie (j w górę, k w dół, jak w normalnym vimie). Jest to świetne, gdy masz 3+ podziałów.
Andrew Scagnelli,

1
+1 za ZF w trybie wizualnym, lubię składanie kodu, ale nie wiedziałem o tym.
coder_tim 30.01.12

2
po walnąć moją klawiaturę mam wnioskować, że <C-w>nalbo <C-w>sjest nowe okno poziomy, <C-w>bjest w prawym dolnym rogu okna, <C-w>club <C-w>qznajduje się w pobliżu okna, <C-w>xjest wzrost, a następnie zmniejszyć szerokość okna (??), <C-w>pto ostatnie okno, <C-w>backspacejest okno ruch w lewo (owski)
puk

:help ctrl-wFTW ... zrób sobie przysługę i zmuś się do wypróbowania tych rzeczy przez co najmniej 15 minut!
sjas

18

Tryb wizualny

Jak powiedziało kilka innych osób, tryb wizualny jest odpowiedzią na problem z kopiowaniem / wycinaniem i wklejaniem. Vim daje ci „v”, „V” i Cv. Małe litery „v” w vimie są zasadniczo takie same, jak klawisz Shift w notatniku. Zaletą jest to, że nie musisz tego przytrzymywać. Możesz użyć dowolnej techniki ruchu, aby skutecznie nawigować do początkowego (lub końcowego) punktu swojego wyboru. Następnie naciśnij „v” i ponownie skorzystaj z wydajnych technik ruchu, aby przejść do drugiego końca swojego wyboru. Następnie „d” lub „y” pozwala wyciąć lub skopiować ten wybór.

Zaletą trybu wizualnego vima w stosunku do opisu wycinania / kopiowania / wklejania w vi przez Jima Dennisa jest to, że nie musisz dokładnie ustalać lokalizacji. Czasami bardziej efektywne jest użycie szybkiego ruchu, aby dostać się do ogólnego miejsca, w którym chcesz się udać, a następnie udoskonalenie go innymi ruchami, niż wymyślenie bardziej złożonego polecenia pojedynczego ruchu, który doprowadzi cię dokładnie tam, gdzie chcesz się udać.

Minusem szerokiego korzystania z trybu wizualnego w ten sposób jest to, że może on stać się kulą, której używasz przez cały czas, co uniemożliwia naukę nowych poleceń vi (m), które mogą pozwolić ci robić rzeczy bardziej wydajnie. Jeśli jednak jesteś bardzo proaktywny w uczeniu się nowych aspektów vi (m), prawdopodobnie nie wpłynie to zbytnio na ciebie.

Podkreślę również, że tryby wizualnej linii i bloków wizualnych dają odmiany tego samego motywu, który może być bardzo potężny ... zwłaszcza tryb blokowania wizualnego.

Efektywne korzystanie z klawiatury

Nie zgadzam się również z twoim twierdzeniem, że naprzemienne ręce to najszybszy sposób korzystania z klawiatury. Ma w sobie element prawdy. Mówiąc bardzo ogólnie, wielokrotne używanie tego samego jest powolne. Najbardziej znaczącym przykładem tej zasady jest to, że kolejne naciśnięcia tego samego palca są bardzo powolne. Twoje twierdzenie prawdopodobnie wynika z naturalnej tendencji do używania s / palca / dłoni / transformacji na tym wzorze. W pewnym stopniu jest to poprawne, ale na skrajnie wysokim spektrum wydajności jest nieprawidłowe.

Zapytaj dowolnego pianisty. Zapytaj ich, czy szybciej jest zagrać kilka kolejnych nut naprzemiennie rękami, czy też używać kolejno kolejnych palców jednej ręki. Najszybszym sposobem na wpisanie 4 naciśnięć klawiszy nie jest naprzemienne układanie rąk, ale pisanie ich 4 palcami tej samej ręki w kolejności rosnącej lub malejącej (nazwij to „biegiem”). Powinno to być oczywiste po rozważeniu tej możliwości.

Trudniejszym problemem jest optymalizacja w tym celu. Optymalizacja pod kątem absolutnej odległości na klawiaturze jest dość łatwa. Vim to robi. Dużo trudniej jest zoptymalizować na poziomie „uruchamiania”, ale vi (m) dzięki edycji modalnej daje większą szansę na to, aby to zrobić, niż jakiekolwiek inne podejście niemodalne (emhem, emacs).

Na Emacsie

Aby fanatycy emacsa całkowicie zignorowali cały mój post ze względu na ostatni komentarz w nawiasie, czuję, że muszę opisać źródło różnicy między religiami emacs i vim. Nigdy nie wypowiadałem się w wojnach redaktorów i prawdopodobnie już tego nie zrobię, ale nigdy nie słyszałem, żeby ktoś tak opisywał różnice, więc proszę bardzo. Różnica polega na następującym kompromisie:

Vim zapewnia niezrównaną wydajność edycji surowego tekstu Emacs daje niezrównaną możliwość dostosowywania i programowania edytora

Niewidomi fanatyki vim twierdzą, że vim ma język skryptowy. Ale jest to niejasny, doraźny język, który został zaprojektowany, by służyć redaktorowi. Emacs ma Lisp! Wystarczająco powiedziane. Jeśli nie doceniasz znaczenia tych dwóch ostatnich zdań lub chcesz nauczyć się wystarczająco dużo o programowaniu funkcjonalnym i Lisp, aby rozwinąć to uznanie, powinieneś użyć vim.

Zealoci emacsa twierdzą, że emacs ma tryb vipera, a więc jest nadzbiorem vim. Ale tryb vipera nie jest standardem. Rozumiem, że większość użytkowników emacsa nie używa trybu vipera. Ponieważ nie jest to domyślne, większość użytkowników emacsa prawdopodobnie nie docenia prawdziwych korzyści płynących z paradygmatu modalnego.

Moim zdaniem różnice te są ortogonalne. Wierzę, że korzyści z vima i emacsa, jak już powiedziałem, są ważne. Oznacza to, że ostateczny edytor jeszcze nie istnieje. Prawdopodobnie to prawda, że ​​emacs byłby najłatwiejszą platformą, na której można oprzeć ostatecznego edytora. Ale edycja modalna nie jest zakorzeniona w sposobie myślenia emacsa. Społeczność emacsa mogłaby się w przyszłości zmienić, ale nie wydaje się to zbyt prawdopodobne.

Więc jeśli chcesz surowej wydajności edycji, użyj vim. Jeśli chcesz mieć najlepsze środowisko do tworzenia skryptów i programowania, użyj edytora emacs. Jeśli chcesz niektóre z nich z naciskiem na programowalność, użyj emacsa w trybie vipera (lub zaprogramuj własny tryb). Jeśli chcesz tego, co najlepsze z obu światów, na razie nie masz szczęścia.


17

Poświęć 30 minut na samouczek vim (uruchom vimtutor zamiast vim w terminalu). Nauczysz się podstawowych ruchów i niektórych naciśnięć klawiszy, dzięki czemu będziesz przynajmniej tak produktywny dzięki vimowi, jak w edytorze tekstu, którego używałeś wcześniej. Potem dobrze przeczytaj odpowiedź Jima Dennisa :)


1
To pierwsza rzecz, o której pomyślałem podczas czytania OP. Oczywiste jest, że plakat nigdy tego nie prowadził; Przejrzałem go, kiedy po raz pierwszy uczyłem się vima dwa lata temu i umocniłem w nim wyższość Vima nad innymi edytorami, z których korzystałem (w tym, dla mnie, Emacsem, ponieważ kombinacje klawiszy są denerwujące w używaniu na Macu) .
dash-tom-bang

16

W jaki sposób korzystasz z Vima, dzięki czemu jesteś bardziej produktywny niż we współczesnym edytorze?

Możliwość wykonywania złożonych, powtarzalnych edycji przy bardzo niewielu naciśnięciach klawiszy (często przy użyciu makr ). Spójrz na VimGolf aby zobaczyć moc Vima!

Po ponad dziesięciu latach niemal codziennego użytkowania trudno wyobrazić sobie używanie innego edytora.


16

Użyj \cdowolnego miejsca w wyszukiwaniu, aby zignorować wielkość liter (zastępując ustawienia ignorowania lub inteligentnej). Np /\cfooczy /foo\cbędą pasować foo, Foo, fOO,FOO , itd.

Użyj w \Cdowolnym miejscu wyszukiwania, aby wymusić dopasowanie wielkości liter. Np. /\CfooLub /foo\Cbędzie pasować tylko do foo.


16

Byłem zaskoczony, gdy nikt nie wspomniał o truchu. Często używam go z listami parametrów w postaci dt,lubyt,


2
lub dfx, dFx, dtx, ytx itp. gdzie x jest znakiem, +1
hhh

Tak! I nie zapomnij ct (zmień na).
markle976

16

Dziwne, nikt nie wspominał o tagach. Pobierz „żywiołowe ctagi” i umieść je przed gównianą, wstępnie zainstalowaną wersją, którą już masz na ścieżce wyszukiwania. Cd do katalogu głównego tego, nad czym pracujesz; na przykład dystrybucja jądra Androida. Wpisz „ctags -R”. aby zbudować indeks plików źródłowych w dowolnym miejscu poniżej tego katalogu w pliku o nazwie „znaczniki”. Zawiera wszystkie tagi, nie zmienia języka ani miejsca w katalogu, w jednym pliku, więc praca w różnych językach jest łatwa.

Następnie otwórz vim w tym folderze i przeczytaj: help ctags dla niektórych poleceń. Z tych, których często używam:

  • Umieść kursor na wywołaniu metody i wpisz CTRL-], aby przejść do definicji metody.

  • Wpisz: ta nazwa, aby przejść do definicji nazwy.


14

Automatyczne wcięcie:

gg(przejdź do początku dokumentu)
=(wcięcie!)
shift-g(przejdź do końca dokumentu)

Będziesz potrzebował wcięcia wtyczki typu pliku w .vimrcpliku i prawdopodobnie odpowiednich ustawień „shiftwidth” i „expandtab”.


4
Lub po prostu skorzystaj z funkcji „: set ai” (auto-indent), która działa od początku w vi.
xcramps

14

Pytałeś o produktywne skróty, ale myślę, że twoje prawdziwe pytanie brzmi: czy vim jest tego wart? Odpowiedź na to pytanie dotyczące przepełnienia stosu to -> „Tak”

Pewnie zauważyłeś dwie rzeczy. Vim jest potężny, a vim jest trudny do nauczenia. Duża część jego mocy polega na rozszerzalności i nieskończonej kombinacji poleceń. Nie czuj się przytłoczony. Idź powoli. Jedno polecenie, jedna wtyczka na raz. Nie przesadzaj.

Cała inwestycja, którą włożysz w vima, zwróci tysiąc razy. Będziesz w edytorze tekstów przez wiele, wiele godzin przed śmiercią. Vim będzie twoim towarzyszem.


13

Wiele buforów, w szczególności szybkie przeskakiwanie między nimi w celu porównania dwóch plików z :bpi :bn(odpowiednio odwzorowane na pojedynczy Shift+ plub Shift+ n)

vimdiff tryb (dzieli się na dwa pionowe bufory, z kolorami pokazującymi różnice)

Kopiowanie obszaru za pomocą Ctrl+v

I na koniec uzupełnij tabulatorami identyfikatory (wyszukaj „mosh_tab_or_complete”). To zmienia życie.


12

Uzgodniony z najwyższym plakatem - : r! polecenie jest bardzo przydatne.

Najczęściej używam go do „wklejania” rzeczy:

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

W ten sposób nie muszę się bawić :set paste.


3
Prawdopodobnie lepiej ustawić clipboardopcję unnamed( set clipboard=unnamedw .vimrc), aby domyślnie korzystać ze schowka systemowego. Lub jeśli nadal chcesz system schowku oddzielić od bezimiennego rejestru, należy odpowiednio nazwany rejestr Schowek: "*p.
R. Martinho Fernandes,

2
Kocham to! Po rozdrażnieniu wklejaniem przykładów kodu z sieci zacząłem czuć się biegły w vimie. To było polecenie, które wymyśliłem na miejscu. To wtedy Vim całkowicie mnie zahaczył.
kevpie

Jeśli pracujesz na komputerze Mac, Command + C i Command + V kopiuj i wklej za pomocą schowka systemowego, nie jest wymagane ponowne mapowanie.
Ben Mordecai,

Tylko z GVIm… W konsoli wklejanie bez :set pastenie działa tak dobrze, jeśli włączona jest funkcja autoindent.
David Wolever
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.