vim fuzzyfinder

VIM: uso de FuzzyFinder, consejos, errores, ¿cómo se puede hacer uso de este complemento?



(6)

Además de la respuesta de Kris, es probable que desee asignar el ''** /'' inmediatamente en su archivo .vimrc como este:

map ,f :FufFile **/<CR>

Así que solo necesitas escribir:

,fTest

para encontrar todos los partidos de prueba en todos los subdirectorios!

HTH

http://www.vim.org/scripts/script.php?script_id=1984

Puedes iniciar FuzzyFinder siguiendo los siguientes comandos:

Command Mode ~ |:FufBuffer| - Buffer mode (|fuf-buffer-mode|) |:FufFile| - File mode (|fuf-file-mode|) |:FufDir| - Directory mode (|fuf-dir-mode|) |:FufMruFile| - MRU-File mode (|fuf-mrufile-mode|) |:FufMruCmd| - MRU-Command mode (|fuf-mrucmd-mode|) |:FufBookmark| - Bookmark mode (|fuf-bookmark-mode|) |:FufTag| - Tag mode (|fuf-tag-mode|) |:FufTaggedFile| - Tagged-File mode (|fuf-taggedfile-mode|) |:FufJumpList| - Jump-List mode (|fuf-jumplist-mode|) |:FufChangeList| - Change-List mode (|fuf-changelist-mode|) |:FufQuickfix| - Quickfix mode (|fuf-quickfix-mode|) |:FufLine| - Line mode (|fuf-line-mode|) |:FufHelp| - Help mode (|fuf-help-mode|)

Así que hace poco me enteré de FuzzyFinder. Para cualquier persona que haya usado esto durante bastante tiempo, ¿puede demostrar cómo realmente usa estos comandos en combinación, las asignaciones que hace, los errores que debe conocer al usar esto?


Aquí están los mapas que uso (no son míos, aunque estoy acostumbrado a ellos ahora):

let g:fuf_modesDisable = [] let g:fuf_mrufile_maxItem = 1000 let g:fuf_mrucmd_maxItem = 400 let g:fuf_mrufile_exclude = ''/v/~$|/.(bak|sw[po])$|^(////|////|//mnt//)'' nnoremap <silent> <C-n> :FufBuffer<CR> nnoremap <silent> <C-p> :FufFileWithCurrentBufferDir<CR> nnoremap <silent> <C-f><C-p> :FufFileWithFullCwd<CR> nnoremap <silent> <C-f>p :FufFile<CR> nnoremap <silent> <C-f><C-d> :FufDirWithCurrentBufferDir<CR> nnoremap <silent> <C-f>d :FufDirWithFullCwd<CR> nnoremap <silent> <C-f>D :FufDir<CR> nnoremap <silent> <C-j> :FufMruFile<CR> nnoremap <silent> <C-k> :FufMruCmd<CR> nnoremap <silent> <C-b> :FufBookmarkDir<CR> nnoremap <silent> <C-f><C-t> :FufTag<CR> nnoremap <silent> <C-f>t :FufTag!<CR> noremap <silent> g] :FufTagWithCursorWord!<CR> nnoremap <silent> <C-f><C-f> :FufTaggedFile<CR> nnoremap <silent> <C-f><C-j> :FufJumpList<CR> nnoremap <silent> <C-f><C-g> :FufChangeList<CR> nnoremap <silent> <C-f><C-q> :FufQuickfix<CR> nnoremap <silent> <C-f><C-l> :FufLine<CR> nnoremap <silent> <C-f><C-h> :FufHelp<CR> nnoremap <silent> <C-f><C-b> :FufAddBookmark<CR> vnoremap <silent> <C-f><C-b> :FufAddBookmarkAsSelectedText<CR> nnoremap <silent> <C-f><C-e> :FufEditInfo<CR> nnoremap <silent> <C-f><C-r> :FufRenewCache<CR>

Principalmente utilizo: para los últimos archivos abiertos para cambiar los buffers (y eliminé todos los complementos de buxexplorer) p para buscar archivos / directorios


FuzzyFinder en sí mismo es bastante inútil para mí. Lo uso en combinación con FuzzyFinder-TextMate y una biblioteca Ruby que atraviesa todos los archivos y subdirectorios para encontrar un archivo, muy parecido a la opción Cmd + T para TextMate en una Mac. Puedes verlo en acción here .

Desafortunadamente, se necesita algo de esfuerzo para que funcione, ya que el autor original dejó de mantener el script. Sin embargo, todavía hay algunas personas que publican regularmente actualizaciones de github. Necesitará dos scripts, fuzzyfinder_textmate.vim y fuzzy_file_finder.rb .

Las últimas versiones funcionan sin problemas en combinación con Vim FuzzyFinder 2.22.3. Tu Vim tiene que ser compilado con el soporte de Ruby, de lo contrario no funcionará. El blog del autor original contiene más información sobre cómo usarlo correctamente. O bien, eche un vistazo a mi configuración de Vim para ver cómo se puede usar. La configuración define dos keymappings ,s e ,e fuzzy para encontrar un archivo y abrirlo en una nueva ventana o en la ventana actual, respectivamente:

function IdeFindTextMate() let g:FuzzyFinderOptions.Base.key_open = ''<CR>'' let g:FuzzyFinderOptions.Base.key_open_split = ''<C-j>'' exe "FuzzyFinderTextMate" endfunction function IdeSplitFindTextMate() let g:FuzzyFinderOptions.Base.key_open = ''<C-j>'' let g:FuzzyFinderOptions.Base.key_open_split = ''<CR>'' exe "FuzzyFinderTextMate" endfunction let mapleader = "," map <silent> <leader>e :call IdeFindTextMate()<CR> map <silent> <leader>s :call IdeSplitFindTextMate()<CR>

Actualizar:

Ahora mismo uso el excelente complemento Command-T en lugar de FuzzyFinder. Echa un vistazo a this respuesta de superusuario mía por las razones.


Primero instale el último script de buscador difuso. Entonces...

Config

Modifica algunas configuraciones en tu .vimrc:

" Truth be told, I don''t remember what these do, but I must have " found them necessary back when I installed fuzzyfinder years ago let s:slash = ''[///]'' let s:startname = ''(^|''.s:slash.'')'' let s:endname = ''($|''.s:slash.'')'' " directories and extensions to ignore when listing files " these contain a lot of Python-isms, yours will probably vary let s:extension = ''/.bak|/.dll|/.exe|/.o|/.pyc|/.pyo|/.swp|/.swo'' let s:dirname = ''build|deploy|dist|vms|/.bzr|/.git|/.hg|/.svn|.+/.egg-info'' let g:fuf_file_exclude = ''/v''.''(''.s:startname.''(''.s:dirname.'')''.s:endname.'')|((''.s:extension.'')$)'' let g:fuf_dir_exclude = ''/v''.s:startname.''(''.s:dirname.'')''.s:endname " limit number of displayed matches " (makes response instant even on huge source trees) let g:fuf_enumeratingLimit = 60

y defino algunos atajos para activarlo:

nnoremap <Leader>f :FufFile **/<cr> nnoremap <Leader>b :FufBuffer<cr> nnoremap <Leader>t :FufTag<cr>

y reinicie Vim para volver a leer la configuración .vimrc.

Encontrar archivo / buffer

Ahora puedo presionar <leader> f para ver una lista de archivos en el directorio y subdirectorios actuales. Comience a escribir y la lista se filtra solo para aquellos que (difusos) coinciden con lo que escribe. Use las teclas del cursor para seleccionar una coincidencia e ingrese para abrir ese archivo. La primera vez que lo active en un proyecto nuevo muy grande, puede tardar un segundo en almacenar en caché los nombres de archivo.

De manera similar, cuando tenga algunos buffers abiertos, presione <leader> b para seleccionar de una lista de buffers abiertos.

Encontrar etiqueta

Lo mejor de todo es la coincidencia de etiquetas (es decir, ir a una función, clase, método, etc.) Sin embargo, primero tenemos que generar un archivo de etiquetas.

Si no estás acostumbrado a etiquetar archivos, esto puede parecer una molestia tener que hacerlo manualmente. Tenga en cuenta que muchas herramientas usan archivos de etiquetas, por ejemplo, el propio Vim las leerá para habilitar ''ir a la definición'', vea ese enlace al final de esta respuesta, por lo que aprender sobre ellas es quizás más valioso de lo que podría esperar.

Instale los últimos ctags ( http://ctags.sourceforge.net/ ) y asegúrese de que esté en su RUTA para que pueda invocarlo desde la línea de comandos. Las versiones recientes están muy mejoradas para lenguajes como Python. Luego, define una pulsación de tecla en .vimrc para que sea fácil volver a ejecutarla en tu proyecto, y elimina la memoria caché de fuzzyfinder al mismo tiempo:

noremap <f12> :silent !ctags -R --languages=python .<cr>:FufRenewCache<cr>

o en Windows:

noremap <f12> :!start /min ctags -R --languages=python .<cr>:FufRenewCache<cr>

(el / min es una forma específica de Windows de ejecutar el comando en segundo plano para que Vim no se bloquee al indexar proyectos muy grandes)

Reinicie vim, y presionando f12 ahora escaneará cada archivo en el directorio y subdirectorios actuales, y creará un índice de todas las funciones, clases, etc. definidas. Ctags analiza muchos lenguajes de programación. La salida va a un archivo llamado ''etiquetas''. Tiene sentido ejecutar esto en la raíz de su proyecto (use Vim''s: pwd y: cd para asegurarse de que esté en su lugar) para que el archivo de etiquetas contenga todo en su proyecto.

Así que ahora puede presionar <leader> t para ver una lista de todas las clases, funciones, métodos, etc. en su proyecto. Como se indicó anteriormente, comience a escribir, y la lista se filtra a solo aquellos que coinciden con lo que escribe. Use los cursores e ingrese para seleccionar uno, y Vim irá al archivo / línea donde se define esa etiqueta.

Gotchas

Si una etiqueta se define más de una vez en su proyecto, (por ejemplo, una clase con el mismo nombre que una función), entonces fuzzyfinder ofrecerá un menú para que pueda elegir a cuál desea saltar. Esto puede ser un poco molesto, porque de forma predeterminada, ctags produce demasiadas definiciones de etiquetas para los archivos Python. Enumera no solo la definición de clases, métodos y funciones, sino todos los lugares donde se define cualquier símbolo dentro de un archivo fuente. Esto incluye la creación de variables y los lugares donde se importa un símbolo desde otro lugar. Esto significa que un símbolo que se define en un archivo y se importa en un segundo archivo tendrá dos ubicaciones de definición, lo que significa que siempre aparecerá un menú en lugar de saltar directamente a la definición de clase. Puede solucionar esto creando un archivo de opciones ctags en ~ / .ctags, diciéndole que no genere etiquetas para las declaraciones de ''inclusión'' y que omita algunos directorios:

--python-kinds=-i --exclude=build --exclude=dist

Cuando cambie su código fuente, su archivo de etiquetas estará desactualizado. Si creas nuevas clases / funciones / métodos / etc, para saltar a ellas tendrás que volver a ejecutar ctags como se muestra arriba. Es sorprendente lo poco frecuente que esto importa.

Encontré que <leader> b se detendría por un segundo antes de trabajar, lo cual era molesto. Resulta que el motivo es que hay otro mapeo definido para <leader> bd definido por mi complemento BClose, y Vim estaba esperando para ver si presionaba o no la siguiente d antes de decidir qué mapeo de teclas invocar. Nunca uso eso, así que lo deshabilité usando esto en mi .vimrc:

autocmd VimEnter * nunmap <Leader>bd

Por cierto, ahora que está generando archivos de etiquetas para su proyecto, es fácil también habilitar una pulsación de tecla para hacer ''ir a la definición'' del símbolo debajo del cursor de texto. Vea la publicación de mi blog al respecto: https://www.tartley.com/go-to-definition-in-vim-for-python-using-ctags-on-windows


Un poco tarde para la fiesta, pero me gustaría añadir que la última versión de FuzzyFinder tiene un nuevo comando :FufCoverageFile , que hace exactamente lo que quieres, es decir:

>CoverageFile>appcontr 20: app/controllers/application_controller.rb 22: app/views/layouts/application.html.erb


Yo uso: FufFile mapeado a, b y comienzo escribiendo ** / seguido de los primeros caracteres de la cadena que estoy buscando.

Esto proporciona una lista de todos los archivos coincidentes que incluyen su cadena.

p.ej

,b **/doc 13: app/models/document.rb 75: test/fixtures/documents.yml 82: test/unit/document_test.rb