Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vim,使用vanilla vim在文件之间快速切换(无插件)_Vim - Fatal编程技术网

vim,使用vanilla vim在文件之间快速切换(无插件)

vim,使用vanilla vim在文件之间快速切换(无插件),vim,Vim,我知道将自己限制在vanillavim(不使用插件)会限制编辑器的功能,但由于我经常在不同的机器之间切换,因此在任何地方移动我的环境通常都太麻烦了。我只想呆在香草维姆 阻碍我前进的是在文件之间快速切换的能力。 我(至少相信)对缓冲区、窗口、选项卡以及netrw(Vex、Ex等)有很好的理解 但在诸如的编辑器中,我只需键入ctrl-p,就可以立即看到文件 我知道我可以直接使用shell,但我想知道,除了文件名之外,在Vim中快速切换文件是否还有其他“隐藏”秘密。答案在很大程度上取决于您的偏好和环境

我知道将自己限制在vanillavim(不使用插件)会限制编辑器的功能,但由于我经常在不同的机器之间切换,因此在任何地方移动我的环境通常都太麻烦了。我只想呆在香草维姆

阻碍我前进的是在文件之间快速切换的能力。 我(至少相信)对缓冲区、窗口、选项卡以及netrw(
Vex
Ex
等)有很好的理解

但在诸如的编辑器中,我只需键入ctrl-p,就可以立即看到文件


我知道我可以直接使用shell,但我想知道,除了文件名之外,在Vim中快速切换文件是否还有其他“隐藏”秘密。

答案在很大程度上取决于您的偏好和环境。一些例子:

  • 如果主要是两个文件(例如C头文件和实现文件),
    非常方便。通常,备用文件是一个重要的概念
  • 如果使用较大的编辑器窗口,window
    :split
    s将查找缓冲区的问题从查找窗口(打开所有缓冲区后)转到查找缓冲区的问题。您可以使用
    [N]
    快速切换到它
  • 如果你能记住(几个)缓冲区号码,那么
    :[N]b[uffer]
    :[N]sb[uffer]
    命令就非常方便<代码>:ls告诉您数字

插件(或者至少是自定义映射)可以大大改进,在这个主题上有各种各样的内容。有多种机制可以分发配置文件(病原体+GitHub、Dropbox等),或者您可以通过Vim附带的netrw插件远程编辑服务器文件。

如果您使用的是文件名并希望跳转到该文件,将为您执行此操作。我也喜欢使用,这不是一个插件;您只需构建标记,就可以轻松地绕过代码库

与ST2的Ctrl+p最接近的等价物(“最近的”,而不是“精确的”)是一个名为“准备就绪”的插件。还有其他类似的插件,如或

我使用CtrlP,我喜欢它,但我全心全意地支持你的决定去“插件免费”。这不是最简单的方法,但从长远来看会有回报的


打开文件

set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *
set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>
nnoremap <leader>j :tjump /
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
打开文件最基本的方法是
:e/path/to/filename
。谢天谢地,您得到了制表符补全和通配符:经典的
*
和一个特殊的
**
,它代表“任意子目录”

结合所有这些,您可以做到:

:e **/*foo<Tab>
从工作目录下任何名称中包含
foo
的子目录下名称中包含
bar
的所有文件中进行选择

当然,这也适用于
:tabe[dit]
:sp[lit]
:vs[plit]

但是,这些命令仅限于一个文件。使用
:next
打开多个文件:

:next **/*.js
并查看
:帮助参数列表


在缓冲区之间跳跃

set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *
set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>
nnoremap <leader>j :tjump /
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
: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
通过此映射,切换到另一个缓冲区非常简单:

gb
(quickly scanning the list)
3<CR>
:只要正确设置路径,find
就是一个非常棒的命令。通过我的设置,
,ffoo
将递归地找到当前目录下包含
foo
的所有文件。它快速、直观、轻便。当然,我受益于与
:edit
和friends相同的补全和通配符

为了使过程更快,以下映射允许我跳过项目的整个部分,并在当前文件的目录下递归查找文件:

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>
上面的映射列出了“wildmenu”中的可用缓冲区,并有一个空提示,允许我使用
导航菜单,或者键入几个字母,然后再次键入
以缩小列表范围。与上面的文件映射一样,这个过程很快,几乎没有摩擦

nnoremap <PageUp>   :bprevious<CR>
nnoremap <PageDown> :bnext<CR>
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

文件标记

set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *
set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>
nnoremap <leader>j :tjump /
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缓冲区。棒极了。

您可以在命令行上完成通配符选项卡,而无需任何插件。e、 g

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

在my.vimrc.

中,有时按顺序浏览文件列表也很方便(例如,如果您执行类似于
vim*.php
的操作,一次打开多个文件)。然后您可以使用
:n[ext]
(以及
:prev[ious]
:fir[st]
:la[st]
)进行导航(除了其他答案中建议的内容)。

如果您想在vim编辑器中切换文件,请参阅下面的答案

首先按Esc键退出编辑模式

然后键入
:e
检查当前文件路径

如果要转到另一个文件,请键入
:e/path of file.txt/
,使用此选项可以切换


如果要转到上一个文件,只需键入切换到上一个文件路径的
:e 35;

我对Vim也有同样的问题

我最不想做的事情就是依靠插件完成像文件交换这样平凡的任务

我将以下行添加到
.vimrc

set path+=**
set wildmenu
砰!现在我可以
:只要vim位于项目的根目录中,就可以在/any/folder/
中找到any/filename/in选项卡完成工作。通配符有效

一旦文件已经打开,并且后台有大量缓冲区(您可以使用
:ls
查看所有缓冲区),运行
:b any/file