Próbuję coraz częściej używać Vima, kiedy tylko mogę. Jednym z moich największych problemów między Vimem a IDE takim jak Aptana jest możliwość automatycznego wcięcia .
Czy istnieje sposób na automatyczne formatowanie kodu (HTML, CSS, PHP) tak, aby był odpowiednio wcięty?
Jeśli tak, to jak zainstalować to w vimie? bardzo dobrze rozumiem wtyczki. Próbowałem przejrzeć ten wątek i jeszcze bardziej mnie to zmyliło: Jak zmienić zachowanie automatycznego wcięcia w Vimie?
Komentarze
- Czy możesz wyjaśnić, w jakim języku chcesz wprowadzić wcięcie? Spodziewałbym się, że jeśli ' jest już obsługiwany przez vima, powinien już mieć automatyczne wcięcie bez dalszych wysiłków. Jeśli nie, powinieneś być w stanie uzyskać wtyczkę.
- najlepiej HTML / css i php
Odpowiedź
Aby automatycznie wciąć cały plik:
gg =G
Wyjaśnienie:
-
gg
– idź na początek pliku -
G
– idź na koniec pliku -
=
– wcięcie
Komentarze
- Czy mógłbyś to wyjaśnić? Co to jest typowo samo w sobie? and = G?
- @Chris zobacz edycję
- Dobra wskazówka, nigdy tego nie wiedziałem. Jednak z bashem robi to bzdury.
- Jak wykonać
gg=G
z powłoki bez otwierania pliku? - @takeshin, czy możesz proszę wyjaśnić to znacznie dokładniej, czy musimy wpisać to w pliku, czy też musimy uruchomić go w terminalu
Odpowiedź
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 – d , aby usunąć wcięcie (AKA przestarzały) Twój kod
- Tabulatory lub spacje do wcięcia – osobiście używam tabulatora
-
:set tabwidth=4
(lub:set tw=4
) będzie kontrolować, o ile spacji tabulator powinien wcinać kod - Polecenie
>>
spowoduje wcięcie bieżącego wiersza. Jeśli przedrostek wprowadzi do liczbę, powiedz4>>
, a następnie doda wcięcie 4 wiersze, zaczynając od bieżącego wiersza. - Podobnie Polecenie
<<
usunie wcięcie wiersza
Mam nadzieję, że to dobry początek.
Komentarze
- Aby automatycznie wprowadzić wcięcie w istniejącym kodzie, użyj
={motion}
w trybie normalnym – np.=G
spowoduje wcięcie całego kodu od bieżącego wiersza do końca pliku.==
spowoduje wcięcie bieżącej linii. - upewnij się także, że ładowane są wtyczki wcięć (np. z
:filetype indent on
) - set tw = 4 ustawia TEXTWIDTH na 4
Odpowiedź
Automatyczne wcięcie *.sh
Po prostu dodaj następujące wiersze w ~/.vimrc
filetype indent on set smartindent autocmd BufRead,BufWritePre *.sh normal gg=G
Komentarze
- Czy dotyczy to tylko edycji w vimie czy wszystkich narzędzi edytora?
-
~./vimrc
dotyczy tylko edytora vim.
Odpowiedź
Ta wtyczka ułatwia formatowanie kodu . Integruje zewnętrzne elementy formatujące i ma rezerwę funkcji wcięcia vima.
https://github.com/Chiel92/vim-autoformat
Zwróć też uwagę na różnicę między formatowaniem a wcięciami. Wcięcie koryguje tylko białe znaki przed każdym wierszem, podczas gdy formatowanie zajmuje się również innymi rzeczami, takimi jak spacje wokół operatorów itp.
Odpowiedź
Utwórz / edytuj plik ~/.vimrc
i dodaj następujący wiersz:
set autoindent
Komentarze
- To nic nie dodaje do istniejących odpowiedzi …
- @jasonwryan Właściwie Hai Vu ' w odpowiedzi wspomina
:set autoindent
, który włącza automatyczne wcięcie tylko dla bieżącego pliku. Dodanie go w.vimrc
włącza automatyczne wcięcie na stałe. - Twój komentarz jest już wspomniany przez odpowiedź Rahula ', więc zastanów się przed opublikowaniem
Odpowiedź
vim „działa całkiem nieźle. Najpierw umieść tę linię w swoim ~/.vimrc
:
filetype plugin indent on
Następnie otwórz plik w vimie i wpisz gg=G
(gg
przenosi kursor do pierwszej linii. =
uruchamia polecenie indent. G
mówi polecenie indent, aby zostało uruchomione od tego miejsca do ostatniej linii.)
Jeśli autoformat wygląda naprawdę źle, na przykład każda linia ma wcięcie po lewej stronie, uruchom :scriptnames
i sprawdź, czy .../indent/html.vim
(lub inny język, którego „używasz) znajduje się na liście. Jeśli nie, upewnij się, że ~/.vimrc
jest poprawny. Lub jeśli uruchomiłeś :filetype plugin indent on
z wiersza poleceń vima, będziesz musiał ponownie otworzyć plik :e
Odpowiedz
Aby przeprowadzić ponowne formatowanie skryptu bash, zaproponowane rozwiązanie gg = G nie działa dobrze w VIM, niezależnie od tego, czy ustawisz skrypt na typ powłoki. Zamiast tego działa;
shfmt -i 2 -ci script.sh
Aby zidentyfikować wszystkie wiersze za pomocą 2 spacji i poprawić formatowanie w inny sposób.
Odpowiedź
W bashu 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 zmienia w skrócie skrypt „bash way”. 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
zadziała z każdym skryptem, ale cały skrypt będzie wcięty 4 spacjami. nie krępuj się modyfikować, ale zacytuj moje imię w swoim skrypcie i opublikuj! : D
Komentarze
- Myślę, że to może nie mieć sensu w pytaniu; zamiast wciskać zestaw wierszy, uważam, że OP chciał automatycznie wprowadzić wcięcie w VIM dla różnych języków. Nawiasem mówiąc, jeśli sobie tego życzysz, możesz to osiągnąć nieco bardziej bezpośrednio dzięki
sed
:cat script_to_be_reindented.sh | sed 's#^# #g'
(no cóż, SO markdown zastępuje spacje tabulatorem, ale rozumiesz) - Wszystko, co robi ta odpowiedź, to wstawianie spacji na początku wiersza i resetowanie całego wyrównania. To samo (z wyjątkiem przeceny) można zrobić za pomocą
sed -i 's|^[ \t]\+| |' script.sh
(czyli 4 spacje wewnątrz| |
, ale ta witryna filtruje wiele spacji w jedną) .