O jakich mrocznych zakątkach Vima nigdy nie mówiła ci mama? [Zamknięte]


799

Istnieje mnóstwo pytań, w których ludzie rozmawiają o popularnych trikach, w szczególności „ Vim + ctags tips and tricks ”.

Nie odnoszę się jednak do często używanych skrótów, które ktoś nowy w Vimie uzna za fajne. Mam na myśli doświadczonego użytkownika systemu Unix (programistę, administratora itp.), Który uważa, że ​​wie coś, o czym 99% z nas nigdy nie słyszało ani nie marzyło. Coś, co nie tylko ułatwia ich pracę, ale jest również CHŁODNE i hackerskie . W końcu Vim znajduje się w najbardziej bogatym w mroki systemie operacyjnym na świecie, dlatego powinien mieć zawiłości, o których tylko nieliczni uprzywilejowani wiedzą i chcą się z nami podzielić.


10
: Okno podziału płci i otwieranie zintegrowanego eksploratora plików (podział poziomy)
user3218088

2
To pytanie wydaje się dość konstruktywne - biorąc pod uwagę liczbę głosów pozytywnych ..., zagłosowano, by je ponownie otworzyć - być może pojawi się jeszcze fajniejsza odpowiedź - która może być poprawiona, jeśli jest przydatna - a tym samym daje większą wartość SOF. Porządkując odpowiedzi głosami Nauczyłem się wielu fajnych rzeczy w zaledwie 5 minut ... naprawdę cenne rzeczy, po co zamykać coś tak cennego? Jak to nie jest konstruktywne?
jhegedus

7
Śmieszne, że to pytanie jest zamknięte. Mów o legalizmie.
Lepidopterist

2
Myślę, że to pytanie jest bardzo konstruktywne, ale bardziej odpowiednie w Quora.
Diogo Melo,

2
Dlaczego są 2 (jak na razie) głosy, aby usunąć to pytanie? Co by to mogło zrobić?
Akavall,

Odpowiedzi:


782

Może nie jest to coś, o czym 99% użytkowników Vima nie wie, ale jest to coś, z czego korzystam codziennie i o czym powinien wiedzieć każdy użytkownik Linux + Vim.

Podstawowe polecenie, ale niezwykle przydatne.

:w !sudo tee %

Często zapominam sudo przed edycją pliku, na którym nie mam uprawnień do zapisu. Kiedy przychodzę zapisać ten plik i pojawia się błąd uprawnień, po prostu wydaje to polecenie vim, aby zapisać plik bez potrzeby zapisywania go w pliku tymczasowym, a następnie ponownie go kopiuję.

Oczywiście musisz być w systemie z zainstalowanym sudo i mieć prawa sudo.


116
Prawdopodobnie jest to nawet lepsze niż uruchamianie vima jako root! Pozytywne!
Arafangion

27
Co do nooba, co dokładnie robi tee? Czy ktoś mógłby przeanalizować to polecenie dla mnie?
AndyL

41
cmap w !! w! sudo tee%
jm666

58
Nigdy nie powinieneś biec sudo vim. Zamiast tego powinieneś wyeksportować EDITORjako vim i uruchomić sudoedit.
Gerardo Marset,

8
@maximus: vim zastępuje% nazwą bieżącego bufora / pliku.
migu

617

Niedawno odkryłem coś, co uważałem za bardzo fajne:

:earlier 15m

Przywraca dokument do stanu sprzed 15 minut. Może przyjmować różne argumenty za czas, który chcesz cofnąć, i zależy od niedopoziomowania. Można odwrócić za pomocą przeciwnego polecenia:later


6
@skinp: Jeśli cofniesz, a następnie dokonasz dalszych zmian od cofniętego stanu, utracisz tę historię. Pozwala to wrócić do stanu, którego już nie ma w stosie cofania.
ephemient

39
Bardzo użyteczne są również g + i g-, aby cofać się w czasie i do przodu. Jest to o wiele potężniejsze niż stos cofania / ponawiania, ponieważ nie tracisz historii, gdy robisz coś po cofnięciu.
Etienne PIERRE

9
Nie utracisz historii ponownych operacji, jeśli wprowadzisz zmiany po cofnięciu. Po prostu nie jest łatwo dostępny. Istnieją wtyczki, które pomogą Ci to wyobrazić, takie jak Gundo.vim
Ehtesh Choudhury

559
Wow, więc teraz mogę to zrobić :later 8hi skończyłem na dziś? : P
Igor Popov

7
Twoje polecenie zakłada, że ​​spędzasz co najmniej 15 minut w vimie !
e2-e4

411

:! [command] wykonuje zewnętrzne polecenie, gdy jesteś w Vimie.

Ale dodaj kropkę po dwukropku, :.! [command]a to zrzuci dane wyjściowe polecenia do bieżącego okna. To jest: . !

Na przykład:

:.! ls

Często używam tego do dodawania bieżącej daty do dokumentu, który wpisuję:

:.! date

74
Jest to dość podobne do: r! Jedyną różnicą, o ile mogę powiedzieć, jest to, że: r! otwiera nową linię:.! nadpisuje bieżącą linię.
saffsd

6
Alternatywą :.!datejest napisanie „data” w wierszu, a następnie uruchomienie !$sh(alternatywnie polecenie zawiera pustą linię i uruchom !jsh). Spowoduje to poprowadzenie linii do powłoki „sh” i zastąpienie danych wyjściowych polecenia.
hlovdal

43
:.!jest tak naprawdę specjalnym przypadkiem :{range}!, który filtruje zakres wierszy (bieżący wiersz, gdy zakres jest .) za pomocą polecenia i zamienia te wiersze na dane wyjściowe. Uważam :%!przydatny do filtrowania całe bufory.
Nefrubyr

2
@sundar: Po co przekazywać linię sed, skoro można użyć podobnych wbudowanych poleceń ed/ ex? Spróbuj uruchomić :.s/old/new/g;-)
jabirali,

4
I zauważ także, że „!” jest jak „y”, „d”, „c” itd. tzn. możesz zrobić: !!, numer !!,! motion (np.! Gshell_command <cr> zamień z bieżącej linii na koniec pliku („G”) na wynik polecenia shell_).
aqn

312

Niezupełnie niejasne, ale istnieje kilka bardzo przydatnych poleceń „usuń w”, takich jak ...

  • diw aby usunąć bieżące słowo
  • di( aby usunąć w ramach bieżących parens
  • di" aby usunąć tekst między cytatami

Inne można znaleźć na :help text-objects


8
dab „usuń nawiasy klamrowe”, daB dla nawiasów klamrowych, t dla tagów typu xml, kombinacje z normalnymi poleceniami są zgodne z oczekiwaniami cib / yaB / dit / vat itp.
sjh 8.04.2009

15
@Masi: yi (va (p usuwa tylko nawiasy kwadratowe
Don Reba,

42
To prawdopodobnie największy powód, dla którego zatrzymałem się w Vimie. To i jego równoważne polecenia „zmień”: ciw, ci (, ci ”, a także dt <space> i ct <space>
thomasrutter 26.04.2009

4
@thomasrutter: Dlaczego nie dW / cW zamiast dt <space>?

9
@Masi: Z wtyczką surround: ds (.

237

de Usuń wszystko do końca słowa, naciskając. na życzenie twojego serca.

ci (xyz [Esc] - To jest dziwne. Tutaj „i” nie oznacza trybu wstawiania. Zamiast tego oznacza wewnątrz nawiasu. Ta sekwencja tnie tekst w nawiasie, w którym stoisz, i zastępuje go "xyz". Działa również w nawiasach kwadratowych i liczbowych - po prostu wykonaj ci [lub ci {odpowiednio. Oczywiście możesz zrobić di (jeśli chcesz tylko usunąć cały tekst bez wpisywania czegokolwiek. Możesz również zrobić azamiast, ijeśli chcę również usunąć nawiasy, a nie tylko tekst w nich.

ci " - wycina tekst w bieżących cudzysłowach

ciw - wycina bieżące słowo. Działa to tak samo jak poprzednie, z wyjątkiem tego, że (jest zastąpione przez w.

C - wytnij resztę linii i przejdź do trybu wstawiania.

ZZ - zapisz i zamknij bieżący plik (WAY szybciej niż Ctrl-F4, aby zamknąć bieżącą kartę!)

ddp - przesuwa bieżącą linię o jeden wiersz w dół

xp - przesuń obecną postać o jedną pozycję w prawo

U - wielkie litery, więc viwUwielkie słowo

~ - zmienia wielkość liter, a więc viw~odwraca obudowę całego słowa

Ctrl + u / Ctrl + d przewiń stronę o pół ekranu w górę lub w dół. Wydaje się to bardziej przydatne niż zwykłe stronicowanie pełnoekranowe, ponieważ ułatwia sprawdzenie relacji między dwoma ekranami. Dla tych, którzy nadal chcą przewijać cały ekran na raz, są Ctrl + f dla Forward i Ctrl + b dla Backward. Ctrl + Y i Ctrl + E przewijają w dół lub w górę o jedną linię na raz.

Szalone, ale bardzo przydatne polecenie to zz - przewija ekran, aby ta linia pojawiła się na środku. Jest to doskonałe do umieszczenia kodu, nad którym pracujesz, w centrum uwagi. Polecenia rodzeństwa - zt i zb - sprawiają, że ta linia jest górna lub dolna na ekranie, co nie jest tak przydatne.

% znajduje i przeskakuje do pasującego nawiasu.

de - usuń od kursora do końca słowa (możesz również dEusunąć, aż do następnej spacji)

bde - usuń bieżące słowo od lewego do prawego separatora

df [spacja] - usuń aż do następnej spacji włącznie

dt. - usuń do następnej kropki

dd - usuń całą linię

ye (lub YE) - ciągnie tekst od tego miejsca do końca słowa

ce - przecina koniec słowa

pa - kopiuje bieżące słowo (zastanawia mnie, co robi „cześć”!)

yy - kopiuje bieżącą linię

cc - wycina bieżącą linię, możesz także zrobić Szamiast tego. Jest też dolna czapka, sktóra odcina aktualny znak i przechodzi do trybu wstawiania.

viwy lub viwc . Złap lub zmień bieżące słowo. Naciskaj wwiele razy, aby nadal wybierać kolejne słowa, użyj, baby przejść do tyłu

vi { - zaznacz cały tekst w nawiasach rysunkowych. va {- zaznacz cały tekst, w tym {} s

vi (p - zaznacz wszystko w (s) i zamień na wklejony tekst

b i e przesuwają kursor słowo po słowie, podobnie jak zwykle Ctrl + strzałki . Definicja słowa jest jednak nieco inna, ponieważ kilka kolejnych delimiterów jest traktowanych jako jedno słowo. Jeśli zaczniesz od środka słowa, naciśnięcie przycisku b zawsze spowoduje przejście do początku bieżącego słowa, a każde kolejne b spowoduje przejście do początku następnego słowa. Podobnie i łatwy do zapamiętania ekursor przesuwa się na koniec bieżącego i każdego kolejnego słowa.

podobnie jak b/ e, kapitał Bi Eprzesuwaj kursor słowo po słowie, używając tylko białych znaków jako ograniczników.

wielka litera D (weź głęboki oddech) Usuwa resztę linii po prawej stronie kursora, tak samo jak Shift + End / Del w normalnych edytorach (zauważ 2 naciśnięcia klawiszy - Shift + D - zamiast 3)


15
zt jest całkiem użyteczny, jeśli używasz go na początku definicji funkcji lub klasy.
Nick Lewis,

9
vityi vitcmożna je odpowiednio skrócić do yiti cit.
Nathan Fellman,

33
Wszystko, co nazywasz „cięciem”, to „zmiana”. np .: C zmienia się do końca linii. Odpowiednikiem „cut” Vima jest „delete”, wykonane za pomocą d / D. Główną różnicą między zmianą a usunięciem jest to, że delete pozostawia cię w trybie normalnym, ale zmiana wprowadza cię w rodzaj trybu wstawiania (chociaż nadal masz komendę zmiany, która jest przydatna, ponieważ całą zmianę można powtórzyć .).
Laurence Gonsalves

11
Myślałem, że jest to lista rzeczy, o których niewiele osób wie. tak, jest bardzo powszechne, pomyślałbym.
Almo

19
byenie działa, gdy znajdujesz się w pierwszym znaku tego słowa. yiwzawsze tak jest.
Andrea Francia,

204

Jednym, który rzadko znajduję w większości samouczków Vima, ale jest NIESAMOWITE przydatny (przynajmniej dla mnie), jest

g; and g,

poruszać się (do przodu, do tyłu) przez listę zmian.

Pokażę, jak go używam. Czasami muszę skopiować i wkleić fragment kodu lub łańcucha, powiedz szesnastkowy kod koloru w pliku CSS, więc szukam, skaczę (nie dbając o to, gdzie jest dopasowanie), kopiuję go, a następnie przeskakuję z powrotem (g;) do miejsca, w którym Edytowałem kod, aby w końcu go wkleić. Nie trzeba tworzyć znaków. Prostsze

Tylko moje 2 centy.


29
podobnie '.przejdzie do ostatnio edytowanej linii i `.przejdzie do ostatnio edytowanej pozycji
aehlke

8
Ctrl-O i Ctrl-I (tab) będą działać podobnie, ale nie tak samo. Poruszają się do tyłu i do przodu na „liście skoków”, którą można wyświetlić wykonując: skoki lub: ju Aby uzyskać więcej informacji, wykonaj: pomoc jumplist
Kimball Robinson

17
Możesz wyświetlić listę zmian, wykonując: zmiany
Kimball Robinson

Hot Dang, które są przydatne. Używam <C-o>/ <C-i>do tego cały czas - lub zaznaczając swoje miejsce.
Wayne Werner

187
:%!xxd

Stwórz vima w edytorze szesnastkowym.

:%!xxd -r

Odwracać.

Ostrzeżenie: jeśli nie edytujesz pliku binarnego (-b), możesz uszkodzić plik. - Josh Lee w komentarzach.


9
Jak to cofnąć?
Christian

40
:! xxd -r // Aby przywrócić HEX
Naga Kiran

21
Właściwie to myślę, :%!xxd -rżeby to cofnąć
Andreas Grech

@JoshLee: Jeśli ktoś ostrożnie nie przechodzi przez nowe linie, czy bezpiecznie jest nie używać opcji -b? Pytam, ponieważ czasami chcę dokonać zmiany heksadecymalnej, ale nie chcę zamykać i ponownie otwierać pliku, aby to zrobić.
dotancohen

4
@dotancohen: Jeśli nie chcesz zamykać / ponownie otwierać pliku, możesz to zrobić: ustaw plik binarny
Bambu


119

Czasami ustawienie w .vimrc zostanie zastąpione przez wtyczkę lub polecenie automatyczne. Aby to debugować, użyteczną sztuczką jest użycie polecenia: verbose w połączeniu z: set. Na przykład, aby dowiedzieć się, gdzie ustawiono / rozbroiono cindenta:

:verbose set cindent?

Spowoduje to wyświetlenie czegoś takiego:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

Działa to również z mapami i zaznaczeniami. (Dzięki joeytwiddle za zwrócenie na to uwagi.) Na przykład:

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim

8
Doskonała wskazówka - dokładnie tego, czego szukałem dzisiaj.
Artem Russakovskii

Doskonały napiwek! Jak poznać te dziwaczne rzeczy?
Rafid

1
:verbosemożna go również użyć przed nmap llub w highlight Normalcelu ustalenia, gdzie ostatnio zdefiniowano lmapę klawiszy lub Normalpodświetlenie. Bardzo przydatne do debugowania!
joeytwiddle

@joeytwiddle Thanks! Dodałem te informacje do odpowiedzi.
Laurence Gonsalves

Kiedy zaczniesz tworzyć niestandardowe mapowania, uratuje to twoją dupę tyle razy, prawdopodobnie jedną z najbardziej przydatnych tutaj (IMO)!
SidOfc


98

Nie jestem pewien, czy w ogóle liczy się to jako ciemne zakątek, ale dopiero się tego nauczyłem ...

:g/match/y A

będzie szarpał (kopiował) wszystkie wiersze zawierające „dopasuj” do "a/ @aregister. ( Wielkie litery Apowodują, że vim dodaje szarpnięcia zamiast zastępować poprzednią zawartość rejestru.) Ostatnio często go używałem podczas tworzenia arkuszy stylów programu Internet Explorer.


liczy się, liczy się, ponieważ tego nie widziałem :)

Niezłe. Nigdy o tym nie słyszałem ... Może się przydać: P
skinp

5
Możesz użyć: g! znaleźć linie, które nie pasują do wzorca np: g! / set / normal dd (usuń wszystkie linie, które nie zawierają zestawu)
tsukimi

3
Czasami lepiej jest zrobić to, co powiedział tsukimi i po prostu odfiltrować linie, które nie pasują do twojego wzorca. Skrócona wersja tego polecenia: :v/PATTERN/dObjaśnienie: :vjest skrótem dla :g!, a :gpolecenie stosuje dowolne polecenie ex do linii. :y[ank]działa i działa :normal, ale tutaj najbardziej naturalną rzeczą jest po prostu :d[elete].
pandubear

Możesz także zrobić :g/match/normal "Ayy- normalsłowo kluczowe pozwala mu na uruchamianie poleceń w trybie normalnym (z czym prawdopodobnie lepiej znasz).
Kimball Robinson

93

Chcesz spojrzeć na swoją historię poleceń?

q:

Następnie przejrzyj, edytuj i na końcu, aby wykonać polecenie.

Czy kiedykolwiek wprowadzałeś podobne zmiany w dwóch plikach i przełączałeś się między nimi? (Powiedz, pliki źródłowe i nagłówkowe?)

:set hidden
:map <TAB> :e#<CR>

Następnie tabuluj w obie strony między tymi plikami.


131
Uderzyłem q:przez przypadek cały czas ...
Josh Lee

11
Alternatywnie, z byłego edytora (:), możesz nacisnąć CTRL-f, aby wyświetlić okno historii poleceń.
Jason Down

6
@jleedev ja też. Niemal nienawidzę tego polecenia, tylko dlatego, że przypadkowo go używam.
bradlis7

9
q / i q? można użyć do wykonania podobnej czynności w zakresie wzorców wyszukiwania.
bpw1621,

5
Naciśnięcie klawisza <Cf> po: lub / (lub w dowolnym trybie poleceń) spowoduje wyświetlenie tego samego menu historii. Możesz więc odwzorować q: jeśli trafisz go bardzo często i nadal będziesz mieć dostęp do tego niesamowitego trybu.
idbrii

82

Vim otworzy na przykład adres URL

vim http://stackoverflow.com/

Fajnie, gdy musisz pobrać źródło strony w celach informacyjnych.


2
Dla mnie nie otworzyło to źródła; zamiast tego najwyraźniej użył elinks, aby zrzucić renderowaną stronę do bufora, a następnie ją otworzył.
Ivan Vučica,

podczas wykonywania tego polecenia wystąpił błąd
Dzung Nguyen,

5
Działa lepiej z ukośnikiem na końcu. Sztuczka!
Thomas

@Vdt: Przydałby się błąd. Jeśli to jest to: „ błąd (netrw) ani polecenie wget, ani polecenie pobierania nie są dostępne”, oczywiście musisz udostępnić jedno z tych narzędzi w zmiennej środowiskowej PATH.
Isaac Nequittepas

Uważam, że jest to szczególnie przydatne, gdy ludzie wysyłają linki do usługi wklejania i zapomnieli wybrać wyróżnianie składni, generalnie po prostu muszę otworzyć link w vimie po dodaniu „& raw”.
Dettorer

68

Makra mogą wywoływać inne makra, a także same siebie.

na przykład:

qq0dwj@qq@q

... usunie pierwsze słowo z każdego wiersza do końca pliku.

Jest to dość prosty przykład, ale pokazuje bardzo potężną funkcję vima


2
Nie wiedziałem, że makra mogą się powtarzać. Fajne. Uwaga: qx rozpoczyna zapis do rejestru x (używa qq do rejestru q). 0 przesuwa się na początek linii. dw usuwa słowo. j przesuwa się w dół linii. @q ponownie uruchomi makro (definiując pętlę). Ale zapomniałeś zakończyć nagrywanie ostatnim „q”, a następnie uruchomić makro, wpisując @q.
Kimball Robinson

2
Myślę, że to celowe, jako zagnieżdżone i rekurencyjne makro.
Yktula

7
qqqqqifuu<Esc>h@qq@q
Gerardo Marset,

6
Innym sposobem osiągnięcia tego jest zarejestrowanie makra w rejestrze a, które dokonuje pewnej transformacji do pojedynczej linii, a następnie podświetlić wiązkę linii za pomocą V i wpisać, :normal! @aaby zastosować makro do każdej linii w twoim zaznaczeniu.
Nathan Long

Znalazłem ten post googling rekurencyjne makra VIM. Nie mogłem znaleźć innego sposobu na zatrzymanie makra niż zabicie procesu VIM.
dotancohen

55

Zakładając, że masz wkompilowane wsparcie dla Perla i / lub Rubiego, :rubydoi :perldobędziesz uruchamiał jednowierszowy Ruby lub Perl na każdej linii w zakresie (domyślnie cały bufor), $_związany z tekstem bieżącej linii (minus nowa linia). Manipulowanie $_zmieni tekst tego wiersza.

Możesz użyć tego do robienia pewnych rzeczy, które są łatwe do zrobienia w języku skryptowym, ale nie są tak oczywiste przy użyciu wbudowanych Vim. Na przykład, aby odwrócić kolejność słów w wierszu:

:perldo $_ = join ' ', reverse split

Aby wstawić losowy ciąg 8 znaków (AZ) na końcu każdego wiersza:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

Jesteś ograniczony do działania na jednej linii na raz i nie możesz dodawać nowych linii.


co jeśli chcę, aby perldo działało tylko na określonej linii? lub wybrane kilka linii?
Sujoy

5
Możesz nadać mu zasięg jak każde inne polecenie. Na przykład: 1,5 perldo będzie działać tylko na liniach 1-5.
Brian Carper

Czy możesz zrobić $ _ + = '\ nNEWLINE !!!' uzyskać nowy wiersz po bieżącym?
Greg

Niestety nie, po prostu dodaje funky kontrolną postać na końcu linii. Możesz jednak użyć wyszukiwania / zamiany Vima, aby zmienić wszystkie znaki kontrolne na prawdziwe nowe znaki.
Brian Carper,

3
Podobnie pydoi py3dodziałaj dla Pythona, jeśli masz skompilowane wymagane wsparcie.
Derecho

54

^ O i ^ I

Idź do starszej / nowszej pozycji. Podczas poruszania się po pliku (przez wyszukiwanie, przenoszenie poleceń itp.) Vim pamięta te „skoki”, dzięki czemu możesz powtarzać te skoki do tyłu (^ O - O dla starych) i do przodu (^ I - tuż obok I na klawiaturze ). Uważam, że jest to bardzo przydatne podczas pisania kodu i wykonywania wielu wyszukiwań.

żołnierz amerykański

Przejdź do pozycji, w której tryb wstawiania został zatrzymany jako ostatni. Często się redaguję, a potem szukam. Aby powrócić do miejsca edycji, naciśnij gi.

gf

umieść kursor na nazwie pliku (np. dołącz plik nagłówka), naciśnij gf, a plik zostanie otwarty

gF

podobny do gf, ale rozpoznaje format „[nazwa pliku]: [numer linii]”. Naciśnięcie gF otworzy [nazwa pliku] i ustawi kursor na [numer linii].

^ P i ^ N

Automatyczne uzupełnianie tekstu podczas edycji (^ P - poprzednie dopasowanie i ^ N następne dopasowanie)

^ X ^ L

Podczas edycji kończy się w tym samym wierszu (przydatne do programowania). Piszecie kod, a następnie przypominacie sobie, że macie ten sam kod gdzieś w pliku. Po prostu naciśnij ^ X ^ L i pełny wiersz zostanie ukończony

^ X ^ F

Uzupełnij nazwy plików. Piszesz „/ etc / pass” Hmm. Zapomniałeś nazwy pliku. Wystarczy nacisnąć ^ X ^ F, a nazwa pliku jest zakończona

^ Z lub: sh

Przenieś tymczasowo do powłoki. Jeśli potrzebujesz szybkiego uderzenia:

  • naciśnij ^ Z (aby umieścić vi w tle), aby powrócić do oryginalnej powłoki i naciśnij fg, aby powrócić do vima z powrotem
  • naciśnij: sh, aby przejść do sub-powłoki i naciśnij ^ D / exit, aby powrócić do vi z powrotem

Z ^X^Fmojego zwierzaka zirytować jest to, że nazwy plików zawierają =znaki, co zrobić zgniłe rzeczy w wielu okazjach (pliki INI, makefile itp.) Używam se isfname-==do końca tej uciążliwości
sehe

3
+1 wbudowane autouzupełnianie po prostu siedzi tam i czeka na odkrycie.
joeytwiddle

48
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor

2
Nie rozumiem, do czego to jest dobre (poza tym, że wygląda jak żart). Czy ktoś może mnie oświecić?
Ryan Edwards,

2
otwórz vim, a następnie wykonaj „: dla i w zakresie (1,255) | .put = '10 .0.0. '. i | endfor"
codygman

2
@RyanEdwards napełnianie / etc / hosts może
Ruslan

26
To jest wspaniała odpowiedź. Nie chodzi o tworzenie adresów IP, ale o to, że VIM może używać pętli w poleceniach .
dotancohen

4
Bez trybu ex:i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
BlackCap

47

Jest to fajna sztuczka, aby ponownie otworzyć bieżący plik z innym kodowaniem:

:e ++enc=cp1250 %:p

Przydatne, gdy musisz pracować ze starszymi kodowaniami. Obsługiwane kodowania są wymienione w tabeli w encoding-values(patrz help encoding-values). Podobne działanie również działa ++ff, dzięki czemu możesz ponownie otworzyć plik z zakończeniem linii Windows / Unix, jeśli popełnisz błąd po raz pierwszy (patrz help ff).


Nigdy nie musiałem używać tego rodzaju rzeczy, ale z pewnością dodamy do mojego arsenału sztuczek ...

świetna wskazówka, dzięki. Aby uzyskać punkty bonusowe, dodaj listę typowych prawidłowych kodowań.
Adriano Varoli Piazza

2
Użyłem tego dzisiaj, ale myślę, że nie musiałem podawać „%: p”; wystarczyło otworzyć plik i wystarczyło: e ++ enc = cp1250. I
Ivan Vučica,

would: set encoding = cp1250 miałby ten sam efekt?
laz

1
`: e + b% 'jest podobnie użyteczny przy ponownym otwarciu w trybie binarnym (bez mungowania nowych linii)
intuicyjnie

47

Wpisanie == poprawi wcięcie bieżącej linii na podstawie powyższej linii.

W rzeczywistości możesz zrobić znak =, a następnie dowolne polecenie ruchu. = {ruch}

Na przykład możesz użyć% ruchu, który porusza się między pasującymi nawiasami klamrowymi. Ustaw kursor na {w następującym kodzie:

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

I naciśnij =%, aby natychmiast uzyskać:

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

Alternatywnie, możesz zrobić = { w bloku kodu, zamiast pozycjonować się bezpośrednio na znaku {.


Hm, nie wiedziałem o wcięciu.
Ehtesh Choudhury

Zwykle nie trzeba być dokładnie na szelkach. Często myślałem, że po prostu =}lub vaBaB=dlatego, że jest mniej zależny. Również v}}:!astyle -bjlepiej pasuje do mojego stylu kodu, ale mogę przywrócić go do twojego stylu za pomocą prostego%!astyle -aj
patrz

7
gg=Gjest całkiem fajne, kiedy coś wklejasz.
Kyrias,


@kyrias Oh, robiłem to tak ggVG=.
Braden Best

42
imap jj <esc>

7
jak w takim razie wpiszesz jj? : P
hasen

6
Jak często wpisujesz jj? Przynajmniej w języku angielskim?
ojblass

50
Zamiast tego odwróciłem Capslocka, aby uciec, ponieważ jest to bezużyteczny klucz. Moje mapowanie dotyczyło jednak całego systemu operacyjnego, więc ma tę dodatkową zaletę, że nigdy nie musisz się martwić o przypadkowe trafienie. Jedyną wadą jest to, że trudniej jest krzyczeć na ludzi. :)
Alex

7
@Alex: zdecydowanie Capslock to śmierć. „czekaj, wtf? och, to był ZZ? .... bzdura.”
intuicyjnie

5
@ojblass: Nie jestem pewien, ile osób kiedykolwiek poprawiło kod Matlaba w Vimie, ale iii jjsą one powszechnie używane do zmiennych przeciwnych, ponieważ ii jsą zastrzeżone dla liczb zespolonych.
brianmearns

37

Zobaczmy, jak jakiś ładny edytor IDE dokonuje transpozycji kolumn.

:%s/\(.*\)^I\(.*\)/\2^I\1/

Wyjaśnienie

\(i \)jak pamiętać rzeczy w regex-land. I \1, \2etc jest jak odzyskać zapamiętane rzeczy.

>>> \(.*\)^I\(.*\)

Zapamiętaj wszystko, a następnie ^I(tab), a następnie wszystko.

>>> \2^I\1

Zamień powyższe elementy na „2nd rzeczy, które zapamiętałeś”, a następnie „1st rzeczy, które zapamiętałeś” - zasadniczo dokonując transpozycji.


4
Przełącza między sobą parę kolumn oddzielonych tabulatorami (separator dowolny, wszystko jest wyrażeniem regularnym).
chaos

39
To tylko wyrażenie regularne; wiele IDE ma wyrażenia regularne typu „szukaj i zamień”.
rlbond

7
@rlbond - Wszystko sprowadza się do tego, jak dobry jest silnik regex w IDE. Wyrazy regularne Vima są dość potężne; inni .. czasami nie tak bardzo.
romandas

3
* Będzie zachłanne, więc wyrażenie regularne zakłada, że ​​masz tylko dwie kolumny. Jeśli chcesz, aby to nie było nudne, użyj {-} zamiast * (patrz: pomoc niepochodna, aby uzyskać więcej informacji na temat mnożnika {})
Kimball Robinson

4
Jest to właściwie dość proste wyrażenie regularne, unikanie nawiasów grupowych sprawia, że ​​wydaje się to skomplikowane.
mk12

30

Nie do końca mroczny sekret, ale lubię umieszczać następujące mapowanie w moim pliku .vimrc, dzięki czemu mogę w dowolnym momencie nacisnąć „-” (minus), aby otworzyć eksplorator plików i pokazać pliki sąsiadujące z tym, który właśnie edytuję . W eksploratorze plików mogę nacisnąć inny „-”, aby przejść o jeden katalog w górę, zapewniając bezproblemowe przeglądanie złożonych struktur katalogów (takich jak te używane obecnie przez frameworki MVC):

map - :Explore<cr>

Mogą być również przydatne dla kogoś. Lubię przewijać ekran i jednocześnie przesuwać kursor:

map <c-j> j<c-e>
map <c-k> k<c-y>

Nawigacja po kartach - uwielbiam karty i muszę łatwo się między nimi poruszać:

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Tylko w Mac OS X: Nawigacja po kartach przypominających Safari:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>

Możesz także przeglądać pliki w samym Vimie, używając: Explore
Roman Plášil

Cześć Roman, właśnie to robi mapowanie, ale przypisuje je do „klawisza skrótu”. :)
KKovacs

27

Lubię używać „sudo bash”, a mój administrator nie znosi tego. Zablokował „sudo”, więc można go było używać tylko z kilkoma poleceniami (ls, chmod, chown, vi itd.), Ale i tak mogłem użyć vima, aby uzyskać powłokę roota:

bash$ sudo vi +'silent !bash' +q
Password: ******
root#

9
FWIW, sudoedit (lub sudo -e) edytuje pliki uprzywilejowane, ale uruchamia edytor jako zwykły użytkownik.
RJHunter

12
tak ... też bym cię nienawidził;) powinieneś potrzebować tylko powłoki root BARDZO RZADKO, chyba że masz już w zwyczaju uruchamiać zbyt wiele poleceń jako root, co oznacza, że ​​twoje uprawnienia są zepsute.
We Are All Monica

5
Dlaczego nawet administrator systemu daje ci root? : D
d33tah

26

Często lubię zmieniać bieżące katalogi podczas edycji - więc muszę mniej określać ścieżki.

cd %:h

Co to robi? I czy to działa z autchdir?
Leonard

2
Przypuszczam, że tymczasowo zastąpi autochdir (dopóki ponownie nie zmienisz buforów). Zasadniczo zmienia katalog na katalog główny bieżącego pliku. Daje mi to nieco większą kontrolę ręczną niż autochdir.
rampion

1
: set autochdir // to również służy tej samej funkcjonalności i zmienia katalog bieżący na katalog pliku w buforze
Naga Kiran

25

Często korzystam z wielu okien podczas pracy nad projektem i czasami muszę je zmienić. Oto, czego używam:

map + <C-W>+
map - <C-W>-

Te mapowania pozwalają zwiększyć i zmniejszyć rozmiar bieżącego okna. To dość proste, ale szybkie.


16
Istnieje również Ctrl-W =, co sprawia, że ​​okna są równe szerokości.
Bill Lynch,

2
Nie zapomnij, że w Vimie możesz wielokrotnie wstawiać liczby, aby wykonać akcję wiele razy. Aby rozszerzyć bieżącą wysokość okna o 8 linii: 8 <CW> +
joeytwiddle 29.01.12

23

Nie jest to nieznana funkcja, ale bardzo przydatna i oszczędzająca czas.

Jeśli chcesz zapisać sesję otwartych buforów, kart, znaczników i innych ustawień, możesz wydać następujące czynności:

mksession session.vim

Możesz otworzyć sesję za pomocą:

vim -S session.vim

5
Możesz także :so session.vimwewnątrz vima.
TankorSmash

22
:r! <command>

wkleja dane wyjściowe polecenia zewnętrznego do bufora.

Zrób trochę matematyki i uzyskaj wynik bezpośrednio w tekście:

:r! echo $((3 + 5 + 8))

Pobierz listę plików do skompilowania podczas pisania pliku Makefile:

:r! ls *.c

Nie sprawdzaj tego, co czytasz na wikipedii, wklej go bezpośrednio do pisanego dokumentu:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever

14
^ R = 3 + 5 + 8 w trybie wstawiania pozwala wstawić wartość wyrażenia (3 + 5 + 8) w tekście przy mniejszej liczbie naciśnięć klawiszy.
Sudhanshu

Jak mogę uzyskać wynik / wyjście do innego bufora niż bieżący?
dcn


21

Mapa F5, aby szybko ROT13 buforować:

map <F5> ggg?G``

Możesz użyć go jako klucza bossa :).


14
Nie wiem, co piszesz ... Ale z pewnością mój szef byłby bardziej ciekawy, gdy zobaczyłby, że piszę zbieraninę ROT13 :)
se4'12

lub sfałszować swoich przyjaciół nmap i ggg?G`` . Lub diaboliczny: nmap i ggg?G``i!
romeovs

1
@romeovs 2nd one jest nieskończoną pętlą, użyj nnoremap
Amit Gold

19

Właśnie znalazłem ten dzisiaj za pośrednictwem NSFAQ :

Komentuj bloki kodu.

Wejdź do trybu blokowego, naciskając CTRL-V.

Zaznacz blok, który chcesz skomentować.

Naciśnij I (wielkie I) i wpisz ciąg komentarza na początku wiersza. (// dla C ++)

Naciśnij ESC, a wszystkie wybrane linie będą // poprzedzone na początku linii.


Dodałem #, aby skomentować blok kodu w Rubim. Jak to cofnąć.
Neeraj Singh,

3
Możesz po prostu nacisnąć ctrl + v ponownie, zaznaczyć // i nacisnąć x, aby „odkomentować”
nos

6
Używam do tego NERDCommenter.
ZyX

1
Skomentowany kod jest prawdopodobnie jednym z najgorszych rodzajów komentarzy, jakie można umieścić w kodzie. Są lepsze zastosowania niesamowitej wstawki blokowej.
Braden Best

1
@Pie, ponieważ skomentowany kod jest martwy . Martwy kod nie ma żadnego pożytecznego celu i tworzy bałagan. Myślisz , że zachowujesz kod, który możesz chcieć przywrócić później, ale zawsze istnieje lepszy sposób. Możesz użyć swojej historii cofania, możesz skopiować plik lub użyć git, który ma wbudowaną tę funkcję ( git checkout). Jeśli chodzi o lepsze wykorzystanie wkładki blokowej, nie ma żadnego osadzenia w kamieniu. Po prostu używasz go, gdy masz wiele wierszy, w których chcesz wstawić tę samą sekwencję znaków w tym samym miejscu.
Braden Best

17

Używam vima do niemal każdej edycji tekstu, więc często używam kopiowania i wklejania. Problem polega na tym, że vim domyślnie często zniekształca importowany tekst za pomocą wklejania. Sposobem na powstrzymanie tego jest użycie

:set paste

przed wklejeniem danych. Pozwoli to uniknąć bałaganu.

Pamiętaj, że będziesz musiał wydać :set nopastepolecenie odzyskania automatycznego wcięcia. Alternatywnymi sposobami wklejania wstępnie sformatowanego tekstu są rejestry schowka ( *i +) oraz:r!cat (trzeba będzie wkleić wklejony fragment za pomocą ^ D).

Czasami pomocne jest również włączenie schematu kolorów o wysokim kontraście. Można to zrobić za pomocą

:color blue

Zauważyłem, że nie działa na wszystkich wersjach vima, których używam, ale działa na większości.


10
Występuje „zniekształcenie”, ponieważ masz włączoną jakąś formę automatycznego wcięcia. Używanie set pastelub określanie klawisza dla pastetoggleopcji jest powszechnym sposobem obejścia tego set mouse=aproblemu , ale ten sam efekt można osiągnąć, ponieważ wtedy Vim wie, że zalew tekstu, który widzi, jest pastą uruchamianą przez mysz.
jamessan

1
Jeśli masz zainstalowany gvim, często możesz (choć zależy to od opcji, z którymi kompiluje vim Twoja dystrybucja) korzystać ze schowka X bezpośrednio z vima poprzez rejestr *. Na przykład, "*paby wkleić z Xlipboarda. (Działa również z terminalowego vima, po prostu może być potrzebny pakiet gvim, jeśli są one oddzielne)
Kyrias

2
@kyrias Dla przypomnienia, *jest PRIMARY( "middle-click") rejestr. Schowek jest+
Braden Najlepsza
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.