ฉันจะถือว่าคำพูดของ LaTeX เป็นวัตถุข้อความได้อย่างไร


29

เครื่องหมายอัญประกาศใน LaTeX นั้นแตกต่างจากข้อความปกติโดยมีการจัดรูปแบบ``like this''(หรือ`like this'สำหรับเครื่องหมายคำพูดเดี่ยว) ทำให้ยากที่จะสำรวจพวกมันเป็นกลุ่ม

ฉันมักจะใช้สิ่งที่ชอบT`ct'(ย้อนหลังจนกระทั่ง`เปลี่ยนไป') อย่างไรก็ตามนี่เป็น clunky และผิดธรรมชาติ ฉันชอบที่จะสามารถที่จะใช้สิ่งที่ตามสายของciq( "การเปลี่ยนแปลงในคำพูด") เช่นเดียวกับที่ฉันสามารถทำได้ciw, ca), ci", ca'ฯลฯ

มีวิธีใดบ้างที่จะบอก Vim ให้``LaTeX'' `quotes'ถือเป็นวัตถุข้อความ? (ในฐานะที่เป็นข้อดีมีวิธีใดบ้างที่จะทริกเกอร์สิ่งนี้ขณะแก้ไข.texไฟล์?)

คำตอบ:


10

ฉันไม่รู้จัก LaTeX แต่ดูเหมือนจะใช้ได้:

vnoremap iq :<C-U>silent! normal! t'vT`<CR>
omap iq :normal viq<CR>

ฉันใช้ข้อมูลนี้ออกจากที่นี่: http://vim.wikia.com/wiki/Creating_new_text_objects

คุณสามารถเพิ่มการสนับสนุนได้aqเช่นกัน:

vnoremap aq :<C-U>silent! normal! f'vF`<CR>
omap aq :normal vaq<CR>

งานนี้สำหรับแต่ดูเหมือนจะไม่ทำงานร่วมกับยกตัวอย่างเช่นiq daq
Doorknob

ขวา. คุณสามารถทำให้มันทำงานร่วมaqกับการทำแผนที่ที่คล้ายกันเพิ่มเติม ฉันแก้ไขคำตอบ ฉันสลับ T` กับ t 'ในการทำแผนที่เพื่อให้ค้นหาไปข้างหน้าก่อนซึ่งดูเป็นธรรมชาติมากขึ้นสำหรับฉัน
superjer

งานนี้สำหรับราคาเดียว แต่daqในผลเพียงใน``foo'' `foo'
Doorknob

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

7

แก้ไข : ฉันเพิ่งค้นพบปลั๊กอินvim-textobject-latexซึ่งเพิ่มฟังก์ชันการทำงานที่แน่นอนที่คุณกำลังมองหา (นอกเหนือจากสิ่งอื่น ๆ ) จาก README ของปลั๊กอิน:

วัตถุข้อความที่รองรับในปัจจุบันคือ:

a   i   Description
a\\ i\\ Inline math surrounded by ``\\(`` and ``\\)``.
a$  i$  Inline math surrounded by dollar signs.
aq  iq  Single-quoted text ``\`like this'``.
aQ  iQ  Double-quoted text ``\``like this''``.
ae  ie  Environment ``\begin{...}–\end{...}``

เพื่อให้คุณสามารถใช้caqและไม่ชอบตามที่คุณต้องการ ฉันทดสอบแล้วใช้งานได้ตามที่โฆษณา แต่โปรดทราบว่ามันขึ้นอยู่กับปลั๊กอินvim-textobject-user นอกจากนี้โปรดทราบว่าคุณต้องตรวจสอบให้แน่ใจว่าtextobject-userปลั๊กอินโหลดก่อนไม่เช่นนั้นจะใช้งานไม่ได้


หากคุณไม่ต้องการยุ่งกับปลั๊กอินคำตอบเดิมของฉันยังคงมีประโยชน์:

เพิ่มสองบรรทัดที่คุณ.vimrcปกพระทัยมากที่สุดของสิ่งที่คุณต้องการ

onoremap aq :<c-u>normal! F`vf'<cr>
onoremap iq :<c-u>normal! T`vt'<cr>

เหล่านี้สร้างวัตถุข้อความใหม่ ( aqและiq) ที่กลับไปก่อนหน้านี้`, 'เข้าสู่โหมดเลือกภาพแล้วเลือกขึ้นต่อไป

นี้จะทำงานciq, caq, และyiq diqอย่างไรก็ตามyaqและdaqจะไม่ดึง / ลบเครื่องหมายคำพูดด้านนอกดังนั้นฉันจึงสร้างวัตถุข้อความอื่นa"เพื่อจัดการกับมัน ( i"ไม่จำเป็น แต่ฉันเพิ่มเพื่อให้สิ่งต่าง ๆ สอดคล้องกัน:

onoremap a" :<c-u>normal! 2F`v2f'<cr>
onoremap i" :<c-u>normal! 2T`v2t'<cr>

ข้อเสียที่สำคัญที่นี่คือสิ่งนี้จะผิดปกติca"ฯลฯ ใช้ หากคุณนำหน้าพวกเขาด้วยau FileType texคุณจะมีปัญหานั้นใน.texไฟล์เท่านั้น แต่บางครั้งก็อาจเป็นเรื่องน่ารำคาญ คุณสามารถตั้งชื่อวัตถุเช่นad/ id('d' สำหรับเครื่องหมายคำพูด 'double') แต่มันดูง่ายกว่าสำหรับฉัน

วิธีเดียวที่ฉันคิดว่าจะห่อสิ่งเหล่านี้ลงในวัตถุข้อความสองชิ้นเท่านั้นคือการเขียนฟังก์ชั่นที่ตรวจสอบการอ้างอิงอื่นนอกชุดแรกและตั้งค่าaqวัตถุข้อความให้เรียกสิ่งนั้น

หมายเหตุ : มีปัญหาเล็กน้อยอีกสองสามประการเกี่ยวกับสิ่งเหล่านี้:

  1. Yanking อาจทิ้งเคอร์เซอร์ไว้ในที่ที่ไม่คาดคิด (อาจแก้ไขได้โดยการเพิ่มโดยใช้เครื่องหมายในคำสั่ง (เช่นma2F`v2f'<cr>`a) เพียงให้แน่ใจว่าจะไม่ใช้ที่คุณใช้บ่อย ๆ ด้วยตนเอง)
  2. เคอร์เซอร์จะต้องอยู่ในเครื่องหมายคำพูด สิ่งแปลก ๆ เกิดขึ้นถ้ามันอยู่ในคำพูด

ในการสรุปทั้งหมดนี้คือสิ่งที่ฉันจะเพิ่มให้ฉัน.vimrcสำหรับปัญหานี้:

augroup filetype_latex
    au!
    au FileType tex,plaintex onoremap a' :<c-u>normal! muF`vf'<cr>`u
    au FileType tex,plaintex onoremap i' :<c-u>normal! muT`vt'<cr>`u
    au FileType tex,plaintex onoremap a" :<c-u>normal! mu2F`v2f'<cr>`u
    au FileType tex,plaintex onoremap i" :<c-u>normal! mu2T`v2t'<cr>`u
end augroup

อย่างที่คุณเห็นฉันเลือกที่จะเลิกฟังก์ชั่นปกติca'/ ya"/ ฯลฯ ดังนั้นฉันจึงไม่ต้องเรียนรู้คำสั่งใหม่สำหรับพวกเขาเพราะฉันจะไม่ใช้ฟังก์ชั่นปกติเท่าไรใน LaTeX นั่นเป็นเพียงการตั้งค่าส่วนตัว; ไม่ยากที่จะเปลี่ยนชื่อวัตถุ ฉันยังเพิ่มในการตรวจจับประเภทไฟล์และเครื่องหมาย


2

นี่เป็นคำถามเก่า แต่เพื่อประโยชน์ของผู้เยี่ยมชมในอนาคต: ฉันคิดว่ามันง่ายกว่าที่จะเปลี่ยนราคายางพาราด้วย:

\usepackage{csquotes} % change " " into nice double quotes  
\MakeOuterQuote{"}

และจากนั้นThis thing is "Foobar"!จะทำงานได้ดีในกลุ่มและน้ำยาง


0

เสียบเข้าไป vim-sandwich

อีกปลั๊กอินที่มีประโยชน์สำหรับสิ่งนี้คือvim-sandwichสิ่งที่กำหนดสภาพแวดล้อมเฉพาะฟุต

  • l`หรือl'สำหรับ`text',
  • l"สำหรับ``text''และ
  • textobjects เพื่อใช้งานกับพวกเขาได้อย่างง่ายดาย

ด้วยการแมปเริ่มต้นดังต่อไปนี้การทำงาน

  • textobject:แทนที่ข้อความภายในของ`text'ด้วยcisl'หรือถ้าการตรวจสอบรถยนต์ที่ใกล้ที่สุดโดยรอบดีcib(เช่นเคอร์เซอร์บนhใน`a (phony) text'ต้องกดvibibc) อย่างไรก็ตามคุณสามารถกำหนด textobject เพิ่มเติมต่อไปนี้iq(ตัวอย่าง OP) omap <unique> iq <Plug>(textobj-sandwich-query-i)l' xmap <unique> iq <Plug>(textobj-sandwich-query-i)l' omap <unique> aq <Plug>(textobj-sandwich-query-a)l' xmap <unique> aq <Plug>(textobj-sandwich-query-a)l' omap <unique> iQ <Plug>(textobj-sandwich-query-i)l" xmap <unique> iQ <Plug>(textobj-sandwich-query-i)l" omap <unique> aQ <Plug>(textobj-sandwich-query-a)l" xmap <unique> aQ <Plug>(textobj-sandwich-query-a)l" ตอนนี้เพียงแค่กดciqหรือciQทำงาน
  • เพิ่มไปtextกับsaiwl'apostrophes เดียวที่จะได้รับ`text'
    รูปแบบของคำสั่งsa{motion/textobject}{surrounding}และวิธีการเรียกผู้ประกอบการadd surroundingในและประเภทรอบทิศทางเป็นinner wordlatex single quote
  • ลบด้วยsdl'หรือด้วยsdb
  • เปลี่ยนกับsrl'l"หรือด้วยsrbl"

มันรองรับ

  • repeat.vim โดยTim PopeหรือKana
  • visualrepeat.vimโดย Ingo Karkat (ไม่ได้รับการสนับสนุนจากเสียงรอบทิศทางโดย Tim Pope)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.