Source code for eye.helpers.file_search

# this project is licensed under the WTFPLv2, see COPYING.txt for details

"""Helper for searching in multiple files, like recursive grep.

The `file_search` plugins allow to perform pattern search in multiple files and directories.

.. seealso::

	The abstract plugin is in :any:`eye.helpers.file_search_plugins.base`.
"""

import os

from eye.app import qApp
from eye.connector import register_signal, disabled
from eye.helpers.file_search_plugins.base import enabled_plugins, get_plugin
from eye.helpers.intent import send_intent
from eye.reutils import qtEnumToCs, qreToPattern

__all__ = (
	'enabled_plugins', 'searchWithPlugin', 'searchStart',
	'setupLocationList', 'searchAndOpenFirstResult',
	'pluginOpenFirstResult',
)


[docs] @register_signal('file_search_widget', 'returnPressed') @disabled def searchStart(search_widget): search_widget.results.clear() search_widget.results.setColumns(loc=True, snippet=True) qregex = search_widget.regexp() plugin_id = search_widget.selected_plugin() find_root = search_widget.shouldFindRoot() ed = search_widget.window().current_buffer() cs = qtEnumToCs(qregex.caseSensitivity()) it = searchWithPlugin(plugin_id, ed.path, qreToPattern(qregex), find_root=find_root, caseSensitive=cs) for res in it: search_widget.results.addItem(res[0], loc=res[1], snippet=res[2])
[docs] def searchWithPlugin(plugin_id, path, pattern, find_root=False, **options): plugin = get_plugin(plugin_id) if find_root: root = plugin.search_root_path(path) elif os.path.isfile(path): root = os.path.dirname(path) else: root = path return plugin.search(root, pattern, **options)
[docs] def setupLocationList(plugin, loclist): plugin.started.connect(loclist.clear) plugin.found.connect(loclist.addItem) plugin.finished.connect(loclist.resizeAllColumns)
[docs] def searchAndOpenFirstResult(plugin_id, path, pattern): plugin = get_plugin(plugin_id)(parent=qApp()) pluginOpenFirstResult(plugin) if os.path.isfile(path): root = os.path.dirname(path) else: root = path plugin.search(root, pattern)
[docs] def pluginOpenFirstResult(plugin): """Connect a SearchPlugin to open automatically the first result When the :any:`plugin` has found a result, an `open_editor` intent is sent to open the first result. This function must be called before starting the search. """ def onFound(res): loc = (res['line'], res.get('col', 1)) send_intent(None, 'open_editor', path=res['path'], loc=loc, reason='file_search') plugin.found.connect(onFound) plugin.found.connect(plugin.interrupt) plugin.found.connect(plugin.found.disconnect) plugin.finished.connect(plugin.deleteLater)