Tabulatory i spacje w Vimie

Jak zapobiec zastąpieniu spacji przez Vima tabulatorami, gdy autoindent jest włączony?

Przykład: jeśli mam dwie tabulatory i 7 spacji na początku linii, i tabstop=3 i wciskam Enter, następna linia ma cztery tabulatory i 1 spację na początku, ale nie chcę tego...

 68
Author: Aaron Thoma, 2008-09-16

6 answers

To chyba dobry pomysł, aby nie używać tabs w ogóle.

:set expandtab

Jeśli chcesz zamienić wszystkie karty w pliku na 3 spacje (które będą wyglądać bardzo podobnie do tabstop=3):

:%s/^I/   /

(Gdzie ^I jest znakiem tabulatora )

Z pomocy VIM online:

'tabstop' 'ts'      number  (default 8)
        local to buffer
Number of spaces that a <Tab> in the file counts for.  Also see
|:retab| command, and 'softtabstop' option.

Note: Setting 'tabstop' to any other value than 8 can make your file
appear wrong in many places (e.g., when printing it).

There are four main ways to use tabs in Vim:
1. Always keep 'tabstop' at 8, set 'softtabstop' and 'shiftwidth' to 4
   (or 3 or whatever you prefer) and use 'noexpandtab'.  Then Vim
   will use a mix of tabs and spaces, but typing <Tab> and <BS> will
   behave like a tab appears every 4 (or 3) characters.
2. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use
   'expandtab'.  This way you will always insert spaces.  The
   formatting will never be messed up when 'tabstop' is changed.
3. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use a
   |modeline| to set these values when editing the file again.  Only
   works when using Vim to edit the file.
4. Always set 'tabstop' and 'shiftwidth' to the same value, and
   'noexpandtab'.  This should then work (for initial indents only)
   for any tabstop setting that people use.  It might be nice to have
   tabs after the first non-blank inserted as spaces if you do this
   though.  Otherwise aligned comments will be wrong when 'tabstop' is
   changed.
 76
Author: user11211,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-13 15:15:38

Chcę tylko, aby autoindentowana linia miała dokładnie takie same znaki wcięć jak poprzednia linia.

:help copyindent

"copyindent' 'ci' boolean (domyślnie wyłączone); local to buffer; {not in Vi}

Skopiuj strukturę istniejących linii wcięcia podczas autoindentowania a nowa linia. Zwykle nowe wcięcie jest rekonstruowane przez szereg tabulatory, po których następuje spacja (chyba że 'expandtab' jest włączone, w takim przypadku używane są tylko spacje). Włączenie tej opcji powoduje, że nowa linia Kopiuj dowolne znaki, które zostały użyte do wcięć na istniejącej linii. Jeśli nowe tiret jest większe niż w istniejącym linia, pozostała przestrzeń jest wypełniona w normalny sposób.

Uwaga: 'copyindent' jest resetowany, gdy'compatible' jest ustawiony.
Zobacz też 'preserveindent'.

:help preserveindent

"' 'pi' boolean (domyślnie wyłączone); local to buffer; {not in Vi}

Podczas zmiany wcięć bieżącej linii, zachowaj jak najwięcej struktura wcięcia, jak to możliwe. Zwykle tiret zastępuje się przez seria tabulatorów, po których następuje spacja (chyba że 'expandtab' jest enabled, w którym to przypadku używane są tylko spacje). Włączenie tej opcji oznacza, że wcięcie zachowa jak najwięcej istniejących znaków do wcięcia i dodawaj tylko dodatkowe tabulatory lub spacje zgodnie z wymaganiami.

Uwaga: przy wielokrotnym użyciu "> > " wynikowe wcięcie jest mieszaniną tabulatory i spacje. Może Ci się to nie spodobać.
Uwaga: 'preserveindent' jest resetowany, gdy 'compatible' jest ustawiony.
Zobacz też 'copyindent' .
Zastosowanie: retab do czyszczenia białej przestrzeni.

 40
Author: Aristotle Pagaltzis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 11:46:34

Możesz przekonwertować wszystkie TAB na SPACE

:set et
:ret!

Lub Konwertuj wszystkie SPACE na TAB

:set et!
:ret!
 39
Author: kev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-26 13:20:11

Oto część mojego .vimrc:

set autoindent
set expandtab
set softtabstop=4
set shiftwidth=4

To działa dobrze dla mnie, ponieważ absolutnie nie chcę tabs w moim kodzie źródłowym. Z twojego pytania wynika, że chcesz zachować dwie zakładki i siedem spacji w następnej linii, i nie jestem pewien, czy jest sposób, aby nauczyć Vima, aby dostosować się do tego stylu.

 22
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 07:24:37

Może to ci pomoże?

Standardowy vi interpretuje klawisz tab dosłownie, ale istnieją popularne alternatywy pochodne vi, które są mądrzejsze, jak vim. Aby vim zinterpretował tab jako polecenie "indent" zamiast polecenia insert-a-tab, zrób to:

set softtabstop=2
 1
Author: svrist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 07:20:46

Jeśli chcesz zastąpić wszystkie tabulatory spacjami w oparciu o ustawienie 'ts', możesz użyć :retab. Może również zrobić odwrotnie.

 1
Author: graywh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 18:50:37