76

Я люблю писать учебники и статьи для программирующего форума, который я часто посещаю. Этот форум имеет ограничение по количеству символов на пост. В прошлом я использовал Notepad++ для написания постов, и он хранит количество живых символов в строке состояния. Я начинаю больше использовать gVim, и я действительно не хочу сейчас возвращаться к Notepad++, но очень полезно иметь этот счетчик символов. Если я перехожу через счетчик, я обычно заканчиваю тем, что вставляю сообщение в Notepad++, чтобы я мог видеть, когда я обрезал достаточно, чтобы достичь предела.

Я видел предложения о том, что :set ruler поможет, но это дает только количество символов через текущий индекс столбца в текущей строке. Было бы замечательно, если бы я не использовал разрывы абзацев, но я уверен, что вы согласитесь, что читать несколько тысяч символов в одном абзаце неудобно.

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

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

Что я должен сделать, чтобы достичь своей цели? Если в нем используется плагин, используете ли вы его и насколько хорошо он работает?

9 ответов9

131

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

Если вы находитесь в Linux, вы можете использовать wc -m чтобы получить количество символов в текущем файле.

:!wc -m %

Поскольку он не обновляется в режиме реального времени, возможно, вы хотите отобразить эту команду примерно так:

map <F4> :!wc -m %<CR>
23
:help count-items

говорит о том, что вы могли бы либо сделать пробную замену аля

:%s/./&/gn

(который затем сообщает количество совпавших символов) или что вы делаете необычный strlen() для визуально выбранного текста:

:echo strlen(@")

("это безымянный регистр)

так как вы можете вызвать выражение в вашей строке состояния, например %{myfunc()} это может быть хорошей отправной точкой. подсчет времени может занять немного времени, так как вам нужно будет выделить весь текст, а затем восстановить его, но, возможно, показывать количество байтов в «-регистре» уже хорошо для вас. если вы действительно хотите знать число символов в буфере: просто визуально выделите ВСЕ текст в буфере и восстановите его, поэтому решение будет таким:

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

который дает вам число символов в «-регистре» (которое идентично количеству байтов, если вы выберете и восстановите текущий буфер).

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, и номер байта, показанный в вашей строке состояния, будет числом символов (конечно, это не верно для многобайтовых символов). вернитесь туда, откуда вы пришли с помощью ctrl o.

6

Улучшение ответа Mrucci:

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

:w !wc -m

и вы можете сопоставить это с чем-то, как упомянуто Mrucci.

3

Вы можете добавить выражение для отображения байтового счета буфера в строке состояния с помощью:

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

Или вы можете изменить переменную option напрямую, чтобы избежать всего этого:

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

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

0

Если вы сохраняете в файле копию своего текста, просто запишите свой текст на диск - по умолчанию отображается количество символов.

Если вы не хотите сохранять файл, просто сохраните ваш текст в /dev/null :w!/dev/null .

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

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

В качестве первого индикатора размера текста просто включите номера строк; признал: для этого нужна умственная арифметика ;-)

0

Обходной путь, который я использовал, пока не принял ответ Мруччи:

Я случайно обнаружил, что когда я:w, чтобы сохранить файл, команда выводит количество записанных байтов. Это более или менее количество символов, так что это было достаточно близко до сих пор. Мне также нравится ответ Мруччи, возможно, больше, чем этот, потому что у него тоже есть количество слов.

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; или, поскольку я редко использую их в качестве первого символа команды.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .