Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Minor mode for caret browsing #349

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/browser/buffer.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ def __init__(self, buffer_id, url, config_dir, arguments, emacs_var_dict, module
self.buffer_widget.open_url_in_background_tab.connect(self.open_url_in_background_tab)

self.buffer_widget.urlChanged.connect(self.set_adblocker)
self.buffer_widget.urlChanged.connect(self.exit_caret_browsing)

# Reset to default zoom when page init or url changed.
self.reset_default_zoom()
Expand Down
36 changes: 16 additions & 20 deletions core/browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -568,6 +568,7 @@ class BrowserBuffer(Buffer):
close_page = QtCore.pyqtSignal(str)
get_focus_text = QtCore.pyqtSignal(str, str)
open_dev_tools_tab = QtCore.pyqtSignal(object)
caret_browsing_status = QtCore.pyqtSignal(bool)

def __init__(self, buffer_id, url, config_dir, arguments, emacs_var_dict, module_path, fit_to_view):
Buffer.__init__(self, buffer_id, url, arguments, emacs_var_dict, module_path, fit_to_view)
Expand Down Expand Up @@ -965,64 +966,61 @@ def try_start_aria2_daemon(self):

subprocess.Popen(aria2_args, stdout=null_file)

def caret_browsing(self):
''' Init caret browsing.'''
def toggle_caret_browsing(self):
''' toggle caret browsing.'''
if self.eval_caret_js:
self.buffer_widget.eval_js("CaretBrowsing.setInitialCursor();")
self.message_to_emacs.emit("Caret browsing activated.")
self.caret_browsing_activated = True
self.caret_browsing_search_text = ""
if self.caret_browsing_activated:
self.buffer_widget.eval_js("CaretBrowsing.shutdown();")
self.message_to_emacs.emit("Caret browsing deactivated.")
self.caret_browsing_activated = False
self.caret_browsing_status.emit(self.caret_browsing_activated)
else:
self.buffer_widget.eval_js("CaretBrowsing.setInitialCursor();")
self.message_to_emacs.emit("Caret browsing activated.")
self.caret_browsing_activated = True
self.caret_browsing_search_text = ""
self.caret_browsing_status.emit(self.caret_browsing_activated)

def caret_exit(self):
''' Exit caret browsing.'''
def exit_caret_browsing(self):
if self.caret_browsing_activated:
self.buffer_widget.eval_js("CaretBrowsing.shutdown();")
self.message_to_emacs.emit("Caret browsing deactivated.")
self.caret_browsing_activated = False
self.caret_browsing_status.emit(self.caret_browsing_activated)

@interactive(insert_or_do=True)
def caret_next_line(self):
''' Switch to next line in caret browsing.'''
if self.caret_browsing_activated:
self.buffer_widget.eval_js("CaretBrowsing.move('forward', 'line');")

@interactive(insert_or_do=True)
def caret_previous_line(self):
''' Switch to previous line in caret browsing.'''
if self.caret_browsing_activated:
self.buffer_widget.eval_js("CaretBrowsing.move('backward', 'line');")

@interactive(insert_or_do=True)
def caret_next_character(self):
''' Switch to next character in caret browsing.'''
if self.caret_browsing_activated:
self.buffer_widget.eval_js("CaretBrowsing.move('forward', 'character');")

@interactive(insert_or_do=True)
def caret_previous_character(self):
''' Switch to previous character in caret browsing.'''
if self.caret_browsing_activated:
self.buffer_widget.eval_js("CaretBrowsing.move('backward', 'character');")

@interactive(insert_or_do=True)
def caret_next_word(self):
''' Switch to next word in caret browsing.'''
if self.caret_browsing_activated:
self.buffer_widget.eval_js("CaretBrowsing.move('forward', 'word');")

@interactive(insert_or_do=True)
def caret_previous_word(self):
''' Switch to previous word in caret browsing.'''
if self.caret_browsing_activated:
self.buffer_widget.eval_js("CaretBrowsing.move('backward', 'word');")

@interactive(insert_or_do=True)
def caret_to_bottom(self):
''' Switch to next word in caret browsing.'''
if self.caret_browsing_activated:
self.buffer_widget.eval_js("CaretBrowsing.move('forward', 'documentboundary');")

@interactive(insert_or_do=True)
def caret_to_top(self):
''' Switch to previous word in caret browsing.'''
if self.caret_browsing_activated:
Expand All @@ -1046,7 +1044,6 @@ def caret_clear_search(self):
self.caret_browsing_search_text = ""
self.message_to_emacs.emit("Cleared caret search text.")

@interactive(insert_or_do=True)
def caret_search_forward(self):
''' Search Text forward in caret browsing.'''
if self.caret_browsing_activated:
Expand All @@ -1056,7 +1053,6 @@ def caret_search_forward(self):
else:
self._caret_search_text(self.caret_browsing_search_text)

@interactive(insert_or_do=True)
def caret_search_backward(self):
''' Search Text backward in caret browsing.'''
if self.caret_browsing_activated:
Expand Down
106 changes: 92 additions & 14 deletions eaf.el
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ Try not to modify this alist directly. Use `eaf-setq' to modify instead."
("C-y" . "yank_text")
("C-w" . "kill_text")
("M-e" . "edit_focus_text")
("M-c" . "caret_browsing")
("M-c" . "toggle_caret_browsing")
("M-D" . "select_text")
("M-s" . "open_link")
("M-S" . "open_link_new_buffer")
Expand All @@ -317,19 +317,6 @@ Try not to modify this alist directly. Use `eaf-setq' to modify instead."
("M->" . "scroll_to_bottom")
("M-t" . "new_blank_page")
("SPC" . "insert_or_scroll_up_page")
("C-q" . "caret_exit")
("s" . "insert_or_caret_next_line")
("w" . "insert_or_caret_previous_line")
("d" . "insert_or_caret_next_character")
("a" . "insert_or_caret_previous_character")
("D" . "insert_or_caret_next_word")
("A" . "insert_or_caret_previous_word")
("S" . "insert_or_caret_to_bottom")
("W" . "insert_or_caret_to_top")
("/" . "insert_or_caret_search_forward")
("?" . "insert_or_caret_search_backward")
("C-i" . "caret_toggle_mark")
("C-." . "caret_clear_search")
("J" . "insert_or_select_left_tab")
("K" . "insert_or_select_right_tab")
("j" . "insert_or_scroll_up")
Expand Down Expand Up @@ -803,6 +790,81 @@ Python process only create application view when Emacs window or buffer state ch

(defvar-local eaf-mindmap--current-add-mode nil)

(define-minor-mode eaf-browser-caret-mode
"EAF browser caret mode."
:keymap (let ((map (make-sparse-keymap)))
(define-key map (kbd "w") 'eaf-caret-previous-line)
(define-key map (kbd "s") 'eaf-caret-next-line)
(define-key map (kbd "d") 'eaf-caret-next-character)
(define-key map (kbd "a") 'eaf-caret-previous-character)
(define-key map (kbd "W") 'eaf-caret-to-top)
(define-key map (kbd "S") 'eaf-caret-to-bottom)
(define-key map (kbd "A") 'eaf-caret-previous-word)
(define-key map (kbd "D") 'eaf-caret-next-word)
(define-key map (kbd "/") 'eaf-caret-search-forward)
(define-key map (kbd "?") 'eaf-caret-search-backward)
(define-key map (kbd "C-o") 'eaf-caret-toggle-mark)
(define-key map (kbd "C-.") 'eaf-caret-clear-search)
map))

(dbus-register-signal
:session "com.lazycat.eaf" "/com/lazycat/eaf"
"com.lazycat.eaf" "toggle_caret_browsing"
#'eaf--toggle-caret-browsing)

(defun eaf--toggle-caret-browsing (caret-status)
(if caret-status
(eaf-browser-caret-mode 1)
(eaf-browser-caret-mode 0)))
Comment on lines +817 to +818
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

你定义了minor mode,但是没有在当前buffer切换mode导致的

@manateelazycat Hmm,我这两行代码是用来判断切换mode的,我觉得应该不是因为没有在当前buffer切换mode导致的。我现在PR按照当前minor mode的Key配置运行完全没有问题,因为它们在eaf-browser-keybinding都没有定义。但是要是将其中一个换成eaf-browser-keybinding中已经有定义的按键,进入minor mode之后就会发现这个按键没有被覆盖

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请先查看我写的 multi-term.el https://github.com/manateelazycat/multi-term/blob/master/multi-term.el#L752

把 caret-mode 改成类似 term-bind-key-alist 的按键列表

  • 激活 caret mode 的时候,遍历 caret key list,用 define-key 强制重新设置按键
  • 退出 caret mode 的时候,遍历 eaf-browser-keybinding ,强制重新设置浏览器默认的按键

通过这样的方法应该可以强制让冲突的按键生效。


(defun eaf-caret-previous-line ()
(interactive)
(eaf-call "call_function" eaf--buffer-id "caret_previous_line"))

(defun eaf-caret-next-line ()
(interactive)
(eaf-call "call_function" eaf--buffer-id "caret_next_line"))

(defun eaf-caret-next-character ()
(interactive)
(eaf-call "call_function" eaf--buffer-id "caret_next_character"))

(defun eaf-caret-previous-character ()
(interactive)
(eaf-call "call_function" eaf--buffer-id "caret_previous_character"))

(defun eaf-caret-to-top ()
(interactive)
(eaf-call "call_function" eaf--buffer-id "caret_to_top"))

(defun eaf-caret-to-bottom ()
(interactive)
(eaf-call "call_function" eaf--buffer-id "caret_to_bottom"))

(defun eaf-caret-previous-word ()
(interactive)
(eaf-call "call_function" eaf--buffer-id "caret_previous_word"))

(defun eaf-caret-next-word ()
(interactive)
(eaf-call "call_function" eaf--buffer-id "caret_next_word"))

(defun eaf-caret-search-forward ()
(interactive)
(eaf-call "call_function" eaf--buffer-id "caret_search_forward"))

(defun eaf-caret-search-backward ()
(interactive)
(eaf-call "call_function" eaf--buffer-id "caret_search_backward"))

(defun eaf-caret-toggle-mark ()
(interactive)
(eaf-call "call_function" eaf--buffer-id "caret_toggle_mark"))

(defun eaf-caret-clear-search ()
(interactive)
(eaf-call "call_function" eaf--buffer-id "caret_clear_search"))

(defun eaf-browser-restore-buffers ()
"EAF restore all opened EAF Browser buffers in the previous Emacs session.

Expand Down Expand Up @@ -2207,6 +2269,22 @@ Make sure that your smartphone is connected to the same WiFi network as this com
| C-c C-k | eaf-edit-buffer-cancel |
| C-c C-t | eaf-edit-buffer-switch-to-org-mode |

* Browser Caret Browsing Mode
| Key | Event |
|---------+------------------------------------|
| w | eaf-caret-previous-line |
| s | eaf-caret-next-line |
| d | eaf-caret-next-character |
| a | eaf-caret-previous-character |
| W | eaf-caret-to-top |
| S | eaf-caret-to-bottom |
| A | eaf-caret-previous-word |
| D | eaf-caret-next-word |
| / | eaf-caret-search-forward |
| ? | eaf-caret-search-backward |
| C-o | eaf-caret-toggle-mark |
| C-. | eaf-caret-clear-search |

")
(dolist (var vars)
(insert (format "* %s\n" (get var 'variable-documentation)))
Expand Down
8 changes: 8 additions & 0 deletions eaf.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,10 @@ def create_buffer(self, buffer_id, url, module_path, arguments):
if getattr(app_buffer.buffer_widget, "get_focus_text", False) and getattr(app_buffer.buffer_widget.get_focus_text, "connect", False):
app_buffer.buffer_widget.get_focus_text.connect(self.edit_focus_text)

# Handle caret_browsing_status signal.
if getattr(app_buffer, "caret_browsing_status", False) and getattr(app_buffer.caret_browsing_status, "connect", False):
app_buffer.caret_browsing_status.connect(self.toggle_caret_browsing)

# Handle get_sub_node_id signal.
if getattr(app_buffer, "get_sub_node_id", False) and getattr(app_buffer.get_sub_node_id, "connect", False):
app_buffer.get_sub_node_id.connect(self.add_multiple_sub_nodes)
Expand Down Expand Up @@ -517,6 +521,10 @@ def eval_in_emacs(self, elisp_code_string):
def edit_focus_text(self, buffer_id, focus_text):
pass

@dbus.service.signal(EAF_DBUS_NAME)
def toggle_caret_browsing(self, caret_status):
pass

@dbus.service.signal(EAF_DBUS_NAME)
def export_org_json(self, org_json_content, org_file_path):
pass
Expand Down