过去几年我在使用TextMate后很难学习vim。
我已经开始将一些文件内导航提交到内存,但我正在努力在多个文件之间导航。
在我的工作流程中,很常见的是我经常在一些文件之间翻转(足够多的文件使得分屏窗口变得太小)。
我目前正在使用NERDTree,但发现深入研究目录繁琐以及不断使用 CTRL + W h / CTRL + W l 来回跳来跳去。
我想我会用标签做得更好,我可以轻松切换,但也许我需要使用不同的工作流程。
我还想在TextMate中使用“转到文件...”快捷方式,例如 CMD + T 。我发现fuzzy_file_finder
但是它需要使用Ruby绑定构建vim,而不是我工作过的本机安装。
虽然我可能重建我想切换到vim的主要原因,但我可以拥有一个我知道可以在任何平台上轻松工作的编辑器环境。
我们非常感谢任何想法的选择!
答案 0 :(得分:227)
浏览文件系统的简便方法是命令:
:Sex
我不是这样说的:)
答案 1 :(得分:82)
我没有发现通过普通的旧: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>
以向下钻取。
: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 :(得分:38)
:Sex
,:Vex
,:Tex
和:Ex
都是有用的命令,用于在您的系统上使用与{{{ 1}}
(其中:e
是Split / Vertical / Tab的缩写)
答案 3 :(得分:6)
如果您还没有找到它们,可能需要查看:
另请注意,您可以重新映射.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
答案 4 :(得分:5)
到目前为止,我发现LustyExplorer是最好的。
您只需键入其名称的一部分即可打开文件。
您可以从当前文件的目录或当前pwd
或缓冲区列表中打开文件。
如果从缓冲区列表中打开文件,则不必浏览目录树,但不幸的是,对于其他两种模式,您仍然需要在树中导航。好消息是你不必从第一个角色开始。
如果你有:
dir_a/
...
dir_b/
file.js
file.html
并且您想要打开dir_b/file.html
,通常可以通过输入b<Tab>h
答案 5 :(得分:4)
我想我会用标签做得更好 可以轻松切换,但也许我 需要使用不同的工作流程。
你知道Vim的标签吗?不确定你是指那里的Vim自己的标签,还是为TextMate而烦恼。目前还不清楚你正在使用什么样的Vim版本,但它至少有7.0版本(这似乎安装在我最近看到的地方),而且它们很棒。
:tabe
会打开一个新标签(“标签编辑”的缩写,例如:tabe
为空,或:tabe path/to/file
用于在新标签中打开文件),您可以在相邻之间移动带有gt
/ gT
的标签,还有一些其他与标签相关的导航命令,正如您对Vim所期望的那样(:help tabs
)
我的大项目工作流往往涉及一堆标签,每个标签都有1到3个窗口,具体取决于我需要的上下文类型。如果我有一个双宽终端窗口,这可以更好地工作,因为我可以垂直分割:vs
,所以一个标签可以轻松地一次显示4个文件,每个文件都有足够的空间。
最后提示:我有时会使用“切换缓冲区”命令(:sb <partial_buf_name>
),这有点像TM的模糊发现,因为它工作得很好但仅适用于已打开的缓冲区。当我一次打开十几个或更多文件时仍然很棒。 (N.B.我需要在我的vimrc中:set switchbuf=usetab
才能在标签页面上工作,但是一旦设置它就很棒了。)
答案 6 :(得分:3)
答案 7 :(得分:2)
如果您想要的文件已经加载到缓冲区(这可能是您经常在少量文件之间翻转),那么您可以使用:b[uffer]
命令快速切换到缓冲区。
:b
可以将缓冲区编号作为参数,或者(更有用的)将字符串与路径/文件名的 part 匹配。如果有多个匹配项,您可以使用Tab键循环显示它们。
如果要拆分窗口并在新窗口中打开缓冲区,请使用:sb name
如果要在新标签页中打开缓冲区,请使用:tab b name
您还可以使用:ls
命令查看当前加载的缓冲区列表。
答案 8 :(得分:2)
令人惊讶的是,在任何答案中都没有提到application.css
命令。我通常使用rails项目,我需要深入到目录层次结构中。因此,对于位于app/assets/stylesheets/
的文件:find applica
,我需要输入public String envoyer(SMS sms) {
logger.info("Envoie SMS au serveur samba sur {} : {} : {}", properties.getUser(), properties.getPassword(), properties.getUrl());
logger.info("SMS : {}", sms.toString());
HttpEntity<String> request = getRequest(sms);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(properties.getUrl(), sms, String.class);
return responseEntity.getBody();
}
private String getBase64Credentials(){
Base64.Encoder encoder = Base64.getEncoder();
String creds = properties.getUser()+":"+properties.getPassword();
byte[] credBytes = creds.getBytes();
byte[] base64Bytes = encoder.encode(credBytes);
logger.info("Credentials === "+creds);
logger.info("Credentials Bytes === "+new String(credBytes));
logger.info("Encoded Credentials === "+new String(base64Bytes));
return new String(base64Bytes);
}
private HttpEntity getRequest(SMS sms){
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic " + getBase64Credentials());
headers.add("sms", sms.toString());
return new HttpEntity<>(headers);
}
,然后按标签进行自动填充,输入打开。
答案 9 :(得分:2)
到目前为止,我发现的最好和最快的文件导航插件是 fzf.vim。您可以非常快速地模糊搜索所有文件、打开的缓冲区甚至文件内容。
因为我们有一个非常大的代码库在工作,所以我指定了几个我最常用的目录作为 fzf 搜索的目录。 Fzf 甚至有丰富的 git 集成。因此,您只能搜索跟踪的文件。
答案 10 :(得分:1)
我使用此函数查找子目录中的文件,但我没有写它。它来自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 :(得分: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-=
以显示缓冲区资源管理器。
我没有那么多使用Windows,因为我通常只有一个或两个窗口。
我还修改了statusline
以包含缓冲区编号%2n
,这样我总是知道正在编辑哪个缓冲区。见:h statusline
答案 12 :(得分:1)
试试吧!
此致 米哈尔
答案 13 :(得分:1)
NerdTree最适合vim中的文件导航。
以下链接是对nerdtree的一个很好的介绍。
答案 14 :(得分: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>)
所以我可以说:
:Er Main.java
它将搜索子目录,找到Main.java
并加载它。它对于同名的多个文件表现不佳,但它快速而简单。
我使用的另一个工具是VTreeExplorer,它提供了一个基于树的文件/目录窗口,并且不需要VIM的任何特殊构建选项(即它是一个vanilla插件)。
答案 15 :(得分: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开头的缓冲区)