เป็นกลุ่มการสลับระหว่างไฟล์อย่างรวดเร็วโดยใช้ vanilla Vim (ไม่มีปลั๊กอิน)


103

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

สิ่งที่รั้งฉันไว้คือความสามารถในการสลับไฟล์อย่างรวดเร็ว ฉัน (เชื่อว่าอย่างน้อย) มีการทำความเข้าใจที่ดีของบัฟเฟอร์ , หน้าต่าง , แท็บเช่นเดียวกับ netrw ( Vex, Exฯลฯ )

แต่ในโปรแกรมแก้ไขเช่นSublime Textฉันสามารถพิมพ์ctrl- pและทันทีที่ฉันอยู่ที่ไฟล์

ฉันรู้ว่าฉันสามารถเลื่อนลงไปที่เชลล์ได้ แต่ฉันสงสัยว่ามีความลับอื่น ๆ ที่ "ซ่อน" อยู่หรือไม่เพื่อสลับระหว่างไฟล์ใน Vim อย่างรวดเร็วโดยอิงจากชื่อไฟล์


2
สิ่งนี้ไม่ตอบคำถามของคุณ แต่อาจชักชวนให้คุณพิจารณาใช้ปลั๊กอิน: dudarev.com/blog/keep-vim-settings-and-plugins-in-git-repo
ajwood

ฉันซิงค์การตั้งค่าของฉันกับ Dropbox เป็นการส่วนตัว มันเงอะงะ แต่ใช้งานได้มากหรือน้อยโดยไม่ต้องคิดเลย ปลั๊กอินเดียวที่ฉันใช้และรู้ว่าใช้ได้ดีกับสิ่งที่คุณต้องการคือ Command-T ( github.com/wincent/Command-T ) Ctrl-P อาจเป็นอีกทางเลือกหนึ่ง ( vim.org/scripts/script.php?script_id=3736 )
FX

1
คุณเคยเห็นdanielmiessler.com/study/vimหรือไม่? เขามีความชาญฉลาดในการใส่ vimrc + ปลั๊กอินทั้งหมดที่เขาต้องการลงใน Github ... ในทุกที่ที่เขาไปเขาสามารถโคลนและ voila Vim ก็ตรงตามที่เขาชอบ Brilliant
bobox

6
@bobox หลายหมื่นคนทำแบบนั้น ไม่มีอะไรพิเศษเกี่ยวกับเรื่องนี้
romainl

คำตอบ:


236

ที่อยู่ใกล้เทียบเท่า ( "ที่อยู่ใกล้" ไม่ "แน่นอน") เพื่อ ST2 ของCtrl+ Pเป็นปลั๊กอินที่เรียกว่าได้รับการพร้อม ... CtrlP มีปลั๊กอินอื่น ๆ ที่คล้ายกันเช่นCommand-TหรือFuzzyFinder FuzzyFinder

ฉันใช้ CtrlP และฉันชอบมัน แต่ฉันสนับสนุนด้วยใจจริงที่จะเลือกใช้ "ปลั๊กอินฟรี" ไม่ใช่วิธีที่ง่ายที่สุด แต่จะให้ผลตอบแทนในระยะยาว


กำลังเปิดไฟล์

วิธีพื้นฐานที่สุดในการเปิดไฟล์คือ:e /path/to/filename. โชคดีที่คุณได้รับการเติมแท็บและสัญลักษณ์แทน: แบบคลาสสิก*และแบบพิเศษ**ซึ่งย่อมาจาก "ไดเรกทอรีย่อยใด ๆ "

เมื่อรวมทั้งหมดเข้าด้วยกันคุณสามารถทำได้:

:e **/*foo<Tab>

เพื่อเลือกจากไฟล์ทั้งหมดที่มีfooในชื่อภายใต้ไดเร็กทอรีการทำงานหรือ:

:e **/*foo/*bar<Tab>

เพื่อเลือกจากไฟล์ทั้งหมดที่มีbarในชื่อของพวกเขาภายใต้ไดเร็กทอรีย่อยใด ๆ ที่มีfooในชื่อของมันที่ใดก็ได้ภายใต้ไดเร็กทอรีการทำงาน

แน่นอนว่าผลงาน:tabe[dit], :sp[lit]และ:vs[plit]มากเกินไป

คำสั่งเหล่านี้ จำกัด ไว้ที่ไฟล์เดียว ใช้:nextเพื่อเปิดไฟล์หลายไฟล์:

:next **/*.js

:help arglistและใช้เวลาดูที่


กระโดดไปมาระหว่างบัฟเฟอร์

:b[uffer] เป็นคำสั่งการสลับบัฟเฟอร์พื้นฐาน:

:b4         " switch to buffer number 4
:bn         " switch to next buffer in the buffer list
:bp         " switch to previous buffer in the buffer list
:bf         " switch to first buffer in the buffer list
:bl         " switch to last buffer in the buffer list
:b foo<Tab> " switch by buffer name with tab-completion
:b#         " switch to the alternate file

สังเกตว่าคำสั่งเหล่านี้หลายคำสั่งและญาติของพวกเขายอมรับการนับ

:lsคำสั่งแสดงรายการของบัฟเฟอร์โหลด มันค่อนข้าง "พิเศษ" แม้ว่าบัฟเฟอร์จะถูกกำหนดหมายเลขเมื่อสร้างขึ้นเพื่อให้คุณสามารถมีรายการที่ดูเหมือน1 2 5ว่าคุณลบบัฟเฟอร์ นี่เป็นเรื่องที่น่าอึดอัดใจใช่และนั่นทำให้การเปลี่ยนไปใช้บัฟเฟอร์ตามจำนวนนั้นค่อนข้างลำบากเกินไป ต้องการเปลี่ยนชื่อโดยบางส่วนหรือขี่จักรยาน:b foo<Tab>:bn :bp

อย่างไรก็ตามนี่คือการทำแผนที่ที่ยอดเยี่ยมที่แสดงรายการบัฟเฟอร์ที่โหลดทั้งหมดและเติมข้อมูลพร้อมท์ให้คุณรอให้คุณพิมพ์จำนวนบัฟเฟอร์แล้วกด<enter>:

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

ด้วยการแมปนี้การเปลี่ยนไปใช้บัฟเฟอร์อื่นทำได้ง่ายๆดังนี้:

gb
(quickly scanning the list)
3<CR>

หรือ:

gb
(quickly scanning the list)
foo<tab><CR>

แนวคิดนี้มาจากภาพที่นำมาจากคอลเลกชัน Vim infographics ของ Bairui :

การบินและการขี่จักรยาน

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

:help buffersอ่านทั้งหมดเกี่ยวกับบัฟเฟอร์ใน


ไปที่การประกาศ

ภายในไฟล์คุณสามารถใช้gdหรือgD.

ภายในโปรเจ็กต์คุณลักษณะ "แท็ก" ของกลุ่มเป็นเพื่อนของคุณ แต่คุณจะต้องมีตัวสร้างโค้ดภายนอกเช่น ctags หรือ cscope คำสั่งพื้นฐานที่สุดคือ:tag fooและ<C-]>ด้วยเคอร์เซอร์บนชื่อวิธีการ เครื่องมือทั้งสองมีการบูรณาการอย่างดีในกลุ่ม: ดู:help tags, และ:help ctags:help cscope

สำหรับสิ่งที่คุ้มค่าฉันใช้การนำทางแท็กอย่างกว้างขวางเพื่อย้ายภายในโปรเจ็กต์ (โดยใช้ CtrlP :CtrlPTagและ:CtrlPBufTagคำสั่งส่วนใหญ่ แต่เป็นแบบ buit-in ด้วย) และวิธีการสลับบัฟเฟอร์ "ทั่วไป" ที่ฉันชอบคือตามชื่อ


การปรับใช้การกำหนดค่าของคุณ

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


แก้ไข

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


การเล่นกลกับไฟล์

set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *

:findเป็นคำสั่งที่ยอดเยี่ยมอย่างแท้จริงทันทีที่คุณset pathถูกต้อง ด้วยการตั้งค่าของฉัน,ffoo<Tab>จะพบไฟล์ทั้งหมดที่fooอยู่ในไดเร็กทอรีปัจจุบันแบบวนซ้ำ รวดเร็วใช้งานง่ายและน้ำหนักเบา แน่นอนว่าฉันได้รับประโยชน์จากการเติมเต็มและสัญลักษณ์แทนเช่นเดียวกับ:editและเพื่อน ๆ

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

nnoremap <leader>F :find <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>S :sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>V :vert sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>T :tabfind <C-R>=expand('%:h').'/*'<CR>

คำเตือน! pathตัวเลือกเป็นอย่างมากที่มีประสิทธิภาพ ค่าด้านบน.,**- - ใช้ได้สำหรับฉันแต่ภาษาที่ฉันใช้ไม่มีไลบรารีมาตรฐาน ที่เหมาะสมคุ้มค่าขึ้นอยู่กับคุณความต้องการ


เล่นกลกับบัฟเฟอร์

set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>

การแมปด้านบนแสดงรายการบัฟเฟอร์ที่มีอยู่ใน "เมนูป่า" พร้อมข้อความแจ้งว่างทำให้ฉันสามารถนำทางเมนูด้วย<Tab>หรือพิมพ์ตัวอักษรสองสามตัวและ<Tab>อีกครั้งเพื่อ จำกัด รายการให้แคบลง เช่นเดียวกับการแมปไฟล์ด้านบนกระบวนการนี้รวดเร็วและแทบไม่มีแรงเสียดทาน

nnoremap <PageUp>   :bprevious<CR>
nnoremap <PageDown> :bnext<CR>

การทำแผนที่เหล่านั้นพูดเพื่อตัวเอง


เล่นกลกับแท็ก

nnoremap <leader>j :tjump /

การแมปนี้ใช้การค้นหา regex แทนการค้นหาคำทั้งหมดดังนั้นฉันจึงสามารถ,jba<Tab>ค้นหาแท็กfoobarbaz()ได้

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


แก้ไขเพิ่มเติม

เคล็ดลับ / เทคนิคเพิ่มเติมสองสามข้อ ...


ตัวเลือก Wildmenu

"wildmenu" ที่เปิดใช้งานset wildmenuทำให้การนำทางไฟล์ / บัฟเฟอร์ง่ายขึ้น พฤติกรรมของมันถูกควบคุมโดยตัวเลือกมากมายที่ควรค่าแก่การตรวจสอบ:

wildmode บอก Vim ว่าคุณต้องการให้ "wildmenu" ทำงานอย่างไร:

set wildmode=list:full

wildignore กรองส่วนที่ไม่สมบูรณ์ทั้งหมด:

set wildignore=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=tags
set wildignore+=*.tar.*

wildignorecaseช่วยให้คุณสามารถค้นหาfooและค้นหาFoo:

set wildignorecase

เครื่องหมายไฟล์

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

~/.vimrcฉันเพิ่งพบอัญมณีนี้ในของคนอื่น จะสร้างเครื่องหมายไฟล์ที่ตำแหน่งที่แน่นอนของเคอร์เซอร์เมื่อใดก็ตามที่คุณปล่อยบัฟเฟอร์ดังนั้นไม่ว่าคุณจะอยู่ที่ใดก็ตามจะ'Jข้ามไปยังบัฟเฟอร์ JavaScript ล่าสุดที่คุณแก้ไข น่ากลัว


2
+1. ฉันไม่รู้เกี่ยวกับ "ไดเร็กทอรีย่อยใด ๆ " ร่วมด้วย:eแต่ฉันจะใช้มันบ่อยมากต่อจากนี้ ฉันประหลาดใจกับงานที่เข้าสู่ Ctrl-P และสามารถเรียนรู้อะไรมากมายจากมัน แต่มันไม่ได้ผลสำหรับฉัน ฉันพบว่ามันค่อนข้างน่าเบื่อและเป็นการขัดจังหวะการฝึกความคิดของฉันในขณะที่ทำงาน(อาจเป็นระบบของฉันการตั้งค่าของฉันเอง แต่ฉันไม่ได้ตรวจสอบ)
Lieven Keersmaekers

2
**ดีมากจริงๆ
romainl

1
ฉันอยากจะโหวตอีกครั้งสำหรับgbแผนที่ อีกอันจะใช้เยอะ ทั้งหมดปลั๊กอินบัฟเฟอร์ฉันได้พยายาม(CtrlP, bufExplorer, ... )จะไม่ได้เกือบเป็นไปอย่างรวดเร็วเช่นนี้(ได้รับพวกเขามีการทำงานมากขึ้น แต่ไม่เพียงพอสำหรับผมที่จะให้ใช้พวกเขา)
Lieven Keersmaekers

2
@LievenKeersmaekers นี่คือที่มาของฉันและนี่คือที่มาของภาพโง่ ๆ ขอบคุณ Bairui!
romainl

4
นี่อาจเป็นคำตอบเดียวที่ยิ่งใหญ่ที่สุด
Craigp

5

คำตอบขึ้นอยู่กับความชอบและสถานการณ์ของคุณ ตัวอย่างบางส่วน:

  • หากส่วนใหญ่เป็นสองไฟล์ (เช่นส่วนหัว C และไฟล์การนำไปใช้งาน) <C-^>จะมีประโยชน์มาก โดยทั่วไปไฟล์สำรองเป็นแนวคิดที่สำคัญ
  • หากคุณใช้หน้าต่างตัวแก้ไขขนาดใหญ่หน้าต่างจะ:splitเปลี่ยนปัญหาในการหาตำแหน่งบัฟเฟอร์จากการค้นหาหน้าต่าง (เมื่อคุณเปิดบัฟเฟอร์ทั้งหมดแล้ว) คุณสามารถใช้[N]<C-w><C-w>เพื่อเปลี่ยนไปใช้งานได้อย่างรวดเร็ว
  • หากคุณสามารถจำหมายเลขบัฟเฟอร์ได้ (ไม่กี่) คำสั่ง:[N]b[uffer]และ:[N]sb[uffer]คำสั่งนั้นค่อนข้างมีประโยชน์ :lsบอกคุณถึงตัวเลข

ปลั๊กอิน (หรืออย่างแมปที่กำหนดเองน้อย) สามารถปรับปรุงสิ่งที่มากและมีความหลากหลายทั้งในหัวข้อนี้ในvim.org มีกลไกมากมายในการแจกจ่าย config ของคุณ (Pathogen + GitHub, Dropbox, ... ) หรือคุณสามารถแก้ไขไฟล์เซิร์ฟเวอร์จากระยะไกลผ่านปลั๊กอินnetrwที่มาพร้อมกับ Vim


4
อาจจะคุ้มค่ากับการพูดถึง ctags, cscope, gtags, id และเพื่อน ๆ ฉันพบว่าการใช้เครื่องหมายตัวพิมพ์ใหญ่จะมีประโยชน์มาก ใช้mAเพื่อจัดเก็บเครื่องหมายAและ "` `A``` เพื่อส่งคืน ฉันพบว่าnetrwมีประโยชน์มากกว่านี้มากหลังจากที่ฉันได้เรียนรู้เกี่ยวกับ:Rexสิ่งที่ส่งกลับไปยัง explorer :b, :eและอื่น ๆ อีกมากมายสามารถใช้สัญลักษณ์เหมือนและ* คำสั่งสามารถใช้ชื่อไฟล์บางส่วน รวมสิ่งนั้นหรือเมนูป่าคุณจะไปได้ไกลทีเดียว สำหรับปลั๊กอินคุณสามารถใช้โดเมนเฉพาะบางอย่างเช่น rail.vim ซึ่งมีคำสั่งการนำทางเฉพาะรางหรือคำสั่งทั่วไปเช่น CtrlP **:b<c-d>
Peter Rincker

@PeterRincker: +1 สำหรับการกล่าวถึงเครื่องหมาย ฉันขอแนะนำให้สร้างคำตอบด้วยเครื่องหมาย
Helbreder

<C - ^> และ [N] <Cw> <Cw> หมายถึงอะไร?
Josh Desmond

5

บางครั้งมันก็สะดวกที่จะไปตามลำดับผ่านรายการไฟล์ (เช่นถ้าคุณทำอะไรบางอย่างที่ต้องการvim *.phpเปิดหลายไฟล์พร้อมกัน) แล้วคุณสามารถใช้:n[ext](เช่นเดียวกับ:prev[ious], :fir[st]และ:la[st]) สำหรับระบบนำทาง (นอกเหนือจากสิ่งที่ได้รับการแนะนำในคำตอบอื่น ๆ )


4

คุณสามารถทำแท็บตัวแทนให้เสร็จสมบูรณ์ในบรรทัดคำสั่งโดยไม่ต้องใช้ปลั๊กอินใด ๆ เช่น

:e src/**/foo*<tab>

จะให้คุณวนรอบไฟล์ทั้งหมดที่ขึ้นต้นด้วย 'foo' ในแผนผังไดเรกทอรีภายใต้. / src และเลือกไฟล์ที่คุณต้องการแก้ไข

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

:b foo<tab>

ซึ่งจะวนรอบบัฟเฟอร์ทั้งหมดด้วย 'foo' ในเส้นทาง คุณอาจต้องตั้งค่าตัวเลือก wildmode และ wildmenu เพื่อให้ได้พฤติกรรมที่คุณต้องการ ฉันมี

wildmode=longest:full
wildmenu

ใน. vimrc ของฉัน


2

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


1

หากคุณต้องการสลับไปมาระหว่างไฟล์ใน vim editor โปรดดูคำตอบด้านล่าง

กดครั้งแรก Escเพื่อออกจากโหมดแก้ไข

จากนั้นพิมพ์ :eเพื่อตรวจสอบเส้นทางไฟล์ปัจจุบัน

หากคุณต้องการไปที่ไฟล์อื่นให้พิมพ์ :e /path-of-file.txt/โดยใช้สิ่งนี้คุณสามารถเปลี่ยนได้

หากคุณต้องการไปที่ไฟล์ก่อนหน้าเพียงแค่พิมพ์:e#ที่สลับไปยังเส้นทางไฟล์ก่อนหน้า


0

ฉันมีปัญหาเดียวกันกับ Vim

สิ่งสุดท้ายที่ฉันต้องการคือขึ้นอยู่กับปลั๊กอินสำหรับงานที่เป็นเรื่องธรรมดาเหมือนการสลับไฟล์

ฉันเพิ่มบรรทัดต่อไปนี้ใน .vimrc

set path+=**
set wildmenu

และ BAM! ตอนนี้ฉันสามารถทำได้:find any/filename/in/any/folder/ตราบเท่าที่ vim อยู่ในไดเรกทอรีรากของโครงการ แท็บเสร็จสิ้นใช้งานได้ สัญลักษณ์แทนทำงาน!

เมื่อเปิดไฟล์เรียบร้อยแล้วและมีบัฟเฟอร์จำนวนมากอยู่เบื้องหลัง (คุณสามารถใช้:lsเพื่อดูบัฟเฟอร์ทั้งหมดได้) การรัน:b any/file <TAB>จะค้นหาบัฟเฟอร์ทั้งหมดอย่างคลุมเครือและข้ามไปยังไฟล์ที่ต้องการ ในกรณีที่ไม่ซ้ำกันจะมีเมนูไวด์ของแท็บ (ดังนั้นบรรทัดที่ 2 ใน. vimrc) ซึ่งสามารถเลือกได้โดยใช้แท็บ

คำตอบของฉันมาจากวิดีโอที่ยอดเยี่ยมนี้
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489
มีเทคนิคเพิ่มเติมและฉันขอแนะนำให้ดู

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