Làm cách nào để tôi đếm các từ trong một phần của tệp mà không để lại vim?


10

Tôi có một tệp đầy văn bản (nói Markdown hoặc LaTeX). Tôi muốn đếm số lượng từ trong một phần của tập tin này.

Tôi biết tôi có thể làm :! wc -w %để chạy wc -w trên bộ đệm hiện tại. Và tôi biết rằng tôi có thể chuyển phần quan tâm vào một sổ đăng ký có tên. Tôi đoán có một cách để gửi một thanh ghi có tên đến hệ điều hành để sử dụng trong một lệnh hoặc đường ống, nhưng tôi không thể tìm thấy một. Hoặc có cách nào tốt hơn để đếm các từ trong sổ đăng ký?

Trường hợp sử dụng của tôi là tôi thực hiện nhiều bài viết không lập trình (ghi chú, luận văn, v.v.) trong vim và tôi muốn đếm xem có bao nhiêu từ tôi đã thêm vào một phần nhất định của tệp ở giữa phần chỉnh sửa phiên.

Câu trả lời:


16

Bạn có thể sử dụng gCTRL+g, sẽ cung cấp cho bạn:

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

Bạn cũng có thể sử dụng điều này từ chế độ trực quan, nếu bạn muốn lấy số lượng từ chỉ cho lựa chọn, điều này đặc biệt hữu ích kết hợp với các đối tượng văn bản như ip. (ví dụ: bạn có thể sử dụng vipg<C-g>để lấy số từ của đoạn hiện tại).

Xem: :help word-count:help text-objects.


Tùy chọn trên có lẽ tốt hơn, nhưng bạn cũng có thể sử dụng wctiện ích để đếm số lượng từ trong một phần. Ngoài :! wc -w %hình thức bạn sử dụng, bạn cũng có thể sử dụng :%!wc -w. Điều này sẽ lọc chuyển động đến một công cụ shell (trong trường hợp này %là toàn bộ bộ đệm), nhưng bạn cũng có thể sử dụng các phạm vi khác (chẳng hạn như :1,5!wc -wcho 5 dòng đầu tiên, !,+5!wc -wcho 5 dòng hiện tại và 5 dòng tiếp theo, v.v.). Bạn cũng có thể chọn văn bản ở chế độ trực quan và nhập :!wc -wđể lọc lựa chọn của bạn.

Lưu ý rằng điều này sẽ thay thế chuyển động bằng đầu ra của công cụ shell, nhưng bạn có thể uhoàn tác điều này.

Xem :help :range!, :help rangecâu trả lời này , nơi tôi đưa ra nhiều ví dụ về phạm vi.


Tôi đã tìm thấy một cái gì đó như thế này trong khi tìm kiếm, nhưng đã bỏ lỡ rằng g đầu tiên là một phần của lệnh đếm, không phải là một công cụ xác định vị trí. Giải pháp này có ý nghĩa bây giờ. Tôi rõ ràng cũng nên đọc lên trên chế độ Visual; Tôi không sử dụng nó thường xuyên đủ.
Colin McFaul

1
Tôi không có ý tưởng rằng bạn có thể sử dụng g<C-g>theo cách đó. Tuyệt vời!
EvergreenTree

3

Có hai cách này có thể được thực hiện, cách vimscript thuần túy và wccách.

Cách vim thuần

Bạn có thể sử dụng lệnh tìm kiếm và thay thế để làm điều này. Ví dụ:

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

Điều này làm là thay vì thay thế một mẫu nhất định bằng một cái gì đó, nó chỉ đếm các lần xuất hiện của mẫu. Điều này là do ncờ. Để đếm các từ trong một phần cụ thể (trong trường hợp này là dòng 5 đến 15), bạn có thể làm một cái gì đó như thế này:

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

Điều này loại bỏ sự cần thiết phải đưa nội dung của lựa chọn vào một thanh ghi. Để xem nhiều khả năng hơn cho những gì có thể được đặt thay thế 5-15, hãy đọc chủ đề trợ giúp cho cmdline-ranges. Nếu bạn muốn làm điều này thường xuyên, có lẽ tốt để tạo một ánh xạ (hoặc lệnh) cho nó. Ngoài ra, nếu bạn đã hlsearchbật, bạn có thể muốn chạy :nohlsearchsau đó để xóa phần tô sáng.

các wccách

Điều tương tự có thể được thực hiện với wc. Theo cùng một cách bạn có thể sử dụng cmdline-rangesđể chọn khu vực có :slệnh, bạn có thể sử dụng chúng với các lệnh bên ngoài. Ví dụ:

:5,15!wc -w

Điều này chạy các dòng 5 đến 15 thông qua wclệnh. Nhược điểm của việc này là nó thay thế phạm vi dòng đó bằng đầu ra của lệnh. Bạn có thể hoàn tác thay đổi này bằng cách nhấn u. Cũng lưu ý rằng giải pháp vimscript có thể không hoạt động với các ngôn ngữ khác nhau, vì \wkhông khớp với những gì thường là ký tự từ trong các ngôn ngữ khác. wccó thể làm tốt hơn lúc này hơn \w. Ngoài ra, đây là một lệnh ưa thích để làm nhanh hơn để làm điều này:

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

Lưu ý rằng điều này làm tắc nghẽn thanh aghi.

Ghi chú

Dường như điều này cũng có thể được thực hiện trong chế độ trực quan với g<C-g>tổ hợp phím. Xem câu trả lời của Carpetsmoker để được giải thích về điều này.


Chúng cần ag cùng với n để biến chúng thành toàn cầu (nếu không, chúng chỉ khớp một từ trên mỗi dòng). Cái thứ hai cũng cần một s ở đầu.
Colin McFaul

1
Đã sửa, xin lỗi về điều đó.
EvergreenTree

1
Sử dụng \wâm thanh như một ý tưởng tốt lúc đầu, nhưng sau khi thử nghiệm tôi đã tìm thấy một số vấn đề. Cái lớn nhất là nó sẽ không khớp với các ký tự không phải ascii, vì vậy một từ giống như überchỉ đơn giản là bị bỏ qua (có một câu hỏi về điều này ngày hôm qua). Ngoài ra, một từ like e-mailđược tính là 2 từ, vì -không có trong \w(sử dụng một từ -hơi hiếm trong tiếng Anh, nhưng rất phổ biến trong tiếng Hà Lan chẳng hạn). Có thể có những nhân vật khác bị bỏ qua trong thời trang này, điều này đưa chúng ta đến điểm cuối cùng của tôi: những quy ước về cái được coi là "từ" có thể khác nhau ...
Martin Tournoij

... bằng nhiều ngôn ngữ khác nhau và các công cụ "phù hợp" như wccó thể chọn ngôn ngữ (Tôi không biết liệu GNU có wcthực sự xử lý vấn đề này không, các công cụ GNU không nổi tiếng vì hỗ trợ unicode tuyệt vời của chúng).
Martin Tournoij

Điều đó thật thú vị. Tôi có thể thêm nó như là một điểm cộng cho wcgiải pháp.
EvergreenTree

1

Đối với các từ sử dụng:

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

. biểu thị dòng hiện tại.

Ngoài ra tôi đặt các mục sau trong tệp .vimrc của mình:

:cabbrev zzcc   s/./&/gn

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

Tôi có thể gõ:

:.,+6 zzcw

zzcwsẽ mở rộng sangs/\i\+/&/g

Đây zzcwchỉ là một cái tên kỳ lạ không phù hợp với bất cứ điều gì (đối với tôi).

Một tác dụng phụ là toàn bộ tập tin được chọn và tô sáng.

Tôi muốn có thể nhập các tweet nhiều dòng trong một tệp, đảm bảo không có quá nhiều ký tự và dán tweet trong twitter.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.