Vim สามารถเขียนบรรทัดเพิ่มเติมได้หรือไม่? เช่นในแต่ละบรรทัด A กลายเป็น B และ 1 กลายเป็น 2


8

ฉันต้องการเขียนสิ่งนี้:

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]

ฉันลงเอยด้วยการใช้ LibreCalc วางส่วนต่าง ๆ ในเซลล์ต่าง ๆ เพิ่มตัวอักษรและตัวเลขการต่อผลลัพธ์และวางล็อตกลับเข้าไปในกลุ่ม

ฉันขอขอบคุณที่สิ่งที่ฉันต้องการเขียนเป็นรหัสอันยิ่งใหญ่ ฉันกำลังศึกษา Python อยู่ในขณะนี้และพยายามหลีกเลี่ยงการหาข้อมูลด้วยตัวเองที่ฉันรู้ว่าจะได้รับการกล่าวถึงในภายหลังในหลักสูตรที่ฉันกำลังติดตาม ( http://interactivepython.org/ )

วิธีที่เร็วที่สุดที่ฉันรู้ในการทำสิ่งนี้ในกลุ่มคือการพิมพ์สิ่งที่ชอบ

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

ฉันรู้ว่าเสียงเรียกเข้านั้นทรงพลังมาก (ฉันใช้งานมาสองสามสัปดาห์แล้ว

เป็นไปได้ไหมที่จะเขียนสิ่งที่ฉันต้องการด้วยคำสั่ง vim?

คำตอบ:


11

แม้ว่าจะสามารถทำได้ด้วยการเขียนสคริปต์หากคุณมี Vim เวอร์ชันล่าสุด (เช่นหนึ่งใน Arch Linux) คุณสามารถใช้g Ctrl-aเพื่อเพิ่มบล็อกภาพ ในกรณีของคุณ:

  1. เขียนบรรทัดเดิม: A = mapping[0] Esc
  2. ดึงเส้นแล้วใส่ 25 สำเนาด้านล่าง: yy25p
  3. สายตาเลือกคอลัมน์ที่มี0ถ่าน (การเลือกปิดกั้นโดยใช้Ctrl-v) ไม่รวม0จากสายที่ 1 (ดังนั้นคุณจะจบลงด้วยคอลัมน์ที่มีช่วง 25 เลขศูนย์) g Ctrl-aแล้วเพิ่มพวกเขาด้วย
  4. Aใช้วิธีเดียวกันสำหรับคอลัมน์ที่มี

( หมายเหตุ : เป็นความคิดเห็นแสดงหนึ่งความต้องการที่จะเพิ่มalphaให้กับnrformatsตัวเลือกในการสั่งซื้อเพื่อให้สามารถเพิ่มตัวอักษรเช่น: set nrformats+=alpha.My vimrcมี: set nrformats=hex,alphaจึงปิดการใช้งานฐานแปดและเพิ่มไบนารีซึ่งผมไม่ได้ใช้)


yy ไม่ทำงานสำหรับฉัน ฉันเห็นบน cheatsheet ที่ฉันพิมพ์จาก www.vimcheatsheet.com ว่านี่เป็นคำสั่งมาตรฐานมาก เป็นกลุ่ม --version ผลตอบแทนนี้: pastebin.com/DcFxZh1S ฉันจะต้องตรวจสอบว่าทำไมมันไม่ทำงานสำหรับฉัน ... (ฉันได้ลองในคำสั่งภาพและโหมดแทรก) นอกจากนี้เมื่อฉันวางทุกอย่างจะปรากฏในบรรทัดเดียวกัน แต่ฉันได้พยายามออกกรัม Ctrl-และมันไม่ตรงกับสิ่งที่ผมอยากขอขอบคุณ :)
ดันแคนเบตต์

1
:verbose map yควรแสดงให้คุณเห็นว่าการจับคู่ที่เริ่มต้นกับyคุณคืออะไรและตั้งไว้ที่ไหน แต่คุณต้องใช้yyในโหมดปกติ
VanLaser


1
รุ่นอะไรของvimจะเพิ่มAไปBกับCtrl-aการดำเนินการ? 7.4 1-1202เหมืองแร่แน่นอนไม่ได้และฉัน
Cory Klein

4
@CoryKlein :set nrformats+=alphaลองพิมพ์ มันจะเพิ่มมูลค่าalphaให้กับตัวเลือก'nrformats'และควรอนุญาตให้Ctrl-aตัวอักษร "เพิ่ม" หากคุณชอบพฤติกรรมนี้คุณสามารถเพิ่มลงใน vimrc ของคุณได้ มิฉะนั้นคุณสามารถเพิ่มลงในตัวเลือกด้วยโอเปอเรเตอร์+=แล้วลบออกภายหลังด้วยโอเปอเรเตอร์-=( :set nrformats-=alpha)
saginaw

6

ฉันชอบโซลูชันการเพิ่มขึ้นของภาพที่ @VanLaser ใช้ (ดู:h v_CTRL-A) อย่างไรก็ตามฉันจะแสดงสิ่งนี้สามารถทำได้ผ่านแมโครเช่นกัน

เริ่มกับ:

A = mapping[0]

บันทึกปุ่มกดต่อไปนี้ลงในแมโครที่คุณเลือก (เช่นq):

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

การทำเช่นนี้จะเป็นการทำซ้ำบรรทัดจากนั้นเพิ่มอักขระตัวแรก (เช่นA) จากนั้นเพิ่มส่วนของตัวเลข ทำงานนี้มาโคร 24 24@qครั้งและคุณจะทำเช่น

  • qq - เริ่มบันทึกลงทะเบียน q
  • yyp - ทำซ้ำบรรทัด
  • :set nrformats+=alpha<cr>- 'nrformatsไม่มีalphaตามค่าเริ่มต้น
  • <c-a>- ด้วยalphaตอนนี้เราสามารถเพิ่มตัวอักษร
  • :set nrformats-=alpha<cr>- ลบออกalphaจาก'nrformats'
  • <c-a> - เพิ่มหมายเลขถัดไป
  • q - หยุดการบันทึก
  • 24@q- เล่นซ้ำมาโครในรีจิสเตอร์q24 ครั้ง

สำหรับความช่วยเหลือเพิ่มเติมดู:

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

เป็นคนดี :) 25
VanLaser

1
@VanLaser: 1 (บรรทัดเริ่มต้น) + 1 (บันทึกมาโคร) + 24 = 26.
Peter Rincker

4

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

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

เด็ดมาก! (+1)
JJoao

2

เกือบทุกครั้งที่ทำอะไรแบบนี้ฉันเลือกที่จะใช้:substituteกับมาโคร โดยเฉพาะความสามารถในการประเมินการแสดงออกแทนเมื่อเริ่มต้น\=ทำให้เป็นไปได้บ่อยครั้ง (ดู:h sub-replace-special)

เมื่อคุณมีบรรทัดว่าง ( 25i<Enter><Esc>) คุณสามารถใช้คำสั่ง

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

ลำดับที่จำเป็นถูกสร้างขึ้นโดยใช้หมายเลขบรรทัดปัจจุบัน ( '.'อาร์กิวเมนต์) ที่ส่งคืนโดยฟังก์ชันline()และใช้ nr2char () เพื่อแปลงตัวเลขทศนิยมให้เทียบเท่า ASCII (65 = A) สตริงที่จำเป็นจะถูกต่อกันโดยใช้.


1

คุณสามารถลองใช้ระบบปฏิบัติการ ...

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

1
Perl ไม่ได้อยู่ในระบบปฏิบัติการ
dash-tom-bang
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.