Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Astro Coke

[Vi & Visual Studio] Compatibility of tab space between vi and visual studio 본문

Computer Setup

[Vi & Visual Studio] Compatibility of tab space between vi and visual studio

astrodoo 2019. 4. 25. 23:46

source: https://tedlogan.com/techblog3.html

tabstop

Set tabstop to tell vim how many columns a tab counts for. Linux kernel code expects each tab to be eight columns wide. Visual Studio expects each tab to be four columns wide. This is the only command here that will affect how existing text displays.

expandtab

When expandtab is set, hitting Tab in insert mode will produce the appropriate number of spaces.

shiftwidth

Set shiftwidth to control how many columns text is indented with the reindent operations (<< and >>) and automatic C-style indentation.

softtabstop

Set softtabstop to control how many columns vim uses when you hit Tab in insert mode. If softtabstop is less than tabstop and expandtab is not set, vim will use a combination of tabs and spaces to make up the desired spacing. If softtabstop equals tabstop and expandtab is not set, vim will always use tabs. When expandtab is set, vim will always use the appropriate number of spaces.

Indentation in the real world

Putting it all together, the following incantations will configure vim for each of the cases listed above:

  • Tabs are eight columns wide. Each indentation level is one tab. (Popular with the Linux kernel.)
    :set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab
  • Tabs are four columns wide. Each indentation level is one tab. (Popular with Windows developers using Visual Studio.)
    :set tabstop=4 softtabstop=4 shiftwidth=4 noexpandtab
  • Each indentation level is four spaces. Tabs are not used. (Popular with Java programmers.)
    :set softtabstop=4 shiftwidth=4 expandtab

Just to prove it's possible, here are some more ... creative indentation styles and their vim representation:

  • Tabs are eight columns wide. Each indentation level is three columns, which may be spaces or tabs.
    :set tabstop=8 softtabstop=3 shiftwidth=3 noexpandtab
  • Tabs are five columns wide. Each indentation level is six columns, which may be spaces or tabs.
    :set tabstop=5 softtabstop=6 shiftwidth=6 noexpandtab

Remembering these settings

So how do you make vim remember what indentation to use for all of your files? vim will read your personal startup file every time it runs; you can put your favorite indentation incantations there. (That's ~/.vimrc on Unix; $HOME/_vimrc on Windows. In gvim, you can click Edit -> Startup Settings to quickly edit this file.) On the opposite end of the spectrum, you can add special incantations to each file you edit, which will override the settings vim reads from elsewhere -- but see modeline because this is often disabled by default as a security feature:

/* vim: set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab : */

(Obviously, wrap the text in your favorite comments to make sure your compiler doesn't try to compile the vim incantations.)

vim will also read .vimrc in the current directory (when the exrc option is set in your normal vimrc), which is useful when editing large numbers of source files in the same directory, or to avoid corrupting source files you don't control.

Visualizing tabs

So what do you do when you open a new source file and you're trying to figure out what tab style the last author used? (And how do you make sure you're doing the Right Thing to avoid mixing tab styles in your new code intermixed with the old code?) I find syntax highlighting useful. In gvim, I like seeing my tabs with underlines. (This tends not to work well on the text terminal for reasons I haven't been able to determine.) The following incantation will tell vim to match tabs, underline them in gvim, and highlight them in blue in color terminals:

syntax match Tab /\t/
hi Tab gui=underline guifg=blue ctermbg=blue

You can't just throw this into your .vimrc and expect all to work, though, because vim will flush its syntax highlighting rules when it loads new files. To hijack this process, add syntax files for your favorite languages in $HOME/.vim/syntax/. For C, the syntax file is c.vim. (Look in $VIM/syntax for a list of existing files.) vim will load the system-wide syntax file and then run your custom file, and you'll be able to visualize your tabs every time you load a C file.