ฉันจะใช้ vim register ได้อย่างไร?


925

ฉันรู้เพียงหนึ่งอินสแตนซ์โดยใช้รีจิสเตอร์คือผ่านCtrlR*ฉันวางข้อความจากคลิปบอร์ด

การใช้งานอื่น ๆ ของการลงทะเบียนมีอะไรบ้าง วิธีใช้งาน

ทุกสิ่งที่คุณรู้เกี่ยวกับการลงทะเบียน VI (ให้ความสำคัญกับ vi 7.2) - แบ่งปันกับเรา


22
ผมให้คำตอบยาวมีการใช้งานของรีจิส
เบอนัวต์

คำตอบ:


1185

การลงทะเบียนในกลุ่มให้คุณเรียกใช้การกระทำหรือคำสั่งเกี่ยวกับข้อความที่เก็บไว้ภายใน ในการเข้าถึงการลงทะเบียนให้คุณพิมพ์"aคำสั่งก่อนหน้าซึ่งaเป็นชื่อของการลงทะเบียน หากคุณต้องการคัดลอกบรรทัดปัจจุบันลงในทะเบียนkคุณสามารถพิมพ์

"kyy

หรือคุณสามารถต่อท้ายทะเบียนโดยใช้อักษรตัวใหญ่

"Kyy

จากนั้นคุณสามารถเลื่อนดูเอกสารและวางไว้ที่อื่นโดยใช้

"kp

เพื่อวางจากคลิปบอร์ดของระบบบน Linux

"+p

หากต้องการวางจากคลิปบอร์ดของระบบบน Windows (หรือจากคลิปบอร์ด "ไฮไลต์เมาส์" บน Linux)

"*p

ในการเข้าถึงประเภทการลงทะเบียนที่กำหนดไว้ในปัจจุบันทั้งหมด

:reg

165
และ"+เป็นทะเบียนพิเศษที่อ้างอิงถึงคลิปบอร์ดของระบบ
Aaron McDaid

17
ใน Windows คลิปบอร์ดสามารถเข้าถึงได้ด้วย"*; "*yGดังนั้นคำสั่งเพื่อคัดลอกจนถึงจุดสิ้นสุดของแฟ้มจะกลายเป็น
Aditya MP

44
ใน X (Linux อาจเป็น OS-X) *เป็นคลิปบอร์ด "mouse highlight" และ+เป็นคลิปบอร์ด Ctrl-XCV
dotancohen

20
มีวิธีต่อท้ายการลงทะเบียนคลิปบอร์ด (เนื่องจากไม่มีทุน+) หรือไม่?
naitsirhc

8
@dotancohen เทคนิคที่เรียกว่าเลือก PRIMARY แต่ผมคิดว่า "ไฮไลต์เมาส์" เป็นเรื่องง่ายสำหรับคนที่จะได้รับ :)
Kyrias

783

ฉันยินดีเมื่อฉันค้นพบการ0ลงทะเบียน หากคุณดึงข้อความโดยไม่ต้องกำหนดให้กับการลงทะเบียนโดยเฉพาะข้อความนั้นจะถูกกำหนดให้กับการ0ลงทะเบียนเช่นเดียวกับการบันทึกไว้ในการ"ลงทะเบียนเริ่มต้น ความแตกต่างระหว่าง0และ"ลงทะเบียนคือการที่0มีประชากรเพียงมีข้อความกระชากขณะที่ลงทะเบียนเริ่มต้นที่มีประชากรยังมีข้อความที่ถูกลบโดยใช้d/ D/ x/ X/ c/ C/ s/ Sคำสั่ง

ฉันพบว่ามีประโยชน์เมื่อฉันต้องการคัดลอกข้อความลบบางสิ่งและแทนที่ด้วยข้อความที่คัดลอก ขั้นตอนต่อไปนี้แสดงตัวอย่าง:

  • ดึงข้อความที่คุณต้องการคัดลอกy[motion]- ข้อความนี้ถูกบันทึก"และ0ลงทะเบียน
  • ลบข้อความที่คุณต้องการแทนที่ด้วยd[motion]- ข้อความนี้ถูกบันทึกในการ"ลงทะเบียน
  • วางข้อความที่ดึงออกด้วย "0p

โดยที่"คำสั่งให้ใช้ register สำหรับคำสั่งถัดไป

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

โปรดทราบว่าpหรือPวางจากการลงทะเบียนเริ่มต้น ระยะยาวเทียบเท่าจะเป็น""p(หรือ""P) และ"0ถือเอาไว้ล่าสุด"1ถือถือเป็นลบหรือเปลี่ยนแปลงล่าสุด

:help registersสำหรับข้อมูลเพิ่มเติมโปรดดูที่


17
pหรือPวางจากการลงทะเบียนเริ่มต้น ระยะยาวเทียบเท่าจะเป็น""p(หรือ""P)
nelstrom

186
โดยวิธีการเช่นเดียวกัน "0 ถือเอาไว้ล่าสุดดึง" 1 ถือการลบหรือเปลี่ยนแปลงล่าสุด
FireAphis

6
"คือคำสั่งให้ใช้การลงทะเบียนสำหรับคำสั่งถัดไป ดังนั้น""pจะใช้การ"ลงทะเบียนสำหรับคำสั่งวางและ"0pจะใช้การ0ลงทะเบียน
Ramon Marco L. Navarro

5
0pจะหมายถึงไปที่ตัวอักษรตัวแรกของบรรทัดปัจจุบันและวางจากเนื้อหาของการลงทะเบียนเริ่มต้น ( ") "pจะเป็นคำสั่งที่ไม่สมบูรณ์เนื่องจากคุณจำเป็นต้องระบุว่าคำสั่งที่จะใช้ลงทะเบียนpสำหรับ
Ramon Marco L. Navarro

15
เช่นเดียวกับ "1 ถือการลบครั้งสุดท้าย" 2 ถือการลบครั้งที่สองครั้งสุดท้าย "3 ถือการลบครั้งสุดท้ายครั้งที่สาม ฯลฯ จนถึง" 9
James

330

หนึ่งในส่วนที่ฉันชอบเกี่ยวกับการลงทะเบียนคือการใช้มันเป็นมาโคร!

สมมติว่าคุณกำลังจัดการกับไฟล์ค่าที่คั่นด้วยแท็บเช่น:

ID  Df  %Dev    Lambda
1   0   0.000000    0.313682
2   1   0.023113    0.304332
3   1   0.044869    0.295261
4   1   0.065347    0.286460
5   1   0.084623    0.277922
6   1   0.102767    0.269638
7   1   0.119845    0.261601

ตอนนี้คุณตัดสินใจว่าคุณจะต้องเพิ่มเครื่องหมายเปอร์เซ็นต์ที่ส่วนท้ายของฟิลด์% Dev (เริ่มจากบรรทัดที่ 2) เราจะสร้างมาโครแบบง่ายในการmลงทะเบียน(เลือกโดยพลการ) ดังนี้:

  1. กด:: qmเพื่อเริ่มการบันทึกแมโครภายใต้การmลงทะเบียน

  2. EE: ไปที่ท้ายคอลัมน์ 3

  3. a: โหมดแทรกเพื่อต่อท้ายคอลัมน์นี้

  4. %: พิมพ์เครื่องหมายเปอร์เซ็นต์ที่เราต้องการเพิ่ม

  5. <ESC>: กลับสู่โหมดคำสั่ง

  6. j0: ไปที่จุดเริ่มต้นของบรรทัดถัดไป

  7. q: หยุดการบันทึกมาโคร

ตอนนี้เราสามารถพิมพ์@mเพื่อเรียกใช้แมโครนี้ในบรรทัดปัจจุบัน นอกจากนี้เราสามารถพิมพ์@@ทำซ้ำหรือ100@mทำสิ่งนี้ได้ 100 ครั้ง! ชีวิตดูดีทีเดียว

ณ จุดนี้คุณควรจะพูดว่า " แต่ต้องรอการตรวจสอบนี้มีอะไรที่เกี่ยวข้องกับการลงทะเบียน "

จุดที่ดีเยี่ยม ลองตรวจสอบสิ่งที่อยู่ในเนื้อหาของการลงทะเบียนโดยการพิมพ์m "mpจากนั้นเราจะได้รับดังต่อไปนี้:

EEa%<ESC>j0

ตอนแรกดูเหมือนว่าคุณจะเปิดไฟล์ไบนารีในแผ่นจดบันทึกโดยไม่ได้ตั้งใจ แต่เมื่อเหลือบดูครั้งที่สองมันเป็นลำดับอักขระที่แน่นอนในมาโครของเรา!

คุณเป็นคนที่อยากรู้อยากเห็นจึงขอทำสิ่งที่น่าสนใจและแก้ไขบรรทัดของข้อความนี้ไปใส่แทนน่าเบื่อเก่า!%

EEa!<ESC>j0

จากนั้นของัดนี้ลงทะเบียนโดยการพิมพ์n B"nyEถ้าอย่างนั้นเรามาเรียกใช้nแมโครบนบรรทัดข้อมูลของเราโดยใช้@n....

OMG มันเพิ่ม !

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


65
นี่คือกุญแจสำคัญโดยสิ้นเชิง ฉันไม่ได้สังเกตจนกระทั่งตอนนี้ว่ารีจิสเตอร์นั้นเหมือนกับบัฟเฟอร์แมโคร ซึ่งหมายความว่าคุณสามารถเก็บมาโครของคุณทั้งหมดในข้อความดึงพวกเขาและเรียกใช้พวกเขา ค่อนข้างเท่และแปลกไปหน่อย เป็นกลุ่มมาก
naught101

1
มันเป็นโน้ตย่อของกองบรรณาธิการ แต่ตัวล็อคที่มีตัวหนา ... อาจแก้ไขได้ มันค่อนข้างน่ารังเกียจในขณะนี้
ashrasmun

1
คุณสามารถใช้+แทนj0เพื่อไปที่อักขระที่ไม่ใช่ช่องว่างแรกในบรรทัดถัดไป
Gokul

100

การลงทะเบียนที่มีประโยชน์อื่น ๆ :

"*หรือ"+- เนื้อหาของคลิปบอร์ดของระบบ

"/ - คำสั่งค้นหาล่าสุด

": - คำสั่งสุดท้าย

หมายเหตุด้วย vim macros คุณสามารถแก้ไขได้เนื่องจากเป็นเพียงรายการของการกดแป้นที่ใช้เมื่อบันทึกแมโคร ดังนั้นคุณสามารถเขียนไปยังแฟ้มข้อความแมโคร (ใช้"apในการเขียนแมโคร) และแก้ไขพวกเขาและโหลดลงทะเบียนกับ วิธีที่ดีในการจัดเก็บมาโครที่มีประโยชน์"ay$


6
เสียงเรียกเข้าเริ่มต้นบน OSX ไม่รวมการรวม "*" คุณสามารถติดตั้งรุ่นจาก homebrew-alt ที่ทำด้วยตรวจสอบด้วยvim --version- -clipboardหมายความว่าคุณไม่มี+clipboardหมายความว่าคุณทำ
Xavier Shay

15
ใน X11 "*และ"+เย็นกว่า: "+วางข้อความสุดท้ายที่คัดลอกด้วยctrl+c(บัฟเฟอร์การคัดลอก) หรือทางลัดที่คุณใช้ (หรือright-click>copy) "*วางข้อความสุดท้ายที่ไฮไลต์ด้วยเมาส์ (บัฟเฟอร์การเลือก) ดังนั้นหากคุณคัดลอกบางสิ่งด้วยctrl+cและจากนั้นไฮไลท์อย่างอื่นด้วยเมาส์คุณสามารถเลือกที่จะวาง สิ่งนี้ไม่สามารถใช้งานได้ใน Windows โดยที่รีจิสเตอร์ทั้งสองนี้ตรงกัน
naught101

1
อวยพรคุณฉันกำลังมองหา"*และ"+ปี! ฉันคิดว่ามีเพียง gvim เท่านั้นที่สามารถเข้าถึงคลิปบอร์ดของระบบได้ แต่ดูเหมือนว่ากลุ่มปกติก็ทำเช่นกัน!
Tarrasch

@Tarrasch หากคุณใช้กลุ่มคอนโซลแทน gvim คุณจะค้นพบอะไรมากมาย ฉันคิด. เยี่ยมชม #vim บน freenode ด้วย!
trusktr

1
วิธีการเปิดใช้หากมีใน-xterm_clipboard vim --versionแพคเกจใด ๆ ที่ง่ายต่อการติดตั้ง? (เดเบียน / apt-get) ขอบคุณ
ดร. เบ

77

การลงทะเบียนหลุมดำ _นั้นเป็นการ/dev/nullลงทะเบียน

ฉันใช้ใน vimrc ของฉันเพื่ออนุญาตให้ลบอักขระเดียวโดยไม่ต้องอัปเดตค่าเริ่มต้น:

noremap x "_x

และวางในโหมดภาพโดยไม่ต้องอัพเดตการลงทะเบียนเริ่มต้น:

vnoremap p "_dP

การทำแผนที่ที่สองก็มีประโยชน์มาก ดูคำอธิบายได้ที่นี่: marcorucci.com/blog/#visualModePaste
mrucci

21
การทำแผนที่สำหรับxลดความยุ่งยากในการแปลงอักขระ
skeept

การกด x จะไม่ลบสิ่งสุดท้ายที่คุณกระชากซึ่งคุณจะพบอยู่ในการลงทะเบียน 0 กด xa สองสามครั้งแล้ว "0p เพื่อวางสิ่งที่คุณดึง
trusktr

2
หากต้องการขยายหมายเหตุของ skeept ด้านบน: ด้วยการจับคู่นี้xคุณจะไม่สามารถทำxpคำสั่ง "" อีกต่อไป"เพื่อสลับกระแสกับตัวอักษรถัดไป มีประโยชน์มากสำหรับการแก้ไขข้อผิดพลาด นอกจากนี้เรายังต้องXpสลับกระแสกับตัวอักษรก่อนหน้า
Daniel Andersson

56

<C-r><registerletter>หากคุณเคยต้องการที่จะวางเนื้อหาของการลงทะเบียนในคำสั่งอดีตโหมดการตี

ทำไมคุณจะใช้สิ่งนี้ ฉันต้องการค้นหาและแทนที่สตริงที่มีความยาวดังนั้นฉันเลือกมันในโหมดภาพเริ่มพิมพ์นิพจน์การค้นหา / แทนที่:%s/[PASTE YANKED PHRASE]//gและไปในวันของฉัน

หากคุณต้องการวางคำเพียงคำเดียวในโหมด ex ให้แน่ใจว่าเคอร์เซอร์อยู่ที่คำนั้นก่อนที่จะเข้าสู่โหมด ex จากนั้นกดปุ่ม<C-r><C-w>เมื่ออยู่ในโหมด ex เพื่อวางคำ


6
การวางข้อความใน:บรรทัดคำสั่งเป็นสิ่งที่ดีที่สุดที่ฉันเรียนรู้ในวันนี้
Shahbaz

1
นอกจากนี้คุณยังสามารถใช้ <CR> <registerletter> ในโหมดแทรก
Floegipoky

1
ผมชอบเขียนหา / แทนที่ regexes แรกมีเพียงแล้วที่จะเปลี่ยนเพียง/[write out your regex]<cr> s/<C-R>//replacement/วิธีนี้คุณจะได้รับประโยชน์จากฟีดแบ็กสด ๆ บน regex ของคุณก่อนที่จะทำการแทนที่
GabeIsman

44

ฉันคิดว่ากูรูลับการลงทะเบียนคือการแสดงออก = ลงทะเบียน สามารถใช้สำหรับการจับคู่โฆษณา

:inoremap  \d The current date <c-r>=system("date")<cr>

คุณสามารถใช้ร่วมกับระบบของคุณดังกล่าวข้างต้นหรือรับการตอบสนองจากฟังก์ชั่น VimL ที่กำหนดเอง ฯลฯ

หรือเพียงแค่สิ่งที่เฉพาะกิจเช่น

<c-r>=35+7<cr>

3
ลองดูวิดีโอของ Derek Wyatt [การใช้การลงทะเบียนนิพจน์] ( derekwyatt.org/vim/vim-tutorial-videos/… )
Jeromy Anglim

1
ลิงค์จาก @JeromyAnglim อยู่ที่นี่แล้ว: derekwyatt.org/vim/tutorials/advanced/#expression-register
Djizeus

39

เคล็ดลับสุดยอดคือการใช้"1pเพื่อวางการลบ / เปลี่ยนแปลงครั้งล่าสุด (และจากนั้นใช้.ซ้ำ ๆ เพื่อวางการลบถัดไปในคำอื่น ๆ"1p...โดยทั่วไปเทียบเท่ากับ"1p"2p"3p"4pเป็นพื้นเทียบเท่ากับ

คุณสามารถใช้สิ่งนี้เพื่อเรียงลำดับบรรทัดกลับด้าน: dddddddddd"1p....


aha อันนี้วิเศษมาก สิ่งที่ฉันต้องการจริงๆเป็นพฤติกรรมเดียวกันสำหรับ
yanks

18

จากหน้าความช่วยเหลือของ vim:

CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*
        Insert the contents of a numbered or named register.  Between
        typing CTRL-R and the second character '"' will be displayed
        <...snip...>
        Special registers:
            '"' the unnamed register, containing the text of
                the last delete or yank
            '%' the current file name
            '#' the alternate file name
            '*' the clipboard contents (X11: primary selection)
            '+' the clipboard contents
            '/' the last search pattern
            ':' the last command-line
            '-' the last small (less than a line) delete
            '.' the last inserted text
                            *c_CTRL-R_=*
            '=' the expression register: you are prompted to
                enter an expression (see |expression|)
                (doesn't work at the expression prompt; some
                things such as changing the buffer or current
                window are not allowed to avoid side effects)
                When the result is a |List| the items are used
                as lines.  They can have line breaks inside
                too.
                When the result is a Float it's automatically
                converted to a String.
        See |registers| about registers.  {not in Vi}
        <...snip...>

17
  • บันทึก q5 แก้ไขลงทะเบียน 5 (หยุด q หยุดบันทึกต่อไป)
  • : reg แสดงการลงทะเบียนทั้งหมดและเนื้อหาใด ๆ ในนั้น
  • @ 5 ดำเนินการลงทะเบียน 5 แมโคร (การแก้ไขที่บันทึกไว้)

15
ฉันไม่ชอบปุ่ม @ เพื่อเปิดใช้งานมาโคร (การกดแป้นสามครั้ง) ดังนั้นผมจึงมีแมป F2 เพื่อเปิดแมโครที่เก็บไว้ในการลงทะเบียน Q: nmap <F2> @q ผมใช้ลงทะเบียน Q แล้วเพราะจะบันทึกแมโครสำหรับ F2 qqเพื่อเล่นผมเพียงแค่กด บันทึกและเล่นซ้ำแมโครอย่างรวดเร็ว
Andrej Panjkov

16

ฉันใช้การลงทะเบียนเริ่มต้นเพื่อ grep สำหรับข้อความในหน้าต่าง vim ของฉันโดยไม่ต้องเข้าถึงสำหรับเมาส์

  1. ข้อความงัด
  2. :!grep "<CTRL-R>0"<CR>

12

การใช้งานที่ลงทะเบียนในคำสั่ง@ด้วย เช่น:

echo @a
echo @0
echo @+

ตั้งไว้ในคำสั่ง:

let @a = 'abc'

ตอนนี้จะวาง"apabc


8

แหล่งใหญ่ของความสับสนคือการลงทะเบียนเริ่มต้น "แหล่งใหญ่ของความสับสนคือการลงทะเบียนเริ่มต้นมันเป็นสิ่งสำคัญที่จะรู้วิธีการทำงาน มันจะดีกว่าถ้าหลีกเลี่ยงการลงทะเบียนเริ่มต้นบ่อยครั้งที่สุด คำอธิบายจากเอกสาร Vim:

Vim fills this register with text deleted with the "d", "c", "s", "x" commands
or copied with the yank "y" command, regardless of whether or not a specific
register was used (e.g.  "xdd).  This is like the unnamed register is pointing
to the last used register.

ดังนั้นการลงทะเบียนเริ่มต้นเป็นตัวชี้ไปยังการลงทะเบียนที่ใช้ล่าสุด เมื่อคุณลบหรือดึงบางสิ่งบางอย่างลงทะเบียนนี้จะชี้ไปที่การลงทะเบียนอื่น ๆ คุณสามารถทดสอบได้โดยการตรวจสอบการลงทะเบียน มีการลงทะเบียนอีกครั้งที่เหมือนกับการลงทะเบียนเริ่มต้นเสมอ: การลงทะเบียน yank ("0 ), ลบการลงทะเบียนครั้งแรก ( "1), ลบการลงทะเบียนขนาดเล็ก ( "-) หรือการลงทะเบียนอื่น ๆ ที่ใช้ในการลบหรืองัด

ข้อยกเว้นเพียงอย่างเดียวคือการลงทะเบียนหลุมดำ Vim doc พูดว่า:

An exception is the '_' register: "_dd does not store the deleted text in any
register.

โดยปกติแล้วคุณจะดีกว่ามากโดยใช้โดยตรง: "0, "-และการ"1-"9ลงทะเบียนเริ่มต้นหรือการลงทะเบียนชื่อ


8

หนึ่งการลงทะเบียนที่ถูกมองข้ามคือ '.' dot register ซึ่งมีข้อความที่แทรกล่าสุดไม่ว่าจะแทรกอย่างไรเช่น ct] (เปลี่ยนจนถึง]) จากนั้นคุณจะรู้ว่าคุณต้องแทรกมันไว้ที่อื่น แต่ไม่สามารถใช้วิธีการทำซ้ำแบบจุด

 :reg .
 :%s/fred/<C-R>./

7

การลงทะเบียนที่ฉันชอบคือการ':'ลงทะเบียน การทำงาน@:ในโหมดปกติทำให้ฉันสามารถทำซ้ำคำสั่ง ex ก่อนหน้านี้ที่รันได้


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