Auto wcięcie / kod formatu dla Vima?

35

Staram się używać Vima coraz częściej, kiedy mogę. Jednym z moich największych chwytów między Vimem a IDE, takim jak Aptana, jest możliwość automatycznego wcięcia.

Czy istnieje sposób automatycznego formatowania kodu (HTML, CSS, PHP), aby był odpowiednio wcięty?

Jeśli tak, to jak to zainstalować w vimie? Nie bardzo rozumiem wtyczek. Próbowałem przejrzeć ten wątek i bardziej mnie to pomieszało: jak zmienić zachowanie automatycznego wcięcia w vimie?

chrisjlee
źródło
Czy możesz wyjaśnić, w jakim języku próbujesz wprowadzić wcięcie? Spodziewałbym się, że jeśli jest już obsługiwany przez vima, powinien już automatycznie wciskać bez dalszego wysiłku. Jeśli nie, powinieneś być w stanie uzyskać wtyczkę.
Edd Steel
najlepiej HTML / css i php
chrisjlee

Odpowiedzi:

54

Aby automatycznie wciąć cały plik:

gg
=G

Wyjaśnił:

  • gg - przejdź do początku pliku
  • G - idź na koniec pliku
  • =- tiret
zabiera
źródło
2
Czy mógłbyś to rozbić? Czym zwykle jest g? i = G?
chrisjlee,
@Chris zobacz edycję
trwa
1
Dobra wskazówka, nigdy tego nie wiedziałem. Robi jednak śmieci z bash.
Sparhawk
Jak wykonać gg=Gz powłoki bez otwierania pliku?
WM
@takeshin, czy możesz to wyjaśnić znacznie dalej, czy musimy wpisać go w pliku, czy też musimy uruchomić go w terminalu
Kasun Siyambalapitiya,
14

Nie wiem o automatycznym formatowaniu istniejącego kodu, ale jeśli piszesz kod i potrzebujesz automatycznego wcięcia:

  • :set autoindent(lub :set ai) włączy automatyczne wcięcie
  • Ctrl- daby cofnąć wcięcie (AKA outdent) w twoim kodzie
  • Tab lub spacje do wcięcia - osobiście używam tabulacji
  • :set tabwidth=4(lub :set tw=4) kontroluje, o ile spacji tabulator powinien wciąć kod
  • >>Polecenie wcięcie bieżącej linii. Jeśli poprzedzisz go liczbą, powiedzmy, 4>>że spowoduje wcięcie 4 linii, zaczynając od bieżącej linii.
  • Podobnie <<polecenie spowoduje cofnięcie wcięcia linii

Mam nadzieję, że to dobry początek.

Hai Vu
źródło
7
Aby automatycznie wciąć istniejący kod, użyj go ={motion}w trybie normalnym - np. =GSpowoduje wcięcie całego kodu od bieżącego wiersza do końca pliku. ==spowoduje wcięcie bieżącej linii.
Edd Steel
1
upewnij się także, że wtyczki wcięcia są ładowane (np. :filetype indent on)
jw013
2
set tw = 4 ustawia TEXTWIDTH na 4
Steffen Roller,
4

Automatyczne wcięcie *.sh

Po prostu dodaj następujące wiersze ~/.vimrc

filetype indent on
set smartindent
autocmd BufRead,BufWritePre *.sh normal gg=G
Rahul Patil
źródło
Czy dotyczy to tylko edycji za pomocą vima lub wszystkich narzędzi edytora?
WM
1
~./vimrcdotyczy tylko edytora vim.
Rahul Patil
2

Ta wtyczka ułatwia formatowanie kodu. Integruje zewnętrzne formatery i zastępuje funkcjonalność wcięć vima.

https://github.com/Chiel92/vim-autoformat

Zauważ też różnicę między formatowaniem a wcięciem. Wcięcie koryguje tylko białe znaki przed każdą linią, podczas gdy formatowanie dotyczy również wszelkich innych rzeczy, takich jak białe znaki wokół operatorów itp.

Chiel ten Brinke
źródło
2

Utwórz / edytuj ~/.vimrcplik i dodaj następujący wiersz:

set autoindent
Akshat Maheshwari
źródło
2
To nic nie dodaje do istniejących odpowiedzi ...
jasonwryan
@ jasonwryan Właściwie odpowiedź Hai Vu wspomina, :set autoindentktóra umożliwia automatyczne wcięcie tylko dla bieżącego pliku. Dodanie go do .vimrcpliku umożliwia automatyczne wcięcie na stałe.
Akshat Maheshwari
twój komentarz został już wspomniany w odpowiedzi Rahula, więc zastanów się przed opublikowaniem
Indrajeet Gour
0

W bash robię to:

source <(echo "Zibri () {";cat script_to_be_reindented.sh; echo "}")
declare -f Zibri| cut -c 5-|head --lines=-1|tail --lines=+3

eliminuje to komentarze i odradza skrypt „bash way”. nie będzie działać, jeśli skrypt zawiera HEREDOCS, ale jeśli to zrobisz:

source <(echo "Zibri () {";cat script_to_be_reindented.sh; echo "}")
declare -f Zibri|head --lines=-1|tail --lines=+3

będzie działać z każdym skryptem, ale cały skrypt będzie wcięty o 4 spacje. nie krępuj się modyfikować, ale podaj moje imię i nazwisko w swoim skrypcie! :RE

Zibri
źródło
Uważam, że może to nie być sednem pytania; zamiast wcięcia zestawu wierszy, uważam, że OP chciał automatycznie wstawić wcięcie w VIM dla różnych języków. sedcat script_to_be_reindented.sh | sed 's#^# #g'
Nawiasem mówiąc
0

Autoformatowanie / wcięcie vima działa całkiem dobrze. Najpierw umieść tę linię w swoim ~/.vimrc:

filetype plugin indent on

Następnie otwórz plik w vimie i wpisz gg=G

( ggprzesuwa kursor do pierwszego wiersza. =uruchamia polecenie wcięcia. Gmówi polecenie wcięcia, aby uruchomiło się z tego miejsca do ostatniego wiersza.)

Jeśli autoformatowanie wygląda naprawdę źle, tak jakby każdy wiersz został po prostu wcięty, uruchom :scriptnamesi sprawdź, czy .../indent/html.vim(lub w jakim języku używasz) jest na liście. Jeśli nie, upewnij się, że masz ~/.vimrcrację. Lub jeśli uruchomiłeś :filetype plugin indent onz linii poleceń vim, będziesz musiał ponownie otworzyć plik:e

wisbucky
źródło