Vim có thể viết các dòng tăng dần không? tức là trên mỗi dòng A trở thành B và 1 trở thành 2


8

Tôi muốn viết cái này:

A = mapping[0]
B = mapping[1]
C = mapping[2]
D = mapping[3]
E = mapping[4]
F = mapping[5]
G = mapping[6]
H = mapping[7]
I = mapping[8]
J = mapping[9]
K = mapping[10]
L = mapping[11]
M = mapping[12]
N = mapping[13]
O = mapping[14]
P = mapping[15]
Q = mapping[16]
R = mapping[17]
S = mapping[18]
T = mapping[19]
U = mapping[20]
V = mapping[21]
W = mapping[22]
X = mapping[23]
Y = mapping[24]
Z = mapping[25]

Cuối cùng tôi đã sử dụng LibreCalc, đặt các phần khác nhau vào các ô khác nhau, thêm các chữ cái và số, nối các kết quả và dán lại rất nhiều vào Vim.

Tôi đánh giá cao rằng những gì tôi muốn viết là mã khủng khiếp. Hiện tại tôi đang học Python và đã cố gắng tránh tự mình tìm kiếm thông tin mà tôi biết sẽ được đề cập sau trong khóa học tôi đang theo dõi ( http://interactivepython.org/ ).

Cách nhanh nhất tôi biết để làm điều này trong vim là gõ một cái gì đó như

A = mapping[0] <ESC> hh <CTRL>+<V> BBh y $ o B <ESC> y 1] <CR>

Tôi biết vim rất mạnh mẽ (tôi đã sử dụng nó trong một vài tuần, tôi thực sự thích nó).

Nó có thể viết những gì tôi muốn với một số lệnh vim không?

Câu trả lời:


11

Mặc dù có thể được thực hiện với kịch bản, nhưng nếu bạn có phiên bản Vim rất gần đây (ví dụ: phiên bản trong Arch Linux), bạn có thể sử dụng g Ctrl-ađể tăng khối hình ảnh. Trong trường hợp của bạn:

  1. Viết dòng gốc: A = mapping[0] Esc
  2. Dòng Yank và đặt 25 bản sao của nó bên dưới: yy25p
  3. Trực quan chọn cột chứa 0char (chọn khối, sử dụng Ctrl-v), ngoại trừ 0dòng thứ 1 (để bạn kết thúc với một cột chứa 25 số 0 cuối cùng), sau đó tăng chúng lên g Ctrl-a.
  4. Áp dụng phương pháp tương tự cho cột chứa A.

( Lưu ý : Như ý kiến cho thấy, một trong những nhu cầu để thêm alphavào nrformatstùy chọn, để có thể thư tăng, ví dụ như: set nrformats+=alpha.My vimrc có: set nrformats=hex,alpha, do đó vô hiệu hóa bát phân và increment nhị phân, mà tôi không sử dụng)


yy không làm việc cho tôi. Tôi có thể thấy trên chiếc áo choàng mà tôi đã in từ www.vimchcoateet.com rằng đây là một lệnh rất chuẩn. vim --version trả về cái này: pastebin.com/DcFxZh1S . Tôi sẽ phải điều tra lý do tại sao nó không hoạt động đối với tôi ... (Tôi đã thử ở chế độ lệnh và chèn trực quan). Ngoài ra khi tôi dán, tất cả xuất hiện trên cùng một dòng. Tuy nhiên tôi đã thử g Ctrl-a và nó thực hiện chính xác những gì tôi muốn, cảm ơn bạn :)
Duncan Betts

1
:verbose map ysẽ cho bạn thấy những ánh xạ bắt đầu với ybạn và nơi chúng được đặt. Nhưng bạn phải sử dụng yyở chế độ bình thường.
VanLaser


1
Phiên bản nào vimsẽ tăng Alên Bvới Ctrl-ahành động? Của tôi chắc chắn không, và tôi vào 7.4 1-1202.
Cory Klein

4
@CoryKlein Hãy thử gõ :set nrformats+=alpha. Nó sẽ thêm giá trị alphavào tùy chọn 'nrformats'và sẽ cho phép Ctrl-a"tăng" các ký tự chữ cái. Nếu bạn thích hành vi này, bạn có thể thêm nó vào vimrc của mình. Nếu không, bạn có thể thêm nó vào tùy chọn với toán tử +=và xóa nó sau đó với toán tử -=( :set nrformats-=alpha).
saginaw

6

Tôi thích giải pháp tăng thị giác mà @VanLaser đã sử dụng (Xem :h v_CTRL-A). Tuy nhiên tôi sẽ cho thấy điều này có thể được thực hiện thông qua macro.

Bắt đầu với:

A = mapping[0]

Ghi lại các phím bấm sau vào một macro bạn chọn (ví dụ q):

yyp:set nrformats+=alpha<cr><c-a>:set nrformats-=alpha<c-a>

Điều này sẽ nhân đôi dòng và sau đó tăng ký tự đầu tiên (ví dụ A) và sau đó tăng phần số. Chạy macro này 24 lần và bạn đã hoàn thành, vd 24@q.

  • qq - bắt đầu ghi vào sổ đăng ký q
  • yyp - nhân đôi dòng
  • :set nrformats+=alpha<cr>- 'nrformatskhông có alphamặc định
  • <c-a>- Với alphachúng tôi bây giờ có thể tăng chữ
  • :set nrformats-=alpha<cr>- xóa alphakhỏi'nrformats'
  • <c-a> - tăng số tiếp theo
  • q - dừng ghi âm
  • 24@q- phát lại macro trong đăng ký q24 lần

Để được trợ giúp thêm xem:

:h q
:h @
:h yy
:h p
:h 'nrformats'
:h :set
:h CTRL-A
:h v_CTRL-A

Đẹp không :) 25?
VanLaser

1
@VanLaser: 1 (vạch xuất phát) + 1 (ghi macro) + 24 = 26.
Peter Rincker

4

Những câu trả lời tốt đã được cung cấp, tôi sẽ không nghĩ sẽ đi sâu vào nó. Tôi đã gõ tất cả các chữ cái trên một dòng và sau đó giới thiệu ngắt văn bản và ngắt dòng bằng cách thay thế biểu thức (sử dụng số dòng cho số tăng dần), đại loại như

iABCDEFGHIJKLMNOPQRSTUVXYZ<Esc>:s/./\=submatch(0)." = mapping[".line('.')."]\n"/g

rất tuyệt ! (+1)
JJoao

2

Hầu như luôn luôn khi làm một cái gì đó như thế này, tôi chọn sử dụng :substitutetrên các macro. Đặc biệt là khả năng đánh giá biểu thức thay thế khi bắt đầu bằng \=làm cho nó thường có thể (xem :h sub-replace-special).

Khi bạn có các dòng trống tại chỗ ( 25i<Enter><Esc>), bạn có thể sử dụng lệnh

:1,26s/^/\=nr2char(line('.')+64) . ' = mapping[' . (line('.')-1) . ']'

các chuỗi cần thiết được tạo bằng cách sử dụng số dòng ( '.'đối số) hiện tại được trả về bởi hàm line()và sử dụng nr2char () để chuyển đổi số thập phân thành tương đương ASCII (65 = A). Các chuỗi cần thiết được nối bằng cách sử dụng.


1

Bạn luôn có thể thử sử dụng hệ điều hành ...

:r ! perl -E 'for(A..Z){say "$_ = mapping[", ord($_)-64 ,"]"}'

1
Perl không có trong hệ điều hành.
dash-tom-bang
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.