Порахуйте виділену довжину рядка в VIM


24

Цікаво, чи існує спосіб підрахунку виділених символів vim(включаючи пробіли)?

ОНОВЛЕННЯ

Візуальний режим VIM

Він показує кількість рядків, якщо мій вибір є в декількох рядках. Мені потрібна кількість символів.

Відповіді:


28

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

- ВІЗУАЛЬНІ - 12

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

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


4
(приголомшено) Як чорт я так довго використовував Vim і ніколи цього не помічав ? Але на свій захист я думав про те, щоб отримати номер програмно.
njd

Хороша відповідь, але погляньте на оновлене запитання. Як і @njd, я цього не помічав.
Немоден

1
@Nemoden: Спробуйте другу частину пропозиції garyjohn (g Ctrl-G). Він повинен показувати рядок типу "Вибране # з # рядків; # з # Слова; # з # байтів."
peth

Ой. Моє ліжко. Я не знаю, чому я пропустив друге рішення. Це працює. Дякую!
Немоден

12
У деяких системах це не включено за замовчуванням. Просто додайте set showcmdдо свого, vimrcщоб увімкнути це.
Тайлер Холієн

8

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

Як йдеться в запитанні, навіть звичайні vперемикаються з числа символів на кількість ліній, якщо виділення охоплює кілька рядків. Однак g CTRL-Gробота це прекрасно.
joeytwiddle

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

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


2

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

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

У цьому випадку, якщо ви користуєтесь системою, схожою на UNIX, ви можете використовувати wc команду для цього.

Найпростіший спосіб - замінити вибраний текст на вихід команди, ввівши (з обраним текстом):

:!wc

(потім натисніть клавішу Enter).

Це буде показано у вашому командному рядку як:

'<,'>!wc

Прочитавши інформацію, ви можете скасувати її u щоб повернутися туди, де ви почали.

Примітка. Ця обробка проводиться лише цілими рядками . Якщо ви хочете часткових ліній, я думаю, що @ garyjohn'sg_CTRL-G - найкраща ставка.

Ви можете уникнути необхідності скасувати, замість цього запустивши:

:w !wc

Це "записує" вибрані рядки на стандартний вхід команди, а вихід команди відображатиметься у новому тимчасовому буфері, залишаючи початковий недоторканим. Див. Для :help :write_cотримання додаткової інформації.

Примітка: я отримав :write_cінформацію від: /programming/1237780/vim-execute-shell-command-without-filtering

Тепер, більш загально:

Цей приклад с wc досить спрощеним, але ви можете уявити, як це потужний підхід. У UNIX вже є багато команд для обробки тексту, і ви можете використовувати їх всередині Vim досить легко, не торкаючись Vimscript (yech).

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

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

Можна зробити те ж саме в Windows, але Windows не має настільки багатого вбудованого набору команд. Ви завжди можете встановити GNUWin32 або подібне, щоб отримати ці переваги.


1

Для програмного способу в vimscript це працювало для мене, коли вибір обмежений одним рядком:

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

(Використовуючи virtcol(..)замість того col(..), щоб він працював так, як очікувалося, коли :set ve=allактивний.)

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