Як я можу отримати (g) Vim для відображення кількості символів поточного файлу?


85

Мені подобається писати підручники та статті для форуму програмування, які я часто зустрічаю. Цей форум має обмеження кількості персонажів. У минулому я використовував Notepad ++ для написання публікацій, і він зберігає підрахунок персонажів у реальному часі у рядку стану. Я починаю більше використовувати gVim, і мені дуже не хочеться повертатися до «Блокнот ++» в цей момент, але дуже корисно вважати цей символ. Якщо я перейду за рахунком, я зазвичай закінчую вставку публікації в Блокнот ++, щоб я міг побачити, коли я досить оброблений, щоб досягти межі.

Я бачив пропозиції, які :set rulerдопоможуть, але це дає лише кількість символів через поточний індекс стовпця на поточному рядку. Це було б чудово, якби я не використовував перерви абзацу, але я впевнений, що ти погодишся, що читати кілька тисяч символів в одному абзаці не комфортно.

Я прочитав довідку і подумав, що rulerformatце спрацює, але, переглянувши statuslineформат, який він використовує, я не побачив нічого, що дає кількість символів для поточного буфера.

Я бачив, що є додатки, які додають це, але я все ще занурюю свої пальці в gVim, і я не впевнений, що хочу завантажити випадкові плагіни, перш ніж я зрозумію, що вони роблять. Я вважаю за краще використовувати щось вбудоване для vim, але якщо воно не існує, воно не існує.

Що я повинен зробити для досягнення своєї мети? Якщо він включає плагін, ви його використовуєте і наскільки добре він працює?

Відповіді:


140

Натисніть g CTRL-Gу звичайному режимі, щоб відобразити статистику щодо курсору та файлу.

Якщо ви перебуваєте в Linux, ви можете використовувати wc -mдля отримання кількості символів у поточному файлі

:!wc -m %

Оскільки він не оновлюється в режимі реального часу, можливо, ви хочете скопіювати цю команду на щось на кшталт:

map <F4> :!wc -m %<CR>

19
g CTRL-GЯ не знав, що це існує. Приємно!
Джейсон Даун

Приємно, я забуваю використовувати! Bang команди у Vim
Eddie B

3
g <cg> приємно працює між платформами.
AndrewPK

Де я можу знайти більше інформації про використання ! [...] %?
Вок

Довідка тут: vimdoc.sourceforge.net/htmldoc/various.html#:!cmd . Якщо ви широко використовуєте команди оболонок, перевірте також цей плагін: stevelosh.com/projects/clam .
mrucci

24
:help count-items

припускає, що ви можете або зробити сухий запуск заміни ала

:%s/./&/gn

(яка потім повідомляє про кількість відповідних символів) або про те, що ви захоплюєтесь strlen()візуально вибраним текстом:

:echo strlen(@")

("- це неназваний реєстр)

оскільки ви можете назвати вираз у своїй статусній лінії, як %{myfunc()}це може бути хорошою відправною точкою. підрахунок всього часу може зайняти трохи часу, оскільки вам доведеться вибрати весь текст, а потім вирвати його, але, можливо, показ кількості байтів у "-реєстрі вже для вас нормально. Якщо ви дійсно хочете дізнатися число символів у буфері: просто візуально виберіть ВСІЙ текст у буфері і витягніть його. Отже, рішення буде таким:

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

що дає вам кількість символів у "-реєстрі" (що ідентично кількості байтів, якщо ви вибрали та вимкнути поточний буфер).


Рішення працює також у Windows (що bash команди не будуть).
dastrobu

Мені подобається, що підрахунок не зникає через секунду, як g<CTRL-g>метод у прийнятій відповіді.
Честер

7

Доповнення до відповіді mrucci:

Ви можете використовувати wcв Linux, не зберігаючи файл спочатку, направляючи :wкоманду на вихід таким чином:

:w !wc -m

і ви можете відобразити його на щось, про що говорили mrucci.


6
:help statusline

дає тобі

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

що також є гарним вирішенням вашої проблеми. просто перейдіть до кінця буфера з, Gа число байтів, показане у вашому статусному рядку, - це число знаків (не вірно з багатобайтовими символами звичайно). поверніться туди, звідки ви прийшли ctrlo.


1
Це проблематично з багатобайтовими символами. Я знайшов це питання після того, як розмістив% o у своєму статусі :)
Метт

@Matt: так, яке рішення?
акіра

1
Рішення mrucci "g ^ g" у звичайному режимі для мене було досить хорошим. Мені це було потрібно для швидкої налагодження, тому я не витратив часу на спробу отримати цю інформацію у статусному рядку.
Метт


1
Оскільки документи нечіткі та заплутані, варто відзначити, що конкретна команда, яку потрібно виконати, є set statusline+=\ %o\ %N (що цікаво, вона не працює, наприклад, для елемента "t S") . Тоді якщо ви бачите статус статус незмінним, це тому, що вам доведеться виконати set laststatus=2. Для мене він замінив існуючий прозорий статус статус новим, він був суцільним чорним кольором і мав лише пункт "кількість байтів".
Привіт-Ангел

3

Якщо ви звикли використовувати: w для збереження файлу, кожен раз, коли ви це робите, стан повідомляє про кількість записаних символів. Наприклад, наприкінці цього речення я зробив: w (так, я використовую gvim, щоб написати цю замітку), і він повідомив: 245C написано.


Це гольфи красиво за один раз.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

3

Ви можете додати вираз, щоб відобразити кількість рахунків буфера в рядку стану за допомогою:

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

Або ви можете змінити параметр змінної безпосередньо, щоб уникнути всього цього:

:let &statusline .= ' %{ line2byte(line("$")+1)-1 }B'

Коли я спробую це, gVim скаржиться на незакриту послідовність виразів. Я помітив, що вам не вистачає дужок, але виправити це теж не допоможе. Ось що я переписав на це:: set statusline =% {line2byte (line ("$"))}
OwenP

@OwenP: має бути виправлено зараз
akira

1
Напевно, ви хочете, ...%{ line2byte(line(\"$\")+1))-1 }щоб він включав символи останнього рядка в рахунку. Цей підхід не буде рахувати багатобайтові символи правильно.
інтуїтивно

1
Також я думаю, що вам потрібно вирватися з просторів або просто позбутися від них.
інтуїтивно

Відредаговано, щоб включити @ інтуїтивні пропозиції, також додавати до статусної лінії, а не перезаписувати.
joeytwiddle

0

Обхід, який я використовував, поки не прийняв відповідь mrucci:

Я випадково дізнався, що коли: w для збереження файлу, команда виводить кількість записаних байтів. Це більш-менш кількість символів, тому це було досить близько до цих пір. Мені подобається відповідь mrucci, можливо, більше, ніж ця, тому що вона також має кількість слів.


0

Якщо ви зберігаєте файлову копію тексту, просто запишіть текст на диск - кількість символів відображається за замовчуванням.

Якщо ви не хочете , щоб зберегти файл, просто збережіть текст /dev/null: :w!/dev/null.

Ви також можете дозволити wcпорахувати своїх персонажів: :%!wc -c- але не забудьте натиснути, Uщоб відновити текст.

Якщо вам це потрібно часто, просто зіставте ці команди на послідовність клавіш: :map #wc :w!/dev/null^[- зауважте, що ^[треба вводити як Ctrl+ V Esc.

Як перший показник розміру тексту, просто увімкніть номери рядків; зізнався: для цього потрібна певна ментальна арифметика ;-)


0

Після цього питання і прочитавши відповіді (спасибі mrucci), я додав ці рядки до свого файлу ініціалізації .vimrc.

# 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>

Я залишаю це vim: допоможіть користувачам зрозуміти, що вони роблять.

Особисто мені здається корисним починати відображення Vim; або, оскільки я рідко використовую їх як перший символ команди.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.