Vim 80 menyangkut tata letak kolom


417

Cara saya lakukan indikasi 80-kolom di Vim sepertinya tidak benar: set columns=80. Kadang-kadang saya juga set textwidth, tetapi saya ingin dapat melihat dan mengantisipasi garis meluap dengan set columnsalternatifnya.

Ini memiliki beberapa efek samping yang tidak menguntungkan :

  1. Saya tidak bisa set numberkarena takut memisahkan antara file yang memiliki urutan nomor baris yang berbeda; yaitu <100 file baris dan> = 100 file baris akan memerlukan dua set columnsnilai berbeda karena kolom tambahan yang digunakan untuk tampilan digit tambahan.
  2. Saya juga memulai sesi baru (g) ​​Vim alih-alih membelah jendela secara vertikal. Ini karena vsplitmemaksa saya untuk set columnssetiap kali saya membuka atau menutup panel, jadi memulai sesi baru tidak terlalu merepotkan.

Bagaimana Anda menangani indikasi 80 karakter saat Anda ingin set numbers, membagi secara vertikal, dll.?


60
Itu dianggap gaya kode yang baik di banyak kalangan; misalnya, Panduan Gaya Python (PEP8) merekomendasikan 79 baris karakter: python.org/dev/peps/pep-0008
cdleary

4
Ini bukan mutlak "Anda harus memiliki 80 karakter", tetapi itu membuatnya lebih baik untuk membaca pada beberapa sistem, seperti misalnya aplikasi berbasis konsol yang tidak berjalan di dalam jendela konsol GUI yang dapat diubah ukurannya.
Matthew Scharley

47
@ davr: Pertama, lebih mudah dibaca. Beberapa studi menunjukkan panjang garis pendek (76 karakter per baris) paling menyenangkan dan tercepat untuk dibaca online. Apakah Anda tahu ini: tiba-tiba mata Anda berada di garis yang salah saat membaca? Ini jarang terjadi dengan 80 karakter. Kedua, saya sering mengedit atau secara visual berbeda dengan dua file berdampingan pada monitor 1600 pixel saya. Ini hanya berfungsi dengan baik jika file tidak memiliki garis lebih dari 80 karakter. Jadi saya sering memformat ulang antrean panjang sebelum saya dapat bekerja secara efisien.
nalply

25
@davr sangat berguna untuk mengedit beberapa file berdampingan.
aehlke

2
Saya membuat bug yang jauh lebih sedikit baik di C / C ++ dan kode JS karena saya mengadopsi lebar garis 80 char (dari gaya pengkodean kernel). Saya kadang-kadang meluap oleh pasangan, tetapi jarang ...
Mark K Cowan

Jawaban:


586

Saya sudah mengatur ini di .vimrc saya:

highlight OverLength ctermbg=red ctermfg=white guibg=#592929
match OverLength /\%81v.\+/

Ini menyoroti latar belakang dengan warna merah halus untuk teks yang melampaui batas 80 kolom (bagaimanapun juga dalam mode GUI - dalam mode terminal kurang begitu).


3
Ide yang hebat! Saya mengubahnya menjadi "ctermbg = darkred" dan "guibg = # FFD9D9" agar sesuai dengan kebutuhan saya dengan lebih baik (latar belakang terang di gvim dan gelap dalam mode cterm).
HS.

10
Saya pikir koreksi halus adalah / \%81v.\+/ - untuk beberapa alasan. * Menyoroti tempat-tempat di mana karakter tidak ada.
cdleary

14
Saya pikir baris ini sedikit lebih baik untuk regex pertandingan: match OverLength /\%>80v.\+/ Ini tidak menyoroti karakter 'ujung garis' dan juga lebih intuitif karena Anda hanya mengatur angka ke apa yang Anda inginkan panjang garis menjadi, bukan +1.
David Terei

8
Untuk beberapa alasan ia hanya berfungsi di buffer pertama yang dibuka untuk saya (jendela pertama dari tab pertama) di vim saya ...
lajarre

3
Periksa stackoverflow.com/a/10993757/9822 jika solusi ini hanya berfungsi di buffer pertama Anda.
Jesse Vogt

769

Pada vim 7.3, Anda dapat menggunakan set colorcolumn=80( set cc=80singkatnya).

Karena versi sebelumnya tidak mendukung ini, saya .vimrcmenggunakan:

if exists('+colorcolumn')
  set colorcolumn=80
else
  au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)
endif

Lihat juga dokumentasi online pada colorcolumnopsi .


26
Anda bahkan dapat secara otomatis mendasarkan nilai 'colorcolumn' pada 'textwidth' dengan sesuatu seperti: set cc = + 1
graywh

1
telah ("colorcolumn") tidak berfungsi untuk saya. Saya harus menggunakan exist ("& colorcolumn") sebagai gantinya.
SpoonMeiser

5
Sangat bagus, kecuali vim <7.1.40 tidak mendukung matchadd.
Greg Jandl

19
Anda juga dapat mengubah warna kolom denganhighlight ColorColumn ctermbg=7
null_radix


54

Cara yang lebih pendek:

match ErrorMsg '\%>80v.\+'

8
Saya sangat suka ini karena tidak mencemari buffer saya dengan garis vertikal panjang! (Y)
Ionică Bizău

ErrorMsgadalah a highlight-group. Ada banyak grup highlight default di Vim yang dapat Anda gunakan berdasarkan pengodean warna yang Anda inginkan untuk kasus ini.
crisron

49

Saya lebih memilih:

highlight ColorColumn ctermbg=gray
set colorcolumn=80

Saya suka yang ini. Saya menggunakan warna hitam, bukan abu-abu dan lebih halus karena latar belakang saya hampir hitam tetapi tidak cukup.
Osilasi Isopycnal

30

Jawaban Simon Howard luar biasa. Tetapi /\%81v.\+/gagal untuk menyoroti tab yang melebihi kolom 81. Jadi saya melakukan sedikit penyesuaian, berdasarkan hal-hal yang saya temukan di VIM wiki dan pilihan warna HS di atas:

highlight OverLength ctermbg=darkred ctermfg=white guibg=#FFD9D9
match OverLength /\%>80v.\+/

Dan sekarang VIM akan menyorot apa pun yang melebihi kolom 80.


2
Mungkin ingin menambahkan guifg=whitedi ujung sana.
Dan Bechard

17

masukkan deskripsi gambar di sini

Pendekatan minimalis, tidak berlebihan. Hanya karakter garis ke-79 yang terlalu panjang yang disorot. Ini mengatasi beberapa masalah umum: bekerja di jendela baru, kata-kata yang berlebihan disorot dengan benar.

augroup collumnLimit
  autocmd!
  autocmd BufEnter,WinEnter,FileType scala,java
        \ highlight CollumnLimit ctermbg=DarkGrey guibg=DarkGrey
  let collumnLimit = 79 " feel free to customize
  let pattern =
        \ '\%<' . (collumnLimit+1) . 'v.\%>' . collumnLimit . 'v'
  autocmd BufEnter,WinEnter,FileType scala,java
        \ let w:m1=matchadd('CollumnLimit', pattern, -1)
augroup END

Catatan: perhatikan FileType scala,javaini membatasi ini untuk file sumber Scala dan Java. Anda mungkin ingin menyesuaikan ini. Jika Anda menghilangkannya, itu akan berfungsi pada semua jenis file.


Mengapa Anda menambahkan FileType scala,java? (tidak bekerja untuk saya)
Dorian

1
@Dorian membatasi ini untuk tipe file Scala dan Java, karena itu adalah tipe file yang saya kerjakan pada saat itu. Saya lupa menyebutkan itu. Memperbarui jawaban.
Dominykas Mostauskis

Font apa yang Anda gunakan di tangkapan layar? Saya merasa sangat enak dipandang.
Benteng

@Idigas: Setuju, dan saya merasa mungkin Comic Sans mungkin merupakan pilihan yang buruk ketika saya awalnya mengatur Putty :)
Mark K Cowan

Saya tidak bisa mendapatkan cuplikan dalam jawaban ini untuk berfungsi di Vim 7.4. (Saya juga menghapus filter FileType.)
Mnebuerquo

13

Anda juga dapat menggambar garis untuk melihat batas 80:

let &colorcolumn=join(range(81,999),",")
let &colorcolumn="80,".join(range(400,999),",")

Hasil:

masukkan deskripsi gambar di sini


13

Cara yang bagus untuk menandai hanya karakter pertama yang keluar dari batas yang ditentukan:

highlight ColorColumn ctermbg=magenta "set to whatever you like
call matchadd('ColorColumn', '\%81v', 100) "set column nr

Dari pembicaraan Damian Conway .


7

Versi vim yang lebih baru memungkinkan :set numberwidth=xnilai, yang menetapkan lebar tampilan nomor baris. Saya tidak benar-benar menggunakan lipat dll, jadi saya tidak akan tahu tentang itu. Menggambar garis vertikal tipis di luar kemampuan aplikasi konsol. GVim boleh mengizinkan ini (saya tidak menggunakannya, jadi tidak bisa berkomentar di sana).


5

Saya khawatir Anda telah menempatkan kendala pada set solusi itu, well, meninggalkan Anda dengan set nol.

Menggunakan :set textwidth=80akan memperbaiki semua masalah yang Anda sebutkan kecuali bahwa Anda tidak dapat dengan mudah melihat batas garis yang muncul. Jika Anda :set ruler, Anda akan mengaktifkan tampilan posisi x, y pada bilah status, yang dapat Anda gunakan untuk melihat kolom tempat Anda berada.

Selain itu, saya tidak yakin harus mengatakan apa kepada Anda. Sayang kehilangan kolom angka, kolom lipat dan split hanya karena Anda harus :set columns=80.


Ya, saya takut itu ... Saya berharap akan ada cara tersembunyi untuk menggambar garis vertikal tipis seperti di editor yang lebih berorientasi grafis.
cdleary

5

Anda dapat mencoba ini:

au BufWinEnter * if &textwidth > 8
\ | let w:m1=matchadd('MatchParen', printf('\%%<%dv.\%%>%dv', &textwidth+1, &textwidth-8), -1)
\ | let w:m2=matchadd('ErrorMsg', printf('\%%>%dv.\+', &textwidth), -1)
\ | endif

Itu akan mengatur dua sorotan di setiap buffer, satu untuk karakter di 8 kolom sebelum apa pun &textwidthyang diatur, dan satu untuk karakter di luar kolom itu. Dengan begitu Anda memiliki tingkat antisipasi. Tentu saja Anda dapat men-tweak untuk menggunakan lebar yang berbeda jika Anda ingin lebih atau kurang antisipasi (yang Anda bayar dalam bentuk hilangnya sintaks yang disorot di kolom tersebut).


3

Nah, melihat pada: kolom bantuan, itu tidak benar-benar dibuat berantakan.

Di konsol, biasanya ditentukan oleh pengaturan konsol (yaitu terdeteksi secara otomatis); di GUI, ia menentukan (dan ditentukan oleh) lebar jendela gvim.

Jadi biasanya Anda hanya membiarkan konsol dan manajer jendela melakukan pekerjaan mereka dengan berkomentar set columns

Saya tidak yakin apa yang Anda maksud dengan "melihat dan mengantisipasi garis meluap". Jika Anda ingin EOL dimasukkan kira-kira kolom 80, gunakan salah satu set textwidthatau set wrapmargin; jika Anda hanya ingin soft wrap (yaitu garis dibungkus, tetapi tidak ada EOL yang sebenarnya), maka mainkan dengan set linebreakdan set showbreak.


2

yang ini di luar bidang kiri tetapi ini adalah peta kecil yang bagus untuk mengubah ukuran pemisahan Anda saat ini menjadi 80 karakter jika Anda memiliki nomor baris di:

" make window 80 + some for numbers wide  
noremap <Leader>w :let @w=float2nr(log10(line("$")))+82\|:vertical resize <c-r>w<cr> 

1

Anda dapat mencoba ini untuk mengatur ukuran jendela untuk memungkinkan 80 karakter teks yang sebenarnya. Ini masih tidak bekerja dengan pemisahan vertikal.

let &co=80 + &foldcolumn + (&number || &relativenumber ? &numberwidth : 0)

Ini membutuhkan vim 7+, 7.3 untuk jumlah yang relatif.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.