Word Wrap in Vim (mempertahankan indentasi)


92

Saya baru saja melihat posting ini yang menjelaskan bagaimana membungkus seluruh kata dalam vim. Solusi yang diterima adalah ini:

:set formatoptions=l
:set lbr

Yang mengambil teks ini (tab ditampilkan sebagai \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Ini menyelesaikan perilaku seperti ini (tab ditampilkan sebagai \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Namun saya ingin mendefinisikan kembali fungsi ini. Saya ingin baris yang dibungkus memiliki jumlah tab di depannya yang sama dengan baris di atas ditambah satu. Yaitu:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Ada ide?


34
+1 atas upaya yang dilakukan untuk membuat pertanyaan sejelas mungkin.
Jeffrey Jose

Apakah Anda ingin teks membungkus lembut di tepi jendela, atau membungkus keras saat garis mencapai panjang tertentu? Saya pikir Anda ingin hard-wrapping (di mana baris baru dimasukkan ke dalam teks Anda setelah kata "akan"), tetapi sulit untuk membedakannya dari contoh Anda.
Bill Odom

@Bill, saya sangat tertarik dengan softwrapping tetapi solusi hardwrapping juga dapat diterima.
sixtyfootersdude

1
Fungsionalitas yang Anda inginkan saat ini tidak ada di Vim. Namun, ada tambalan yang mendekati: groups.google.com/group/vim_dev/web/vim-patches (ini # 15, "Garis terbungkus indentasi dengan benar").
Bill Odom

Terkait: VimCasts memiliki episode yang bagus dalam menggunakan utilitas unix eksternal untuk menangani masalah ini: vimcasts.org/e/18
Damien Wilson

Jawaban:


18

The breakindent Patch memiliki apa yang Anda cari. Saya berhasil menerapkannya menggunakan instruksi yang ditemukan di utas ini:

Patch Vim dengan patch breakindent di OS X dengan Homebrew

Secara khusus, rumus Homebrew echristopherson.

Saya tahu utas ini sudah tua tetapi populer di google dan saya menemukannya beberapa kali ketika mencoba menemukan solusi.

EDIT: Patch ini sekarang disertakan dengan vim sebagai patch 7.4.338. Lihat: https://retracile.net/blog/2014/07/18/18.00

Di Yosemite (Mac OS X), saya menggunakan perintah snowbound dengan hombrew:

brew install macvim --with-features=huge --override-system-vim --HEAD 

tambalan tampaknya tidak berfungsi dengan macvim terbaru di homebrew? @ Exit42 bagaimana Anda membuatnya bekerja?
bersalju

nvm. Saya mengumpulkan macvim dengan pinggiran berdarah homebrewbrew install macvim --with-features=huge --override-system-vim --HEAD
bersalju

1
Lihat jawaban saya di bawah ini: stackoverflow.com/questions/2828174/… Tidak perlu patch di versi terbaru vim.
JoshuaD

26

Ini tidak berhasil ketika pertanyaan awalnya diajukan, tetapi mulai 25 Juni 2014, ini akan berhasil. (Dengan asumsi Anda memperbarui vim Anda ke versi yang lebih baru dari tanggal itu)

Tambahkan ke .vimrc Anda:

" Indents word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures word-wrap does not split words
set formatoptions=l
set lbr

Dan itu dia!

-

Beberapa orang (termasuk saya) berbagi satu .vimrc di banyak komputer. Dalam hal ini, penting untuk memiliki baris ini yang kuat (untuk menghindari pesan kesalahan yang mengganggu). Ini sedikit lebih baik:

if has("patch-7.4.354")
    " Indents word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures word-wrap does not split words
    set formatoptions=l
    set lbr
endif

Dengan cara ini, jika Anda menggunakan vim versi sebelumnya, Anda tidak mendapatkan pesan kesalahan.


Menariknya, ini bekerja pada 7.4 vim cygwin saya tetapi tidak di 7.4 vim unbuntu saya. Saya menduga itu perlu sedikit lebih luas, tetapi akan segera melihat adopsi universal.
JoshuaD

1
Bekerja di Vim 7.4 @ ArchLinux.
Andy Mikhaylenko

1
Anda dapat menggunakan tes ini sebagai gantinya:if has("patch-7.4.354")
Lawrence Kesteloot

Ini tidak menjawab pertanyaan tentang komentar OP: jumlah tab yang sama (...) ditambah satu . Ini juga sangat penting menurut saya, Anda mungkin sering ingin menyimpan lekukan tambahan dan menggeser segmen yang dibungkus secara optik ke kanan (daftar, catatan, dll. Yang diatur dengan ketat);
berdarah

8

Yang terbaik yang akan Anda dapatkan adalah showbreakopsi yang akan meletakkan string tetap di depan setiap baris yang dibungkus (saya gunakan set showbreak=...).


@AlexanderBird Menurut :help 'showbreak', tidak, Anda tidak bisa - showbreakhanya string.
Rory O'Kane

4

Saya setuju dengan jawaban yang mengatakan 'showbreak' adalah pilihan terbaik. Showbreak biasanya tidak memungkinkan Anda untuk meletakkan karakter noncetak (misalnya, spasi atau tab) ke dalam string showbreak, sehingga seperti yang biasa digunakan, ini hanya akan memberi Anda indikator di sepanjang margin kiri, yaitu tidak ada indentasi yang sebenarnya. Ini tidak bagus, karena tujuan utama OP, menurut saya, adalah memberi garis yang dibungkus lekukan agar tidak mengacaukan area margin kiri dan terlihat seperti garis mereka sendiri.

Jadi salah satu cara untuk menambahkan indentasi (jelek) menggunakan showbreak adalah dengan menggunakan banyak karakter, .eg, ": set showbreak => --------------->". Ini menghasilkan sesuatu yang terlihat seperti ini:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Alternatif yang lebih baik mungkin menggunakan karakter spasi yang tidak terputus (dengan asumsi instance Vim Anda diaktifkan unicode), yang masing-masing dapat dimasukkan ke string showbreak menggunakan urutan kunci ctrl-v, 160. Dengan begitu Anda bisa memasukkan string showbreak yang kosong di sisi kiri dan tampak seperti indentasi yang sebenarnya. Misalnya, ": set showbreak =.. ... ... ...... >>" where each '.' dalam perintah sebenarnya karakter spasi tidak terputus yang dimasukkan dengan menekan ctrl-V, 160. Dengan cara itu Anda akan mendapatkan bungkus yang menjorok dengan baik, seperti ini:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Anda masih tidak memiliki kemampuan untuk memvariasikan tingkat indentasi sesuai dengan indentasi baris sebelumnya, tetapi setidaknya Anda mendapatkan indentasi yang bersih dari garis yang dibungkus tanpa banyak kekacauan visual di sepanjang margin kiri jendela. Mungkin masih ada kebingungan jika indentasi baris terbungkus kurang dari awal baris sebenarnya, tetapi ini mungkin dapat dihindari dengan membuat showbreak "indentasi" cukup besar (yaitu, lebih besar daripada indentasi yang biasa ditemukan dalam kode Anda ) tetapi masih cukup kecil sehingga memberikan cukup ruang untuk pembungkusan teks yang terbaca. Untuk banyak kegunaan, saya pikir indentasi showbreak 40 atau 50 spasi akan melakukannya dengan cukup baik.


7
Anda dapat menempatkan spasi di showbreak dengan melarikan diri mereka: :set showbreak=\ \ \ \ . Namun, masih tidak berfungsi untuk tab.
Bill Odom
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.