Làm cách nào tôi có thể nhận (g) Vim để hiển thị số lượng ký tự của tệp hiện tại?


85

Tôi thích viết hướng dẫn và bài viết cho một diễn đàn lập trình tôi thường xuyên. Diễn đàn này có giới hạn ký tự cho mỗi bài. Trước đây tôi đã sử dụng Notepad ++ để viết bài đăng và nó giữ số lượng ký tự trực tiếp trên thanh trạng thái. Tôi bắt đầu sử dụng gVim nhiều hơn và tôi thực sự không muốn quay lại Notepad ++ vào thời điểm này, nhưng rất hữu ích khi đếm số ký tự này. Nếu tôi vượt quá số lượng, tôi thường sẽ dán bài đăng vào Notepad ++ để tôi có thể thấy khi nào tôi đã cắt đủ để vượt quá giới hạn.

Tôi đã thấy các đề xuất có :set rulerthể giúp ích, nhưng điều này chỉ đưa ra số lượng ký tự thông qua chỉ mục cột hiện tại trên dòng hiện tại. Điều này sẽ rất tuyệt nếu tôi không sử dụng ngắt đoạn, nhưng tôi chắc chắn rằng bạn đồng ý rằng việc đọc vài nghìn ký tự trong một đoạn là không thoải mái.

Tôi đã đọc trợ giúp và nghĩ rằng nó rulerformatsẽ hoạt động, nhưng sau khi xem qua statuslineđịnh dạng mà nó sử dụng, tôi không thấy bất cứ thứ gì có số lượng ký tự cho bộ đệm hiện tại.

Tôi đã thấy rằng có các plugin bổ sung điều này, nhưng tôi vẫn nhúng các ngón chân vào gVim và tôi không chắc chắn tôi muốn tải các plugin ngẫu nhiên trước khi tôi hiểu chúng làm gì. Tôi muốn sử dụng một cái gì đó được tích hợp sẵn để vim, nhưng nếu nó không tồn tại thì nó không tồn tại.

Tôi nên làm gì để hoàn thành mục tiêu của mình? Nếu nó liên quan đến một plugin, bạn có sử dụng nó không và nó hoạt động tốt như thế nào?

Câu trả lời:


140

Nhấn g CTRL-Gở chế độ bình thường để hiển thị một số thống kê trên con trỏ và tệp.

Nếu bạn ở trong linux, bạn có thể sử dụng wc -mđể lấy số ký tự trong tệp hiện tại

:!wc -m %

Vì nó không được cập nhật trong thời gian thực, có thể bạn muốn ánh xạ lệnh này thành một cái gì đó như:

map <F4> :!wc -m %<CR>

19
g CTRL-GTôi không biết điều này tồn tại. Đẹp!
Jason Down

Rất vui, tôi tiếp tục quên sử dụng các lệnh bang bang trong Vim
Eddie B

3
g <cg> hoạt động đa nền tảng là tốt.
AndrewPK

Tôi có thể tìm thêm thông tin về việc sử dụng ở ! [...] %đâu?
Chảo

Trợ giúp có tại đây: vimdoc.sourceforge.net/htmldoc/various.html#:!cmd . Nếu bạn sử dụng nhiều lệnh shell, hãy kiểm tra plugin này: stevelosh.com/projects/clam .
mrucci

24
:help count-items

gợi ý rằng bạn có thể thực hiện một cuộc chạy đua thay thế ala

:%s/./&/gn

(sau đó báo cáo lại số lượng ký tự trùng khớp) hoặc bạn thực hiện một cách ưa thích strlen()trên văn bản được chọn trực quan:

:echo strlen(@")

("là thanh ghi không tên)

vì bạn có thể gọi một biểu thức trong dòng trạng thái của bạn như thế %{myfunc()}có thể là một điểm khởi đầu tốt. đếm tất cả thời gian có thể tốn một chút thời gian vì bạn sẽ phải chọn toàn bộ văn bản và sau đó kéo nó ra, nhưng có thể hiển thị số byte trong "-register là ổn đối với bạn. Nếu bạn thực sự muốn biết số ký tự trong bộ đệm: chỉ cần chọn trực quan TẤT CẢ văn bản trong bộ đệm và kéo nó. Vì vậy, giải pháp sẽ là:

 :set statusline=%{strlen(@")}

cung cấp cho bạn số lượng ký tự trong "-register (trùng với số byte nếu bạn chọn và lấy bộ đệm hiện tại).


Giải pháp cũng hoạt động trên Windows (lệnh bash sẽ không).
dastrobu

Tôi thích rằng số lượng không biến mất sau một giây như g<CTRL-g>phương pháp trong câu trả lời được chấp nhận.
Chester

7

Một cải tiến cho câu trả lời của mrucci:

Bạn có thể sử dụng wctrên linux mà không phải lưu tệp trước bằng cách chỉ đạo :wđầu ra lệnh như sau:

:w !wc -m

và bạn có thể ánh xạ nó tới một cái gì đó như được đề cập bởi mrucci.


6
:help statusline

mang đến cho bạn

o N   Byte number in file of byte under cursor, first byte is 1.
      Mnemonic: Offset from start of file (with one added)

đó cũng là một cách giải quyết tốt cho vấn đề của bạn. chỉ cần đi đến cuối bộ đệm với Gvà số byte hiển thị trong dòng trạng thái của bạn là số ký tự (tất nhiên không đúng với ký tự nhiều byte). quay trở lại nơi bạn đến từ với ctrlo.


1
Đây là vấn đề với các ký tự nhiều byte. Tôi đã tìm thấy câu hỏi này sau khi đặt% o vào trạng thái của mình :)
Matt

@Matt: vậy, giải pháp là gì?
akira

1
Giải pháp "g ^ g" của mrucci ở chế độ bình thường là đủ tốt cho tôi. Tôi cần nó để gỡ lỗi nhanh, vì vậy tôi đã không dành thời gian để thử và lấy thông tin đó trong dòng trạng thái.
Matt


1
Vì các tài liệu rất mơ hồ và khó hiểu, nên đáng chú ý rằng lệnh cụ thể mà người ta cần thực hiện là set statusline+=\ %o\ %N (thật thú vị, nó không hoạt động đối với mục "t S") . Sau đó, nếu bạn thấy dòng trạng thái không thay đổi, đó là vì bạn phải thực thi set laststatus=2. Đối với tôi, nó đã thay thế dòng trạng thái trong suốt hiện có bằng trạng thái mới, có màu đen đặc và chỉ có mục "đếm byte".
Hi-Angel

3

Nếu bạn có thói quen sử dụng: w để lưu tệp, mỗi lần bạn thực hiện việc này, trạng thái sẽ báo cáo lại số lượng ký tự được viết. Ví dụ, ở cuối câu này tôi đã làm một: w (vâng, tôi đang sử dụng gvim để viết ghi chú này) và nó đã báo cáo: 245C được viết.


Golf này đẹp cho sử dụng một lần.
Ciro Santilli 改造 心 心

3

Bạn có thể nối một biểu thức để hiển thị bytecount của bộ đệm trong dòng trạng thái với:

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

Hoặc bạn có thể thay đổi trực tiếp biến tùy chọn để tránh tất cả những gì thoát:

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

Khi tôi thử điều này, gVim phàn nàn về một chuỗi biểu thức không được tiết lộ. Tôi nhận thấy bạn đang thiếu dấu ngoặc đơn, nhưng sửa nó cũng không giúp được gì. Đây là những gì tôi viết lại thành :: set statusline =% {line2byte (line ("$"))}
OwenP

@OwenP: nên được sửa ngay bây giờ
akira

1
Có lẽ bạn muốn ...%{ line2byte(line(\"$\")+1))-1 }nó bao gồm các ký tự của dòng cuối cùng trong số đếm. Cách tiếp cận này sẽ không tính chính xác các ký tự đa nhân.
trực giác

1
Ngoài ra tôi nghĩ rằng bạn cần phải thoát khỏi không gian, hoặc chỉ cần thoát khỏi chúng.
trực giác

Đã chỉnh sửa để bao gồm các đề xuất của @ intuited, cũng được thêm vào dòng trạng thái thay vì ghi đè lên nó.
joeytwiddle

0

Cách giải quyết tôi đã sử dụng cho đến khi tôi chấp nhận câu trả lời của mrucci:

Tôi tình cờ phát hiện ra rằng khi tôi: w để lưu tệp, lệnh sẽ xuất ra số byte được ghi. Đây ít nhiều là số lượng nhân vật, cho đến nay đã đủ gần. Tôi cũng thích câu trả lời của mrucci, có thể nhiều hơn câu này vì nó cũng có số từ.


0

Nếu bạn giữ một bản sao tệp văn bản của mình, chỉ cần ghi văn bản của bạn vào đĩa - số ký tự được hiển thị theo mặc định.

Nếu bạn không muốn giữ một tệp, chỉ cần lưu văn bản của bạn vào /dev/null: :w!/dev/null.

Bạn cũng có thể cho phép wcđếm các ký tự của mình: :%!wc -c- nhưng đừng quên nhấn Uđể khôi phục văn bản của bạn.

Nếu bạn cần điều này thường xuyên, chỉ cần ánh xạ các lệnh này thành một chuỗi khóa: :map #wc :w!/dev/null^[- lưu ý rằng ^[phải được nhập là Ctrl+ V Esc.

Là một chỉ báo đầu tiên về kích thước văn bản, chỉ cần bật số dòng; thừa nhận: điều này cần một số mỹ phẩm tinh thần ;-)


0

Sau khi có câu hỏi này và đọc câu trả lời (cảm ơn mrucci) tôi đã thêm những dòng này vào tệp khởi tạo .vimrc của mình.

# 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>

Tôi để nó cho vim: giúp người dùng tìm ra những gì họ làm.

Cá nhân tôi thấy hữu ích khi bắt đầu ánh xạ Vim với; hoặc, vì tôi hiếm khi sử dụng chúng làm ký tự đầu tiên của lệnh.

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.