คำสั่ง Vim ใดบ้างที่สามารถใช้เพื่ออ้าง / ไม่พูดคำ


204

ฉันจะพูด / unquote คำพูดอย่างรวดเร็วและเปลี่ยนการอ้างอิง (เช่นจาก'เป็น") ใน Vim ได้อย่างไร? ฉันรู้เกี่ยวกับปลั๊กอินSurround.vimแต่ฉันต้องการใช้เป็นกลุ่มเท่านั้น


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

สำหรับคำเดียวหรือทุกคำในบรรทัด เช่นเมื่อแปลงคำที่วางเป็นตัวอักษรสตริง
ยูจีนยาร์มาช

คำตอบ:


251

Surround.vim จะเป็นคำตอบที่ง่ายที่สุดของคุณ หากคุณไม่ได้ใช้งานอย่างแท้จริงนี่คือตัวอย่างของสิ่งที่คุณสามารถทำได้ ไม่จำเป็นต้องมีประสิทธิภาพมากที่สุด แต่นั่นเป็นเหตุผลว่าทำไมจึงเขียน Surround.vim

  • อ้างคำโดยใช้เครื่องหมายคำพูดเดี่ยว
    ciw'Ctrl+r"'
    • ciw - ลบคำที่เคอร์เซอร์เปิดอยู่และสิ้นสุดในโหมดแทรก
    • ' - เพิ่มคำพูดแรก
    • Ctrl+r"- แทรกเนื้อหาของ"รีจิสเตอร์หรือที่รู้จักกันในชื่อ yank / delete ล่าสุด
    • ' - เพิ่มคำพูดปิด

  • เลิกอ้างคำที่อยู่ในเครื่องหมายคำพูดเดี่ยว
    di'hPl2x
    • di' - ลบคำที่อยู่ในเครื่องหมายคำพูดเดี่ยว
    • hP - เลื่อนเคอร์เซอร์ไปทางซ้ายที่เดียว (ด้านบนของเครื่องหมายคำพูดเปิด) และใส่ข้อความที่เพิ่งลบไปก่อนหน้าเครื่องหมายคำพูด
    • l - เลื่อนเคอร์เซอร์ไปทางขวาที่เดียว (ด้านบนของเครื่องหมายคำพูดเปิด)
    • 2x - ลบเครื่องหมายคำพูดทั้งสอง

  • เปลี่ยนเครื่องหมายคำพูดเดี่ยวเป็นเครื่องหมายคำพูดคู่
    va':s/\%V'\%V/"/g
    • va' - เลือกคำที่ยกมาและคำพูดด้วยสายตา
    • :s/ - เริ่มเปลี่ยนใหม่
    • \%V'\%V - จับคู่คำพูดเดี่ยวที่อยู่ในภูมิภาคที่เลือกทางสายตาเท่านั้น
    • /"/g - แทนที่พวกเขาทั้งหมดด้วยเครื่องหมายคำพูดคู่

1
มันใช้งานได้ดีสำหรับฉัน เพียงแค่ googled ที่วางในโหมดแทรกก็เป็นไปได้ด้วย Ctrl + op
Eugene Yarmash

1
ใช้ร่วมกับ Record Mode (q), ทำงานได้อย่างมีเสน่ห์สำหรับงานที่รวดเร็ว
บิชอป

ทำไมciwและไม่เพียงcw? ฉันพบความสับสนครั้งแรกและครั้งที่สองทำงานได้ดี
Big McLargeHuge

18
@Koveras ciwทำงานโดยไม่คำนึงว่าเคอร์เซอร์อยู่ที่ไหนในคำนั้น cwใช้งานได้เฉพาะเมื่อเคอร์เซอร์ของคุณอยู่ที่จุดเริ่มต้นของคำ :help iwดู
jamessan

10
การไฮแจ็กคำตอบยอดนิยมเพื่อให้เคล็ดลับเล็ก ๆ น้อย ๆ : หากคุณมีหลายคำที่จะแทนที่คำพูดเดี่ยวในเครื่องหมายคำพูดคู่คุณอาจสังเกตเห็นว่าวิธีแก้ปัญหาแรกของ @jamessan ไม่สามารถใช้.คำสั่งได้ เพื่อให้มันใช้งานciw' Ctrl+r Ctrl+p"ได้ จากนั้น.จะทำงานตามที่คุณต้องการสำหรับคำต่อไปนี้: แทนที่จะจดจำเนื้อหาของการลงทะเบียนมันจะจำได้ว่าคุณต้องการอะไรก็ตามที่อยู่ในทะเบียนตอนนี้ (ยากที่จะอธิบาย แต่ถ้าคุณลองทั้งคู่จะเห็นได้ชัด) :-))
autra

182

อ้างคำโดยใช้เครื่องหมายคำพูดเดี่ยว

ciw'Ctrl+r"'

มันง่ายกว่าที่ฉันจะทำแบบนี้

ciw '' Esc P

8
น่าเสียดายที่ไม่อนุญาต (ซ้ำ)
Wil Moore III

2
ฉันชอบสิ่งนี้เพราะฉันสามารถใช้กับเทอร์มินัล / repls ด้วยโหมด vim เนื่องจาก Ctrl + r มักจะใช้สำหรับค้นหาประวัติย้อนกลับ
krock

3
@wilmoore บันทึกข้างต้นเป็นแมโครแล้วเล่นซ้ำ
Christopher

30

นี่คือการทำแผนที่บางอย่างที่สามารถช่วยได้:

:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P

หากคุณยังไม่ได้เปลี่ยนตัวแปร mapleader แล้วเปิดใช้งานการทำแผนที่ด้วยหรือ\q" \q' \qdพวกเขาเพิ่มคำพูดสองครั้งรอบคำภายใต้เคอร์เซอร์คำพูดเดียวรอบคำภายใต้เคอร์เซอร์ลบคำพูดใด ๆ รอบคำภายใต้เคอร์เซอร์ตามลำดับ


ความคิดที่ยอดเยี่ยม! ฉันสิ้นสุดการเพิ่มmap <Leader>' gewi'<Esc>A'<Esc>ลงใน.vimrcไฟล์ของฉันเพื่อแทรกความคิดเห็นคำพูดเดียวจากตำแหน่งปัจจุบันไปยังจุดสิ้นสุดของบรรทัด; ซึ่งช่วยฉันในขณะที่แปลงสคริปต์ MSDOS เพื่อทุบตี
ILMostro_7

@ Geoff มันทำงานได้ดีสำหรับคำพูดเดียว แต่สำหรับคำพูดสองครั้งมัน insterts `" "" "` ด้านหน้าของคำ
RameshVel

@RameshVel เป็นไปได้ว่าคุณมีมาโครบางตัวที่มีผลกระทบทางด้านขวาของแผนที่ ฉันอัพเดตคำสั่งการแม็พเป็น nnoremap เพื่อให้การแม็พอื่นไม่ถูกขยาย ฉันยังปรับปรุงการแมป คนก่อนหน้ามีปัญหาเมื่อเคอร์เซอร์อยู่ที่คำแรกของบรรทัด
Geoff Reedy

:vnoremap <leader>q c""<esc>Pนอกจากนี้ยังสามารถดัดแปลงได้ง่ายสำหรับโหมดภาพที่จะล้อมรอบตัวเลือกที่มีคำพูดเช่น
Dominik

27

นอกเหนือจากคำสั่งอื่น ๆ คำสั่งนี้จะใส่คำทั้งหมดในบรรทัดด้วยเครื่องหมายคำพูดคู่ (ตามความคิดเห็นของคุณ)

:s/\(\S\+\)/"\1"/

หรือถ้าคุณต้องการลดจำนวนแบ็กสแลชคุณสามารถใส่ตัวปรับ\v(วิเศษมาก) ที่จุดเริ่มต้นของรูปแบบ

:s/\v(\S+)/"\1"/

ข้อความที่คัดลอกของฉันมีเครื่องหมายจุลภาคอยู่ด้วยดังนั้นฉันจึงเปลี่ยนเป็นข้อความนี้:s/\v([a-Z]+)/"\1"/g
tsukimi

22

วิธีมาโคร!

  1. กดqและqสำหรับบันทึกลงใน q register (เราใช้ "q" เป็นทางลัดเพื่อจดจำ "เครื่องหมายคำพูด")

  2. กดshift+ bย้ายเคอร์เซอร์ไปข้างหน้าคำปัจจุบัน

  3. กดiประเภท'(คำพูดเดียว)

  4. กดescจากนั้นกดeเพื่อย้ายไปยังจุดสิ้นสุดของคำ

  5. กดaจากนั้นกด'อีกครั้งเพื่อล้อมคำด้วยเครื่องหมายคำพูด

  6. กดescเพื่อเข้าสู่โหมดปกติ

  7. ในที่สุดกดqเพื่อบันทึกลงในqทะเบียน

วิธีใช้

  1. เลื่อนเคอร์เซอร์ไปยังคำที่ต้องการ
  2. กด@qเพื่อล้อมคำด้วยเครื่องหมายคำพูด
  3. กด@@ถ้าคุณต้องการทำซ้ำมันเป็นคำอื่น

คุณสามารถเปลี่ยนแปลงstep 4อะไรก็ได้ที่คุณชอบ {บรรทัดคำจนกระทั่งพบอักขระบางตัว ฯลฯ }

ทำให้แมโครที่บันทึกไว้ยังคงอยู่

  1. เปิด. vimrc
  2. ไปที่จุดสิ้นสุดของไฟล์
  3. เปลี่ยนเป็นโหมดแทรก พิมพ์สิ่งนี้เพื่อให้มันคงอยู่:
let @ q = ' ctrl+ r ctrl+ rq'
  1. บันทึกและออก

  2. เปิดไฟล์ของคุณไปที่คำบางคำ

  3. ตอนนี้กด @q

หากคุณทำอย่างถูกต้องสิ่งมหัศจรรย์ควรปรากฏในคำพูดของคุณ

คุณสามารถทำตามขั้นตอนนี้สำหรับมาโครอื่นที่คุณรัก


3
ต้องบอกว่าฉันชอบวิธีนี้ ไม่จำเป็นต้องใช้ Surround.vim และง่ายต่อการเรียกใช้และสร้างมาโคร นอกจากนี้ยังสามารถใช้งานได้อย่างง่ายดายสำหรับสิ่งอื่น ๆ ที่คุณต้องการ (สำหรับฉันเช่นพูดคำปัจจุบันจนถึงตอนท้ายของบรรทัดที่สมบูรณ์แบบสำหรับ ansible) ในการแสดงแมโครให้ทำ: "qp หากต้องการบันทึกไปที่. vimrc และทำดังนี้: ให้ @q = 'เนื้อหามาโคร' (เพื่อความสมบูรณ์)
th3penguinwhisperer

ฉันชอบสิ่งนี้มาก คุณสามารถซ้อนมาโครเหล่านี้ได้เช่นกัน ดังนั้นคุณจึงสามารถบันทึกในทะเบียนญ@q wและจากนั้นคุณสามารถตัดต่อไปคำที่มีคำพูดที่ใช้กับn n@j
ชื่อผู้ใช้ที่ซ่อนอยู่

1
ฉันเพิ่มบางขั้นตอนเพื่อทำให้แมโครถาวร
Brain90

1
Pedantic แต่ word และ WORD นั้นแตกต่างกันใน Vim Shift + b = B ดังนั้นขั้นตอนที่ 2 ควรเปลี่ยนเป็น "... front of WORD ปัจจุบัน" หากคุณหมายถึงการเริ่มต้นของคำคุณไม่จำเป็นต้องใช้ Shift
Ambareesh

ขอบคุณสำหรับจุดที่ ฉันใช้ shift + b เพื่อจัดการกับคำ แมโครควรทำงานในคำหรือ WORD [0] จริง ๆ แล้วขั้นตอนที่ 3 ควรเปลี่ยนเป็น + e [0] stackoverflow.com/a/14390568/341959
Brain90

18

หากต้องการตัดคำพูดเดียว (ตัวอย่าง) ให้ใช้ciw'<C-r>"'<esc>งานได้ แต่การทำซ้ำจะไม่ทำงาน ลอง:

ciw'<C-r><C-o>"'<esc>

นี่ทำให้เนื้อหาของการลงทะเบียนเริ่มต้น "แท้จริง" ตอนนี้คุณสามารถกด.ที่คำใดก็ได้เพื่อปิดมันด้วยเครื่องหมายคำพูด หากต้องการเรียนรู้:h[elp] i_ctrl-rเพิ่มเติมเกี่ยวกับวัตถุข้อความที่:h text-objects

ที่มา: http://vimcasts.org/episodes/pasting-from-insert-mode/


2
สุดยอดเคล็ดลับ! ciw'<C-R><C-O>"'<Esc>ถ้าใครต้องการที่จะทำให้การทำแผนที่นี้สัญกรณ์ที่เหมาะสมคือ
glts

<Cr> "ทำอะไรกันแน่
CodeCrack

@CodeCrack มันเป็น CTRL-R CTRL-R แทรกเนื้อหาของรีจิสเตอร์ที่เคอร์เซอร์และอยู่ในโหมดแทรก
Erwin Rooijakkers

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

7

สำหรับผู้ใช้ VSCodeVim คุณสามารถทำได้

vwS"

  • คุณสามารถแทนที่"ด้วยสิ่งที่คุณต้องการห่อ
  • คุณสามารถแทนที่wด้วยตัวดำเนินการตัวเลือกอื่น ๆ

2
สิ่งนี้ทำงานได้ดีสำหรับฉันใน MacVIM แต่ฉันต้องใช้viwS'ซึ่งตัดคำด้วยเครื่องหมายคำพูดเดี่ยว โดยวิธีที่ง่ายที่สุด
Matt Grannary

ใช้งานได้เฉพาะถ้าคุณอยู่ที่จุดเริ่มต้นของคำ ถ้าคุณต้องการที่จะทำมันจากที่ใดก็ได้ในคำว่าคุณสามารถทำได้:viwS"
geoyws

6

ฉันไม่ทราบคำสั่ง builtin vim สำหรับสิ่งนี้ แต่ใช้r"f'r"เพื่อเปลี่ยนจาก 'เป็น' และr'f"r'เปลี่ยนจาก "เป็น 'หากคุณยืนอยู่บนคำแรก' หรือ" คำสั่งr'จะแทนที่อักขระใดก็ตามที่อยู่ภายใต้เคอร์เซอร์ของคุณด้วย ', และf"เลื่อนคุณไปข้างหน้าสู่สิ่งต่อไป "


1
โซลูชัน "คู่มือ" ที่ใช้งานง่ายที่สุดสำหรับฉัน แทนคำสั่งการแทนที่ที่สอง ( 'rและ"r) คุณสามารถพิมพ์.และถ้าคุณต้องการเปลี่ยนเครื่องหมายคำพูดเพิ่มเติม;และ,นำคุณไปยังคำสั่งถัดไปหรือก่อนหน้าเนื่องจากพวกเขาf/F/t/Tทำการค้นหาล่าสุดซ้ำในทิศทางเดียวกันหรือคำตรงกันข้าม
สิ้นสุด

5

การเพิ่มคำพูด

ฉันเริ่มใช้ฟังก์ชันที่รวดเร็วและสกปรกใน.vimrc:

vnoremap q <esc>:call QuickWrap("'")<cr>
vnoremap Q <esc>:call QuickWrap('"')<cr>

function! QuickWrap(wrapper)
  let l:w = a:wrapper
  let l:inside_or_around = (&selection == 'exclusive') ? ('i') : ('a')
  normal `>
  execute "normal " . inside_or_around . escape(w, '\')
  normal `<
  execute "normal i" . escape(w, '\')
  normal `<
endfunction

ดังนั้นตอนนี้ฉันเลือกสิ่งที่ฉันต้องการ (โดยทั่วไปผ่านviw- เลือกคำในภาพ) ในเครื่องหมายคำพูดและกดQเพื่อใส่เครื่องหมายคำพูดคู่หรือกดqเพื่อใส่เครื่องหมายคำพูดเดี่ยว

การลบคำพูด

vnoremap s <esc>:call StripWrap()<cr>

function! StripWrap()
  normal `>x`<x
endfunction

ฉันใช้vim-textobj-quotesเพื่อที่ vim จะถือว่าราคาเป็นวัตถุข้อความ ซึ่งหมายความว่าฉันสามารถทำได้vaq(เลือกรอบคำพูดด้วยสายตาสิ่งนี้จะค้นหาคำพูดที่ใกล้ที่สุดและเลือกภาพนั้น (นี่เป็นทางเลือกคุณสามารถทำอะไรก็ได้f"vww) จากนั้นฉันกดsเพื่อตัดเครื่องหมายคำพูดออกจากส่วนที่เลือก

การเปลี่ยนคำพูด

จูบ. ฉันคำพูดลบแล้วเพิ่มคำพูด ตัวอย่างเช่นในการเปลี่ยนราคาเดียวกับราคาคู่ผมจะดำเนินการตามขั้นตอนดังนี้ 1. ลบราคาเดียว: vaqs2. vwQเพิ่มคำพูดใหม่:



4

หากคุณใช้ปลั๊กอินเสียงเรียกเข้าhttps://github.com/tpope/vim-surround (หรือใช้ปลั๊กอิน VSCode Vim ซึ่งมาพร้อมกับเสียงเรียกเข้าที่ติดตั้งไว้ล่วงหน้าเป็นเสียงเรียกเข้า) จะทำให้คุณมั่นใจได้เลย!

เพิ่ม

ysiw' // surround in word `'`

หล่น

ds' // drop surround `'`

เปลี่ยนแปลง

cs'" // change surround from `'` to `"`

มันใช้งานได้กับแท็ก html!

cst<em> // change surround from current tag to `<em>`

ตรวจสอบ readme บน GitHub สำหรับตัวอย่างที่ดีกว่า


2

ต่อไปนี้คือการแมปแบบง่าย ๆ ที่สามารถใช้ในการพูดและไม่พูดคำ:

" 'quote' a word
nnoremap qw :silent! normal mpea'<Esc>bi'<Esc>`pl
" double "quote" a word
nnoremap qd :silent! normal mpea"<Esc>bi"<Esc>`pl
" remove quotes from a word
nnoremap wq :silent! normal mpeld bhd `ph<CR>

1
มันจะดีสำหรับทุกคนถ้าคุณสามารถทำอย่างละเอียดคำตอบของคุณ: วิธีการเพิ่มการแมปวิธีการโทรหาพวกเขา ฯลฯ ขอบคุณ
Carles Alcolea

1
ฉันจะบอกว่าการพูดอ้างสองเท่าและไม่ควรพูดqw qd wq
nilon

ด้วยเหตุผลบางอย่างการเสนอราคาซ้ำคืนการเสนอราคาเพิ่มเติมในตอนท้ายเช่น "word" "
janicebaratheon

@ShuaiWang คุณอาจมีออโต้พาร์ทหรือมีการติดตั้งส่วนขยายที่คล้ายกันอยู่บ้างไหม? การลบข้อผิดพลาดคงที่สำหรับฉัน
Nephilim

2

VIM สำหรับ vscodeมันสุดยอดมาก มันใช้vim-Surroundหนึ่งตัวหากคุณไม่ใช้ vscode

ตัวอย่างบางส่วน:

"ทดสอบ" พร้อมเคอร์เซอร์ภายในเครื่องหมายคำพูดพิมพ์ cs "" เพื่อลงท้ายด้วย "ทดสอบ"

"test" พร้อมเคอร์เซอร์ภายในเครื่องหมายคำพูดพิมพ์ ds "เพื่อจบการทดสอบ

"test" ที่มีเคอร์เซอร์อยู่ในเครื่องหมายคำพูดพิมพ์ cs "t แล้วป้อน 123> เพื่อสิ้นสุดด้วยการทดสอบ <123>

ทดสอบด้วยเคอร์เซอร์บน word test type ysaw) เพื่อสิ้นสุดด้วย (test)


1

ฉันใช้ nnoremap ใน. vimrc ของฉัน

วิธีอ้างคำเดี่ยว:

nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl

หากต้องการลบเครื่องหมายคำพูด (ทำงานกับเครื่องหมายคำพูดคู่เช่นกัน):

nnoremap qs :silent! normal mpeld bhd `ph<CR>

กฎที่ต้องจำ: 'sq' = เครื่องหมายคำพูดเดี่ยว


0

แล้วเรื่องนี้ล่ะ

 :%s/\'/"/g

2
คำสั่งนี้ทำงานกับไฟล์ทั้งหมด ฉันแค่ต้องเปลี่ยนคำเดียว
Eugene Yarmash

4
หากไม่มีตัวเลือก%นี้จะใช้งานได้กับบรรทัดปัจจุบันเว้นแต่ว่าคุณได้เลือกไฟล์ทั้งหมด
เอมิลี่

0

ฉันเขียนสคริปต์ที่ทำสิ่งนี้:

function! WrapSelect (front)
    "puts characters around the selected text.
    let l:front = a:front
    if (a:front == '[')
        let l:back = ']'
    elseif (a:front == '(')
        let l:back = ')'
    elseif (a:front == '{')
        let l:back = '}'
    elseif (a:front == '<')
        let l:back = '>'
    elseif (a:front =~ " ")
        let l:split = split(a:front)
        let l:back = l:split[1]
        let l:front = l:split[0]
    else
        let l:back = a:front
    endif
    "execute: concat all these strings. '.' means "concat without spaces"
    "norm means "run in normal mode and also be able to use \<C-x> characters"
    "gv means "get the previous visual selection back up"
    "c means "cut visual selection and go to insert mode"
    "\<C-R> means "insert the contents of a register. in this case, the
    "default register"
    execute 'norm! gvc' . l:front. "\<C-R>\""  . l:back
endfunction
vnoremap <C-l> :<C-u>call WrapSelect(input('Wrapping? Give both (space separated) or just the first one: '))<cr>

หากต้องการใช้เพียงไฮไลต์บางสิ่งกดการควบคุม l แล้วพิมพ์อักขระ ถ้ามันเป็นหนึ่งในตัวละครที่ฟังก์ชั่นรู้มันก็จะให้ตัวละครที่ถูกยกเลิก หากไม่เป็นเช่นนั้นมันจะใช้อักขระเดียวกันเพื่อแทรกทั้งสองด้าน

Surround.vim สามารถทำได้มากกว่านี้ แต่ก็เพียงพอสำหรับความต้องการของฉัน


-1

ตัวอย่างการแมปโหมดภาพเพื่อเพิ่มเครื่องหมายคำพูดเดี่ยวรอบบล็อกข้อความที่เลือก:

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