Як я рахую слова в частині файлу, не залишаючи vim?


10

У мене файл, повний тексту (скажімо, Markdown або LaTeX). Я хотів би порахувати кількість слів у частині цього файлу.

Я знаю, що можу :! wc -w %запустити wc -w на поточному буфері. І я знаю, що я можу залучити розділ, що цікавиться, до названого реєстру. Я здогадуюсь, є спосіб надіслати іменний реєстр в операційну систему для використання в команді або трубі, але я не зміг його знайти. Або є кращий спосіб порахувати слова в реєстрі?

Мій випадок використання полягає в тому, що я багато пишу непрограмування (примітки, тези тощо) in vim, і я хотів би порахувати, скільки слів я додав до заданого розділу файлу в середині редагування сесія.

Відповіді:


16

Ви можете використовувати gCTRL+g, що дасть вам:

Col 1 of 118-121; Line 1 of 5; Word 1 of 142; Byte 1 of 678

Ви також можете використовувати це у візуальному режимі, якщо ви хочете отримати кількість слів лише для вибору, що особливо корисно в поєднанні з текстовими об'єктами, такими як ip. (наприклад, ви можете використовувати vipg<C-g>для підрахунку слів поточного абзацу).

Див .: :help word-countі :help text-objects.


Наведений вище варіант, мабуть, кращий, але ви також можете скористатися wcутилітою для підрахунку кількості слів у розділі. Крім :! wc -w %форми, яку ви використовуєте, ви також можете використовувати :%!wc -w. Це дозволить відфільтрувати рух до інструменту оболонки (у цьому випадку %всього буфера), але ви також можете використовувати інші діапазони (наприклад, :1,5!wc -wдля перших 5 рядків, !,+5!wc -wдля поточного та наступних 5 рядків тощо). Ви також можете вибрати текст у візуальному режимі та ввести, :!wc -wщоб відфільтрувати вибраний.

Зауважте, що це замінить рух вихідним інструментом оболонки, але ви можете uскасувати це.

Дивіться :help :range!, :help rangeі ця відповідь, де я навожу більше прикладів діапазонів.


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

1
Я не мав уявлення, що ти можеш цим скористатися g<C-g>. Дивовижно!
EvergreenTree

3

Це можна досягти двома способами, чистим способом і wcспособом.

Чистий vim спосіб

Для цього можна скористатися командою пошуку та заміни. Наприклад:

:%s/\<\w\{-}\>//gn

Це робиться замість того, щоб замінити заданий візерунок чимось, він просто підраховує виникнення шаблону. Це через nпрапор. Для підрахунку слів у певному розділі (у цьому випадку рядки 5 - 15), ви можете зробити щось подібне:

:5,15s/\<\w\{-}\>//gn

Це знімає необхідність з’єднання вмісту виділення в регістр. Щоб побачити більше можливостей того, що можна поставити замість 5-15, прочитайте тему довідки для cmdline-ranges. Якщо ви хочете робити це часто, можливо, добре створити для нього відображення (або команду). Крім того, якщо ви hlsearchввімкнули, ви можете запустити :nohlsearchпізніше, щоб очистити виділення.

wcшлях

Те ж саме можна зробити і з wc. Таким же чином, як ви можете cmdline-rangesобрати область з :sкомандою, ви можете використовувати їх із зовнішніми командами. Наприклад:

:5,15!wc -w

Це виконує рядки 5 по 15 через wcкоманду. Недоліком цього є те, що він замінює цей діапазон рядків результатом команди. Ви можете скасувати цю зміну, натиснувши u. Також зауважте, що рішення vimscript може не працювати з різними мовами, оскільки \wвоно не відповідає тому, що зазвичай є символами слова в інших мовах. wcможе зробити краще в цьому \w. Крім того, ось модна команда, щоб зробити це швидше:

command -range=% -addr=lines WordCount execute '<count>!wc -w' | .y a | undo | echo @a

Зауважте, що це клобує aреєстр.

Примітка

Здається, що це також можна зробити у візуальному режимі за допомогою g<C-g>комбінації клавіш. Дивіться відповідь Carpetsmoker для пояснення цього.


Їм потрібно ag разом з n, щоб зробити їх глобальними (інакше вони відповідають лише одному слову на рядок). Другий також потребує s на початку.
Колін Макфол

1
Виправлено, вибачте з цього приводу.
EvergreenTree

1
Використовуючи \wзвуки , як ідея хорошою спочатку, але після тестування я виявив ряд проблем. Найбільшим є те, що воно не відповідатиме персонажам, überщо не стосуються ascii, тому таке слово, як просто, пропускається ( вчора було питання про це ). Крім того, слово типу e-mailвважається двома словами, оскільки -його немає \w(використання a -є дещо рідкісним в англійській мові, але дуже поширене, наприклад, у голландській). Можуть бути й інші персонажі, які ігноруються таким чином, що підводить нас до моєї останньої точки: конвенції щодо того, що вважається "словом", можуть відрізнятися ...
Мартін Турнойй,

... на різних мовах, і "належні" інструменти, як-от, wcможуть з’являтись на локальному рівні (я не знаю, чи GNU wcнасправді займається цим, до речі, інструменти GNU не відомі своєю чудовою підтримкою unicode).
Martin Tournoij

Це цікаво. Я можу додати це як плюс до wcрішення.
EvergreenTree

1

Для вживання слів:

:.,+4 s/\i\+/&/gn

. позначає поточний рядок.

Також я помістив у свій .vimrc файл:

:cabbrev zzcc   s/./&/gn

:cabbrev zzcw   s/\i\+/&/g

Я можу набрати:

:.,+6 zzcw

і zzcwволя розшириться доs/\i\+/&/g

Це zzcwпросто дивна назва, яка нічого не відповідає (для мене).

Побічний ефект - це вибраний і виділений весь файл.

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

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