Tab untuk indentasi, spasi untuk penyelarasan

17

Saya mencoba membuat indentasi vim otomatis dengan tab, dan menyelaraskan dengan spasi putih, tetapi sebenarnya, vim indentasi dengan tab dan mengisi perataan dengan tab + spasi putih.

Vim melakukannya:

masukkan deskripsi gambar di sini

(setiap blok adalah tab)

{
>--long a = 1,
>-->--..b = 2,
>-->--..c = 3;
}

Dapat melakukannya:

{
>--long a = 1,
>--.....b = 2,
>--.....c = 3;
}

Jadi, saya pikir ada banyak pertanyaan tentang subjek tab dan spasi, tetapi tidak satupun dari mereka memberikan beberapa solusi Just Works:

Sebenarnya saya menggunakan:

set ai
set cindent
set cinoptions=(0,:0,u0,U0,g0)

Saya mencoba plugin Smart Tab , yang sepertinya berfungsi dengan baik, tetapi ketika saya mencoba gg=Gsaya mendapatkan beberapa kesalahan aneh:

Error detected while processing function CtabRedoIndent..<SNR>12_CheckAlign:
line   11:
E108: No such variable: "b:ctab_lastalign"
Press ENTER or type command to continue
Error detected while processing function CtabRedoIndent:
line   10:
E170: Missing :endwhile

Diskusi ini tampaknya sudah lama, jadi sekarang, 2015, ada solusi resmi untuk menghadapinya?

tjbrn
sumber
Saya tidak memiliki pemetaan untuk ini, hanya sebuah ide ... tetapi bagaimana jika Anda mengatur Vim untuk menyisipkan tab (berapa pun lebar yang Anda suka) ketika Anda menekan tombol tab, tetapi sebenarnya perluas tab ke spasi jika Anda mengetik Shift -Tab? Bukankah itu akan membuat perataan semacam ini menjadi sederhana?
Wildcard
(PS: Ada diskusi yang bagus tentang "Tabs vs. Spaces" di forum "Perang Keagamaan" komik xkcd . Nikmati;)
Wildcard

Jawaban:

3

Melakukan ini benar-benar secara otomatis sulit. Vim tidak tahu apa itu "indentasi" dan apa itu "alignment"; dan beberapa orang mungkin tidak setuju tentang apa yang sebenarnya merupakan lekukan dan penyelarasan.

Yang sedang berkata, plugin Smart Tabs dirancang untuk melakukan apa yang Anda inginkan; Saya menemukan bahwa itu bekerja cukup baik untuk file C, tetapi memiliki sejumlah peringatan; itu memecah file Python, misalnya, dan melakukan beberapa hal yang tidak terduga (bagi saya, tetap) untuk file C di kali.
Melihat sumbernya, saya tidak dapat benar-benar mengetahui cara kerjanya dalam 5 menit, dan dikombinasikan dengan fakta bahwa itu merusak beberapa hal, harus memberitahu Anda untuk melanjutkan dengan hati-hati ...

Martin Tournoij
sumber
3

Plug-in Smart Tabs yang Anda sebutkan hampir sebagus yang didapat. Saya awalnya mengalami kesalahan yang sama yang Anda lakukan dan menyerah tetapi akhirnya menghabiskan beberapa menit untuk memperbaikinya. Coba terapkan tambalan berikut:

--- ctab.vim.orig   2016-08-11 17:05:20.767275274 +0800
+++ ctab.vim    2016-08-11 17:15:20.039286525 +0800
@@ -221,7 +221,7 @@
       if a:line == line('.')
         let b:ctab_lastalign=a:line
       else
-        unlet b:ctab_lastalign
+        unlet! b:ctab_lastalign
       endif
       set ts=50
       set sw=50

Saya kemudian menemukan bahwa seseorang telah menyarankan perbaikan serupa di bagian wiki Smart Tabs . Sayangnya, belum ada rilis baru.

MartinR
sumber
0

Lekukan dalam vim dilakukan hanya menggunakan skrip berikut

Script untuk melakukan indentasi satu file

#!/bin/bash 
#Author: Ankit shah
#Enter file name to indent as argument
file=$1
vim $file -c "normal gg=G" -c "wq"
#Use expand command to turn tabs into spaces. Code uniform across different vim environment
expand -t 4 $file $file 
Ankit Shah
sumber
2
Ini bukan jawaban untuk pertanyaan
Martin Tournoij