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.?

cdleary
sumber
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).

Simon Howard
sumber
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 .

Jeremy W. Sherman
sumber
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
2
Dokumentasi untuk opsi ini ada di vimdoc.sourceforge.net/htmldoc/options.html#%27colorcolumn%27
JohnTESlade
54

Cara yang lebih pendek:

match ErrorMsg '\%>80v.\+'
Maksim Vi.
sumber
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
wieczorek1990
sumber
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.

Z.Zen
sumber
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.

Dominykas Mostauskis
sumber
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

0x8BADF00D
sumber
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 .

Diabaikan
sumber
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).

Matthew Scharley
sumber
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.

Lucas Oman
sumber
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).

Aristoteles Pagaltzis
sumber
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.

Ding-Yi Chen
sumber
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> 
ErichBSchulz
sumber
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.

Mike L
sumber