วิธีที่มีประสิทธิภาพมากขึ้นในการใช้บัฟเฟอร์คืออะไร?


13

เมื่อเร็ว ๆ นี้ฉันได้ลดจำนวนปลั๊กอินที่ใช้อยู่อย่างมากดังนั้นฉันจึงค้นหาคำตอบโดยใช้ฟีเจอร์ Vim ในตัวเท่านั้น

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

โดยให้ฉันทำสิ่งต่อไปนี้:

  • ใช้งานครั้งแรก:buffersเพื่อรับรายการบัฟเฟอร์ที่เปิดอยู่
  • จำจำนวนบัฟเฟอร์ที่ฉันต้องการใช้
  • กดEnterเพื่อปิดรายการบัฟเฟอร์
  • ใช้:bXกับXจำนวนบัฟเฟอร์ที่จะใช้

เวิร์กโฟลว์นี้ดูเหมือนจะหนักสำหรับฉันดังนั้นฉันจึงเพิ่มบรรทัดต่อไปนี้ใน .vimrc:

" Improve the navigation in the buffers 
nnoremap <Leader><S-b> :B<CR> 
command! B call Buffers() 

function! Buffers() 
    execute "buffers" 
    let buffer=input("Enter a buffer:") 
    execute "b" . buffer 
endfunction 

สิ่งนี้ให้ฉันคำสั่ง:B(และการแมป) ซึ่งเรียกฟังก์ชั่น:buffersรออินพุตและในที่สุดก็เรียก:bตามด้วยอินพุต

มันใช้งานได้ดี แต่ฉันประหลาดใจที่ฉันต้องพัฒนาฟังก์ชั่นดังกล่าว: โดยปกติ Vim จะมีเวิร์กโฟลว์เริ่มต้นที่มีประสิทธิภาพพอสมควรดังนั้นฉันจึงสงสัยว่าถ้ามีวิธีที่ดีกว่าในการเปลี่ยนไปใช้บัฟเฟอร์ที่ฉันไม่รู้อะไรยกเว้น ว่ามันได้เปิดแล้วในเซสชั่นการแก้ไขของฉัน


3
ฉัน:lsตามด้วย:b#(ไม่จำเป็นต้องกดปุ่ม return หรือ escape ก่อนสามารถไปจากรายการบัฟเฟอร์ใน 'ls' ได้โดยตรง) (การโพสต์เป็นความคิดเห็นเพราะดูเหมือนจะไม่เพียงพอที่จะเป็นคำตอบได้หรือไม่สงสัยด้วย พลาดอะไรบางอย่างและตอบคำถามผิด ๆ )
LindaJeanne

2
@LindaJeanne: อย่างที่ฉันบอก:b#ไม่ใช่สิ่งที่ฉันกำลังมองหา แต่ใช่ความจริงที่ว่าคุณสามารถบันทึกการกดแป้นพิมพ์โดยการป้อนโดยตรง:bโดยไม่ต้องกดenterก่อนที่น่าสนใจ (อันที่จริงอาจจะเบาเกินไปที่จะเป็นคำตอบ แต่มันก็คุ้มค่าความคิดเห็น :-))
statox

ฉันเดาว่า LindaJeanne หมายถึง#ตัวละครในฐานะหมายเลขแสตนด์แทนที่จะเป็นตัว#อักษร
8bittree

คำตอบ:


12

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

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

nnoremap ,b :buffer *
set wildmenu
set wildignore+=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=*/min/*,*/vendor/*,*/node_modules/*,*/bower_components/*
set wildignore+=tags,cscope.*
set wildignore+=*.tar.*
set wildignorecase
set wildmode=full

เมื่อใช้บัฟเฟอร์ที่ถูกต้องจะมีการกดแป้นน้อยกว่าห้าหรือหกครั้ง:

แท็บเสร็จ


สิ่งนี้ให้ฉันคำสั่ง:B(และการแมป) ซึ่งเรียกฟังก์ชั่น:buffersรออินพุตและในที่สุดก็เรียก:bตามด้วยอินพุต

Barry Arthur มากับวิธีแก้ปัญหาที่ง่ายกว่าเมื่อหลายปีก่อนซึ่งได้รับความนิยมตั้งแต่นั้นมา:

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

ซึ่งฉันเสนอตัวแปรหลากหลายเล็กน้อยเพิ่มเติมสองสามปีที่ผ่านมา:

nnoremap gb :ls<CR>:b

GB


เนื่องจากเรามีการพูดคุย vimscript นี่คือฟังก์ชั่นความสุขเล็ก ๆ น้อย ๆ ที่ผมเขียนว่า "อัตโนมัติ populates" บรรทัดคำสั่งกับต้นขั้วคำสั่งทันทีหลังจากที่รายการเหมือนคำสั่งเช่นหรือ:ls :ilistข้อดีของฟังก์ชั่นนั้นเหนือการแมปด้านบนคือฉันไม่ต้องจำการแมปเฉพาะ มันทำงานเหมือนเป็นกลุ่มแต่มีการบิดเล็กน้อย

" smooth listing
cnoremap <expr> <CR> <SID>CCR()

function! s:CCR()
    if getcmdtype() == ":"
        let cmdline = getcmdline()
            if cmdline =~ '\v\C^(dli|il)' | return "\<CR>:" . cmdline[0] . "jump  " . split(cmdline, " ")[1] . "\<S-Left>\<Left>"
        elseif cmdline =~ '\v\C^(cli|lli)' | return "\<CR>:silent " . repeat(cmdline[0], 2) . "\<Space>"
        elseif cmdline =~ '\C^changes' | set nomore | return "\<CR>:sil se more|norm! g;\<S-Left>"
        elseif cmdline =~ '\C^ju' | set nomore | return "\<CR>:sil se more|norm! \<C-o>\<S-Left>"
        elseif cmdline =~ '\C^ol' | set nomore | return "\<CR>:sil se more|e #<"
        elseif cmdline =~ '\C^undol' | return "\<CR>:u "
        elseif cmdline =~ '\C^ls' | return "\<CR>:b"
        elseif cmdline =~ '/#$' | return "\<CR>:"
        else | return "\<CR>" | endif
    else | return "\<CR>" | endif
endfunction

CCR


ที่กล่าวว่าฉันเป็นผู้สนับสนุนใหญ่ของ "การนำทางด้วยสัญลักษณ์" เหนือ "การนำทางด้วยไฟล์" เมื่อนำมาใช้ได้การนำทางที่ใช้สัญลักษณ์จะเร็วกว่าและประหยัดกว่าการนำทางด้วยไฟล์

GIF ล่าสุดแสดงค่าเฉลี่ยหนึ่งการนำทางด้วยสัญลักษณ์ ตัวอย่างนั้นโง่ แต่…โอ้ดี


ฉันเดาว่าฉันเล่นได้ไม่เพียงพอกับwild*ตัวเลือกฉันจะพยายามปรับแต่งตามที่ฉันต้องการ เกี่ยวกับวิธีแก้ปัญหาของ Barry Arthur มันค่อนข้างใกล้กับคำตอบของ @ nobe4 ที่น่าสนใจ ในที่สุดฉันจะต้องมองลึกลงไปที่CCR()ฟังก์ชั่นของคุณเพื่อให้ได้มันจริงๆ แต่มันก็ดูมีแนวโน้ม ขอบคุณสำหรับคำตอบ.
statox

5
ดูคำตอบของฉันนี้ การ์ตูนพิเศษ
romainl

ฉันจะขโมยของเหล่านี้อย่างแน่นอน!
statox

7

ฉันพบปัญหาเดียวกันเมื่อไม่นานมานี้และฉันพบวิธีแก้ไข:

nnoremap <leader>b :buffers<CR>:buffer<space>

วิธีนี้จะเปิดรายการบัฟเฟอร์และไม่ต้องซ่อนให้ตัวเลือกเพื่อสลับบัฟเฟอร์

ฉันคิดว่ามันสมเหตุสมผลแล้วที่ Vim ไม่มีตัวเลือก "list and select" ที่นี่นี่เป็นการกระทำสองอย่างแยกกัน แต่เป็นกลุ่มที่ทรงพลังพอที่จะรวมคำสั่งเข้าด้วยกัน

คิดว่ามันเป็นปรัชญา Unix: ทำสิ่งหนึ่งและทำได้ดี

:buffersแสดงรายการบัฟเฟอร์และ:buffer xxxอนุญาตให้คุณเลือก


1
นั่นเป็นวิธีที่ดีในการทำให้ฟังก์ชั่นเบาลงที่ฉันแนะนำในคำถามของฉันน่าสนใจ!
statox

1
หากคุณต้องการทำให้พื้นที่ในตอนท้ายมองเห็นได้ชัดเจนขึ้นคุณสามารถทำได้: nnoremap <leader> b: buffers <CR>: buffer <Space> |
Tyler Durden

1

ในขณะที่ฉันใช้เทคนิคของ nobe4 เช่นนี้:

nnoremap <Leader>b :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>

จากนั้นฉันก็เริ่มใช้ Tab-completion กับสิ่งนั้น (ตามที่ romainl แนะนำ)

แต่เมื่อเร็ว ๆ นี้ฉันได้พบวิธีที่เร็วที่สุดด้วยการกดแป้นที่น้อยที่สุดคือการใช้:

{count} CTRL-^

สิ่งนี้ไม่แตกต่างจาก:b#<Enter>แต่อย่างที่คุณพูดคุณต้องรู้หมายเลขบัฟเฟอร์!

ดังนั้นฉันจึงเรียกใช้ปลั๊กอินMiniBufExplorerซึ่งจะแสดงรายการชื่อไฟล์ที่ด้านบน (เช่นตัวแก้ไขอื่น ๆ เกือบทุกรายการ) ฉันแน่ใจว่ามีทางเลือกมากมาย

ในที่สุดเนื่องจากเป็นบิตของการยืดนิ้วมือของฉันและนี่คือการดำเนินการที่พบบ่อยมากผมย้ายมันไปCtrl-^ การดำเนินการที่ไม่ซับซ้อนเกินไป:Ctrl-E

nnoremap <C-E> :<C-U>call SwitchToBuffer()<CR>

function! SwitchToBuffer()
  if v:count > 0
    exec v:count . "b"
    return
  endif

  " Whatever you want to do if you didn't provide a count
  " In this case, fall back to nobe4's technique:
  call feedkeys(":ls\n:b ")
endfunction

ดังนั้นกระบวนการสับเปลี่ยนบัฟเฟอร์ของฉันในปัจจุบันเป็นดังนี้:

  1. ดู MiniBufExplorer
  2. ตี 3 Ctrl-E

น่าเศร้าที่ MBE และสคริปต์ด้านบนไม่ใช่บิวอินบิวอินตามที่คุณร้องขอ เมื่อฉันอยู่บนเครื่องระยะไกลที่ไม่มีการกำหนดค่าฉันเพียงแค่ใช้:b [partial]และ Tab-completion

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