如何在VIM中添加文件夹到项目中(类似于Sublime Text)?

3

我刚从Sublime Text转换到GVIM(在Windows上)。我还在考虑是否应该继续使用ST或完全转向VIM。我迫切需要(或错过)的一个功能是:

  1. Ctrl+P 在我的文件夹列表中跳转至任何文件。
  2. Ctrl+Shift+f 在这些文件夹列表中查找(和替换)任何文本。

我使用Sublime Text 3 的 添加文件夹到项目 功能添加了许多文件夹,这非常有帮助。现在,我知道VIM的 CtrlP 插件可以做类似的事情,但我无法弄清楚如何让它搜索我想要的文件夹,而不是当前文件的根目录。

我在我的vimrc文件中尝试设置路径,但没有取得太大的成功。

你能否帮忙解决?如果这是一个重复的问题,请原谅。

谢谢。


对于搜索和替换,我推荐使用ctrlsf.vim插件:https://github.com/dyng/ctrlsf.vim - Zach
4个回答

2
据我所知,ctrlp插件仅在一个目录(及其子目录)中进行搜索。使用Unix功能:创建一个带有指向您感兴趣的项目外目录的链接的目录。这样,与项目外目录的关联不仅是编辑器知道的内容,而且还记录在实际项目中。
搜索和替换可能会有些棘手。您需要在所有感兴趣的文件中工作,然后在所有文件上重复替换命令。例如,如果您想在此处及其子目录中的所有C文件中搜索foo并将其替换为bar,则可以执行以下操作。
:args **/*.c
:argdo %s/foo/bar/g

1
  1. Ctrl+P to go to any file that I want in my list of folders.

    The :find command can be used to "find" a file in the directories specified in the 'path' option:

    set path+=/some/arbitrary/path
    set path+=/another/one
    
    :find *foo
    

    I find these two mappings very handy:

    nnoremap <key> :find *                                    " search in every directory
                                                              " in 'path'
    nnoremap <key> :find <C-R>=expand('%:p:h').'/**/*'<CR>    " start from the directory
                                                              " of the current file
    
  2. Ctrl+Shift+f to find (and replace) any text in those list of folders.

    What amadan said above.


谢谢Romainl。我按照您的要求添加了我的文件夹。set path+=c:\project1\``set path+=c:\project2。当我使用:find搜索我知道存在的文件时,它会给我以下错误。E345:在路径中找不到文件。我几乎要放弃了。 - NotepadPlusPlus PRO

0

不错的选择!所以你发现了 CtrlP。它内置了广泛的文档。使用 :h ctrlp 查看完整的 vimdocs,解释了各种选项。它将解释一些重要的工作目录设置,这对于良好的使用体验非常重要。例如,以下是我使用的一些设置:

" The one you really care about...
" Set root to CWD. Another good option is 'r' for VCS mode.
" You should start vim in the root of your project tree
let g:ctrlp_working_path_mode = 0
" You _can_ switch dirs
let g:ctrlp_extensions = ['dir']

" Avoid big/unimportant project areas
set wildignore+=*/node_modules/*,*/build/*,*/components/*,*/_public/*,*/tmp/*,*/vendor/*

" Cache -- get used to pressing F5 on tree changes/additions
let g:ctrlp_use_caching = 1
let g:ctrlp_clear_cache_on_exit = 0

" Somewhat self-explanatory
let g:ctrlp_show_hidden = 1
let g:ctrlp_switch_buffer = 2
let g:ctrlp_max_depth = 6
let g:ctrlp_max_height = 50

" Open *h*orizontally and *j*ump to first win.
let g:ctrlp_open_multiple_files = 'hj'
" Use <C-d> to toggle
"let g:ctrlp_by_filename = 1

如需进一步控制在工作树之外查找文件的位置,请参考g:ctrlp_user_command。这里有一个Windows示例,使用dir命令。您可以使用它,并添加您想要的额外路径。

您可能还想添加NerdTree,它是CtrlP的一个很好的补充。它类似于ST的侧边栏。使用?获取帮助。它有一个菜单,让您快速添加文件和目录,也许就像您想要的“添加到项目文件夹”。

对于搜索和替换,请查看ag.vim。我将其映射为<leader>g(意思是“grep”)。

以上提到的是我最喜欢的一些,但你应该探索Vim插件的世界,决定哪些值得采用。我建议在你还是新手时一次只尝试一个插件,而不是使用有时不透明的“分发”。使插件管理更容易的工具有Vundle / Pathogen(选择其中一个)。


CtrlP的文档都没有涉及到OP想要的项目外目录,而Ag也无法替代。 - Amadan
谢谢Micah。正如Amadan所提到的,我已经阅读了CtrlP文档,但是我找不到在多个目录中使用它的方法。有人可以给我一个在Windows上使用let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d'的多个目录的示例吗? - NotepadPlusPlus PRO
我没有Windows机器进行实验,但是这篇文档(请参考示例部分)建议使用类似以下命令:dir /a c:\some\dir\ c:\another\dir\。如果可以使用Cygwin,您将会得到一个全功能的find命令和更好的glob匹配。 - Micah Elliott

-1

Eureka...!!!!!

经过数日的不懈搜索(和不眠之夜),我终于找到了答案(请继续阅读)。

首先是一些愚人节思想

我非常渴望不放弃Vim。但这个问题正在内心深处折磨着我,并且干扰了我的工作流程。我在Windows中有许多项目文件夹,我希望vim能够搜索。由于某种原因,Ctrl+p从未真正起作用。我曾经想过放弃Vim,但后来我找到了这个!

我的答案

这与我预期的有些不同。但答案是Everything(by VoidTools)。它允许从任何地方搜索,并在几秒钟内给出结果。它是Windows中迄今为止最好的文件名搜索工具。它支持Regex。(虽然它不是文本搜索工具)。它有一个称为的命令行界面

es.exe

使用 Vim 的 FindEverything.vim 插件(FindEverything),我能够搜索不仅是我的项目文件夹,而且几乎任何地方。它会在 vim 缓冲区返回结果。

感谢大家的帮助。我知道并不是每个人都同意这个解决方案。但在 Windows 上,这绝对是我找到的最好的解决方案!希望对其他处于同样困境的人有所帮助!!!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接