diff --git a/emacs-dev-config-modern.el b/emacs-dev-config-modern.el index ef096a8..7968840 100644 --- a/emacs-dev-config-modern.el +++ b/emacs-dev-config-modern.el @@ -125,14 +125,17 @@ "Configure debugging with dap-mode." (use-package dap-mode :ensure t - :commands dap-debug + :commands (dap-debug dap-debug-edit-template) + ;; Don't auto-enable - only load when explicitly needed for debugging :config ;; Python debugging (require 'dap-python) ;; C/C++ debugging (require 'dap-gdb-lldb) - ;; Automatic configuration - (dap-auto-configure-mode 1))) + ;; Don't auto-configure globally - causes severe performance issues + ;; Enable manually when debugging: M-x dap-auto-configure-mode + ;; (dap-auto-configure-mode 1) ; Commented out for performance + )) (defun dev-mode-modern-setup-languages () "Configure language-specific settings." @@ -148,7 +151,8 @@ (use-package qml-mode :ensure t :mode "\\.qml\\'" - :hook (qml-mode . eglot-ensure))) + ;; Removed qml-mode hook - Qt5 has no language server + )) (defun dev-mode-modern-setup-editing-tools () "Setup advanced editing tools for development." diff --git a/emacs-dev-config.el b/emacs-dev-config.el index eecd05f..e154c11 100644 --- a/emacs-dev-config.el +++ b/emacs-dev-config.el @@ -46,7 +46,7 @@ "Configure LSP mode for development." (use-package lsp-mode :ensure t - :hook ((c-mode c++-mode python-mode qml-mode) . lsp-deferred) + :hook ((c-mode c++-mode python-mode) . lsp-deferred) ; Removed qml-mode - Qt5 has no LSP :commands (lsp lsp-deferred) :config (setq lsp-keymap-prefix "C-c l") @@ -420,11 +420,13 @@ "Configure debugging support." (use-package dap-mode :ensure t - :commands dap-debug + :commands (dap-debug dap-debug-edit-template) + ;; Don't auto-enable - only load when explicitly needed :config (require 'dap-python) (require 'dap-gdb-lldb) - (dap-auto-configure-mode 1) + ;; Don't auto-configure globally - causes performance issues + ;; (dap-auto-configure-mode 1) ; Commented out for performance (setq dap-auto-configure-features '(sessions locals controls tooltip)))) (defun dev-mode-custom-functions () diff --git a/init.el b/init.el index a1848bf..4f5f8fb 100644 --- a/init.el +++ b/init.el @@ -11,6 +11,10 @@ ;; EMERGENCY FIX - Load this first to ensure editing works (require 'init-emergency-fix) +(require 'init-seq-fix) ; Fix seq library issues + +;; Load performance optimizations early +(require 'init-performance) ;;; Load core modules in order (require 'init-core) ; Core settings and package management diff --git a/lisp/init-editor.el b/lisp/init-editor.el index ac23d0e..9bc3ca8 100644 --- a/lisp/init-editor.el +++ b/lisp/init-editor.el @@ -12,6 +12,18 @@ (setq shift-select-mode t) (transient-mark-mode t) +;; Standard word navigation with C-left/right +(global-set-key (kbd "C-") 'left-word) +(global-set-key (kbd "C-") 'right-word) + +;; Word selection with C-Shift-left/right +(global-set-key (kbd "C-S-") 'left-word) +(global-set-key (kbd "C-S-") 'right-word) + +;; Make sure shift-selection works with these commands +(put 'left-word 'CUA 'move) +(put 'right-word 'CUA 'move) + ;;; Text manipulation (global-set-key (kbd "C-") 'cua-set-rectangle-mark) @@ -41,6 +53,11 @@ :config (setq olivetti-body-width 100)) +;;; Rainbow delimiters - colorize matching brackets +(use-package rainbow-delimiters + :ensure t + :hook (prog-mode . rainbow-delimiters-mode)) + ;;; God-mode configuration (disabled by default) ;; Uncomment the following lines to enable god-mode ;; (let ((god-config (expand-file-name "god-mode-config.el" user-emacs-directory))) diff --git a/lisp/init-qol.el b/lisp/init-qol.el index af287f5..d712b6c 100644 --- a/lisp/init-qol.el +++ b/lisp/init-qol.el @@ -55,10 +55,11 @@ (define-key smartparens-mode-map (kbd "C-M-w") 'sp-copy-sexp) (define-key smartparens-mode-map (kbd "M-") 'sp-unwrap-sexp) (define-key smartparens-mode-map (kbd "M-") 'sp-backward-unwrap-sexp) - (define-key smartparens-mode-map (kbd "C-") 'sp-forward-slurp-sexp) - (define-key smartparens-mode-map (kbd "C-") 'sp-forward-barf-sexp) - (define-key smartparens-mode-map (kbd "C-M-") 'sp-backward-barf-sexp) - (define-key smartparens-mode-map (kbd "C-M-") 'sp-backward-slurp-sexp) + ;; Changed from C- to avoid conflict with word navigation + (define-key smartparens-mode-map (kbd "C-c ") 'sp-forward-slurp-sexp) + (define-key smartparens-mode-map (kbd "C-c ") 'sp-forward-barf-sexp) + (define-key smartparens-mode-map (kbd "C-c M-") 'sp-backward-barf-sexp) + (define-key smartparens-mode-map (kbd "C-c M-") 'sp-backward-slurp-sexp) (define-key smartparens-mode-map (kbd "M-D") 'sp-splice-sexp) (define-key smartparens-mode-map (kbd "C-]") 'sp-select-next-thing-exchange) (define-key smartparens-mode-map (kbd "C-<") 'sp-select-previous-thing) @@ -156,7 +157,8 @@ (global-set-key (kbd "C-x |") 'qol-toggle-window-split) ;;; Window movement with windmove -(windmove-default-keybindings) ; Use Shift+arrows to move between windows +;; Use Meta (Alt) + arrows instead of Shift+arrows to avoid conflicts with shift-selection +(windmove-default-keybindings 'meta) ; Use Meta+arrows to move between windows (setq windmove-wrap-around t) ;;; Better buffer names for duplicates diff --git a/lisp/init-treesitter.el b/lisp/init-treesitter.el index df8cc51..0a7c591 100644 --- a/lisp/init-treesitter.el +++ b/lisp/init-treesitter.el @@ -83,7 +83,7 @@ (add-to-list 'auto-mode-alist '("\\.go\\'" . go-ts-mode)) ;; Enhanced font-lock for tree-sitter modes - (setq treesit-font-lock-level 4) ; Maximum highlighting + (setq treesit-font-lock-level 3) ; Balanced highlighting (was 4, reduced for performance) ;; Tree-sitter debugging helpers (defun treesit-inspect-node-at-point () diff --git a/lisp/init-ui.el b/lisp/init-ui.el index 3f1f2a1..5ebc3e6 100644 --- a/lisp/init-ui.el +++ b/lisp/init-ui.el @@ -37,6 +37,18 @@ (setq window-divider-default-right-width 1) (window-divider-mode 1) +;;; X11 optimizations for no-toolkit builds +(when (and (display-graphic-p) + (eq window-system 'x) + ;; Check if using no-toolkit build (OLDXMENU present) + (string-match-p "OLDXMENU" system-configuration-features)) + ;; Disable double buffering to fix redraw issues + (add-to-list 'default-frame-alist '(inhibit-double-buffering . t)) + ;; Force synchronous X operations + (setq x-gtk-use-system-tooltips nil) + ;; More responsive display updates + (setq redisplay-dont-pause t)) + ;;; Font Settings (preserved from custom-set-faces) ;; Apply font settings to all frames (current and future) (set-face-attribute 'default nil diff --git a/qml-config.el b/qml-config.el index c09e6a9..364a7ac 100644 --- a/qml-config.el +++ b/qml-config.el @@ -1,21 +1,8 @@ ;;; -*- lexical-binding: t -*- -;; QML Language Server Configuration Helper -;; This file provides enhanced QML auto-completion setup +;; QML Mode Configuration (Qt5 - No LSP) +;; This file provides QML mode setup without LSP (Qt5 has no language server) -;; Function to find QML language server executable -(defun find-qml-language-server () - "Find the QML language server executable in common locations." - (or (executable-find "qml-lsp") - (executable-find "qmlls") - (executable-find "qml6-lsp") - ;; Try common Qt installation paths - "/usr/lib/qt6/bin/qmlls" - "/usr/lib/x86_64-linux-gnu/qt6/bin/qmlls" - "/opt/qt6/bin/qmlls" - ;; Fallback - will show an error if not found - "qmlls")) - -;; Enhanced QML mode configuration +;; Basic QML mode configuration (use-package qml-mode :ensure t :mode ("\\.qml\\'" . qml-mode) @@ -25,58 +12,20 @@ ;; Add QML-specific keywords for better syntax highlighting (font-lock-add-keywords 'qml-mode - '(("\\<\\(readonly\\|default\\|signal\\|alias\\)\\>" . font-lock-keyword-face) - ("\\<\\(Qt\\|QtQuick\\|QtQuick\\.Controls\\)\\>" . font-lock-constant-face)))) + '(("\\<\\(readonly\\|default\\|signal\\|alias\\|property\\|required\\)\\>" . font-lock-keyword-face) + ("\\<\\(Qt\\|QtQuick\\|QtQuick\\.Controls\\|QtQuick\\.Layouts\\)\\>" . font-lock-constant-face) + ("\\<\\(Item\\|Rectangle\\|Text\\|Image\\|MouseArea\\|Column\\|Row\\|Grid\\|ListView\\|GridView\\)\\>" . font-lock-type-face)))) -;; Enhanced LSP configuration for QML -(with-eval-after-load 'lsp-mode - ;; Register QML language server - (lsp-register-client - (make-lsp-client :new-connection (lsp-stdio-connection - (lambda () (list (find-qml-language-server)))) - :activation-fn (lsp-activate-on "qml") - :server-id 'qmlls)) - - ;; QML-specific LSP settings - (setq lsp-qml-server-command (find-qml-language-server)) - - ;; Enable LSP for QML files - (add-to-list 'lsp-language-id-configuration '(qml-mode . "qml"))) - -;; Enhanced company configuration for QML with error handling +;; Company backends for QML (without LSP) (with-eval-after-load 'company - ;; Check if company-qml is working properly - (defun company-qml-safe-p () - "Check if company-qml backend is available and working." - (and (featurep 'company-qml) - (condition-case nil - (progn - (company-qml 'candidates "test") - t) - (error nil)))) - - ;; QML-specific company backends with fallback (defun setup-qml-company-backends () - "Set up company backends for QML mode with error handling." - (if (company-qml-safe-p) - ;; Use company-qml if it works - (setq-local company-backends - '((company-qml - company-capf - company-files - company-yasnippet - company-dabbrev-code) - company-dabbrev)) - ;; Fallback without company-qml - (progn - (message "company-qml not available or has errors, using LSP-based completion") - (setq-local company-backends - '((company-capf ; LSP completions (primary for QML) - company-files ; File completions - company-yasnippet ; Snippet completions - company-dabbrev-code ; Code word completions - company-keywords) ; Language keywords - company-dabbrev))))) ; General word completions + "Set up company backends for QML mode without LSP." + (setq-local company-backends + '((company-dabbrev-code ; Code word completions + company-keywords ; Language keywords + company-files ; File completions + company-yasnippet) ; Snippet completions + company-dabbrev))) ; General word completions ;; Apply to QML mode (add-hook 'qml-mode-hook 'setup-qml-company-backends)) @@ -88,10 +37,35 @@ (unless (file-exists-p qml-snippets-dir) (make-directory qml-snippets-dir t)))) -;; Enhanced QML development settings +;; Prevent LSP from being registered for QML +(with-eval-after-load 'lsp-mode + ;; Remove QML from LSP language configurations + (setq lsp-language-id-configuration + (assq-delete-all 'qml-mode lsp-language-id-configuration)) + ;; Unregister any QML LSP clients + (when (boundp 'lsp-clients) + (setq lsp-clients (delq 'qmlls lsp-clients)))) + +;; Prevent Eglot from activating in QML mode +(with-eval-after-load 'eglot + ;; Remove QML from eglot server programs if present + (setq eglot-server-programs + (assq-delete-all 'qml-mode eglot-server-programs))) + +;; QML development settings (add-hook 'qml-mode-hook (lambda () - ;; Enable electric pair mode for automatic bracket/quote pairing + ;; Forcefully disable LSP for QML files (Qt5 has no language server) + (when (bound-and-true-p lsp-mode) + (lsp-disconnect) + (lsp-mode -1)) + (when (bound-and-true-p lsp-managed-mode) + (lsp-managed-mode -1)) + ;; Also disable Eglot if it tries to start + (when (bound-and-true-p eglot--managed-mode) + (eglot-shutdown) + (eglot--managed-mode -1)) + ;; Electric pair mode for automatic bracket/quote pairing (electric-pair-local-mode 1) ;; Enable automatic indentation (electric-indent-local-mode 1) @@ -101,13 +75,55 @@ (setq indent-tabs-mode nil) ;; Enable line numbers (display-line-numbers-mode 1) - ;; Enable syntax checking - (flycheck-mode 1))) + ;; Disable flycheck (no QML checker for Qt5) + (when (bound-and-true-p flycheck-mode) + (flycheck-mode -1)))) -;; Key bindings for QML development +;; Simple navigation functions for QML +(defun qml-find-definition () + "Simple definition finder using grep." + (interactive) + (let ((thing (thing-at-point 'symbol))) + (when thing + (grep (format "grep -n \"\\b%s\\b\" *.qml" thing))))) + +(defun qml-find-references () + "Simple reference finder using grep." + (interactive) + (let ((thing (thing-at-point 'symbol))) + (when thing + (grep (format "grep -n \"\\b%s\\b\" *.qml" thing))))) + +;; Key bindings for QML development (without LSP) (with-eval-after-load 'qml-mode - (define-key qml-mode-map (kbd "C-c C-r") 'lsp-rename) - (define-key qml-mode-map (kbd "C-c C-d") 'lsp-find-definition) - (define-key qml-mode-map (kbd "C-c C-f") 'lsp-find-references)) + (define-key qml-mode-map (kbd "C-c C-d") 'qml-find-definition) + (define-key qml-mode-map (kbd "C-c C-f") 'qml-find-references) + (define-key qml-mode-map (kbd "C-c C-c") 'comment-region) + (define-key qml-mode-map (kbd "C-c C-u") 'uncomment-region)) -(provide 'qml-config) +;; Helper function to insert common QML snippets +(defun qml-insert-property () + "Insert a QML property declaration." + (interactive) + (insert "property ") + (save-excursion (insert ": "))) + +(defun qml-insert-signal () + "Insert a QML signal declaration." + (interactive) + (insert "signal ") + (save-excursion (insert "()"))) + +(defun qml-insert-function () + "Insert a QML function declaration." + (interactive) + (insert "function ") + (save-excursion (insert "() {\n \n}"))) + +;; Add snippet key bindings +(with-eval-after-load 'qml-mode + (define-key qml-mode-map (kbd "C-c i p") 'qml-insert-property) + (define-key qml-mode-map (kbd "C-c i s") 'qml-insert-signal) + (define-key qml-mode-map (kbd "C-c i f") 'qml-insert-function)) + +(provide 'qml-config) \ No newline at end of file