Tombol Tab == 4 spasi dan indentasi otomatis setelah kurung kurawal di Vim

1265

Bagaimana saya membuat vi - Vim tidak pernah menggunakan tab (mengubah spasi menjadi tab, buruk!), Membuat kunci tab == 4 spasi, dan secara otomatis memasukkan kode setelah blok penjepit keriting seperti yang dilakukan Emacs ?

Juga, bagaimana saya menyimpan pengaturan ini sehingga saya tidak perlu memasukkannya lagi?

Saya telah melihat pertanyaan lain yang terkait dengan ini, tetapi sepertinya selalu sedikit dari apa yang saya inginkan.

mmcdole
sumber
3
Terkait: Bagaimana cara mengganti tab dengan spasi? di Vim SE
kenorb

Jawaban:

1882

Seperti yang telah ditunjukkan dalam beberapa jawaban di bawah ini, metode yang lebih disukai sekarang adalah BUKAN menggunakan smartindent, tetapi gunakan yang berikut (di .vimrc Anda ):

filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab

Di file .vimrc: Anda :

set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

File bantuan memerlukan sedikit waktu untuk membiasakan diri, tetapi semakin banyak Anda membaca, semakin baik Vim:

:help smartindent

Bahkan lebih baik, Anda dapat menyematkan pengaturan ini di sumber Anda untuk portabilitas:

:help auto-setting

Untuk melihat pengaturan Anda saat ini:

:set all

Seperti yang ditunjukkan oleh graywhent dalam komentar, smartindent telah digantikan oleh cindent yang "Bekerja lebih pintar", meskipun masih terutama untuk bahasa dengan sintaks mirip C:

:help C-indenting

Ken
sumber
4
Jika Anda telah mengatur exttab maka harus menggunakan spasi. Apakah Anda juga "mengatur kompatibel"? Itu memiliki berbagai efek samping termasuk menyetel ulang ekstABtab ke default "off"
Ken
60
Maaf, tetapi smartindent digantikan oleh cindent, yang hanya cocok untuk sintaks gaya C. Menyalakan salah satu di vimrc Anda bisa menjadi masalah saat bekerja dengan bahasa lain. Cukup gunakan "indentasi tipe file pada" sebagai gantinya.
graywh
2
Nah, smartindent juga hanya untuk sintaks C-style dan pada dasarnya sudah usang.
graywh
4
jika saya mengaktifkan expandtab, apakah ada cara untuk benar-benar memasukkan karakter tab dalam teks?
Daniele Segato
3
@DanieleSegato <ctrl v> <tab> harus bekerja dalam mode insert: stackoverflow.com/questions/4781070/…
Ken
236

Terkait, jika Anda membuka file yang menggunakan tab dan spasi, anggap Anda punya

set expandtab ts=4 sw=4 ai

Anda dapat mengganti semua tab dengan spasi di seluruh file dengan

:%retab
netjeff
sumber
10
FYI, jika Anda tidak ingin tab Anda diganti dengan spasi, hapus baris expandtab.
Eno
6
Bukankah tab spasi? ;-)
Rob Wells
11
@ Rob-Wells: Saya mengubah "spasi putih" menjadi "spasi". Apakah kamu senang sekarang? ;-)
netjeff
Bisakah Anda menjelaskan apa artinya baris pertama itu?
Dana Gugatan Monica
2
expandtab menentukan apakah tab diperluas ke spasi. ts = tabstop = Jumlah spasi tempat <Tab> dalam file dihitung. sw = shiftwidth = Jumlah spasi yang digunakan untuk setiap langkah indentasi (otomatis). ai = autoindent = Salin indentasi dari baris saat ini ketika memulai baris baru.
mcmacerson
89

Cara terbaik untuk mendapatkan indentasi filetype-spesifik adalah dengan menggunakan filetype plugin indent ondi vimrc Anda. Kemudian Anda dapat menentukan hal-hal seperti set sw=4 sts=4 etdi .vim / ftplugin / c.vim, misalnya, tanpa harus membuat global untuk semua file yang sedang diedit dan sintaks tipe non-C lainnya akan mendapatkan indentasi yang benar juga (bahkan lisps) .

greywh
sumber
9
IMHO, lebih baik daripada jawaban yang telah ditandai benar. filetype indent pada supersedes cindent dan smartindent.
0fnt
62

Untuk memiliki 4 ruang tab di sebagian besar file, tab char 8-real sebenarnya di Makefiles, dan indentasi otomatis dalam berbagai file termasuk C / C ++, letakkan ini di ~/.vimrcfile Anda :

" Only do this part when compiled with support for autocommands.
if has("autocmd")
    " Use filetype detection and file-based automatic indenting.
    filetype plugin indent on

    " Use actual tab chars in Makefiles.
    autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif

" For everything else, use a tab width of 4 space chars.
set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.
set shiftwidth=4    " Indents will have a width of 4.
set softtabstop=4   " Sets the number of columns for a TAB.
set expandtab       " Expand TABs to spaces.
Shervin Emami
sumber
Kenapa kamu tidak butuh else? Sepertinya saya seperti baris terakhir menimpa makefile-spesifik dalam semua kasus
lucidbrot
6
Hai @ lucidbrot, pernyataan "autocmd FileType make" pada dasarnya memberitahu vim beberapa pengaturan untuk digunakan setiap kali membuka Makefile. Sedangkan garis di bawahnya adalah pengaturan default. Dengan kata lain, pengaturan "tabstop = 8 ..." diterapkan nanti ketika file dibuka, dan akan menimpa pengaturan "tabstop = 4 ..." yang berlaku pada inisialisasi.
Shervin Emami
56

Pada banyak sistem Linux, seperti Ubuntu, .vimrcfile tidak ada secara default, jadi Anda disarankan untuk membuatnya terlebih dahulu.

Jangan gunakan .viminfofile yang ada di direktori home. Ini digunakan untuk tujuan yang berbeda.

Langkah 1: Buka direktori home Anda

cd ~

Langkah 2: Buat file

vim .vimrc

Langkah 3: Tambahkan konfigurasi yang disebutkan di atas

filetype plugin indent on
set tabstop=4
set shiftwidth=4
set expandtab

Langkah 3: Simpan file, dengan menekan Shift+ ZZ.

Erick
sumber
11
Jangan gunakan Shift + ZZitu akan membuat file .swp. gunakan wq.
shas
6
@shas: "ZZ" sama dengan ": x" , yang sama dengan ": wq", kecuali bahwa itu hanya menyimpan jika file telah diubah ... ( Ctrl-Zada cerita lain ...)
Gert van den Berg
1
@Memiliki Itu tidak benar. Jika Anda tidak ingin swap file untuk edit sesion, Anda harus menjalankan vim -n <file>. File swap bukan sesuatu yang dihasilkan saat menghemat waktu; itu akan sangat mengecewakan tujuannya, karena swap file menjadi berguna dalam memulihkan sesi edit yang tiba-tiba dihentikan.
Kaz
32

Cara yang disarankan adalah menggunakan indentasi berbasis filetype dan hanya menggunakan smartindent dan cindent jika itu tidak cukup.

Tambahkan berikut ini ke .vimrc Anda

set expandtab
set shiftwidth=2
set softtabstop=2
filetype plugin indent on

Semoga ini membantu sebagai jawaban yang berbeda.

Chaudhry Junaid
sumber
12

edit ~ / .vimrc Anda

$ vim ~/.vimrc

tambahkan baris berikut:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
Yusuf Ibrahim
sumber
10

Dari wiki VIM :

:set tabstop=4
:set shiftwidth=4
:set expandtab
Pengguna
sumber
6

Indentasi otomatis didasarkan pada mode sintaksis saat ini. Saya tahu bahwa jika Anda mengedit Foo.java, maka masukkan a {dan tekanEnter indentasi baris berikut.

Adapun tab, ada dua pengaturan. Di dalam Vim, ketik titik dua dan kemudian "set tabstop = 4" yang akan mengatur tab untuk ditampilkan sebagai empat spasi. Tekan titik dua lagi dan ketik "set expandtab" yang akan menyisipkan spasi untuk tab.

Anda dapat menempatkan pengaturan ini dalam .vimrc (atau _vimrc pada Windows) di direktori home Anda, jadi Anda hanya perlu mengetiknya sekali.

Joey Gibson
sumber
0

Pertama, jangan gunakan Tabkunci di Vim untuk indentasi manual. Vim memiliki sepasang perintah dalam mode sisipkan untuk secara manual menambah atau mengurangi jumlah indentasi. Perintah-perintah itu adalah Ctrl-Tdan Ctrl-D. Perintah-perintah ini mengamati nilai-nilai tabstop, shiftwidthdanexpandtab , dan mempertahankan campuran spasi dan tab yang benar (jumlah tab maksimum diikuti oleh jumlah spasi yang diperlukan).

Kedua, kunci indentasi manual ini tidak harus digunakan terlalu banyak jika Anda menggunakan lekukan otomatis.

Jika Ctrl-Talih-alih Tabmengganggu Anda, Anda dapat memetakannya kembali:

:imap <Tab> ^T

Anda juga dapat memetakan Shift-Tabuntuk melakukan Ctrl-Ddeindent:

:imap <S-Tab> ^D

Di sini ^ T dan ^ D adalah karakter kontrol literal yang dapat dimasukkan sebagai Ctrl-VCtrl-T.

Dengan pemetaan ini, Anda masih bisa mengetik Tab literal ke dalam buffer menggunakan Ctrl-VTab. Perhatikan bahwa jika Anda melakukan ini, bahkan jika :set expandtabdalam keadaan aktif, Anda mendapatkan karakter tab yang tidak dikembangkan.

Efek serupa dengan <Tab>peta dicapai dengan menggunakan:set smarttab , yang juga menyebabkan backspace di depan garis berperilaku pintar.

Dalam smarttabmode, ketika Tabdigunakan bukan pada awal baris, itu tidak memiliki arti khusus. Itu berbeda dari pemetaan di atas saya Tabuntuk Ctrl-T, karenaCtrl-T di mana saja digunakan dalam garis (dalam mode insert) akan meningkatkan lekukan garis ini.

Pemetaan berguna lainnya mungkin:

:map <Tab> >
:map <S-Tab> <

Sekarang kita dapat melakukan hal-hal seperti memilih beberapa baris, dan tekan Tabuntuk membuat indentasi berakhir. Atau pukulTab dua kali pada baris (dalam mode perintah) untuk meningkatkan lekukannya.

Jika Anda menggunakan perintah manajemen lekukan yang tepat, maka semuanya dikendalikan oleh tiga parameter: shiftwidth, tabstopdan expandtab.

The shiftwidthparameter mengontrol ukuran lekukan Anda; jika Anda ingin empat inden spasi, gunakan :set shiftwidth=4, atau singkatan :set sw=4.

Jika ini dilakukan, maka lekukan akan dibuat menggunakan campuran spasi dan tab, karena noexpandtabini adalah default. Gunakan :set expandtab. Ini menyebabkan karakter tab yang Anda ketikkan ke buffer untuk memperluas ke spasi, dan untuk lekukan yang dikelola Vim hanya menggunakan spasi.

Kapan expandtabaktif, dan jika Anda mengelola lekukan Anda melalui semua mekanisme Vim yang tepat, nilai tabstopmenjadi tidak relevan. Ini mengontrol bagaimana tab muncul jika mereka terjadi pada file. Jika Anda telah set tabstop=8 expandtabdan kemudian menyelipkan tab keras ke dalam file menggunakan Ctrl-VTab, itu akan menghasilkan keselarasan ke posisi tab berbasis 8 kolom berikutnya, seperti biasa.

Kaz
sumber
Semua pemetaan Anda harus menggunakan varian non-rekursif. Memetakan go <C-t>dapat menggunakan sintaks itu daripada literal. Terakhir, pemetaan <Tab>dalam mode normal juga akan memetakan <C-i>(mereka adalah karakter yang sama), jadi saya tidak merekomendasikan itu (Anda kehilangan fungsionalitas vim yang bagus
D. Ben Knoble
@ D.BenKnoble Saya tidak merekomendasikan semua ini; Saya menggunakan Ctrl-T, Ctrl-D, dan <> sendiri. Itu menggunakan Vim sebagaimana dimaksud. Orang yang terbiasa menggunakan Tab di editor lain mungkin tidak menyukainya, itu saja.
Kaz