Metin hizalamasını korurken sekmeleri boşluklara dönüştürmek mümkün mü?
Basitçe değiştirmek, yalnızca baş karakterlerden oluşmadığında işe yarar.
Metin hizalamasını korurken sekmeleri boşluklara dönüştürmek mümkün mü?
Basitçe değiştirmek, yalnızca baş karakterlerden oluşmadığında işe yarar.
Yanıtlar:
:retab
Komutu kullanabilirsiniz . itibaren
:help :retab
<Tab>
Verilen yeni tabstop değerini kullanarak yeni beyaz boşluk dizileri içeren tüm beyaz boşluk dizilerini değiştirin . Yeni bir tabstop boyutu belirtmezseniz veya sıfırsa, Vim, şu anki değerini kullanır'tabstop'
. [...] Açık olduğunda'expandtab'
, Vim tüm sekmeleri uygun sayıda boşlukla değiştirir.
Komutun bir aralığı kabul ettiğini unutmayın, böylece görsel bir seçim yapıp ardından sadece :retab
seçilen satırları yapabilirsiniz.
:retab
Ancak belirtildiği gibi kullanabilirsiniz , bu sadece satırın başındaki sekmeleri değil tüm sekmeleri boşluk olarak değiştirir.
Yani bu ( ⇥
bir sekme karakteri):
if :; do
⇥echo "⇥hello"
end
olarak değiştirilir ( ␣
boşluk karakteri nerede ):
if :; do
␣␣echo "␣␣hello"
end
Bu, bazı senaryolarda beklenmeyen yan etkiler yaratabilir ve boşlukları sekmelere değiştirirken daha da büyük bir sorun yaratır!
Bu yüzden satırın başında sadece sekmeleri / boşlukları değiştirmek için küçük bir fonksiyon yazdım :
" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
let l:spaces = repeat(' ', &tabstop)
" Replace tabs with spaces
if a:expandtab
silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
" Replace spaces with tabs
else
silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
endif
endfun
Bu sürümle, expandtab
işlev çağrısında manuel olarak belirtmeniz gerekir (yani :call Retab(1)
, sekmeleri boşluklara dönüştürmek için), ancak aynı şekilde &expandtab
olduğu gibi (zaten &tabstop
olduğu gibi) geçerli değerini alacak şekilde de değiştirebilirsiniz :retab
. (Manuel olarak belirtmeyi tercih ediyorum).
a
yılında if a:expandtab
ortalama?
set expandtab
sizin .vimrc ve daha sonra autocmd BufWritePre * :call Retab(&expandtab)
- girinti yerine boşluk, sekmeler için değiştirilecektir.
Vim, verilen yeni tabstop (eg ) değerini kullanarak !retab
tüm dizileri <Tab>
yeni beyaz boşluk dizileriyle değiştirecek komut sağlar :set tabstop=2
, ancak dizelerin içindeki tüm sekmeler değiştirilebilir (örneğin, bir C programında \t
bunu önlemek için kullanmalısınız )!
Alternatif olarak, aşağıdaki komutu kullanarak tüm sekmeleri boşluklara çevirebilirsiniz:
:%s/\t/ /g
veya @Shahbaz tarafından önerildiği gibi :
:%s/^\t\+/ g
Böylece sadece girintide kullanılan sekmeler dönüştürülür.
Açıklama:
%
tamponun tamamını gösterir ( :help :%
)s
yerine geçen ( :help sub-replace-special
) anlamına gelir\t
, veya ^I
sekme için duruyor
- bir sekme için istediğiniz kadar boşluk kullanıng
- global anlamına gelir ve aynı satırdaki birden fazla sekme oluşumunu dönüştürürSonra tüm dosyanın girinti düzeltmek için, sen deneyebilirsiniz: gg=G. Kontrol Et: Daha fazla ayrıntı için hatalı girintili kodu tekrar girin .
Boşlukları sekmeler yerine varsayılan olarak kullanmak için, aşağıdaki ayarları .vimrc
dosyanıza eklemeniz gerekir :
set tabstop=2 " (ts) width (in spaces) that a <tab> is displayed as
set expandtab " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2 " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)
Alternatif çözüm kullanmaktır tidy
İlgili:
%s/^\t\+/ g
sadece girintide kullanılan sekmelerin dönüştürülmesi için yapardım . Ayrıca, gg=G
python gibi dillerle yıkıcı olabilir.
Kullanmayı deneyin:
expand -t 4 input_filename output_filename
expand
sekmeleri kabuktan çalıştırabileceğiniz boşluklara dönüştüren bir komut satırı aracıdır :!expand
.
Bu var POSIX'deki çoğu sistemlerde mevcut olmalıdır böylece. unexpand
Bu arada, tersini yapacak.
expand
?
:%!expand -t 4
vim içinde yapabilirsin . Daha da iyisi, mevcut kaydırma genişliği seçeneğini de kullanabilirsiniz: :exe '%!expand -t ' . &shiftwidth
Bütünlüğü sağlamak için, =
sekmelerin boşluklarla değiştirilir belirttiğiniz sonra da, girintileri düzeltmek için kullanılabilir. Normal modda, yazarak yapabilirsiniz :set expandtab
. Sonra =
iki şekilde kullanılabilir:
=
seçilen kod bloklarının girintilerini düzeltir.gg=G
tüm dosyayı, şike yapacak gg
, ardından dosyanın başına imleci hareket =
uygulanır ve G
dosyanın sonuna imleci hareket ettirir.Referans: link
:h vim-faq
ve arama/tab characters
. Ezberlemek etiketi zor:h faq-14.16
.