ฉันจะพูด / unquote คำพูดอย่างรวดเร็วและเปลี่ยนการอ้างอิง (เช่นจาก'
เป็น"
) ใน Vim ได้อย่างไร? ฉันรู้เกี่ยวกับปลั๊กอินSurround.vimแต่ฉันต้องการใช้เป็นกลุ่มเท่านั้น
ฉันจะพูด / unquote คำพูดอย่างรวดเร็วและเปลี่ยนการอ้างอิง (เช่นจาก'
เป็น"
) ใน Vim ได้อย่างไร? ฉันรู้เกี่ยวกับปลั๊กอินSurround.vimแต่ฉันต้องการใช้เป็นกลุ่มเท่านั้น
คำตอบ:
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
- แทนที่พวกเขาทั้งหมดด้วยเครื่องหมายคำพูดคู่ciw
และไม่เพียงcw
? ฉันพบความสับสนครั้งแรกและครั้งที่สองทำงานได้ดี
ciw
ทำงานโดยไม่คำนึงว่าเคอร์เซอร์อยู่ที่ไหนในคำนั้น cw
ใช้งานได้เฉพาะเมื่อเคอร์เซอร์ของคุณอยู่ที่จุดเริ่มต้นของคำ :help iw
ดู
.
คำสั่งได้ เพื่อให้มันใช้งานciw' Ctrl+r Ctrl+p"
ได้ จากนั้น.
จะทำงานตามที่คุณต้องการสำหรับคำต่อไปนี้: แทนที่จะจดจำเนื้อหาของการลงทะเบียนมันจะจำได้ว่าคุณต้องการอะไรก็ตามที่อยู่ในทะเบียนตอนนี้ (ยากที่จะอธิบาย แต่ถ้าคุณลองทั้งคู่จะเห็นได้ชัด) :-))
อ้างคำโดยใช้เครื่องหมายคำพูดเดี่ยว
ciw'Ctrl+r"'
มันง่ายกว่าที่ฉันจะทำแบบนี้
ciw '' Esc P
นี่คือการทำแผนที่บางอย่างที่สามารถช่วยได้:
: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 เพื่อทุบตี
:vnoremap <leader>q c""<esc>P
นอกจากนี้ยังสามารถดัดแปลงได้ง่ายสำหรับโหมดภาพที่จะล้อมรอบตัวเลือกที่มีคำพูดเช่น
นอกเหนือจากคำสั่งอื่น ๆ คำสั่งนี้จะใส่คำทั้งหมดในบรรทัดด้วยเครื่องหมายคำพูดคู่ (ตามความคิดเห็นของคุณ)
:s/\(\S\+\)/"\1"/
หรือถ้าคุณต้องการลดจำนวนแบ็กสแลชคุณสามารถใส่ตัวปรับ\v
(วิเศษมาก) ที่จุดเริ่มต้นของรูปแบบ
:s/\v(\S+)/"\1"/
:s/\v([a-Z]+)/"\1"/g
วิธีมาโคร!
กดqและqสำหรับบันทึกลงใน q register (เราใช้ "q" เป็นทางลัดเพื่อจดจำ "เครื่องหมายคำพูด")
กดshift+ bย้ายเคอร์เซอร์ไปข้างหน้าคำปัจจุบัน
กดiประเภท'(คำพูดเดียว)
กดescจากนั้นกดeเพื่อย้ายไปยังจุดสิ้นสุดของคำ
กดaจากนั้นกด'อีกครั้งเพื่อล้อมคำด้วยเครื่องหมายคำพูด
กดescเพื่อเข้าสู่โหมดปกติ
ในที่สุดกดqเพื่อบันทึกลงในq
ทะเบียน
วิธีใช้
คุณสามารถเปลี่ยนแปลงstep 4
อะไรก็ได้ที่คุณชอบ {บรรทัดคำจนกระทั่งพบอักขระบางตัว ฯลฯ }
ทำให้แมโครที่บันทึกไว้ยังคงอยู่
let @ q = ' ctrl+ r ctrl+ rq'
บันทึกและออก
เปิดไฟล์ของคุณไปที่คำบางคำ
@q
หากคุณทำอย่างถูกต้องสิ่งมหัศจรรย์ควรปรากฏในคำพูดของคุณ
คุณสามารถทำตามขั้นตอนนี้สำหรับมาโครอื่นที่คุณรัก
@q w
และจากนั้นคุณสามารถตัดต่อไปคำที่มีคำพูดที่ใช้กับn
n@j
หากต้องการตัดคำพูดเดียว (ตัวอย่าง) ให้ใช้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/
ciw'<C-R><C-O>"'<Esc>
ถ้าใครต้องการที่จะทำให้การทำแผนที่นี้สัญกรณ์ที่เหมาะสมคือ
.
จะเป็นการเขียนเนื้อหาของการโทรจริงครั้งล่าสุด
สำหรับผู้ใช้ VSCodeVim คุณสามารถทำได้
vwS"
"
ด้วยสิ่งที่คุณต้องการห่อw
ด้วยตัวดำเนินการตัวเลือกอื่น ๆviwS'
ซึ่งตัดคำด้วยเครื่องหมายคำพูดเดี่ยว โดยวิธีที่ง่ายที่สุด
viwS"
ฉันไม่ทราบคำสั่ง builtin vim สำหรับสิ่งนี้ แต่ใช้r"f'r"
เพื่อเปลี่ยนจาก 'เป็น' และr'f"r'
เปลี่ยนจาก "เป็น 'หากคุณยืนอยู่บนคำแรก' หรือ" คำสั่งr'
จะแทนที่อักขระใดก็ตามที่อยู่ภายใต้เคอร์เซอร์ของคุณด้วย ', และf"
เลื่อนคุณไปข้างหน้าสู่สิ่งต่อไป "
'r
และ"r
) คุณสามารถพิมพ์.
และถ้าคุณต้องการเปลี่ยนเครื่องหมายคำพูดเพิ่มเติม;
และ,
นำคุณไปยังคำสั่งถัดไปหรือก่อนหน้าเนื่องจากพวกเขาf/F/t/T
ทำการค้นหาล่าสุดซ้ำในทิศทางเดียวกันหรือคำตรงกันข้าม
การเพิ่มคำพูด
ฉันเริ่มใช้ฟังก์ชันที่รวดเร็วและสกปรกใน.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. ลบราคาเดียว: vaqs
2. vwQ
เพิ่มคำพูดใหม่:
หากคุณใช้ปลั๊กอินเสียงเรียกเข้า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 สำหรับตัวอย่างที่ดีกว่า
ต่อไปนี้คือการแมปแบบง่าย ๆ ที่สามารถใช้ในการพูดและไม่พูดคำ:
" '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>
qw
qd
wq
VIM สำหรับ vscodeมันสุดยอดมาก มันใช้vim-Surroundหนึ่งตัวหากคุณไม่ใช้ vscode
ตัวอย่างบางส่วน:
"ทดสอบ" พร้อมเคอร์เซอร์ภายในเครื่องหมายคำพูดพิมพ์ cs "" เพื่อลงท้ายด้วย "ทดสอบ"
"test" พร้อมเคอร์เซอร์ภายในเครื่องหมายคำพูดพิมพ์ ds "เพื่อจบการทดสอบ
"test" ที่มีเคอร์เซอร์อยู่ในเครื่องหมายคำพูดพิมพ์ cs "t แล้วป้อน 123> เพื่อสิ้นสุดด้วยการทดสอบ <123>
ทดสอบด้วยเคอร์เซอร์บน word test type ysaw) เพื่อสิ้นสุดด้วย (test)
ฉันใช้ nnoremap ใน. vimrc ของฉัน
วิธีอ้างคำเดี่ยว:
nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl
หากต้องการลบเครื่องหมายคำพูด (ทำงานกับเครื่องหมายคำพูดคู่เช่นกัน):
nnoremap qs :silent! normal mpeld bhd `ph<CR>
กฎที่ต้องจำ: 'sq' = เครื่องหมายคำพูดเดี่ยว
แล้วเรื่องนี้ล่ะ
:%s/\'/"/g
%
นี้จะใช้งานได้กับบรรทัดปัจจุบันเว้นแต่ว่าคุณได้เลือกไฟล์ทั้งหมด
ฉันเขียนสคริปต์ที่ทำสิ่งนี้:
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 สามารถทำได้มากกว่านี้ แต่ก็เพียงพอสำหรับความต้องการของฉัน
ตัวอย่างการแมปโหมดภาพเพื่อเพิ่มเครื่องหมายคำพูดเดี่ยวรอบบล็อกข้อความที่เลือก:
:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>