Навигация по Vim

Я пытаюсь очень усердно изучить vim после использования TextMate в течение последних нескольких лет.

Я начал фиксировать некоторую часть навигации по файлам в памяти, но я борюсь с переходом между несколькими файлами.

В моем рабочем процессе довольно распространено, что я просматриваю несколько файлов довольно регулярно (достаточно файлов, чтобы окна с разделенной панелью стали слишком маленькими). ​​

В настоящее время я использую NERDTree, но нахожу сверление в каталоги громоздким, а также постоянно используя CTRL + W h/CTRL + W l для перехода назад и вперед.

Я думаю, что мне бы лучше с вкладками, которые я могу легко переключаться между ними, но, возможно, мне нужно использовать другой рабочий процесс.

Мне также понравится ярлык "Перейти к файлу...", например CMD + T в TextMate. Я нашел fuzzy_file_finder, но для этого требуется, чтобы vim был построен с привязками Ruby, что не относится к родным установкам, над которыми я работал,

В то время как я мог перестроить основную причину, по которой я хочу переключиться на vim, так что я могу иметь одну среду редактора, которая, как я знаю, будет легко работать на любой платформе.

Варианты там подавляющие, любые идеи очень ценятся!

Ответ 1

Я не нахожу сверление в подкаталоги через обычный старый :e, чтобы быть громоздким, учитывая приличную конфигурацию для завершения табуляции.

Посмотрите на параметр 'wildmenu', чтобы Vim показывал список завершений (имена файлов) в моделировании над командной строкой. Вы можете изменить параметр 'wildmode', чтобы дополнительно настроить вид заполнения вкладки, который сделает Vim.

Лично я использую :set wildmode=full.

Мой рабочий процесс выглядит следующим образом:

  • :cd в каталог верхнего уровня моего проекта.
  • Чтобы открыть файл foo/bar/baz:

    • Самый простой сценарий: введите :e f<tab>b<tab>b<tab><enter>.

    • Если в одном из этих каталогов имеется более одного файла, начинающегося с b, вам может понадобиться сделать <left> или <right> или еще один <tab> на клавиатуре, чтобы прыгать между ними (или введите еще несколько писем, чтобы устранить несоответствие).

    • В худшем случае есть файлы и каталоги, которые используют имя, и вам нужно развернуть его в каталог. В этом случае вкладка - заполните имя каталога, а затем введите *<tab> для развертки.

  • Откройте 2 или 3 окна и при необходимости распакуйте файлы.
  • Как только файл открыт в буфере, не убивайте буфер. Оставьте его открытым в фоновом режиме при открытии новых файлов. Просто :e новый файл в том же окне.
  • Затем используйте :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, настроить некоторые окна и открыть несколько файлов. Лично я никогда не обнаружил, что любой из сторонних скриптов просмотра файлов очень полезен.

Ответ 2

Простым способом просмотра файловой системы является команда:

:Sex

Я не делаю этого:)

Ответ 3

:Sex, :Vex, :Tex и :Ex - все полезные команды для ex (ploring) файлов в вашей системе, если вы хотите использовать что-то отличное от :e

(где S/V/T являются короткими для Split/Vertical/Tab)

Ответ 4

Если вы еще не нашли их, вы можете проверить:

  • оригинальный плагин нечеткого поиска - у IIRC нет проблем с привязкой Ruby.
  • Плагин проекта - аналогичен NERDTree
  • плагин explorer для буфера - отображает список открытых буферов

Также имейте в виду, что вы можете переназначить ключевые ярлыки в своем .vimrc, чтобы сделать их менее громоздкими. Я использую разделенные окна много; Я нашел следующее дело с ними гораздо проще:

" 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

Я нахожу LustyExplorer лучшим до сих пор.

Вы можете открыть файл, введя только часть его имени.

Вы можете открыть файл из каталога текущего файла или текущего pwd или из списка буферов.

Если вы открываете файл из списка буферов, вам не нужно перемещаться по дереву каталогов, но, к сожалению, для двух других режимов вам все равно придется перемещаться по дереву. Хорошо, что вам не нужно начинать с первого персонажа.

Если у вас есть:

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

и вы хотите открыть dir_b/file.html, вы можете найти его, набрав b<Tab>h

Ответ 6

Думаю, мне лучше с вкладками я может легко переключаться между ними, но, может быть, я необходимо использовать другой рабочий процесс.

Знаете ли вы о вкладках Vim? Не уверен, что вы ссылались на собственные вкладки Vim или наклон для TextMate. Непонятно, какую версию Vim вы используете, но у нее были вкладки с по крайней мере 7.0 (что, кажется, установлено повсюду, где я смотрю в последнее время), и они потрясающие.

:tabe открывает новый (короткий для "редактирования вкладки", например, :tabe для пустого или :tabe path/to/file для открытия файла на новой вкладке), вы можете перемещаться между соседними вкладками с помощью gt/gt, и там также есть множество других команд навигации, связанных с вкладками, как вы могли бы ожидать от Vim (:help tabs)

Мой рабочий процесс для больших проектов имеет тенденцию включать в себя множество вкладок, каждый из которых имеет от 1 до 3 окон в зависимости от того, какой контекст мне нужен. Это работает еще лучше, если у меня есть двойное окно терминала, так как я могу вертикально разделить на :vs, поэтому одна вкладка может легко показать мне 4 файла одновременно с большим количеством места для каждого.

Окончательный совет: иногда я использую команду "switch buffer" (:sb <partial_buf_name>), которая является sorta-kinda, как TM-нечеткое обнаружение, поскольку она работает очень хорошо, но только для уже открытых буферов. Все еще замечательно, когда я открываю сразу несколько десятков или более файлов. (N.B. Мне нужно было :set switchbuf=usetab в моем vimrc для этого, чтобы работать с вкладками, но как только это установило его.)

Ответ 7

Посмотрите плагин ctrlp в качестве альтернативы плагину Команда-Т. Это лучше, чем в том, что это "родной" Vim script и не нуждается в компиляции Vim с ruby ​​(или другой поддержкой), пока он работает очень быстро и ненавязчиво.

Ответ 8

Если файл, который вы хотите, уже загружен в буфер (что, вероятно, если вы периодически перемещаетесь между несколькими файлами), вы можете быстро переключиться на буфер с помощью команды :b[uffer].

:b может принимать номер буфера в качестве параметра или (более полезно) строку, которая соответствует части пути/имени файла. Если есть несколько совпадений, вы можете использовать вкладку, чтобы перебирать их.

Если вы хотите разбить окно и открыть буфер в новом окне, используйте :sb name

Если вы хотите открыть буфер на новой вкладке, используйте :tab b name

Вы также можете использовать команду :ls, чтобы просмотреть список загруженных буферов.

Ответ 9

Удивительно, что команда :find не упоминалась ни в одном из ответов. Обычно я работаю с рельсовыми проектами, где мне нужно глубоко развернуть иерархию каталогов. Поэтому для файла application.css, расположенного в app/assets/stylesheets/, все, что я должен ввести, это :find applica, а затем нажмите вкладка для автозаполнения и введите, чтобы открыть.

Ответ 10

Я использую эту функцию для поиска файлов в подкаталогах, но я ее не писал. Это из vim wiki:

function! Find(name) 
    let l:list=system("find . -name '".a:name."' | grep -v \".svn/\" | perl -ne 'print \"$.\\t$_\"'") 
    let l:num=strlen(substitute(l:list, "[^\n]", "", "g")) 
    if l:num 0 
            echo "Not a number" 
            return 
        endif 
        if l:inputl:num 
            echo "Out of range" 
            return 
        endif 
        let l:line=matchstr("\n".l:list, "\n".l:input."\t[^\n]*") 
    else 
      let l:line=l:list 
    endif 
    let l:line=substitute(l:line, "^[^\t]*\t./", "", "") 
    execute ":e ".l:line 
endfunction 

command! -nargs=1 Find :call Find("") 

Одна вещь, которая мне нравится, это поддержка подстановочных знаков (*). Он также хорошо вел себя для нескольких совпадений.

Ответ 11

В дополнение к ответам 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

Или вы можете просто заменить explorer буфера командой :ls, которая в основном отображает одно и то же.

Последний отображает Alt-=, чтобы отобразить проводник буфера.

Я не очень сильно использую Windows, поскольку у меня обычно есть только одно или два окна.

Я также изменил statusline, чтобы включить номер буфера %2n, так что я всегда знаю, какой буфер редактируется. См. :h statusline

Ответ 12

Вы знаете приложение MacVim? Это VIM отполировано для OS X, и одной из его функций является поддержка вкладок (CMD + T для открытия новой вкладки), у нее есть ящик и т.д. (Читайте это: http://zerokspot.com/weblog/2008/08/03/macvim-as-textmate-replacement/)

Попробуйте!

Отношения Михал

Ответ 13

Здесь что-то довольно тривиальное, что я придерживаюсь в .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>) 

Поэтому я могу просто сказать:

: Er Main.java

и он будет искать подкаталоги, найти Main.java и загрузить его. Это не очень хорошо для нескольких файлов с одним и тем же именем, но это быстро и просто.

Другим инструментом, который я использую, является VTreeExplorer, который предоставляет дерево-окно файлов/каталогов и не требует каких-либо специальных строить варианты из VIM (т.е. это ванильный плагин).

Ответ 14

Мой рабочий процесс для поиска файлов - это 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 to open:)

^D всегда будет давать вам все матчи. Поскольку autocmd всегда идет в папку текущего файла, с которой легко работать. Если вы находитесь в foo/bar.py и хотите перейти на foo/baz.py, вы делаете :e baz.py, и вы там. Это также работает с буферами (:b foo^D перечисляет все буферы, начинающиеся с foo)