วิธีการเขียนในแนวตั้ง?


22

ให้บอกว่าฉันต้องการผลิตข้อความต่อไปนี้ในเอกสารของฉัน:

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

มีวิธีง่ายๆในการเขียน "ข่าวสารบางอย่าง" ในแนวตั้งข้างต้นโดยไม่ต้องแทรกอักขระแต่ละตัวในแต่ละบรรทัดด้วยตนเองหรือไม่?


5
คุณสามารถเขียนข้อความของคุณตามปกติแล้วทำ:s/./% \0\r/เพื่อเพิ่ม%และการขึ้นบรรทัดใหม่ ... ไม่ดีแก้ปัญหา แต่ ...
มาร์ติน Tournoij

วิธีแก้ปัญหาที่ดีมันทำงานได้ดี จะใช้มันตอนนี้ขอบคุณ
Allan Hasegawa

คำตอบ:


16

ทางออกที่ดีจริงๆอาจต้องใช้งานมากกว่านี้ แต่ "ไม่เลว" ก็ไม่ยากที่จะบรรลุ

ความคิด

สิ่งที่เราต้องการคือการเลื่อนหนึ่งบรรทัดลงหลังตัวละครแต่ละตัวดังนั้นเราทำได้โดยInsertCharPreใช้คำสั่งอัตโนมัติ!

รหัส

วางไว้ใน.vimrcหรือดีกว่ายังไฟล์บางส่วนภายใต้plugin/ไดเรกทอรี

" 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()

การใช้

ป้อน:Vertคำสั่งเพื่อเริ่มเขียนในแนวตั้ง การออกจากโหมดแทรกจะปิดใช้งาน "โหมด" นี้โดยอัตโนมัติ แน่นอนคุณสามารถแมปไปยังทางลัดหากคุณต้องการใช้คำสั่งนี้บ่อยครั้ง

ปัญหาที่ทราบ

  1. การเขียนในแนวตั้งจะไม่ถูกปิดใช้งานหากคุณออกจากโหมดแทรกผ่าน Ctrl-C(นี่เป็นผลมาจากCtrl-Cการใช้งานในลักษณะที่แปลกเล็กน้อยเกี่ยวกับInsertLeaveเหตุการณ์ที่ไม่ได้ถูกเปิดใช้งานดังนั้นการใช้คีย์ต้องใช้ความระมัดระวัง)

1
โต้แย้งที่จะเป็นที่รู้จัก Issue # 1: <C-C>คุณไม่ควรออกจากโหมดแทรกด้วย
tommcdo

@ Tomcdo ฉันไม่ แต่ถ้ามีใครบางคนใช้มัน มันมีประโยชน์จริง ๆ เพื่อหลีกเลี่ยงการขยายตัวย่อฉันสงสัยว่าทำไมInsertLeaveไม่ให้คีย์นี้
xaizek

1
ฉันคิดว่าฉันหมายถึงการส่งเสริมแนวโน้มของการปฏิเสธ<C-C>ว่าเป็นวิธีที่ดีในการออกจากโหมดแทรก วิธีที่คุณพูดถึงอาจหมายความว่าบางครั้งมันเป็นวิธีที่ดี มันเหมือนกับว่า "Caveat: เอกสารของคุณจะไม่ถูกบันทึกถ้าคุณปิด Microsoft Word โดยถอดปลั๊กคอมพิวเตอร์ของคุณ"
tommcdo

@tommcdo ไม่คิดว่ามันจะฟังทางนี้ เพิ่มหมายเหตุเกี่ยวกับ<C-C>การเป็นสาเหตุของปัญหา ฉันไม่ได้ตระหนักถึงวิธีอื่นที่จะออกจากโหมดแทรกปราบปรามการขยายตัวย่อเป็นไม่ถ้าไม่มีก็มีประโยชน์อย่างน้อยเป็นส่วนหนึ่งของการทำแผนที่เหมือน<C-C> inoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>
xaizek

ฉันไม่ได้พิจารณาตัวย่อมันเป็นจุดที่ดี ฉันยังพบสถานที่บางแห่งในความช่วยเหลือที่อธิบาย<C-C>ว่าออกจากโหมดแทรกโดยไม่ต้องขยายตัวย่อและไม่มีการกล่าวถึงว่าจะไม่เรียกInsertLeaveเหตุการณ์อย่างไร ตอนนี้ฉันอยากรู้อยากเห็นว่ามีวิธีการในตัวที่จะทำ แต่ในตอนนี้การทำแผนที่ของคุณเป็นความคิดที่ดี
tommcdo

4

คุณสามารถพิมพ์ได้ตามปกติแล้วแปลงข้อความแนวนอนปัจจุบันเป็นแนวตั้งโดยใช้การทดแทนในกลุ่มดังต่อไปนี้ (ใช้กับบรรทัดปัจจุบัน):

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

หรือวิธีที่ง่ายกว่ามากในการจดจำคือการเรียกใช้คำสั่งต่อไปนี้ (สำหรับทุกบรรทัด):

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

หากต้องการใช้เฉพาะกับบรรทัดปัจจุบันหรือมากกว่าบรรทัดก่อนหน้าVขยายพื้นที่สำหรับบรรทัดเพิ่มเติมหากจำเป็นและดำเนินการข้างต้น (แต่ไม่มี%)

สำหรับ PowerShell บน Windows, ตรวจสอบทดแทนสำหรับพับ

ในการกำหนดการจับคู่คีย์อย่างง่าย (เช่นF2) ลองทำดังนี้:

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

จากนั้นพิมพ์บางสิ่งและกดF2เพื่อทำให้ข้อความเป็นแนวตั้งอย่างง่าย


ทางเลือกอื่นคือการตั้งค่าการตัดคำอัตโนมัติเช่น

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

ที่จะตัดข้อความโดยอัตโนมัติให้ใกล้เคียงกับ 1 ตัวอักษรเนื่องจาก white space อนุญาต ข้อเสียคือตัวอักษรแต่ละตัวจะต้องเว้นวรรค (ดังนั้นจึงเป็นตัวเดียวกับที่คุณจะกดEnter


1
มากกว่า:s/\(.\)/\1\r/gคุณก็สามารถใช้:s/./\0\r/gซึ่งเป็นหน้าที่เหมือน
Wildcard

1

ฉันพบว่ามาโครเป็นวิธีที่ยอดเยี่ยมในการทำสิ่งผิดปกติหากคุณสนใจที่จะทำสิ่งนั้นไม่เกินหนึ่งครั้งในดวงจันทร์สีน้ำเงิน สมมติว่าคุณมีตารางต่อไปนี้:

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

และสมมติว่าคุณต้องการแทนที่ด้วยSome Msg Other Messageก่อนอื่นเรามาขยายตารางสำหรับอักขระพิเศษ (บรรทัดก่อนหน้านี้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

มาโครที่ฉันกำลังจะทำคือดูแลการแปลงข้อความจากแนวนอนเป็นแนวตั้งในขณะที่แทนที่ข้อความเก่า เริ่มต้นด้วยการพิมพ์ข้อความในตำแหน่งแรก (เคอร์เซอร์อยู่ที่ท้าย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

บันทึกแมโครต่อไปนี้:

  • qq: เริ่มบันทึกแมโครชื่อ q
  • ^: ไปที่จุดเริ่มต้นของบรรทัด
  • 3l: เลื่อนไปยังคอลัมน์ที่จะวางข้อความ
  • x: ลบอักขระเก่า
  • l: เลื่อนไปทางขวาปล่อยให้ตัวละครหนึ่งตัวจากข้อความแทนที่ตัวละครเก่า:
  • v: ไปที่โหมดภาพ
  • f|: ข้ามไปที่ |
  • 2h: เลื่อนกลับไปที่อักขระสองตัว
  • d: การเลือกตัด
  • j: ย้ายลง
  • P: วางก่อนเคอร์เซอร์
  • q: ยุติการบันทึกแมโคร

ณ จุดนี้คุณมี:

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

ทำซ้ำมาโครในจำนวนที่มากพอ (เช่นจำนวนตัวอักษร แต่คุณไม่จำเป็นต้องรู้ล่วงหน้าล่วงหน้าดูถูกดูแคลนและทำต่อไปเมื่อคุณเห็นว่าการประมาณของคุณใกล้เคียง) งั้นไปด้วย10@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 |
%   ge |
%    |
%    |
%    V

ตกลงอีกหนึ่ง ( @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

eเคอร์เซอร์ของคุณอยู่ในขณะนี้ในวันสุดท้าย แมโครทำงานได้ไม่ดีกับตัวอักษรตัวสุดท้าย (คุณสามารถลอง@qแล้วu(ยกเลิก) เพื่อผลลัพธ์ที่ไม่น่าพอใจ) เพียงปรับด้วยตัวคุณเอง ( Xสำหรับ backspace)


ดีมาก. มาโครเป็นหนทางไปเป็นกลุ่ม ความพยายามอย่างรวดเร็วของฉันเป็นหลักเหมือนกับคุณ; qq03lxldt|i ^[jPxq@q
Wildcard

@ Wildcard ฉันสามารถลงคะแนนได้บ้างไหม?
Shahbaz

1
ฮา! ลื่นใจของฉัน; ฉันคิดว่าฉันมี :)
ไวด์การ์ด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.