{ config, lib, pkgs, ... }: with lib; let # Source: https://github.com/Henry/dot-emacs/blob/master/my-lisp/company-pcomplete.el company-pcomplete = pkgs.writeText "company-pcomplete.el" '' ;;; company-pcomplete.el --- company-mode pcomplete backend -*- lexical-binding: t -*- ;; Copyright (C) 2016 Free Software Foundation, Inc. ;; Author: Henry G. Weller ;; This file is part of GNU Emacs. ;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs. If not, see . ;;; Commentary: ;; ;; Based on `ac-pcomplete', see https://www.emacswiki.org/emacs/EshellCompletion ;; and `pcomplete`, see pcomplete.el. ;;; Code: (require 'company) (require 'cl-lib) (require 'pcomplete) (defgroup company-pcomplete nil "Completion backend using pcomplete." :group 'company) (defvar company-pcomplete-available 'unknown) (defun company-pcomplete--prefix () (let* ((pcomplete-stub) pcomplete-seen pcomplete-norm-func pcomplete-args pcomplete-last pcomplete-index (pcomplete-autolist pcomplete-autolist) (pcomplete-suffix-list pcomplete-suffix-list)) (pcomplete-completions) (buffer-substring (pcomplete-begin) (point)))) (defun company-pcomplete--candidates () (let* ((pcomplete-stub) (pcomplete-show-list t) pcomplete-seen pcomplete-norm-func pcomplete-args pcomplete-last pcomplete-index (pcomplete-autolist pcomplete-autolist) (pcomplete-suffix-list pcomplete-suffix-list) (candidates (pcomplete-completions)) (prefix (buffer-substring (pcomplete-begin) (point))) ;; Collect all possible completions for the current stub (cnds (all-completions pcomplete-stub candidates)) (bnds (completion-boundaries pcomplete-stub candidates nil "")) (skip (- (length pcomplete-stub) (car bnds)))) ;; Replace the stub at the beginning of each candidate by the prefix (mapcar #'(lambda (cand) (concat prefix (substring cand skip))) cnds))) (defun company-pcomplete-available () (when (eq company-pcomplete-available 'unknown) (condition-case _err (progn (company-pcomplete--candidates) (setq company-pcomplete-available t)) (error (message "Company: pcomplete not found") (setq company-pcomplete-available nil)))) company-pcomplete-available) ;;;###autoload (defun company-pcomplete (command &optional _arg &rest ignored) "`company-mode' completion backend using `pcomplete'." (interactive (list 'interactive)) (cl-case command (interactive (company-begin-backend 'company-pcomplete)) (prefix (when (company-pcomplete-available) (company-pcomplete--prefix))) (candidates (company-pcomplete--candidates)) (sorted t))) (provide 'company-pcomplete) ''; in mkIf (elem "emacs::company" config.machine.pkgs) { programs.emacs.init.usePackage = { company = { enable = true; diminish = [ "company-mode" ]; hook = [ "(after-init . global-company-mode)" ] ++ optional (elem "emacs::rust" config.machine.pkgs) ''(rust-mode . (lambda () (setq company-backends '((company-capf :with company-yasnippet)))))''; bind = { "\t" = "'company-complete-common"; }; init = ''(require 'ffap)''; config = '' ;; (setq company-tooltip-align-annotations t) (setq company-idle-delay 0.3 company-show-numbers t) ${optionalString (elem "emacs::org" config.machine.pkgs) '' (load-file "${company-pcomplete}")'' } ''; extraConfig = '' :bind (:map company-mode-map ([remap completion-at-point] . company-complete-common) ([remap complete-symbol] . company-complete-common)) ''; }; company-box = { enable = true; hook = [ "(company-mode . (lambda () (company-box-mode)))" ]; config = '' (setq company-box-icons-alist 'company-box-icons-all-the-icons) (setq company-box-icons-lsp `(( 1 . ,(all-the-icons-faicon "file-text-o" :v-adjust -0.0575)) ; Text ( 2 . ,(all-the-icons-faicon "cube" :v-adjust -0.0575)) ; Method ( 3 . ,(all-the-icons-faicon "cube" :v-adjust -0.0575)) ; Function ( 4 . ,(all-the-icons-faicon "cube" :v-adjust -0.0575)) ; Constructor ( 5 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Field ( 6 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Variable ( 7 . ,(all-the-icons-faicon "cog" :v-adjust -0.0575)) ; Class ( 8 . ,(all-the-icons-faicon "cogs" :v-adjust -0.0575)) ; Interface ( 9 . ,(all-the-icons-alltheicon "less")) ; Module (10 . ,(all-the-icons-faicon "wrench" :v-adjust -0.0575)) ; Property (11 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Unit (12 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Value (13 . ,(all-the-icons-material "content_copy" :v-adjust -0.2)) ; Enum (14 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Keyword (15 . ,(all-the-icons-material "content_paste" :v-adjust -0.2)) ; Snippet (16 . ,(all-the-icons-material "palette" :v-adjust -0.2)) ; Color (17 . ,(all-the-icons-faicon "file" :v-adjust -0.0575)) ; File (18 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Reference (19 . ,(all-the-icons-faicon "folder" :v-adjust -0.0575)) ; Folder (20 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; EnumMember (21 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Constant (22 . ,(all-the-icons-faicon "cog" :v-adjust -0.0575)) ; Struct (23 . ,(all-the-icons-faicon "bolt" :v-adjust -0.0575)) ; Event (24 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Operator (25 . ,(all-the-icons-faicon "cog" :v-adjust -0.0575)) ; TypeParameter )) ''; }; all-the-icons = { enable = true; }; company-jedi = { enable = (elem "emacs::elpy" config.machine.pkgs); }; }; fonts.fonts = pkgs.emacs-all-the-icons-fonts.all; }