การนำทางไฟล์ Vim


91

ฉันพยายามอย่างหนักที่จะเรียนรู้กลุ่มหลังจากใช้ TextMate ในช่วงสองสามปีที่ผ่านมา

ฉันเริ่มส่งการนำทางในไฟล์ไปยังหน่วยความจำ แต่ฉันกำลังดิ้นรนกับการนำทางระหว่างไฟล์หลาย ๆ ไฟล์

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

ฉันกำลังใช้ NERDTree แต่พบว่าการเจาะลึกลงไปในไดเร็กทอรีที่ยุ่งยากรวมถึงการใช้CTRL+ W h/ CTRL+ W lเพื่อกระโดดไปมา

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

ฉันต้องการทางลัด "ไปที่ไฟล์ ... " เช่นCMD+ Tใน TextMate ฉันพบแล้วfuzzy_file_finderแต่ต้องสร้างกลุ่มด้วยการผูก Ruby ซึ่งไม่ใช่กรณีการติดตั้งแบบเนทีฟที่ฉันเคยทำ

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

ตัวเลือกต่างๆมีความคิดที่น่าชื่นชมมาก!


1
ฉันไม่พบวิธีที่น่าพอใจจริงๆในการนำทางไฟล์และบัฟเฟอร์ซึ่งไม่ใช้อุปกรณ์ช่วยภายนอกเลย สิ่งที่สร้างขึ้นในนั้นค่อนข้างแย่ (ฉันหมายถึงเปลี่ยนเป็นบัฟเฟอร์ตามจำนวนใครไปรอบ ๆ ที่จำหมายเลขบัฟเฟอร์ชั่วคราว ... )
Svend

1
@svend: คุณสามารถอ้างถึงบัฟเฟอร์ตามชื่อและหมายเลข - ดูคำตอบของฉันด้านล่าง
Dave Kirby

คุณได้จับคู่caps-lockกับctrl? ทำให้สิ่งต่างๆctrlดีขึ้นมาก ... คุณสามารถใช้สิ่งที่ต้องการgnome-tweaksหรือsetxkbmap -o ctrl:nocaps
นาธานแชปเปลล์

คำตอบ:


93

ฉันไม่พบว่าการเจาะลึกลงไปในไดเรกทอรีย่อยผ่านทางเก่าธรรมดา:eให้ยุ่งยากเนื่องจากมีการกำหนดค่าที่เหมาะสมสำหรับการเติมแท็บ

ดู'wildmenu'ตัวเลือกเพื่อให้ Vim แสดงรายการความสมบูรณ์ (ชื่อไฟล์) ใน modeline เหนือ commandline คุณสามารถเปลี่ยนตัว'wildmode'เลือกเพื่อกำหนดค่าประเภทของการเติมแท็บเพิ่มเติมได้

ส่วนตัวผมใช้:set wildmode=full.

ขั้นตอนการทำงานของฉันเป็นดังนี้:

  1. :cd ลงในไดเร็กทอรี toplevel ของโครงการของฉัน
  2. ในการเปิดไฟล์foo/bar/baz:

    • สถานการณ์ที่ง่ายที่สุด: :e f<tab>b<tab>b<tab><enter>ชนิด

    • หากมีมากกว่าหนึ่งแฟ้มเริ่มต้นด้วยbหนึ่งในไดเรกทอรีที่คุณอาจจะต้องทำ<left>หรือ<right>หรืออื่น<tab>บนแป้นพิมพ์เพื่อข้ามไปมาระหว่างพวกเขา (หรือพิมพ์ตัวอักษรไม่กี่ที่จะมากขึ้นกระจ่าง)

    • สถานการณ์เลวร้ายที่สุดมีไฟล์และไดเร็กทอรีที่ใช้ชื่อร่วมกันและคุณต้องเจาะลึกลงในไดเร็กทอรี ในกรณีนี้แท็บกรอกชื่อไดเร็กทอรีจากนั้นพิมพ์*<tab>เพื่อเจาะลึก

  3. เปิด 2 หรือ 3 หน้าต่างแล้วเปิดไฟล์ทั้งหมดตามต้องการ
  4. เมื่อเปิดไฟล์ในบัฟเฟอร์แล้วอย่าฆ่าบัฟเฟอร์ เปิดทิ้งไว้ในพื้นหลังเมื่อคุณเปิดไฟล์ใหม่ เพียงแค่:eไฟล์ใหม่ในหน้าต่างเดียวกัน
  5. จากนั้นใช้:b <tab>เพื่อวนรอบบัฟเฟอร์ที่เปิดอยู่แล้วในพื้นหลัง ถ้าคุณพิมพ์มันจะตรงกับเฉพาะกับไฟล์ปัจจุบันที่เปิดการแข่งขัน:b foo<tab>foo

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

" Window movements; I do this often enough to warrant using up M-arrows on this"
nnoremap <M-Right> <C-W><Right>
nnoremap <M-Left> <C-W><Left>
nnoremap <M-Up> <C-W><Up>
nnoremap <M-Down> <C-W><Down>

" Open window below instead of above"
nnoremap <C-W>N :let sb=&sb<BAR>set sb<BAR>new<BAR>let &sb=sb<CR>

" Vertical equivalent of C-w-n and C-w-N"
nnoremap <C-w>v :vnew<CR>
nnoremap <C-w>V :let spr=&spr<BAR>set nospr<BAR>vnew<BAR>let &spr=spr<CR>

" I open new windows to warrant using up C-M-arrows on this"
nmap <C-M-Up> <C-w>n
nmap <C-M-Down> <C-w>N
nmap <C-M-Right> <C-w>v
nmap <C-M-Left> <C-w>V

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


4
ปลายหมวกสำหรับคำอธิบายที่น่ากลัว กระดิกนิ้วสำหรับ skillz ++ คุณจำเป็นต้องเข้าใจคำอธิบายอยู่แล้ว
Mr. Baudin

261

วิธีง่ายๆในการเรียกดูระบบไฟล์คือคำสั่ง:

:Sex

ฉันไม่ได้ทำมัน :)


15
และจากความช่วยเหลือฉันเห็นว่า Vex ก็ยอดเยี่ยมเช่นกัน
jrwren

18
และมี 69 upvotes ฉันไม่คิดว่าฉันจะเปลี่ยนใจขนาดนั้น
AlbeyAmakiir

3
และ:Vexถ้าคุณต้องการแบ่งหน้าจอในแนวตั้งแทนที่จะเป็นแนวนอน
sreenivas

1
ว้าวไม่เคยรู้เรื่องนี้มาก่อน ฉันพบว่า:Vexมีประโยชน์มากขึ้น แต่:Sexก็ทำให้วันของฉัน
William Robertson

2
สำหรับบันทึกก็ใช้:Seงานได้เช่นกัน (เหมือนกันสำหรับVe, Teตัวแปร) ไม่จำเป็นต้องทำให้มันแปลก :)
towc

47

:Sex, :Vex, :Texและ:Exมีคำสั่งที่เป็นประโยชน์สำหรับอดีต (ploring) ไฟล์ในระบบของคุณถ้าคุณต้องการที่จะใช้สิ่งที่แตกต่างจาก:e

( S/V/Tย่อมาจาก Split / Vertical / Tab)


7

หากคุณยังไม่พบสิ่งเหล่านี้คุณอาจต้องการตรวจสอบ:

  • ปลั๊กอินตัวค้นหาฟัซซีดั้งเดิมซึ่ง IIRC ไม่มีปัญหาการผูก Ruby
  • ปลั๊กอินโครงการ - คล้ายกับ NERDTree
  • ปลั๊กอิน buffer explorer - แสดงรายการของบัฟเฟอร์ที่เปิดอยู่

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

" set your own personal modifier key to something handy
let mapleader = "," 

" use ,v to make a new vertical split, ,s for horiz, ,x to close a split
noremap <leader>v <c-w>v<c-w>l
noremap <leader>s <c-w>s<c-w>j
noremap <leader>x <c-w>c

" use ctrl-h/j/k/l to switch between splits
map <c-j> <c-w>j
map <c-k> <c-w>k
map <c-l> <c-w>l
map <c-h> <c-w>h

5

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

คุณรู้จักแท็บของ Vim หรือไม่? ไม่แน่ใจว่าคุณกำลังอ้างถึงแท็บของ Vim ที่นั่นหรือกำลังหา TextMate ไม่ชัดเจนว่าคุณใช้ Vim เวอร์ชันใด แต่มีแท็บตั้งแต่อย่างน้อย 7.0 (ซึ่งดูเหมือนว่าจะติดตั้งทุกที่ที่ฉันดูเมื่อเร็ว ๆ นี้) และมันยอดเยี่ยมมาก

:tabeเปิดแท็บใหม่ (ย่อมาจาก "แท็บแก้ไข" ดังนั้นเช่น:tabeว่างเปล่าหรือ:tabe path/to/fileเปิดไฟล์ในแท็บใหม่) คุณสามารถย้ายไปมาระหว่างแท็บที่อยู่ติดกันด้วยgt/ gTและยังมีคำสั่ง nav ที่เกี่ยวข้องกับแท็บอื่น ๆ อีกมากมายเช่น คุณอาจคาดหวังจาก Vim ( :help tabs)

เวิร์กโฟลว์ของฉันสำหรับโปรเจ็กต์ขนาดใหญ่มักจะเกี่ยวข้องกับแท็บต่างๆมากมายแต่ละแท็บจะมีหน้าต่างระหว่าง 1 ถึง 3 หน้าต่างขึ้นอยู่กับบริบทที่ฉันต้องการ สิ่งนี้จะทำงานได้ดียิ่งขึ้นถ้าฉันมีหน้าต่างเทอร์มินัลแบบกว้างสองเท่าเนื่องจากฉันสามารถแยกในแนวตั้ง:vsได้ดังนั้นแท็บเดียวสามารถแสดงไฟล์ 4 ไฟล์พร้อมกันได้อย่างง่ายดายโดยมีที่ว่างมากมายสำหรับแต่ละไฟล์

เคล็ดลับสุดท้าย: บางครั้งฉันใช้คำสั่ง "switch buffer" ( :sb <partial_buf_name>) ซึ่งเป็น sorta-kinda เหมือนกับการค้นหาที่คลุมเครือของ TM ซึ่งทำงานได้ค่อนข้างดี แต่สำหรับบัฟเฟอร์ที่เปิดอยู่แล้วเท่านั้น ยังคงยอดเยี่ยมสำหรับเมื่อฉันเปิดไฟล์หลายสิบไฟล์ขึ้นไปพร้อมกัน (หมายเหตุฉันต้องการ:set switchbuf=usetabใน vimrc ของฉันเพื่อให้สิ่งนี้ทำงานในแท็บต่างๆได้ แต่เมื่อตั้งค่าได้แล้วมันก็ยอดเยี่ยม)


1
ความเข้าใจของฉันเกี่ยวกับแท็บคือมันเป็นตัวเก็บรักษาโครงร่างมากกว่าไม่ใช่วิธีการเปิดบัฟเฟอร์หนึ่งรายการในแต่ละแท็บ (ดู Bram Molenaars มุมมองของตัวเองบนแท็บในวิดีโอ "นิสัย 7 ประการในการแก้ไขข้อความที่มีประสิทธิภาพ"
Svend

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

vim-titlecaseสกรูกับ gt / การแมป GT แต่มีการทำงานรอบ
naught101

5

ฉันพบLustyExplorerดีที่สุดแล้ว

คุณสามารถเปิดไฟล์ได้โดยพิมพ์ชื่อเพียงบางส่วน

คุณสามารถเปิดไฟล์จากไดเร็กทอรีของไฟล์ปัจจุบันหรือไฟล์ปัจจุบันpwdหรือจากรายการบัฟเฟอร์

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

ถ้าคุณมี:

dir_a/
    ...
dir_b/
    file.js
    file.html

และคุณต้องการเปิดdir_b/file.htmlโดยทั่วไปคุณสามารถค้นหาได้โดยพิมพ์b<Tab>h


ฉันสร้างส่วนขยายให้กับส่วนเสริมที่ยอดเยี่ยมนี้ svendtofte.com/wp-content/uploads/2009/08/… svendtofte.com/other/vim-stuff โดยพื้นฐานให้ฉันใส่ชื่อไฟล์ที่เพิ่งใช้ไม่ว่าจะโหลดไปแล้วหรือไม่ก็ไม่สำคัญ ซึ่งหมายความว่าคุณจะต้องเรียกดู FS เมื่อคุณเปิดไฟล์เป็นครั้งแรกเท่านั้น
Svend

4

เป็นที่น่าแปลกใจที่เห็นว่า:findคำสั่งนั้นไม่ได้รับการกล่าวถึงในคำตอบใด ๆ ฉันมักจะทำงานกับโปรเจ็กต์รางที่ฉันต้องเจาะลึกลงไปในลำดับชั้นของไดเร็กทอรี ดังนั้นสำหรับไฟล์ที่application.cssอยู่ในapp/assets/stylesheets/สิ่งที่ฉันต้องพิมพ์คือ:find applicaจากนั้นกดแท็บเพื่อเติมข้อความอัตโนมัติและกดEnterเพื่อเปิด


3

ตรวจสอบปลั๊กอินctrlpเป็นทางเลือกให้ปลั๊กอินที่สั่ง-T จะดีกว่านี้ตรงที่มันเป็นสคริปต์ Vim 'เนทีฟ' และไม่จำเป็นต้องรวบรวม Vim ด้วยทับทิม (หรือการสนับสนุนอื่น ๆ ) ในขณะที่มันทำงานได้เร็วและไม่สร้างความรำคาญ


2

หากไฟล์ที่คุณต้องการโหลดลงในบัฟเฟอร์แล้ว (ซึ่งเป็นไปได้ว่าหากคุณกำลังพลิกไปมาระหว่างไฟล์จำนวนหนึ่งเป็นประจำ) คุณสามารถเปลี่ยนไปใช้บัฟเฟอร์ได้อย่างรวดเร็วด้วย:b[uffer]คำสั่ง

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

หากคุณต้องการแยกหน้าต่างและเปิดบัฟเฟอร์ในหน้าต่างใหม่ให้ใช้ :sb name

หากคุณต้องการเปิดบัฟเฟอร์ในแท็บใหม่ให้ใช้ :tab b name

คุณยังสามารถใช้:lsคำสั่งเพื่อดูรายการบัฟเฟอร์ที่โหลดในปัจจุบัน


1

ฉันใช้ฟังก์ชั่นนี้เพื่อค้นหาไฟล์ในไดเร็กทอรีย่อยฉันไม่ได้เขียนมัน มันมาจากvim wiki :

ฟังก์ชัน! ค้นหา (ชื่อ)
    ให้ l: list = system ("find. -name '" .a: name. "' | grep -v \". svn / \ "| perl -ne 'print \" $. \\ t $ _ \ "' ") 
    ให้ l: num = strlen (แทน (l: list, "[^ \ n]", "", "g")) 
    ถ้า l: num 0 
            เสียงสะท้อน "ไม่ใช่ตัวเลข" 
            กลับ 
        endif 
        ถ้า l: inputl: num 
            เสียงสะท้อน "อยู่นอกช่วง" 
            กลับ 
        endif 
        ให้ l: line = matchstr ("\ n" .l: list, "\ n" .l: input. "\ t [^ \ n] *") 
    อื่น 
      ให้ l: line = l: list 
    endif 
    ให้ l: line = แทน (l: line, "^ [^ \ t] * \ t. /", "", "") 
    ดำเนินการ ": e" .l: line 
สิ้นสุดการทำงาน 

คำสั่ง! -nargs = 1 ค้นหา: โทรหา ("")

สิ่งหนึ่งที่ฉันชอบคือมันรองรับสัญลักษณ์แทน (*) นอกจากนี้ยังทำงานได้ดีสำหรับการแข่งขันหลายรายการ


1

นอกจากwildmenuคำตอบแล้วฉันยังใช้ปลั๊กอินBufExplorerและการแมปต่อไปนี้เพื่อข้ามบัฟเฟอร์อย่างรวดเร็ว:

nmap <A-1> :b 1<CR>
nmap <A-2> :b 2<CR>
nmap <A-3> :b 3<CR>
...
nmap <A-0> :b 10<CR>
nmap <A-=> \bs

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

อันสุดท้ายแมปAlt-=เพื่อแสดงบัฟเฟอร์ explorer

ฉันไม่ได้ใช้ Windows มากนักเพราะโดยทั่วไปฉันมีหน้าต่างเพียงหนึ่งหรือสองหน้าต่างเท่านั้น

ฉันยังแก้ไขstatuslineเพื่อรวมหมายเลขบัฟเฟอร์%2nเพื่อให้ฉันรู้อยู่เสมอว่าบัฟเฟอร์ใดกำลังถูกแก้ไข ดู:h statusline


1

คุณรู้จักแอปพลิเคชัน MacVim หรือไม่? เป็น VIM ขัดเงาสำหรับ OS X และหนึ่งในคุณสมบัติของมันคือรองรับแท็บ (CMD + T เพื่อเปิดแท็บใหม่) มีลิ้นชัก ฯลฯ ... (อ่านสิ่งนี้: http://zerokspot.com/weblog/2008 / 08/03 / macvim-as-textmate-replacement / )

ลองมัน!

ขอแสดงความนับถือ Michal



0

นี่คือสิ่งที่ค่อนข้างเล็กน้อยที่ฉันติด.vimrcไว้ มันจะโหลดไฟล์จากไดเร็กทอรีย่อยใด ๆ

" load from an unspecified subdirectory 
function! LoadFromSubdirectory(filespec) 
  let filename = glob("`find . -name '" . a:filespec . "' -print`") 
  exe ':e '.filename 
endfunction 
:command -nargs=1 Er :call LoadFromSubdirectory(<f-args>) 

ดังนั้นฉันสามารถพูดได้ว่า:

: เออ Main.java

และจะค้นหาไดเรกทอรีย่อยค้นหาMain.javaและโหลด มันทำงานได้ไม่ดีสำหรับไฟล์หลาย ๆ ไฟล์ที่มีชื่อเดียวกัน แต่ทำได้ง่ายและรวดเร็ว

เครื่องมืออื่นที่ฉันใช้คือVTreeExplorerซึ่งมีหน้าต่างไฟล์ / ไดเรกทอรีแบบต้นไม้และไม่ต้องการตัวเลือกการสร้างพิเศษใด ๆ จาก VIM (เช่นเป็นปลั๊กอินวานิลลา)


ฉันต้องการโหลดจากไดเร็กทอรีย่อย แต่ปัญหาหลายไฟล์อาจเป็นตัวทำลายข้อตกลงสำหรับฉัน ฉันพัฒนา Django ดังนั้นฉันมักจะมีพวงของไดเรกทอรีย่อยที่ทุกคนมีmodels.py, views.pyฯลฯ
พีท

0

ขั้นตอนการค้นหาไฟล์ของฉันคือ wildmenu, autocwd และ:e.

ส่วนที่เกี่ยวข้องใน.vimrc:

set wildmenu
set wildignore=*.dll,*.o,*.pyc,*.bak,*.exe,*.jpg,*.jpeg,*.png,*.gif
set wildmode=list:full
set autochdir
let g:netrw_list_hide='^\.,.\(pyc\|pyo\|o\)$'

และวิธีใช้:

:e myf^D

ที่ให้ไฟล์ทั้งหมดในไดเร็กทอรีปัจจุบันที่ขึ้นต้นด้วย myf คุณยังสามารถ<Tab>ผ่านพวกเขา ใช้ return เพื่อเปิด :)

^Dจะให้การแข่งขันทั้งหมดแก่คุณเสมอ เนื่องจาก autocmd จะไปที่โฟลเดอร์ของไฟล์ปัจจุบันเสมอจึงใช้งานได้ง่าย หากคุณอยู่ในfoo/bar.pyและคุณต้องการไปหาfoo/baz.pyคุณเท่านั้น:e baz.pyและคุณอยู่ที่นั่น ที่ทำงานร่วมกับบัฟเฟอร์ ( :b foo^Dแสดงรายการบัฟเฟอร์ทั้งหมดที่ขึ้นต้นด้วย foo)


วิธีการไปยังไดเรกทอรีอื่น ๆ ตัวอย่างเช่นฉันมักจะทำงานระหว่างมุมมอง Python เทมเพลต HTML และไฟล์ JavaScript ซึ่งทั้งหมดอยู่ในไดเรกทอรีย่อยที่แตกต่างกัน? ใน TextMate ฉันเริ่มพิมพ์ชื่อไฟล์และรายการที่ตรงกันทั้งหมดใน "project" (aka cwd) ของฉันก็ปรากฏขึ้น
พีท

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