Bagaimana saya bisa mendapatkan (g) Vim untuk menampilkan jumlah karakter file saat ini?

86

Saya suka menulis tutorial dan artikel untuk forum pemrograman yang sering saya kunjungi. Forum ini memiliki batas karakter per posting. Saya telah menggunakan Notepad ++ di masa lalu untuk menulis posting dan itu membuat jumlah karakter langsung di status bar. Saya mulai menggunakan gVim lebih banyak dan saya benar-benar tidak ingin kembali ke Notepad ++ pada saat ini, tetapi sangat berguna untuk memiliki jumlah karakter ini. Jika saya menghitung, saya biasanya menempelkan postingan ke Notepad ++ sehingga saya bisa melihat kapan saya sudah cukup banyak untuk mendapatkan batasnya.

Saya telah melihat saran yang :set rulerakan membantu, tetapi ini hanya memberikan jumlah karakter melalui indeks kolom saat ini pada baris saat ini. Ini akan bagus jika saya tidak menggunakan istirahat paragraf, tapi saya yakin Anda akan setuju bahwa membaca beberapa ribu karakter dalam satu paragraf tidak nyaman.

Saya membaca bantuan dan berpikir itu rulerformatakan berhasil, tetapi setelah melihat statuslineformat yang digunakannya, saya tidak melihat apa pun yang memberikan jumlah karakter untuk buffer saat ini.

Saya telah melihat bahwa ada plugin yang menambahkan ini, tapi saya masih mencelupkan jari kaki saya ke gVim dan saya tidak yakin saya ingin memuat plugin acak sebelum saya mengerti apa yang mereka lakukan. Saya lebih suka menggunakan sesuatu bawaan untuk vim, tetapi jika tidak ada itu tidak ada.

Apa yang harus saya lakukan untuk mencapai tujuan saya? Jika melibatkan plugin, apakah Anda menggunakannya dan seberapa baik kerjanya?

OwenP
sumber

Jawaban:

140

Tekan g CTRL-Gdalam mode normal untuk menampilkan beberapa statistik pada kursor dan file.

Jika Anda berada di linux, Anda dapat menggunakan wc -muntuk mendapatkan jumlah karakter dalam file saat ini

:!wc -m %

Karena tidak diperbarui secara waktu nyata, mungkin Anda ingin memetakan perintah ini ke sesuatu seperti:

map <F4> :!wc -m %<CR>
mrucci
sumber
19
g CTRL-GSaya tidak tahu ini ada. Bagus!
Jason Down
Bagus, saya terus lupa menggunakan perintah bang! Di Vim
Eddie B
3
g <cg> bekerja lintas platform yang bagus.
AndrewPK
Di mana saya dapat menemukan lebih banyak info tentang penggunaan ! [...] %?
Wajan
Bantuan ada di sini: vimdoc.sourceforge.net/htmldoc/various.html#:!cmd . Jika Anda banyak menggunakan perintah shell, periksa juga plugin ini: stevelosh.com/projects/clam .
mrucci
24
:help count-items

menunjukkan, bahwa Anda bisa melakukan dry-a ganti ala

:%s/./&/gn

(yang kemudian melaporkan kembali jumlah karakter yang cocok) atau bahwa Anda menyukai strlen()teks yang dipilih secara visual:

:echo strlen(@")

("adalah register yang tidak disebutkan namanya)

karena Anda dapat memanggil ekspresi di baris status Anda seperti %{myfunc()}itu mungkin merupakan titik awal yang baik. menghitung semua waktu bisa sedikit memakan waktu karena Anda harus memilih seluruh teks dan kemudian mencabutnya, tetapi mungkin menunjukkan jumlah byte dalam "-register ok untuk Anda sudah. ​​jika Anda benar-benar ingin tahu nomornya karakter di buffer: cukup pilih SEMUA teks secara visual dalam buffer dan tarik, jadi solusinya adalah:

 :set statusline=%{strlen(@")}

yang memberi Anda jumlah karakter dalam "-register (yang identik dengan jumlah byte jika Anda memilih dan menarik buffer saat ini).

akira
sumber
Solusi juga berfungsi di Windows (yang perintah bash tidak akan).
dastrobu
Saya suka bahwa penghitungan tidak hilang setelah sedetik menyukai g<CTRL-g>metode dalam jawaban yang diterima.
Chester
8

Peningkatan untuk jawaban mrucci:

Anda dapat menggunakan wcdi linux tanpa harus menyimpan file terlebih dahulu dengan mengarahkan :woutput perintah sebagai berikut:

:w !wc -m

dan Anda dapat memetakannya ke sesuatu seperti yang disebutkan oleh mrucci.

arsitektonis
sumber
6
:help statusline

Memberi anda

o N   Byte number in file of byte under cursor, first byte is 1.
      Mnemonic: Offset from start of file (with one added)

yang juga merupakan solusi yang baik untuk masalah Anda. langsung saja ke ujung buffer dengan Gdan nomor byte yang ditampilkan di statusline Anda adalah jumlah karakter (tentu saja tidak dengan karakter multi-byte). kembali ke tempat asalmu ctrlo.

akira
sumber
1
Ini bermasalah dengan karakter multi-byte. Saya menemukan pertanyaan ini setelah meletakkan% o di status saya :)
Matt
@ Matt: jadi, apa solusinya?
akira
1
solusi mrucci "g ^ g" dalam mode normal cukup baik untuk saya. Saya memerlukannya untuk debug cepat, jadi saya belum meluangkan waktu untuk mencoba dan mendapatkan informasi di baris status.
Mat
1
Karena dokumen tidak jelas dan membingungkan, perlu dicatat bahwa perintah khusus yang perlu dijalankan adalah set statusline+=\ %o\ %N (yang menarik, itu tidak berfungsi untuk item mis. "T S") . Maka jika Anda melihat status tidak berubah, itu karena Anda harus mengeksekusi set laststatus=2. Bagi saya itu menggantikan status transparan yang ada dengan yang baru, menjadi hitam pekat, dan hanya memiliki "byte count" item.
Hi-Angel
3

Jika Anda terbiasa menggunakan: w untuk menyimpan file, setiap kali Anda melakukannya, status melaporkan kembali jumlah karakter yang ditulis. Sebagai contoh, pada akhir kalimat ini saya melakukan: w (ya saya menggunakan gvim untuk menulis catatan ini) dan dilaporkan: 245C ditulis.

Erin Thomas
sumber
Golf ini indah untuk sekali pakai.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
3

Anda dapat menambahkan ekspresi untuk menampilkan bytecount buffer di baris status dengan:

:set statusline+=\ %{\ line2byte(line(\"$\")+1)-1\ }B

Atau Anda dapat mengubah variabel opsi secara langsung untuk menghindari semua yang lolos:

:let &statusline .= ' %{ line2byte(line("$")+1)-1 }B'
akira
sumber
Ketika saya mencoba ini, gVim mengeluh tentang urutan ekspresi yang tidak tertutup. Saya perhatikan Anda tidak memiliki tanda kurung, tetapi memperbaikinya juga tidak membantu. Inilah yang saya tulis ulang untuk:: set statusline =% {line2byte (line ("$"))}
OwenP
@WenP: harus diperbaiki sekarang
akira
1
Mungkin Anda ingin ...%{ line2byte(line(\"$\")+1))-1 }agar itu menyertakan karakter baris terakhir dalam hitungan. Pendekatan ini tidak akan menghitung karakter multibyte dengan benar.
intuited
1
Juga saya pikir Anda perlu melarikan diri dari ruang, atau hanya menyingkirkannya.
intuited
Diedit untuk memasukkan saran @ intuited, juga ditambahkan ke baris status daripada menimpanya.
joeytwiddle
0

Solusi yang saya gunakan sampai saya menerima jawaban mrucci:

Saya menemukan secara tidak sengaja bahwa ketika saya: w untuk menyimpan file, perintah menampilkan jumlah byte yang ditulis. Ini kurang lebih merupakan jumlah karakter, jadi sejauh ini sudah cukup dekat. Saya suka jawaban mrucci juga, mungkin lebih dari yang ini karena memiliki jumlah kata juga.

OwenP
sumber
0

Jika Anda menyimpan salinan file teks Anda, cukup tulis teks Anda ke disk - jumlah karakter ditampilkan secara default.

Jika Anda tidak ingin menyimpan file, hanya menyimpan teks Anda ke /dev/null: :w!/dev/null.

Anda juga dapat wcmenghitung karakter Anda: :%!wc -c- tetapi jangan lupa untuk menekan Uuntuk mengembalikan teks Anda.

Jika Anda sering membutuhkan ini, petakan saja perintah-perintah ini ke urutan kunci: :map #wc :w!/dev/null^[- perhatikan bahwa ^[harus dimasukkan sebagai Ctrl+ V Esc.

Sebagai indikator pertama ukuran teks, cukup nyalakan nomor baris; mengakui: ini membutuhkan aritmatika mental ;-)

kdo
sumber
0

Setelah memiliki pertanyaan ini dan membaca jawabannya (terima kasih mrucci) saya menambahkan baris ini ke file inisialisasi .vimrc saya.

# get full statistics on the current buffer (not perfect, may redraw screen)
map ;gg           G$g<C-G>''
# get full statistics on the current position in the buffer
map ;gh           g<C-G>

Saya membiarkannya vim: membantu pengguna untuk mencari tahu apa yang mereka lakukan.

Secara pribadi saya merasa berguna untuk memulai pemetaan Vim dengan; atau, karena saya jarang menggunakannya sebagai karakter pertama dari suatu perintah.

David E.
sumber