Hitung panjang string yang disorot dalam VIM

24

Saya bertanya-tanya apakah ada cara untuk menghitung simbol yang disorot di vim(termasuk spasi putih)?

MEMPERBARUI

Mode visual VIM

Ini menunjukkan jumlah baris jika pilihan saya ada di beberapa baris. Saya perlu jumlah simbol.

Nemoden
sumber

Jawaban:

28

Kecuali saya kehilangan sesuatu, Vim sudah melakukan itu. Jika saya menyorot beberapa teks menggunakan mouse atau dengan mengetik vdan menggerakkan kursor, saya melihat di bagian bawah layar

- VISUAL - 12

di mana angka di sebelah kanan adalah jumlah karakter yang disorot. Ini hanya berfungsi jika seleksi berada pada satu baris, jika tidak maka akan menunjukkan jumlah baris.

Anda juga dapat secara visual memilih beberapa wilayah teks dan jenis g Ctrl-Gyang akan menunjukkan jumlah baris, kata, dan byte yang dipilih.

garyjohn
sumber
4
(tercengang) Bagaimana sih saya menggunakan Vim begitu lama dan tidak pernah memperhatikan itu ? Tetapi dalam pembelaan saya, saya berpikir untuk mendapatkan nomor tersebut secara terprogram.
njd
Jawaban yang bagus, tetapi lihatlah pertanyaan yang diperbarui. Serta @njd saya tidak memperhatikan itu.
Nemoden
1
@Nemoden: Coba bagian kedua dari saran garyjohn (g Ctrl-G). Seharusnya menampilkan baris seperti "# Garis # yang Dipilih; # dari # Kata; # dari # Bytes."
peth
Oh Salahku. Saya tidak tahu mengapa saya melewatkan solusi kedua. Berhasil. Terima kasih!
Nemoden
12
Ini tidak diaktifkan secara default pada beberapa sistem. Cukup tambahkan set showcmdke Anda vimrcuntuk mengaktifkannya.
Tyler Holien
8

Vim membalik antara menampilkan jumlah karakter dan jumlah baris untuk teks yang divisualisasikan tergantung pada apa dan bagaimana Anda memvisualisasikan (vim 7.4 ditambal hingga September 2015)

V will display line count
v$ will display character count

Jika Anda memvisualisasikan lebih dari satu baris, itu hanya menampilkan jumlah baris

g-CTRL-G displays 'byte count' which seems to be 'char count' +1 per line
zzapper
sumber
Seperti yang dikatakan dalam pertanyaan, bahkan normal vberalih dari jumlah karakter ke jumlah baris jika pilihan tersebut mencakup beberapa baris. Namun g CTRL-Gmelakukan pekerjaan dengan baik.
joeytwiddle
2
:function VisualLength()
:  exe 'normal "xy'
:  echo "Visual: " . strlen(@x) . "\n"
:  exe 'normal gv'
:endfunction

:map ,q "xy:call VisualLength()<CR>
  1. Pertama, Anda menarik pilihan saat ini (ke buffer x)

  2. Kemudian Anda menampilkan panjang buffer itu: strlen(@x)
    (The - VISUAL - ditampilkan di baris status mengaburkan ini, jadi kami harus menambahkan baris baru)

  3. Sorot rentang visual sebelumnya: gv

Ini tidak memperhitungkan apakah mode visual adalah mode baris, karakter, atau blok, tetapi cukup untuk sebagian besar kasus.

njd
sumber
2

Saya melihat dari tangkapan layar bahwa Anda menjalankan di Windows, jadi jawaban ini mungkin tidak banyak membantu Anda. Tapi untuk orang lain ...

Fitur Vim yang kurang digunakan adalah membiarkan perintah eksternal melakukan pengangkatan berat.

Untuk kasus ini, jika Anda menggunakan sistem mirip UNIX, Anda dapat menggunakan wcperintah untuk melakukan itu.

Cara paling sederhana adalah mengganti teks yang dipilih dengan output dari perintah, dengan mengetik (dengan teks yang dipilih):

:!wc

(lalu tekan enter).

Ini akan ditampilkan di baris perintah Anda sebagai:

'<,'>!wc

Setelah membaca info, Anda dapat membatalkan dengan uuntuk kembali ke tempat Anda memulai.

Catatan: Pemrosesan ini dilakukan hanya pada seluruh baris . Jika Anda ingin garis parsial, saya pikir @ garyjohn g_CTRL-Gadalah taruhan terbaik Anda.

Anda dapat menghindari keharusan membatalkan dengan menjalankan:

:w !wc

Ini "menulis" baris yang dipilih ke input standar perintah, dan output dari perintah akan ditampilkan dalam buffer sementara baru, meninggalkan yang asli tidak tersentuh. Lihat :help :write_cuntuk info lebih lanjut.

Catatan: Saya mendapat :write_cinfo dari: /programming/1237780/vim-execute-shell-command-without-filtering

Sekarang, secara lebih umum:

Contoh dengan wcini cukup sederhana, tetapi Anda dapat membayangkan bagaimana ini merupakan pendekatan yang kuat. UNIX memiliki banyak perintah pemrosesan teks yang sudah tersedia, dan Anda dapat menggunakannya dengan mudah di Vim, tanpa harus menyentuh Vimscript (yech).

Lebih jauh, setiap program commandline yang Anda tulis yang berhubungan dengan stdin / stdout sekarang tidak hanya menguntungkan Anda di terminal Anda, tetapi juga di dalam Vim.

Saya menemukan diri saya, misalnya, menjalankan tidydan json-formatdari dalam vim untuk membuat file yang saya lihat lebih mudah dibaca.

Anda dapat melakukan hal yang sama pada Windows, tetapi Windows tidak memiliki seperangkat perintah bawaan yang begitu banyak. Anda selalu dapat menginstal GNUWin32 atau serupa untuk mendapatkan manfaatnya.

jwd
sumber
1

Untuk cara terprogram dalam vimscript, ini bekerja untuk saya ketika seleksi dibatasi dalam satu baris:

let amount = virtcol("'>") - virtcol("'<")

(Menggunakan virtcol(..)bukannya col(..), sehingga berfungsi seperti yang diharapkan saat :set ve=allaktif.)

Evgeni Sergeev
sumber