ฉันจะจัดการและจดจำตัวย่อจำนวนมากใน vimrc ของฉันได้อย่างไร


10

ฉันมีตัวย่อมากกว่า 500 ตัว ( iabbr, abbr) และการแมปบางอย่างในไฟล์ vimrc ของฉันจาก Java, PHP, C / C ++ และ Latex

มันไม่ง่ายเลยที่จะจดจำได้ทันทีเมื่อฉันไม่ได้ใช้ภาษาในบางครั้ง

ฉันสงสัยว่าฉันสามารถทำชื่อตัวย่อให้สำเร็จได้หรือไม่ มีวิธีใดที่ดีกว่าในการเข้าถึง / จัดการตัวย่อทั้งหมดเหล่านี้?

คำตอบ:


10

ฉันไม่รู้ว่าวิธีใดดีที่สุดในการจัดการตัวย่อมากกว่า 500 ตัว อาจเป็นในระยะยาวตามที่ @statox อธิบายคุณอาจดูตัวอย่างเพื่อลดจำนวนนี้

และหากคุณต้องการตัวย่อให้สมบูรณ์โดยอัตโนมัติคุณสามารถลองใช้รหัสต่อไปนี้:

augroup GetAbbrev
    autocmd!
    autocmd VimEnter * let s:abbrev_list = [] |
                \ call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(s:abbrev_list, submatch(1))', 'gn')
augroup END

set completefunc=CompleteAbbrev
function! CompleteAbbrev(findstart, base)
    if a:findstart
        return searchpos('\<\k', 'bcnW', line('.'))[1] - 1
    else
        return filter(copy(s:abbrev_list), 'v:val =~ "^" . a:base')
    endif
endfunction

หากต้องการใช้งานคุณจะต้องกดC-x C-uหลังจากเริ่มต้นตัวย่อ


autocmd ตั้งค่าตัวแปรs:abbrev_listซึ่งควรมีตัวย่อทั้งหมดของคุณ

ฟังก์ชั่นCompleteAbbrev()ควรกลับรายการของผู้สมัครตามคำก่อนเคอร์เซอร์

ค่าตัวเลือกที่บอกเป็นกลุ่มที่ฟังก์ชั่นที่จะเรียกเมื่อคุณกด'completefunc' โปรดทราบว่าตัวเลือกนั้นเป็นของท้องถิ่นสำหรับบัฟเฟอร์ดังนั้นคุณยังคงสามารถใช้ฟังก์ชั่นอื่น ๆ ในรูปแบบของบัฟเฟอร์ที่แตกต่างกันโดยใช้ autocmd และเหตุการณ์ตัวอย่างC-x C-u
FileType

ดู:h complete-functionsข้อมูลเพิ่มเติมเกี่ยวกับการทำงานของฟังก์ชัน


อีกวิธีคือการใช้คำพ้องความหมายให้สมบูรณ์ จาก:h i_^x^t:

                            *i_CTRL-X_CTRL-T*
CTRL-X CTRL-T       Works as CTRL-X CTRL-K, but in a special way.  It uses
                    the 'thesaurus' option instead of 'dictionary'.  If a
                    match is found in the thesaurus file, all the
                    remaining words on the same line are included as
                    matches, even though they don't complete the word.
                    Thus a word can be completely replaced.

                    For an example, imagine the 'thesaurus' file has a
                    line like this:
                            angry furious mad enraged
                    Placing the cursor after the letters "ang" and typing
                    CTRL-X CTRL-T would complete the word "angry";
                    subsequent presses would change the word to "furious",
                    "mad" etc.
                    Other uses include translation between two languages,
                    or grouping API functions by keyword.

ในการใช้โซลูชันนี้คุณต้องทำ 3 สิ่ง:

  1. เขียน{lhs}ตัวย่อทั้งหมดของคุณลงในไฟล์เฉพาะ
    ตัวอย่างเช่น/home/user/mysynonyms.txt. และจัดกลุ่มตามธีมที่คล้ายกัน
  2. เพิ่มพา ธ ไปยังไฟล์นี้ไปยังตัวเลือก'thesaurus':

    set thesaurus+=/home/user/mysynonyms.txt
    
  3. ตีC-x C-tหลังจากเริ่มต้นชื่อตัวย่อใด ๆ ภายในกลุ่ม

ตัวอย่างเช่นสมมติว่าคุณมีตัวย่อดังต่อไปนี้:

iab cfa CFuncA
iab cfb CFuncB
iab cfc CFuncC

iab jfa JavaFuncA
iab jfb JavaFuncB
iab jfc JavaFuncC

iab pfa PhpFuncA
iab pfb PhpFuncB
iab pfc PhpFuncC

คุณสามารถจัดกลุ่มตามภาษาการเขียนโปรแกรมที่เป็นของพวกเขา
ข้างใน/home/user/mysynonyms.txtคุณจะเขียน:

cpp cfa cfb cfc
php pfa pfb pfc
java jfa jfb jfc

ตอนนี้เมื่อใดก็ตามที่คุณกดC-x C-tชื่อตัวย่อ (หรือเพียงแค่เริ่มต้น), กลุ่มที่จะแสดงในเมนูป๊อปอัพตัวย่อทั้งหมดที่อยู่ในบรรทัดเดียวกัน

นี่คือลักษณะ:

ป้อนคำอธิบายรูปภาพที่นี่

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

และคุณไม่จำเป็นต้องใช้ภาษาการเขียนโปรแกรมเพื่อตัดสินใจว่ากลุ่มใดจะใช้ตัวย่อ คุณสามารถจัดกลุ่มตามความคล้ายคลึง / หัวข้อ / หมวดหมู่ที่มีความหมายที่คุณมีอยู่ในใจ

ดังนั้นเมื่อคุณลืมตัวย่อที่เฉพาะเจาะจงคุณสามารถพิมพ์ตัวอักษรตัวแรกของหมวดหมู่กดC-x C-tและเลือกตัวอักษรที่เกี่ยวข้องภายในเมนู

แก้ไข:
การถ่ายโอนคำย่อทั้งหมดของคุณภายใน/home/user/mysynonyms.txtคุณสามารถใช้คำสั่ง 3 Ex เหล่านี้:

:let abbrev_list = []
:call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(abbrev_list, submatch(1))', 'gn')
:call writefile(abbrev_list, '/home/user/mysynonyms.txt')

แก้ไข 2:
ฉันได้เพิ่มการตั้งค่าสถานะnเมื่อsubstitute()มีเรียกฟังก์ชันเนื่องจากคุณไม่ต้องการทดแทน มีวัตถุประสงค์เพียงอย่างเดียวคือการเพิ่มตัวย่อภายในรายการเมื่อพบ
แต่เนื่องจากคุณมีตัวย่อหลายอย่างมันอาจทำให้กระบวนการช้าลงอย่างไร้ประโยชน์ฉันไม่รู้ เริ่มแรกฉันไม่ได้ใส่เพราะฉันไม่รู้เวอร์ชั่น Vim ที่คุณใช้ หากรุ่นของคุณใหม่กว่า7.3.627ควรเป็นอย่างนั้นมิฉะนั้นคุณจะต้องลบการnตั้งค่าสถานะ


คำตอบที่ยอดเยี่ยมและครอบคลุม คุณร็อค
1234

\ วี% (^ | \ n) \ s * ฉัน% (nore) AB% [brev] \ s +% (% (\ <expr \> | \ <บัฟเฟอร์ \>) \ s +)? {2} ( \ k +) ไม่ทำงานกับไฟล์ vimrc ของฉัน
1234

@JoobLee มันใช้ได้กับระบบของฉันคุณมีข้อผิดพลาดหรือไม่? มันทำงานกับ regex ที่เรียบง่าย (แต่เชื่อถือได้น้อยกว่า) \vi?abbr\s+(\k+)ไหม คุณช่วยให้ฉันเชื่อมโยงกับข้อความที่ตัดตอนมาจากตัวย่อของคุณเพื่อดูว่าฉันสามารถทำซ้ำปัญหาของคุณ?
user9433424

@JoobLee หากเวอร์ชัน Vim ของคุณเร็วพอให้เพิ่มการnตั้งค่าสถานะลงในการโทรสำรอง (ฉันได้แก้ไขคำตอบเพื่อรวมไว้) หากคุณค้นหาvimrcและคัดลอกวางสิ่งนี้\v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+จะเน้นตัวย่อของคุณหรือไม่
user9433424

9

เคล็ดลับ wikia แนะนำวิธีการเลือกแสดงตัวย่อของคุณ:

คุณสามารถแสดงรายการตัวย่อทั้งหมดของคุณด้วย

:ab<CR>

(แทนที่abด้วยiabเพื่อแสดงรายการตัวย่อของโหมดแทรกเท่านั้น)

และคุณสามารถแสดงรายการตัวย่อทั้งหมดด้วยคำนำหน้าเดียวกันด้วย

:ab prefix<CR>

สิ่งนี้ไม่เหมาะอย่างยิ่งกับตัวย่อที่สมบูรณ์ แต่อาจเป็นวิธีที่ดีในการมีรายชื่อตัวย่อที่มีอยู่ของคุณอย่างรวดเร็ว

เพื่อให้การแก้ปัญหานี้มีประสิทธิภาพมากขึ้นวิธีปฏิบัติที่ดีคือการสร้างตัวย่อเฉพาะสำหรับประเภทไฟล์ ตัวอย่างเช่นตัวย่อนี้มีประโยชน์เฉพาะในบัฟเฟอร์ Java:

iabbrev syso System.out.println("");

ดังนั้นจึงเป็นการดีที่จะกำหนดเช่นนี้:

autocmd! FileType java :iabbrev <buffer> syso System.out.println("");

ส่วน autocommand อนุญาตให้สร้างตัวย่อเฉพาะเมื่อคุณอยู่ในบัฟเฟอร์ของจาวาและ<buffer>ตัวเลือกที่ทำให้ตัวย่อสามารถเข้าถึงได้จากบัฟเฟอร์นี้เท่านั้น

วิธีนี้:iabจะแสดงตัวย่อเมื่อคุณอยู่ในบัฟเฟอร์ของจาวาเท่านั้น หากคุณมีตัวย่อจำนวนมากมันน่าสนใจที่จะสร้างฟังก์ชั่นตามประเภทไฟล์ซึ่งจะกำหนดตัวย่อทั้งหมดและให้ autocommand เรียกใช้ฟังก์ชัน สิ่งที่ต้องการ:

autocmd! FileType latex call CreateLatexAbbrev()

function! CreateLatexAbbrev()
    iabbrev <buffer> something something else
    " All the other latex abbreviations
endfunction

อีกวิธีคือการสร้างฟังก์ชั่นเติมข้อความอัตโนมัติของคุณเองโดยใช้รายการตัวย่อของคุณเป็นแหล่งของคำหลัก

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


1

วิธีการเกี่ยวกับการจัดกลุ่มตัวย่อตามประเภทไฟล์?

แทนที่จะเก็บทุกอย่างไว้ใน~/.vimrcไฟล์ของคุณให้แยกมันและวางไว้ในตำแหน่งที่เหมาะสมในไดเรกทอรีรันไทม์ของคุณซึ่งอยู่~/.vimบนระบบปฏิบัติการ Unix

ตัวอย่างเช่นตัวย่อ Markdown ของคุณจะอยู่ในไฟล์~/.vim/after/ftplugin/markdown.vimซึ่ง Vim จะตรวจสอบหลังจากที่โหลดไฟล์ประเภท Markdown

ปรากฎว่าเราไม่ควรมี.vimrcไฟล์ขนาดใหญ่ $VIMRUNTIMEคุณจะได้รับความยืดหยุ่นมากขึ้นโดยใช้ :h 'runtimepath'เส้นทางรันไทม์การบันทึกไว้ในระบบให้ความช่วยเหลือที่เป็นกลุ่มของ:

ครั้งแรกที่ผมได้เรียนรู้เกี่ยวกับเรื่องนี้จากบทความดี ๆจาก .vimrc เพื่อ .vimในกลุ่มแกนจุติVimways

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