Module: Canopus::Workspace::ProjectSearchable

Defined in:
lib/canopus/workspace/project_searchable.rb

Instance Method Summary collapse

Instance Method Details

#cancel_project_search ⇒ Object



28
29
30
31
32
33
34
35
36
# File 'lib/canopus/workspace/project_searchable.rb', line 28

def cancel_project_search
  prepared = (@search_prepare_lock ||= Mutex.new).synchronize do
    @search_generation = (@search_generation || 0) + 1
    saved, @search_prepared = @search_prepared, nil
    saved
  end
  prepared&.close
  nil
end

#replace_in_buffer(pattern, replacement, **options) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/canopus/workspace/project_searchable.rb', line 38

def replace_in_buffer(pattern, replacement, **options)
  if editor.buffer.is_a?(MultiBuffer)
    changes = editor.replacement_edits(pattern, replacement, **options).select do |range, _text|
      editor.buffer.excerpts.any? { |excerpt| range.begin >= excerpt.view_start && range.end <= excerpt.view_end }
    end
    editor.edit(changes, kind: :replace_all)
    changes.length
  else
    editor.replace_all(pattern, replacement, **options)
  end
end

#search_project(query, regexp: false, case_sensitive: true, whole_word: false, async: true) ⇒ Object

Capture immutable open-buffer snapshots on the foreground. File IO, scanning and the complete private result Editor are prepared off-thread.

Raises:



17
18
19
20
21
22
23
24
25
26
# File 'lib/canopus/workspace/project_searchable.rb', line 17

def search_project(query, regexp: false, case_sensitive: true, whole_word: false, async: true)
  raise Error, "Workspace closed" if @closed
  raise Error, "Search query cannot be empty" if query.empty?
  expression = regexp ? query : Regexp.escape(query)
  expression = "\\b(?:#{expression})\\b" if whole_word
  pattern = Regexp.new(expression, case_sensitive ? 0 : Regexp::IGNORECASE, timeout: 0.25)
  cancel_project_search
  @message = "Searching project…" if async
  prepare_project_search(pattern, @search_generation, search_sources, settings: search_editor_settings, async: async)
end