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


86

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

Я видел предложения, которые :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).
Дастробу

Мне нравится, что счет не исчезает через секунду, как g<CTRL-g>в принятом ответе.
Честер

8

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

Вы можете использовать wcLinux без необходимости сохранять файл, направив :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 записано.


Это гольф красиво для одноразового использования.
Сиро Сантилли 事件 改造 中心 法轮功 六四 事件

3

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

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

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

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

Когда я пытаюсь это сделать, gVim жалуется на незамкнутую последовательность выражений. Я заметил, что вам не хватает скобок, но исправление, которое тоже не помогает. Вот что я переписал:: set statusline =% {line2byte (line ("$"))}
OwenP

@OwenP: должно быть исправлено сейчас
Акира

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

1
Также я думаю, что вам нужно сбежать из пробелов или просто избавиться от них.
интуитивно

Отредактировано для включения предложений @ intuited, также добавляется в строку состояния, а не перезаписывает ее.
joeytwiddle

0

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

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


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.