วิธีผูกชุดบัฟเฟอร์เข้ากับแท็บ?


14

เมื่อฉันต้องการทำงานในโครงการที่แตกต่างกันในเวลาเดียวกันฉันมีเวิร์กโฟลว์ folowing:

  • ฉันสร้างหนึ่งแท็บสำหรับแต่ละโครงการ
  • ในแต่ละแท็บฉันเปิดไฟล์ที่ฉันต้องการแก้ไขซึ่งทำให้หลายบัฟเฟอร์
  • Optionnaly ถ้าฉันต้องการเห็นสองไฟล์ (หรือมากกว่า) ในเวลาเดียวกันฉันสร้างหน้าต่างแยกดังนั้นฉันมีแท็บที่มีหน้าต่างที่แตกต่างกันซึ่งแสดงบัฟเฟอร์หนึ่ง

เพื่อนำทางระหว่างบัฟเฟอร์ของฉันฉันไม่ได้ใช้จริง ๆ:lsและ:b [name or number of buffer]ฉันได้สร้างการจับคู่ที่สะดวกทำให้ฉันสามารถสลับระหว่างบัฟเฟอร์ด้วย:bnextและ:bprevious

วิธีการทำงานนี้ค่อนข้างดี แต่มีบางอย่างที่รบกวนฉัน: บัฟเฟอร์ถูกแชร์ระหว่างแท็บ

ถ้าผมเปิดfile1และfile2ในtab1และfile3ในtab2ถ้าในtab1ผมใช้เวลาหลาย:bnextฉันจะเห็นfile3ในแท็บนี้ซึ่งผมไม่ต้องการที่จะ ขั้นตอนการทำงานที่ผมต้องการที่จะได้รับคือ folowing :

  • เริ่มเป็นกลุ่ม (ฉันมีแท็บแรกที่มีบัฟเฟอร์อยู่): $ vim foo
  • เพิ่มบัฟเฟอร์ลงในแท็บนี้: :e bar
  • เปิดแท็บใหม่และเปลี่ยนเป็น: :tabnew
  • เปิดบัฟเฟอร์ใหม่ในแท็บนี้: :e baz
  • ถ้าฉันอยู่ในบัฟเฟอร์นี้และทำ:bnextหรือ:bpreviousฉันจะอยู่ในbazบัฟเฟอร์ (เพราะเป็นเพียงคนเดียวในแท็บนี้)
  • ถ้าฉันไปที่แท็บก่อนหน้า:tabpreviousและดำเนินการหลายครั้ง:bnextฉันจะสลับระหว่างfooและbarบัฟเฟอร์เท่านั้น แต่จะไม่เห็นbaz

ดังนั้นคำถามของฉันมาที่นี่:มันเป็นไปได้ที่จะผูกชุดของบัฟเฟอร์ไปยังแท็บและทำให้เป็นกลุ่มที่ไม่อนุญาตให้เข้าถึงบัฟเฟอร์บางส่วนจากแท็บอื่นกว่าที่พวกเขาตั้งใจจะอยู่ใน?

หมายเหตุ:ฉันทราบว่าการใช้:b [myBuffer]จะเป็นวิธีหนึ่งในการเก็บบัฟเฟอร์ไว้ในแท็บ แต่เมื่อฉันมีไฟล์ 3 หรือ 4 ไฟล์ที่จะแก้ไขฉันรู้สึกว่าฉันใช้การแมปของฉันเร็วกว่าการพิมพ์ชื่อบัฟเฟอร์(แม้ว่าฉันจะทำได้ พิมพ์ตัวอักษรเพียงบางส่วนให้ตรงกับชื่อบัฟเฟอร์)


1
ต่อไปนี้เป็นการอภิปรายเก่า ๆ ที่เน้นถึงความเป็นมืออาชีพและแย้งของแนวทางดังกล่าวและแนะนำสิ่งที่วันนี้สามารถแปลเป็น: อินสแตนซ์ vim หลายรายการ (หนึ่งรายการต่อโครงการ / บัฟเฟอร์รายการ) + tmux: vim.1045645.n5.nabble.com/
VanLaser

@VanLaser: ขอบคุณสำหรับลิงค์มันเป็นการสนทนาที่น่าสนใจ! ที่จริงฉันรวม tmux และอินสแตนซ์เสียงเรียกเข้าที่แตกต่างกันเมื่อฉันอยู่ในเครื่องส่วนตัวของฉัน คำถามของฉันมาจากความจริงที่ว่าฉันต้องใช้หน้าต่างสำหรับงานมืออาชีพของฉันและฉันจริงๆไม่ชอบการหน้าต่างได้รับการจัดการ: การใช้alt+tab(หรือแย่เมาส์) รู้สึกมากน้อยง่ายกว่าเปลี่ยนแท็บภายในกลุ่ม
statox

1
บางที vim-ctrlspaceสามารถช่วยได้ - มันโฆษณาตามรายการบัฟเฟอร์ของหน้าแท็บ ฉันไม่ได้ใช้มัน
VanLaser

คำตอบ:


7

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

if !exists("g:WindowBufManager") 
  let g:WindowBufManager= {}
endif

function! StoreBufTab()
  if !has_key(g:WindowBufManager, tabpagenr())
    let  g:WindowBufManager[tabpagenr()] = []
  endif

  " add the new buffer to our explorer
  if index(g:WindowBufManager[tabpagenr()], bufname("%")) == -1 && bufname("%") != ""
    call add (g:WindowBufManager[tabpagenr()],bufname("%"))
  endif
endfunction

function! WindowBufManagerNext() 
  " find the next index of the buffer
  let s = index(g:WindowBufManager[tabpagenr()], bufname("%"))
  if (s!= -1)
    let s = (s +1) % len(g:WindowBufManager[tabpagenr()])
    execute 'b ' . g:WindowBufManager[tabpagenr()][s]
  endif
endfunction

augroup WindowBufManagerGroup
  autocmd! BufEnter * call StoreBufTab()
augroup END

ปิด vimrc ของคุณแล้วเปิดอีกครั้ง ในการค้นหาบัฟเฟอร์ถัดไปให้ใช้

:call WindowBufManagerNext()

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


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

6

บัฟเฟอร์เป็นสากลและไม่มีอะไรที่คุณสามารถทำได้ยกเว้นการเขียนเลเยอร์นามธรรมของคุณเองที่ด้านบนของหน้าแท็บหน้าต่างและบัฟเฟอร์ คำตอบของ philolo1 แสดงให้เห็นถึงวิธีการที่เหมาะสมในการแก้ไขปัญหา แต่คุณจะพบข้อ จำกัด ของ "วิธีแก้ปัญหา" อย่างรวดเร็วและต้องการทำซ้ำฟีเจอร์ในตัวเช่น:bufdoหรือไฟล์สำรอง ...

ในทางกลับกัน "อาร์กิวเมนต์" สามารถอยู่ในหน้าต่างเดียวกับหน้าต่างดังนั้นมันอาจจะมีประโยชน์ในเวิร์กโฟลว์ของคุณมากกว่า "บัฟเฟอร์" (ในความหมายที่เข้มงวดที่สุดของคำ):

$ vim file1 file2
:tabnew
:argl file3 file4 file5
:n
:n
gt
:n
gt
:N
and so on…

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

แต่การทำงานกับแต่ละโปรเจคในอินสแตนซ์ Vim ของตัวเองนั้นเป็นความคิดของฉันในการแก้ปัญหาเฉพาะทาง


ฉันเห็นด้วยกับความคิดที่ว่าการใช้อินสแตนซ์ vim แยกต่างหากจะดีกว่าเมื่อฉันสามารถใช้ในเทอร์มินัลอย่างที่ฉันพูดในความคิดเห็นอื่นฉันต้องใช้ windows บนคอมพิวเตอร์มืออาชีพของฉันและการสลับระหว่างอินสแตนซ์ gvim . ฉันจะดูข้อโต้แย้งที่ฉันไม่เคยใช้มาก่อนและนั่นอาจเป็นวิธีแก้ปัญหาที่ดีขอบคุณ!
statox

2

ดังนั้นด้วยความล่าช้าฉันคิดว่าฉันอาจพบคำตอบที่น่าพอใจ (อย่างน้อยสำหรับฉัน!) คุณจะต้องมีสองปลั๊กอินของ Shougo:

และแผนที่การเข้าถึงด่วนที่จะใช้แทน:lsเพื่อดู (และเลือก) เฉพาะบัฟเฟอร์จากแท็บปัจจุบัน

ตัวอย่างเช่น:

nnoremap <leader>b :<C-u>Unite buffer_tab -no-split<CR>

รวมกัน - ต่อบัฟเฟอร์ของแท็บ

ตอนนี้คุณสามารถเลื่อนผ่านรายการบัฟเฟอร์แท็บปัจจุบัน ( j, k), เลือกหนึ่ง ( CR), ยกเลิก ( q), เข้าสู่โหมด "อินพุต" (แทรก) เพื่อกรองการเลือกบัฟเฟอร์อย่างรวดเร็วโดยพิมพ์ตัวอักษรบางตัวหรือกดTabเพื่อเปิดรายการการดำเนินการ สำหรับรายการที่เลือกในปัจจุบัน (เช่นเพื่อเปิดบัฟเฟอร์ด้านบนของรายการที่ใช้งานในปัจจุบัน) - ในระยะสั้นคุณดำเนินการด้วยวิธี "Unite" ทั่วไป

(ดูเพิ่มเติม:h unite_default_key_mappingsและรวมความช่วยเหลือโดยทั่วไป)


และตอนนี้สำหรับเคล็ดลับสุดท้าย ด้วยaltercmdคุณสามารถสร้างlsคำสั่งที่เปิดใช้งานแท็บได้เอง(ขึ้นอยู่กับการทำงานของ Unite ด้านบน):

:command! LS Unite buffer_tab -no-split
:AlterCommand ls LS

... และทุกครั้งที่คุณโจมตี:lsกลุ่มจะเรียกใช้คำสั่งของคุณแทน

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


ฉันจะลองวิธีนี้ด้วย ในขณะที่ฉันกำลังลอง ctrl-space ที่ VanLaser พูดถึงในความคิดเห็นซึ่งค่อนข้างดี ฉันจะดูวิธีแก้ปัญหาที่สะดวกที่สุด +1 +1 สำหรับปลั๊กอิน altercmd ซึ่งค่อนข้างเด็ด!
statox

2

ฉันไม่สามารถแสดงความคิดเห็นได้เนื่องจากบัญชีของฉันใหม่ขออภัยเกี่ยวกับเรื่องนี้ แต่ ++++ 1 สำหรับ ctrl-space

ฉันถูกขายตามเวลาที่ฉันทำไว้ครึ่งทางผ่านความช่วยเหลือ Ctrlspace มีโครงสร้างดังนี้:

workspaces --> contain tabs --> contain buffers

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

คุณสามารถตั้งชื่อแท็บของคุณ หากยังไม่พอคุณสามารถเปลี่ยนไดเรกทอรีที่ใช้งานได้อย่างง่ายดายและสร้างบุ๊กมาร์กสำหรับไดเรกทอรีที่คุณใช้บ่อย

มันเชื่อมต่อกับ nerdtree เป็นอย่างดีหากคุณใช้สิ่งนั้น (แม้ว่าโดยสุจริตคุณอาจไม่รู้สึกเหมือนคุณต้องการมันหลังจากผ่านสัปดาห์ด้วย ctrlspace)


พิจารณากรณีการใช้งานนี้:

คุณมีโครงการ มันเกี่ยวข้องกับการปลูกต้นไม้ มีต้นไม้ผลไม้และต้นไม้เงิน ต้นไม้เงินประกอบด้วยดอลลาร์และเซนต์ในขณะที่ต้นไม้ผลมีแอปเปิ้ลและส้ม

ในตัวอย่างนี้แอปเปิ้ลส้มดอลลาร์และเซนต์เป็น "บัฟเฟอร์" ทั้งหมด

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

พื้นที่ทำงาน "trees" บันทึกการกำหนดค่าทั้งหมดนี้และให้คุณเข้าถึงได้ทันทีทุกครั้งที่คุณเปิด vim


ตอนนี้ฉันรู้แล้วว่ามันมีอยู่จริงฉันไม่สามารถจินตนาการถึงการพัฒนาเชิงวัตถุในกลุ่มโดยไม่ต้องใช้ปลั๊กอินนี้ ในกรณีที่นี่คือลิงค์: https://github.com/szw/vim-ctrlspace


2

ดังนั้นในที่สุดตัดสินใจที่จะสร้างปลั๊กอินของตัวเองในการแก้ปัญหาของฉันมันเป็นที่มีอยู่บนGitHub

ฉันใช้ความคิดของ @ philolo1 และพยายามทำให้เสร็จในเวลาที่ฉันเขียนคำตอบนี้มันยังคงทำงานอยู่

แก้ไขฉันไม่ได้บำรุงรักษาปลั๊กอินตามขั้นตอนการทำงานของฉันตามที่ได้รับการพัฒนาและฉันรู้ว่าการผูกบัฟเฟอร์เข้ากับแท็บจะเพิ่มปัญหามากกว่าที่จะแก้ไข


ปลั๊กอินจะผูกบัฟเฟอร์กับแท็บ: เมื่อผู้ใช้เปิดบัฟเฟอร์มันจะ "จัดเก็บ" โดยอัตโนมัติในแท็บและไม่สามารถเข้าถึงได้จากแท็บอื่น

การติดตั้งควรเป็น "ตัวจัดการปลั๊กอินที่เป็นมิตร" (อย่างน้อยก็ทำงานได้ดีกับVim-PlugและVundle )

คุณสมบัติหลักบางประการคือ:

  • จัดการการรวมบัฟเฟอร์โดยอัตโนมัติ (ผู้ใช้สามารถเปิดได้เหมือนที่เคยทำมาก่อน)
  • :NextBufและ:PrevBufแทนที่:bnและ:bNเพื่อให้สถานะที่สอดคล้องกันของแท็บ
  • :ListBufอนุญาตให้แสดงรายการบัฟเฟอร์ที่คล้ายกัน:lsยกเว้นว่าพวกเขาถูกแยกในแท็บและเครื่องหมายให้ผู้ใช้เห็นได้อย่างง่ายดายในแท็บที่เขาเป็นอยู่ในปัจจุบัน
  • :ChangeBuf ยอมรับหมายเลขบัฟเฟอร์หรือชื่อบัฟเฟอร์เพื่อเปลี่ยนบัฟเฟอร์และเปลี่ยนแท็บโดยอัตโนมัติ
  • การปิดบัฟเฟอร์เสร็จสิ้นด้วย :CloseBuf
  • ปิดแท็บด้วย :CloseTab

สำหรับการดำเนินงานอื่น ๆ ที่ผู้ใช้ควรจะสามารถที่จะใช้ในตัวคุณสมบัติ (เช่น:tabopen, :tabnextฯลฯ ... )

สำหรับคำสั่งแต่ละบางแมปเริ่มต้นที่มีให้และพวกเขาสามารถใช้งานได้อย่างง่ายดายโดยการเพิ่มของคุณlet g:betterTabsVim_map_keys = 0.vimrc

ฉันพยายามสร้างไฟล์ช่วยเหลือที่ชัดเจน ( :h betterTabs.txt): ยังไม่สมบูรณ์ แต่ผู้ใช้ควรหาขั้นต่ำในการใช้ปลั๊กอิน

ฉันยังมีการทดสอบอีกมากที่ต้องทำเพื่อให้แน่ใจว่าปลั๊กอินนั้นไม่ทำให้เกิดปัญหาใด ๆ

ในที่สุดหากใครต้องการที่จะช่วยให้มันเป็นไปได้เสมอในการสร้างปัญหาในหน้า Githubหรือเพื่อสร้างคำขอดึง


1

ลองใช้งานปลั๊กอินนี้ ดูเหมือนว่าฉันจะเหมาะกับความต้องการของคุณอย่างสมบูรณ์แบบ https://github.com/szw/vim-ctrlspace


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