21

Интересно, есть ли способ подсчета выделенных символов в vim (включая пробелы)?

ОБНОВИТЬ

VIM визуальный режим

Он показывает количество строк, если мой выбор на нескольких строках. Мне нужно количество символов.

5 ответов5

24

Если я не пропустил что-то, Вим уже делает это. Если я выделю какой-нибудь текст с помощью мыши или, введя v и переместив курсор, я увижу внизу экрана

-- VISUAL --                                        12

где число справа - это количество выделенных символов. Это работает только в том случае, если выделение находится в одной строке, в противном случае отображается количество строк.

Вы также можете визуально выбрать некоторую область текста и набрать g Ctrl-G, которая покажет количество выбранных строк, слов и байтов.

6

Vim переключается между отображением количества символов и количества строк для визуализируемого текста в зависимости от того, что и как вы визуализируете (vim 7.4 исправлен до сентября 2015 года)

V will display line count
v$ will display character count

Если вы визуализируете более одной строки, отображается только количество строк.

g-CTRL-G displays 'byte count' which seems to be 'char count' +1 per line
2

По вашему скриншоту я вижу, что вы работаете в Windows, поэтому этот ответ может вам не сильно помочь. Но для других ...

Недостаточно используемая (IMO) особенность Vim - позволить внешним командам выполнять тяжелую работу.

В этом случае, если вы находитесь в UNIX-подобной системе, вы можете использовать команду wc для этого.

Самый простой способ - заменить выделенный текст выводом команды, набрав (с выделенным текстом):

:!wc

(затем нажмите ввод).

Это будет показано в вашей командной строке как:

'<,'>!wc

После того, как вы прочитали информацию, вы можете отменить с u чтобы вернуться к тому, с чего вы начали.

Примечание. Эта обработка выполняется только для целых строк . Если вам нужны частичные строки, я думаю, что @ garyjohn's g_CTRL-G - ваш лучший выбор .

Вы можете избежать необходимости отмены, вместо этого запустив:

:w !wc

Это "записывает" выбранные строки в стандартный ввод команды, и вывод команды будет отображаться в новом временном буфере, оставляя исходный нетронутым. Смотрите :help :write_c для получения дополнительной информации.

Примечание: я получил информацию :write_c от: https://stackoverflow.com/questions/1237780/vim-execute-shell-command-without-filtering

Теперь в целом:

Этот пример с wc довольно прост, но вы можете представить, насколько это мощный подход. В UNIX уже доступно много команд для обработки текста, и вы можете использовать их в Vim довольно легко, не трогая Vimscript (yech).

Кроме того, любая написанная вами программа командной строки, которая работает со stdin/stdout, теперь может принести пользу не только вашему терминалу, но и внутри Vim.

Например, я запускаю tidy и json-format изнутри vim, чтобы сделать файлы, на которые я смотрю, более читабельными.

Вы можете сделать то же самое в Windows, но в Windows нет такого богатого набора встроенных команд. Вы всегда можете установить GNUWin32 или аналогичную версию, чтобы получить эти преимущества.

2
:function VisualLength()
:  exe 'normal "xy'
:  echo "Visual: " . strlen(@x) . "\n"
:  exe 'normal gv'
:endfunction

:map ,q "xy:call VisualLength()<CR>
  1. Сначала вы дергаете текущий выбор (в буфер x)

  2. Затем вы отображаете длину этого буфера: strlen(@x)
    (- VISUAL - отображается в строке состояния это скрывает, поэтому мы должны добавить новую строку)

  3. Выделите предыдущий визуальный диапазон: gv

Это не учитывает, был ли визуальный режим линейным, символьным или блочным, но этого достаточно для большинства случаев.

1

Для программного способа в vimscript это работало для меня, когда выбор ограничен одной строкой:

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

(Используя virtcol(..) вместо col(..) , чтобы он работал как положено, когда :set ve=all активен.)

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