Làm thế nào để viết theo chiều dọc?


22

Hãy nói rằng tôi muốn tạo văn bản sau trong tài liệu của mình:

%
%            Not Important
%    O ------------------------->
%    |
%  S |
%  o |
%  m |
%  e |
%    |
%  M |
%  s |
%  g |
%    |
%    V

Có cách nào dễ dàng để viết "Một số Msg" theo chiều dọc như trên mà không cần phải tự chèn từng ký tự vào mỗi dòng không?


5
Bạn có thể viết văn bản của mình như bình thường, sau đó làm :s/./% \0\r/để thêm %và dòng mới ... Tuy nhiên, không phải là một giải pháp tuyệt vời ...
Martin Tournoij

Giải pháp tốt đẹp, nó hoạt động tốt. Sẽ được sử dụng cho bây giờ, cảm ơn bạn.
Allan Hasegawa

Câu trả lời:


16

Giải pháp thực sự tốt có lẽ sẽ cần thêm một số công việc, nhưng "không tệ" không khó để đạt được.

Ý kiến

Tất cả những gì chúng ta cần là di chuyển xuống một dòng sau mỗi ký tự, vì vậy hãy thực hiện điều đó thông qua InsertCharPrelệnh tự động!

Đặt nó vào .vimrchoặc tốt hơn cho một số tập tin trong plugin/thư mục.

" enters insert mode to write vertically
function! VertStart()
    augroup Vert
        autocmd!
        " handles each entered character and moves cursor down
        autocmd InsertCharPre * call feedkeys("\<left>\<down>", 'n')
        autocmd InsertLeave * call VertEnd()
    augroup END

    inoremap <BS> <Up><Del>
    startinsert
endfunction

" cleans up on leaving insert mode
function! VertEnd()
    iunmap <BS>
    augroup Vert
        autocmd!
    augroup END
endfunction

" command to start writing vertically
command! Vert call VertStart()

Sử dụng

Nhập :Vertlệnh để bắt đầu viết theo chiều dọc. Để chế độ chèn tự động vô hiệu hóa "chế độ" này. Tất nhiên, bạn có thể ánh xạ nó tới một phím tắt nếu bạn cần sử dụng lệnh này thường xuyên.

Các vấn đề đã biết

  1. Viết dọc sẽ không bị vô hiệu hóa nếu bạn để chế độ chèn qua Ctrl-C(đây là kết quả của Ctrl-Cviệc thực hiện theo một cách hơi lạ đối với InsertLeavesự kiện, không được kích hoạt; do đó, việc sử dụng khóa đòi hỏi phải cẩn thận).

1
Từ chối vấn đề đã biết # 1: Bạn không nên rời khỏi chế độ Chèn với <C-C>.
tommcdo

@tommcdo, tôi không, nhưng nếu nó ở đó, ai đó sẽ sử dụng nó. Nó thực sự hữu ích để tránh mở rộng viết tắt, tôi tự hỏi tại sao InsertLeavekhông được kích hoạt cho khóa này.
xaizek

1
Tôi cho rằng tôi muốn thúc đẩy xu hướng từ chối <C-C>như là một cách tốt để thoát khỏi chế độ Chèn. Cách bạn đề cập có thể ngụ ý rằng đôi khi nó là một phương pháp tốt. Kiểu như nói "Hãy cẩn thận: tài liệu của bạn sẽ không được lưu nếu bạn đóng Microsoft Word bằng cách rút phích cắm máy tính của bạn."
tommcdo

@tommcdo Không nghĩ rằng nó có thể nghe theo cách này. Đã thêm một lưu ý về <C-C>lý do của vấn đề. Tôi không biết về một phương pháp khác để bỏ chế độ chèn ngăn chặn mở rộng viết tắt <C-C>, nếu không có, nó ít nhất hữu ích như là một phần của ánh xạ inoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>.
xaizek

Tôi đã không xem xét các chữ viết tắt, đó là một điểm tốt. Tôi thậm chí đã tìm thấy một số vị trí trong trợ giúp mô tả <C-C>là rời khỏi chế độ Chèn mà không mở rộng chữ viết tắt và không có đề cập nào về cách nó không kích hoạt InsertLeavecác sự kiện. Bây giờ tôi tò mò liệu có một cách tích hợp để làm điều đó không, nhưng bây giờ bản đồ của bạn là một ý tưởng tuyệt vời.
tommcdo

4

Bạn có thể nhập như bình thường và sau đó chuyển đổi văn bản ngang hiện tại thành dọc bằng cách sử dụng thay thế trong Vim như sau (áp dụng cho dòng hiện tại):

:s/\(.\)/\1\r/g

Hoặc phương pháp dễ nhớ hơn nhiều là thực thi một trong các lệnh sau (cho tất cả các dòng):

:%!fold -w1
:%!grep -o .

Để chỉ áp dụng cho dòng hiện tại hoặc nhiều dòng, đi trước V, mở rộng khu vực cho nhiều dòng hơn nếu cần và thực hiện ở trên (nhưng không có %).

Đối với PowerShell trên Windows, hãy kiểm tra thay thế lần .

Để xác định ánh xạ khóa đơn giản (ví dụ F2), hãy thử như sau:

:nnoremap <F2> V:!fold -w1<CR>

Sau đó gõ một cái gì đó và nhấn F2để làm cho văn bản dọc, đơn giản như vậy.


Cách khác là đặt gói từ tự động, vd

:set tw=1 " textwidth
:set formatoptions+=t

Điều đó sẽ tự động bao bọc văn bản gần 1 ký tự như khoảng trắng cho phép. Nhược điểm là mỗi chữ cái cần được theo sau bởi khoảng trắng (vì vậy nó gần giống như bạn sẽ nhấnEnter


1
Thay vào đó :s/\(.\)/\1\r/g, bạn chỉ có thể sử dụng :s/./\0\r/gđó là giống hệt nhau về chức năng.
tự đại diện

1

Tôi thấy rằng macro là một cách tuyệt vời để làm những thứ khác thường nếu bạn thích làm điều đó không quá một lần trong một mặt trăng xanh. Giả sử bạn có bảng sau:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  S |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    V

Và hãy nói rằng bạn muốn thay thế Some Msgbằng Other Message. Trước hết, hãy mở rộng bảng cho ký tự phụ (dòng trước cuối yy5p:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  S |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

Macro tôi sẽ đưa ra sẽ đảm nhận việc chuyển đổi văn bản từ ngang sang dọc trong khi thay thế văn bản cũ. Bắt đầu bằng cách nhập văn bản ở vị trí đầu tiên (con trỏ ở cuối Other Message):

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  SOther Message |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

Ghi lại macro sau:

  • qq: bắt đầu ghi macro có tên q
  • ^: đi đến đầu dòng
  • 3l: di chuyển đến cột nơi văn bản sẽ được đặt
  • x: xóa ký tự cũ
  • l: di chuyển sang phải, để lại một ký tự từ tin nhắn thay cho ký tự cũ:
  • v: chuyển sang chế độ trực quan
  • f|: nhảy tới |
  • 2h: di chuyển trở lại hai nhân vật
  • d: lựa chọn cắt
  • j: đi xuống
  • P: dán trước con trỏ
  • q: chấm dứt ghi macro

Tại thời điểm này, bạn có:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  other Message | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

Lặp lại số lần macro đủ lớn (nghĩa là số lượng ký tự, nhưng bạn không cần biết trước. Chỉ cần đánh giá thấp và tiếp tục khi bạn thấy mức độ ước tính của mình gần như thế nào). Vì vậy, hãy đi với 10@q. Bạn lấy:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  t | So you can't just write your
%  h |
%  e | text and transform it into
%  r |
%    | the shape that you want
%  M |
%  e | Macros help here
%  s |
%  s |
%  a |
%   ge |
%    |
%    |
%    V

Ok, thêm một ( @q):

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  t | So you can't just write your
%  h |
%  e | text and transform it into
%  r |
%    | the shape that you want
%  M |
%  e | Macros help here
%  s |
%  s |
%  a |
%  g |
%   e |
%    |
%    V

Con trỏ của bạn bây giờ là cuối cùng e. Macro không hoạt động tốt với chữ cái cuối cùng (bạn có thể thử @qvà sau đó u(hoàn tác) để có kết quả không đạt yêu cầu). Đơn giản chỉ cần tự điều chỉnh nó ( Xcho backspace).


Rất đẹp. Macro là cách để đi trong vim. Nỗ lực nhanh chóng của tôi về cơ bản giống như của bạn; qq03lxldt|i ^[jPxq@q
tự đại diện

@Wildcard, tôi có thể haz upvote không?
Shahbaz

1
Hà! Trượt tâm trí của tôi; Tôi đã nghĩ tôi có. :)
tự đại diện
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.