Source code for eye.helpers.ycm.feed
# this project is licensed under the WTFPLv2, see COPYING.txt for details
import mimetypes
import os
from PyQt5.QtCore import QTimer
from ...app import qApp
from ...structs import PropDict
from ...connector import register_signal, disabled, category_objects
from .daemon import get_daemon, is_daemon_available
__all__ = ('ycm_filetype', 'feed_on_load', 'feed_on_save', 'feed_on_daemon_ready', 'feed_on_change')
MIME_YCMFILETYPE = {
'application/javascript': 'js',
'text/x-chdr': 'c',
'text/x-csrc': 'c',
'text/x-c++hdr': 'cpp',
'text/x-c++src': 'cpp',
'text/x-python': 'python',
}
EXT_YCMFILETYPE = {
'c': 'c',
'cc': 'cpp',
'cpp': 'cpp',
'cs': 'cs',
'go': 'go',
'h': 'cpp',
'hh': 'cpp',
'hpp': 'cpp',
'js': 'js',
'py': 'python',
}
FEED_ON_EDIT_PAUSE_MS = 1000
[docs]
def ycm_filetype(path):
mime, _ = mimetypes.guess_type(path)
try:
return MIME_YCMFILETYPE[mime]
except KeyError:
pass
_, dotext = os.path.splitext(path)
ext = dotext[1:]
try:
return EXT_YCMFILETYPE[ext]
except KeyError:
return 'general'
[docs]
@register_signal('editor', 'file_opened')
@register_signal('editor', 'file_saved_as')
@disabled
def feed_on_load(editor, path):
if not is_daemon_available():
return
editor.ycm = PropDict()
editor.ycm.filetype = ycm_filetype(path)
get_daemon().send_parse(path, editor.ycm.filetype, editor.text())
[docs]
@register_signal('editor', 'file_saved')
@disabled
def feed_on_save(editor, path):
if not is_daemon_available():
return
if not getattr(editor, "ycm", None):
return
get_daemon().send_parse(path, editor.ycm.filetype, editor.text())
def _timeout_feed():
if not is_daemon_available():
return
editor = qApp().sender().parent()
get_daemon().send_parse(editor.path, editor.ycm.filetype, editor.text())
[docs]
@register_signal('editor', 'textChanged')
@disabled
def feed_on_change(editor):
if not is_daemon_available() or not editor.path:
return
if not hasattr(editor, 'ycm_feed_timer'):
editor.ycm_feed_timer = QTimer(editor)
editor.ycm_feed_timer.setSingleShot(True)
editor.ycm_feed_timer.timeout.connect(_timeout_feed)
# reboot timer
editor.ycm_feed_timer.start(FEED_ON_EDIT_PAUSE_MS)
[docs]
@register_signal('ycm_control', 'ready')
@disabled
def feed_on_daemon_ready(ycm):
for editor in category_objects('editor'):
if editor.path:
feed_on_load(editor, editor.path)