วิธีที่เร็วที่สุดในการเปลี่ยนเป็นบัฟเฟอร์ในกลุ่ม?


43

วิธีหนึ่งที่จะเลือกบัฟเฟอร์ในกลุ่มอาจจะมีการเรียกดูบัฟเฟอร์รายการโดยใช้คำสั่งมาตรฐาน:lsหรือบางปลั๊กอิน / รหัส vimscript ภายนอกเพื่อเรียกดูรายการในหน้าต่าง

สมมติว่าฉันต้องการข้ามไปที่บัฟเฟอร์โดยตรงเร็วที่สุด

เพื่อสำรวจรายการบัฟเฟอร์ในโหมดต่อเนื่องตอนนี้ฉันใช้<C-J> <C-K>ทางลัดโดยตั้งค่าไว้ใน. vimrc ของฉัน:

" move among buffers with CTRL
map <C-J> :bnext<CR>
map <C-K> :bprev<CR>

อีกวิธีหนึ่ง (การเข้าถึงโดยตรง) อาจจะเปลี่ยนจากจำนวน : <C-^>รู้จำนวนบัฟเฟอร์ก็เป็นไปได้ที่จะเปลี่ยนโดยตรงโดยการป้อนหมายเลขบัฟเฟอร์ตามมาด้วย ดังนั้นถ้าผมต้องการที่จะสลับไป buffer จำนวน 5 5<C-^>ผมจะกด

แต่สิ่งนี้ดูเหมือนจะไม่ทำงานสำหรับฉัน (ฉันใช้ vim 7.4 บนกล่องอูบุนตูจากผู้เยี่ยมชม Windows พร้อมแป้นพิมพ์ภาษาอิตาลี ) ฉันสงสัยว่าเป็นเพราะ^ตัวละครอยู่ในคีย์ตัวพิมพ์ใหญ่ในแป้นพิมพ์ภาษาอิตาลีดังนั้นในความเป็นจริง^ฉันต้องกดSHIFT-^

ความคิดใด ๆ


2
คุณสามารถกด<c-6>แทน<c-^>?
Peter Rincker

คุณหมายถึง Ctrl-1 เพื่อไปที่หมายเลขบัฟเฟอร์ 1 น่าเสียดายที่ใช้งานไม่ได้ ไม่มีอะไรเกิดขึ้น
จอร์โจโรบิโน

1
ไม่เทอร์มินัลบางตัวสามารถเข้าใจ Ctrl-6 ซึ่งเหมือนกับ Ctrl- ^ บนคีย์บอร์ดของสหรัฐอเมริกา
Peter Rincker

2
+1 เยี่ยมมากใช้งานได้! ฉันใช้รูปแบบแป้นพิมพ์ภาษาอิตาลี (ใช้ตัวจำลองเทอร์มินัลฉาบ) ดังนั้น: เปลี่ยน1<C-6>เป็นบัฟเฟอร์หมายเลข 1 ขอบคุณ!
Giorgio Robino

คุณสามารถลองใช้CtrlSpaceได้
Hongbo Liu

คำตอบ:


51

:bคำสั่งนอกจากนี้ยังสามารถใช้เวลาย่อยของชื่อของแฟ้มของ buffer ที่คุณต้องการที่จะเดินทางไปยังซึ่งมีความสะดวกมาก

ตัวอย่างเช่นถ้าคุณมีสามบัฟเฟอร์foo, barและbazแล้ว

  • :b barจะเปลี่ยนเป็นbarไฟล์

  • :b oจะเปลี่ยนเป็นfooไฟล์

  • :b aจะทำให้คุณมีข้อผิดพลาดเพราะมันอาจหมายถึงการอย่างใดอย่างหนึ่งbarหรือแต่คุณสามารถแก้ไขชื่อที่จะเฉพาะเจาะจงมากขึ้นด้วยยกตัวอย่างเช่นbaz: r Enter

สิ่งนี้มีประโยชน์มากเพราะมันหมายถึงแทนที่จะ

:buffer very/very/long/path/to/a/veryVeryLongFileName.txt

คุณสามารถทำสิ่งที่ชอบ

:b LongFileName

ซึ่งสั้นกว่าและง่ายกว่ามาก

คำสั่งนี้ยังสามารถนำตัวเลขถ้าคุณต้องการใช้ที่:

:b 5

8
ข้อแม้เกี่ยวกับการใช้ชื่อบัฟเฟอร์บางส่วน: หากชื่อบัฟเฟอร์บางส่วนปรากฏที่จุดเริ่มต้นของขอบเขตคำในเส้นทางบัฟเฟอร์บางบัฟเฟอร์ไม่มีบัฟเฟอร์ที่มีชื่อบางส่วนที่อยู่ตรงกลางของคำจะสามารถเข้าถึงได้โดย:bคำสั่ง ตัวอย่างเช่นถ้าคุณมีสองบัฟเฟอร์path/to/fooและpath/to/tofuคำสั่ง:b f<Tab>จะไม่ตรงเพราะมันตรงกับที่จุดเริ่มต้นของคำในpath/to/tofu path/to/foo
tommcdo

2
:5bสั้นลงเล็กน้อย:b 5 ;-)
joeytwiddle

15

นี่คือสิ่งที่ฉันใช้:

nnoremap <Leader>b :ls<CR>:b<Space>

ตอนนี้การกด\bจะแสดงรายการบัฟเฟอร์ที่พร้อมใช้งานและเตรียมพร้อม:bสำหรับคุณ

จากนั้นคุณสามารถพิมพ์หมายเลขบัฟเฟอร์แล้วกด Enter

หรือคุณสามารถพิมพ์ชื่อไฟล์บางส่วนแล้วกด Enter (อย่างไรก็ตามฉันมักจะกด Tab ก่อนที่จะกด Enter เพื่อตรวจสอบว่าฉันได้รับบัฟเฟอร์ที่ถูกต้องถ้าไม่ฉันจะปั่นต่อกับ Tab จนกว่าจะได้อันที่ฉันต้องการ)


ในความเป็นจริงฉันใช้ tweaked เล็กน้อยด้านบน:

nnoremap <C-e> :set nomore <Bar> :ls <Bar> :set more <CR>:b<Space>

สิ่งนี้จะป้องกันไม่ให้-- More --พรอมต์ปรากฏเมื่อคุณมีบัฟเฟอร์มากกว่าบรรทัดที่มีให้แสดง

แต่ถ้าคุณมักจะ'more'ปิดการใช้งานตัวเลือกอยู่แล้วการทำแผนที่นี้จะทำให้คุณรำคาญจริงๆเพราะจะเปิดใช้งาน'more'ตัวเลือกอีกครั้งหลังจากทำls!


1
ความจริงจะบอกว่าฉันไม่ได้ใช้อย่างใดอย่างหนึ่งจริง ๆ ฉันใช้ปลั๊กอินเล็ก ๆ ของฉันเองแต่ฟังก์ชันการทำงานคล้ายกันมาก ด้วยปลั๊กอินนี้ฉันสามารถใช้ Tab-complete ในชื่อไฟล์ของบัฟเฟอร์ที่ไม่ได้เปิด
joeytwiddle

1
แม้ว่าเทคนิคนี้จะไม่เร็วเท่าการใช้[count]<C-^>เมื่อคุณรู้ว่าหมายเลขบัฟเฟอร์มันค่อนข้างมีประโยชน์เมื่อคุณไม่รู้
joeytwiddle

2
ขอบคุณ joeytwiddle สำหรับบันทึกย่อของคุณ ฉันจะตรวจสอบปลั๊กอินของคุณโดยเร็ว ในกรณีของฉัน (ดูปัญหาแป้นพิมพ์ด้านบน) [count]<C-6>ปรากฏแก่ฉันวิธีที่เร็วที่สุดในการเปลี่ยนไปใช้บัฟเฟอร์ที่รู้จัก
Giorgio Robino

ใช่ฉันยังใช้[count]<C-^>วันนี้ แต่นั่นหมายความว่าฉันต้องเรียกใช้ MiniBufExplorer หรือสิ่งที่คล้ายกันเพื่อทราบว่าหมายเลขบัฟเฟอร์คืออะไร!
joeytwiddle

ทำไมคุณถึงต้องการ <CR> และ <SPACE> ตอนแรกก็ปรากฏให้ฉันราวกับว่ามันทำงานได้ดีโดยที่พวกเขา ...
เฟลิกซ์ Crazzolara

9

:CtrlPBufferจากปลั๊กอินCtrlP (4k ★)

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

เปิดบัฟเฟอร์เลือนรายชื่อด้วย:CtrlPBufferหรือกด<C-p>ตามด้วยที่จะเปลี่ยนโหมดไปที่<C-b>buffer

ป้อนจำนวนอักขระที่เพียงพอเพื่อระบุบัฟเฟอร์ที่คุณต้องการเปิด
คุณยังสามารถใช้<C-j>และ<C-k>เพื่อหมุนเวียนรายการและเลือกบัฟเฟอร์ด้วยตนเอง

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

การปรับแต่ง

หากคุณต้องการเปิดรายการบัฟเฟอร์ทันทีด้วย<C-p>เพิ่มบรรทัดต่อไปนี้ใน vimrc ของคุณ:

let g:ctrlp_cmd = 'CtrlPBuffer'

คุณสามารถใช้<C-f/b>เพื่อสลับโหมดของหน้าต่าง ctrlp

let g:ctrlp_cmd = 'CtrlPMRU'ผมเองใช้ รายการ (mru) ที่ใช้ล่าสุดยังประกอบด้วยบัฟเฟอร์ที่เปิดอยู่ ถ้าคุณใช้โหมด ctrlp let g:ctrlp_cmd = 'CtrlPLastMode [--dir]'ที่แตกต่างกันและต้องการที่จะติดไปยังโหมดสุดท้ายของคุณคุณสามารถตั้งค่า

ปลั๊กอินที่คล้ายกัน

มีปลั๊กอินเพิ่มเติมที่ให้รายการบัฟเฟอร์พร้อมรับคำแบบโต้ตอบกับการจับคู่แบบคลุมเครือเช่น

  • fzf.vim (4k ★) โดย Junegunn (+ เทอร์มินัลไป)
  • command-tโดย Wincent (+ ruby)
  • denite.nvimโดย Shougo (+ python3, vim8 หรือ neovim)

ด้านมืดกับด้านแสง

(เช่นการตั้งค่า plugin-heavy vim เทียบกับวิธี vim)

ก่อนที่คุณจะตัดสินใจที่จะใช้ปลั๊กอินที่ซับซ้อนมากขึ้นเหล่านี้ศึกษาตอบโดย@Doorknobและ@joeytwiddle โดยเฉพาะอย่างยิ่งตรวจสอบหนึ่งซับถ้าหนึ่งในนั้นตอบสนองความต้องการของคุณแล้ว

  1. nnoremap <Leader>b :b <C-d>
  2. nnoremap <Leader>b :ls<Cr>:b<Space>

การติดตั้งปลั๊กอินเพียงเพื่อเปลี่ยนบัฟเฟอร์อาจจะเกินความจำเป็น ดูเพิ่มเติมหมายเหตุในhttps://www.vi-improved.org/recommendationsและบทความโดยดึงนีล'On เหลาเห็น'


ใช่ Hotschke ฉันยอมรับว่าฉันมักจะใช้: CtrlPBuffer
Giorgio Robino

ฉันกำลังใช้map <leader>a <ESC>:CtrlPBuffer<CR><CR>เพื่อข้ามไปยังบัฟเฟอร์ที่เปิดก่อนหน้านี้ด้วย<leader>a(ในขณะที่<leader>bเพิ่งเปิดรายการบัฟเฟอร์สำหรับฉัน)
Rolf

@Rolf: คุณรู้<C-^>(= <C-6>)? เห็น:h CTRL-^ไหม ตอนนี้นี่เป็นสิ่งที่แผนที่ของคุณ<leader>aทำ ดังนั้นฉันคิดว่าคุณเพิ่งยกตัวอย่างว่าทำไมผู้คนถึงบอกว่าการใช้ปลั๊กอินอาจทำให้ผู้ใช้ที่เป็นกลุ่มที่ไม่รู้ว่า vim สามารถทำอะไรได้บ้าง
Hotschke

@ Hotschke: ไม่ฉันไม่รู้ เรียนรู้สิ่งที่รู้แล้วขอบคุณ! ฉันจะทำการแมปใหม่อีกครั้ง <C - ^>
Rolf

การอ้างอิงที่ดีเยี่ยมสำหรับ <Cd> พร้อม vanilla vim ฉันไม่ได้เห็นการอ้างอิงนั้นที่อื่น
Radke

8

นอกจากคำตอบที่เป็นประโยชน์จริง ๆ โดย joeytwiddle และ Doorknob อย่าลืม:b#ซึ่งเปลี่ยนเป็นบัฟเฟอร์ที่ใช้ล่าสุด <C-^>นอกจากนี้ยังสามารถทำได้ด้วยเพียง เมื่อคุณมีบัฟเฟอร์จำนวนมากและคุณสลับไปมาอย่างต่อเนื่องบัฟเฟอร์ล่าสุดมักเป็นปลายทางที่พบบ่อยที่สุด

ส่วนตัวฉันใช้การผสมผสานหลายวิธี เมื่อฉันทำงานกับหลักสองบัฟเฟอร์และส่วนที่เหลือจะเปิดเพียงสำหรับการอ้างอิงบางครั้งผมมักจะสลับไปมาระหว่างพวกเขาด้วยหรือ:b# <C-^>เมื่อฉันต้องทำงานกับพวกเขามากขึ้นและสลับบ่อยฉันใช้ตัวเลข (เช่นในปลาย joeytwiddle) หรือบางส่วนของชื่อ (เช่นในปลาย Doorknob) กับ TAB เพื่อทำให้เสร็จสมบูรณ์ เมื่อชื่อมีความสับสนและมีบัฟเฟอร์จำนวนมากที่เปิด (ปกติมากกว่า 10) ฉันใช้ปลั๊กอิน Ctrl-P บ่อยขึ้น ( https://github.com/kien/ctrlp.vim ) ด้วยการกดปุ่มเร็วสองครั้งฉันได้รับรายการ พวกเขาทั้งหมดและฉันสามารถใช้การค้นหาคลุมเครือที่ทรงพลังเหนือพวกเขาเพื่อค้นหาสิ่งที่ฉันต้องการได้อย่างรวดเร็ว


2
<C - ^> คนเดียว (<C-6> ในกรณีของฉันตามคำแนะนำของ Peter Rincker) เป็นกลอุบายที่ดีในกรณีที่มีเพียง 2 บัฟเฟอร์ :-)
Giorgio Robino

5

[bและ]bจากปลั๊กอินvim-unimpaired(> 2k ★)

หากคุณติดตั้งvim-unimpairedแล้วคุณสามารถใช้งานได้

  • [b( :bp[revious])และ
  • ]b( :bn[ext])

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

  • [B( :bf[irst]) และ
  • ]B( :bl[ast])

มีมากขึ้นมากมายยึดแมปที่มีอยู่ในvim-unimpairedที่คุณอาจพบว่ามีประโยชน์ พวกเขาทั้งหมดทำตามรูปแบบเดียวกันซึ่งทำให้ง่ายต่อการจดจำ

ด้านมืดกับด้านแสง

ปลั๊กอินนี้สามารถพิจารณาว่ามีน้ำหนักเบาและ 'มีชีวิตชีวา' มันถูกเขียนแทนโดยชุมชน #vimในฐานะที่เป็นปลั๊กอิน "ไม่เป็นอันตราย"


+1 นอกจากนี้ยังมีข้อสังเกตว่าคุณสามารถนับได้ 3[bเพื่อกระโดดสามบัฟเฟอร์กลับ
joeytwiddle

1

ขณะนี้ฉันกำลังใช้ปุ่ม<Leader>+ numberเพื่อสลับ กุญแจผู้นำคือ<space>กุญแจของฉัน ฉันยังใช้กลุ่มสายการบินเพื่อแสดงบัฟเฟอร์ nr ที่ด้านบนของหน้าต่าง

" airline settings
let g:airline#extensions#tabline#buffer_nr_show = 1
let g:airline#extensions#tabline#enabled = 1

ในขณะที่ bufnr มักจะเกิน 10 ดังนั้นฉันปรับแต่งการแมปของฉันเองถ้าnumberเป็นเพียงการจับคู่สลับบัฟเฟอร์ทันทีมิฉะนั้นรอการป้อนหมายเลขหรือ<space>คีย์เพื่อยืนยัน:

nnoremap <expr> <Leader>1 tweak#wtb_switch#key_leader_bufnum(1)
nnoremap <expr> <Leader>2 tweak#wtb_switch#key_leader_bufnum(2)
nnoremap <expr> <Leader>3 tweak#wtb_switch#key_leader_bufnum(3)
nnoremap <expr> <Leader>4 tweak#wtb_switch#key_leader_bufnum(4)
nnoremap <expr> <Leader>5 tweak#wtb_switch#key_leader_bufnum(5)
nnoremap <expr> <Leader>6 tweak#wtb_switch#key_leader_bufnum(6)
nnoremap <expr> <Leader>7 tweak#wtb_switch#key_leader_bufnum(7)
nnoremap <expr> <Leader>8 tweak#wtb_switch#key_leader_bufnum(8)
nnoremap <expr> <Leader>9 tweak#wtb_switch#key_leader_bufnum(9)




func! tweak#wtb_switch#key_leader_bufnum(num)
    let l:buffers = tweak#wtb_switch#buflisted()
    let l:input = a:num . ""

    while 1

        let l:cnt = 0
        let l:i=0
        " count matches
        while l:i<len(l:buffers)
            let l:bn = l:buffers[l:i] . ""
            if l:input==l:bn[0:len(l:input)-1]
                let l:cnt+=1
            endif
            let l:i+=1
        endwhile

        " no matches
        if l:cnt==0 && len(l:input)>0
            echo "no buffer [" . l:input . "]"
            return ''
        elseif l:cnt==1
            return ":b " . l:input . "\<CR>"
        endif

        echo ":b " . l:input

        let l:n = getchar()

        if l:n==char2nr("\<BS>") ||  l:n==char2nr("\<C-h>")
            " delete one word
            if len(l:input)>=2
                let l:input = l:input[0:len(l:input)-2]
            else
                let l:input = ""
            endif
        elseif l:n==char2nr("\<CR>") || (l:n<char2nr('0') || l:n>char2nr('9'))
            return ":b " . l:input . "\<CR>"
        else
            let l:input = l:input . nr2char(l:n)
        endif

        let g:n = l:n

    endwhile
endfunc

func! tweak#wtb_switch#buflisted()
  return filter(range(1, bufnr('$')), 'buflisted(v:val)')
endfunc

วางรหัสจากที่นี่

โดยวิธีการที่ฉันยังใช้<S-h>และ<S-l>สำหรับ:bpและ:bnหรือ:tabpและ:tabnถ้ามีมากกว่าหนึ่งเปิดแท็บในปัจจุบัน มันค่อนข้างง่ายสำหรับฉัน


1

วันนี้ฉันกำลังใช้[buffer_number]<Ctrl-^>เพื่อเปลี่ยนบัฟเฟอร์เพราะมันเร็วมาก

แต่จะรู้จำนวนบัฟเฟอร์ได้อย่างไร ฉันใช้MiniBufExplorerดังนั้นฉันจะเห็นหมายเลขบัฟเฟอร์ที่ด้านบนของ Vim เสมอ

ฉันยังใช้การแมปต่อไปนี้เพราะ<C-^>ใช้มือเดียวได้ยาก

:nmap <C-E> <C-^>

บนเครื่องใหม่ที่ไม่มีการกำหนดค่าฉันกลับไปที่ :b [part_of_filename]<Tab><Enter>

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