commit
60a4393fa3
15 changed files with 15950 additions and 0 deletions
@ -0,0 +1,565 @@ |
|||||||
|
;;; cygwin-mount.el --- Teach EMACS about cygwin styles and mount points. |
||||||
|
|
||||||
|
;; Copyright (C) 1997 Michael Cook <mcook@xemacs.org>. |
||||||
|
;; 2001 Klaus Berndl <berndl@sdm.de> |
||||||
|
|
||||||
|
;; Author: Michael Cook <mcook@xemacs.org> |
||||||
|
;; Keywords: files, mount, cygwin |
||||||
|
|
||||||
|
;; This file is *NOT* (yet?) part of GNU Emacs. |
||||||
|
;; |
||||||
|
;; This program 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 2, or (at your option) |
||||||
|
;; any later version. |
||||||
|
;; |
||||||
|
;; This program 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; see the file COPYING. If not, write to the |
||||||
|
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
||||||
|
;; Boston, MA 02111-1307, USA. |
||||||
|
|
||||||
|
;; Additional info: |
||||||
|
;; $Date: 2004-01-14 07:35:04 -0800 (Wed, 14 Jan 2004) $ |
||||||
|
;; Maintenance: Eric Hanchrow <offby1@blarg.net> |
||||||
|
;; Additional code by: Stephane Rollandin <hepta@zogotounga.net> |
||||||
|
;; Michael Mauger <mmaug@yahoo.com> |
||||||
|
;; Keisuke Mori <ksk@ntts.com> |
||||||
|
;; Drew Moseley (drewmoseley@mindspring.com) |
||||||
|
;; James Ganong (jeg@bigseal.ucsc.edu) |
||||||
|
;; Jeff Juliano <juliano@cs.unc.edu> |
||||||
|
;; Klaus Berndl <berndl@sdm.de> |
||||||
|
;; Nick Sieger <nsieger@bitstream.net> |
||||||
|
;; Richard Y. Kim <ryk@dspwiz.com> |
||||||
|
;; Karel Sprenger <karel.sprenger@compaq.com> |
||||||
|
;; |
||||||
|
;; When submitting patches, please try to also submit an automated |
||||||
|
;; test that demonstrates the need for the patch -- i.e., one that |
||||||
|
;; fails with the unpatched code, but passes with the patched code. |
||||||
|
;; This will make is easier for the maintainer to decide if your patch |
||||||
|
;; duplicates functionality from other patches. Patching `tests.el' |
||||||
|
;; would be good. |
||||||
|
;;; Availabilty |
||||||
|
|
||||||
|
;; The latest version of cygwin-mount.el can always be found at |
||||||
|
;; http://www.blarg.net/~offby1/cygwin-mount/ |
||||||
|
|
||||||
|
;; ---------------------------------------------------------------------- |
||||||
|
;;; Commentary |
||||||
|
|
||||||
|
;; This package lets you use cygwin-style filenames like |
||||||
|
;; "//D/any/path/to/file" or "/cygdrive/D/any/path/to/file" in exactly |
||||||
|
;; the same manner as the normal Windows-style filenames like |
||||||
|
;; "D:\any\path\to\file" or "D:/any/path/to/file". NOTE: "/cygdrive/" |
||||||
|
;; is only an example for the cygdrive-prefix \(see |
||||||
|
;; `cygwin-mount-cygdrive-prefix--internal'). cygwin-mount can handle |
||||||
|
;; every cygdrive-prefix set by "mount --change-cygdrive-prefix" |
||||||
|
;; (e.g. "/" is also a valid cygdrive-prefix). UNC paths work |
||||||
|
;; too. Furthermore, this package lets you use all your cygwin mounts |
||||||
|
;; in file operations. For example, you can use (e.g. find-file) for |
||||||
|
;; a file named "/usr/bin/anyfile" if you have mounted the related |
||||||
|
;; Windows-path to /usr/bin. Ange-ftp also works correctly. |
||||||
|
|
||||||
|
;;; Installation: |
||||||
|
|
||||||
|
;; Put in your .emacs or site-start.el file the following lines: |
||||||
|
;; (require 'cygwin-mount) |
||||||
|
;; (cygwin-mount-activate) |
||||||
|
|
||||||
|
;;; Customization and using |
||||||
|
|
||||||
|
;; + All customization is done in the customize-group `cygwin-mount'. |
||||||
|
;; Do not set the user-options via `setq' but only via customize because |
||||||
|
;; otherwise the package will not work correct!! |
||||||
|
;; Important: Now the cygwin mountpoints are stored in the variable |
||||||
|
;; `cygwin-mount-table--internal'. This variable must not be set by the user |
||||||
|
;; but it is only set by customizing `cygwin-mount-table'! |
||||||
|
;; + Activating: cygwin-mount-activate |
||||||
|
;; + Deactivating: cygwin-mount-deactivate |
||||||
|
|
||||||
|
;;; Compatibility |
||||||
|
|
||||||
|
;; The cygwin-mount.el package is only tested with NTEmacs >= 20.6.1. |
||||||
|
;; It has also been tested with the native port of XEmacs 21.1 but not |
||||||
|
;; very intensive! The package has been tested with Cygwin 1.1.8 and |
||||||
|
;; >= 1.3.1. It reportedly also works with at least some versions of |
||||||
|
;; MinGW. |
||||||
|
|
||||||
|
;; How it works: |
||||||
|
;; basically we push some functions onto file-name-handler-alist. |
||||||
|
;; They detect filenames expressed in cygwin style, and translate |
||||||
|
;; those names into native Win32 style. |
||||||
|
|
||||||
|
;;; Code: |
||||||
|
|
||||||
|
(defconst cygwin-mount-version "1.4.8") |
||||||
|
|
||||||
|
(defgroup cygwin-mount nil |
||||||
|
"Proper handling of cygwin mounts and filenames." |
||||||
|
:prefix "cygwin-" |
||||||
|
:group 'files) |
||||||
|
|
||||||
|
;; some constants |
||||||
|
|
||||||
|
(defconst cygwin-mount-program "mount.exe") |
||||||
|
(defconst cygwin-mount-uname-program "uname.exe") |
||||||
|
(defconst cygwin-mount-buffername " *mount*") |
||||||
|
|
||||||
|
;; internal variables. These variables are only set by calling |
||||||
|
;; `cygwin-mount-activate' or by customizing `cygwin-mount-table'. |
||||||
|
|
||||||
|
(defvar cygwin-mount-table--internal nil |
||||||
|
"Do not set this variable directly but customize `cygwin-mount-table'!") |
||||||
|
|
||||||
|
(defvar cygwin-mount-cygdrive-prefix--internal "" |
||||||
|
"Prefix for the \"/cygdrive/X/\" style of cygwin. |
||||||
|
A cygwin-user can change the \"/cygdrive\" to whatever he wants to access |
||||||
|
files at MS-DOS drives. For example many people seem to like to have the |
||||||
|
drives accessible as a directory so that c: == /c, which means the |
||||||
|
cygdrive-prefix is \"/\" instead of \"/cygdrive\". This prefix must end |
||||||
|
with a '/'! Do not set this variable because the value of this variable is |
||||||
|
determined at activation-time of cygwin-mount \(see |
||||||
|
`cygwin-mount-activate')") |
||||||
|
|
||||||
|
;; user options |
||||||
|
|
||||||
|
(defcustom cygwin-mount-cygwin-bin-directory nil |
||||||
|
"*The directory where the cygwin binaries reside. |
||||||
|
If nil then the cygwin-binary-directory must be into the PATH." |
||||||
|
:group 'cygwin-mount |
||||||
|
:type '(radio (const :tag "Cygwin is into PATH" :value nil) |
||||||
|
(directory :tag "Cygwin-Binary-Dir" :value ""))) |
||||||
|
|
||||||
|
(defcustom cygwin-mount-build-mount-table-asynch nil |
||||||
|
"*When non-nil, `cygwin-mount-table' is built at load-time. |
||||||
|
If you change the value via customize you must deactivate and activate the |
||||||
|
package again to take effect." |
||||||
|
:group 'cygwin-mount |
||||||
|
:type 'boolean) |
||||||
|
|
||||||
|
(defcustom cygwin-mount-table t |
||||||
|
"*Alist of custom cygwin mount points or t. |
||||||
|
If t if all the current mount-points returned by the cygwin mount-program |
||||||
|
should be used. If set to nil then there are no mount-points. An element of |
||||||
|
the alist has the form \(<mounted windows-device> . <cygwin-directory>), |
||||||
|
e.g. \(\"D:\\\\programs\\\\cygwin\\\\bin\" . \"/usr/bin/\") or |
||||||
|
\(\"D:/programs/cygwin\" . \"/\")." |
||||||
|
:group 'cygwin-mount |
||||||
|
:set (function (lambda (symbol value) |
||||||
|
(set symbol value) |
||||||
|
(if (equal value t) |
||||||
|
(cygwin-mount-build-table-internal) |
||||||
|
(setq cygwin-mount-table--internal value)))) |
||||||
|
:initialize 'custom-initialize-default |
||||||
|
:type '(radio (const :tag "Automatic" |
||||||
|
:value t) |
||||||
|
(repeat :tag "Custom mounts" |
||||||
|
(cons (directory :tag "Mounted device") |
||||||
|
(string :tag "Cygwin directory"))))) |
||||||
|
|
||||||
|
;; copied from executable.el because this library is not included in all |
||||||
|
;; Emacsen by default. |
||||||
|
(defvar cygwin-mount-executable-binary-suffixes |
||||||
|
(if (memq system-type '(ms-dos windows-nt)) |
||||||
|
'(".exe" ".com" ".bat" ".cmd" ".btm" "") |
||||||
|
'(""))) |
||||||
|
(defun cygwin-mount-executable-find (command) |
||||||
|
"Search for COMMAND in `exec-path' and return the absolute file name. |
||||||
|
Return nil if COMMAND is not found anywhere in `exec-path'." |
||||||
|
(let ((list exec-path) |
||||||
|
file) |
||||||
|
(while list |
||||||
|
(setq list |
||||||
|
(if (and (setq file (expand-file-name command (car list))) |
||||||
|
(let ((suffixes cygwin-mount-executable-binary-suffixes) |
||||||
|
candidate) |
||||||
|
(while suffixes |
||||||
|
(setq candidate (concat file (car suffixes))) |
||||||
|
(if (and (file-executable-p candidate) |
||||||
|
(not (file-directory-p candidate))) |
||||||
|
(setq suffixes nil) |
||||||
|
(setq suffixes (cdr suffixes)) |
||||||
|
(setq candidate nil))) |
||||||
|
(setq file candidate))) |
||||||
|
nil |
||||||
|
(setq file nil) |
||||||
|
(cdr list)))) |
||||||
|
file)) |
||||||
|
|
||||||
|
;; functions |
||||||
|
|
||||||
|
(defun cygwin-mount-get-full-progname (program) |
||||||
|
"Return the full path of PROGRAM if possible or nil." |
||||||
|
(let ((fullname |
||||||
|
(if (and cygwin-mount-cygwin-bin-directory |
||||||
|
(stringp cygwin-mount-cygwin-bin-directory) |
||||||
|
(file-directory-p cygwin-mount-cygwin-bin-directory)) |
||||||
|
(concat (file-name-as-directory cygwin-mount-cygwin-bin-directory) |
||||||
|
program) |
||||||
|
(expand-file-name (or (cygwin-mount-executable-find program) |
||||||
|
program))))) |
||||||
|
(if (file-executable-p fullname) |
||||||
|
fullname |
||||||
|
nil))) |
||||||
|
|
||||||
|
(defun cygwin-mount-get-cygdrive-prefix () |
||||||
|
"Return prefix used for the \"/cygdrive/X/\" style of cygwin. |
||||||
|
This is done by calling \"mount --show-cygdrive-prefixes\". |
||||||
|
The result is either \"/\" or \"/<string>/\"." |
||||||
|
(let ((buf (get-buffer-create " *cygdrive*")) |
||||||
|
(fullname (cygwin-mount-get-full-progname cygwin-mount-program))) |
||||||
|
(if (null fullname) |
||||||
|
(error "Cannot find program '%s'. Check `cygwin-mount-cygwin-bin-directory'" |
||||||
|
cygwin-mount-program) |
||||||
|
(with-current-buffer buf |
||||||
|
(or |
||||||
|
(progn |
||||||
|
(erase-buffer) |
||||||
|
(zerop (call-process fullname nil buf nil "--show-cygdrive-prefix"))) |
||||||
|
(progn |
||||||
|
(erase-buffer) |
||||||
|
(zerop (call-process fullname nil buf nil "--show-cygdrive-prefixes"))) |
||||||
|
(error "Cannot run %s" fullname)) |
||||||
|
(goto-char (point-min)) |
||||||
|
(prog1 |
||||||
|
(let ((regexp-prefix "\\(/[^ \t]*\\)[ \t]+") |
||||||
|
cygdrive-prefix) |
||||||
|
;; we search first for the user prefix and if there isn't any we |
||||||
|
;; search for the system prefix. |
||||||
|
(if (or (search-forward-regexp (concat regexp-prefix "user") nil t) |
||||||
|
(search-forward-regexp (concat regexp-prefix "system") nil t)) |
||||||
|
(progn |
||||||
|
(setq cygdrive-prefix (match-string 1)) |
||||||
|
(if (string= cygdrive-prefix "/") |
||||||
|
cygdrive-prefix |
||||||
|
(concat cygdrive-prefix "/"))) |
||||||
|
"/cygdrive/")) |
||||||
|
(kill-buffer buf)))))) |
||||||
|
|
||||||
|
(defun trim-trailing-whitespace (str) |
||||||
|
(string-match "^\\(.*\\S-\\)\\s-*$" str ) |
||||||
|
(replace-match "\\1" nil nil str)) |
||||||
|
|
||||||
|
(defun cygwin-mount-parse-one-line (line) |
||||||
|
"Parse the output from one line of the Cygwin `mount' command; |
||||||
|
return a pair containing the windows directory and the corresponding |
||||||
|
Cygwin path." |
||||||
|
|
||||||
|
;; can't use non-greedy regular expressions because versions of |
||||||
|
;; Emacs older than 21.1 lack them. |
||||||
|
(if (or (string-match "\\(.*\\) on \\(/.*\\) type .* (.*)" line) |
||||||
|
(string-match "\\(.*\\)\\s-+\\(/.*\\)\\s-+\\(user\\|system\ |
||||||
|
\\|vfat\\)\\s-+\\(textmode\\|binmode\\)" |
||||||
|
line)) |
||||||
|
(let ((win (match-string 1 line)) |
||||||
|
(cyg (match-string 2 line))) |
||||||
|
(setq win (trim-trailing-whitespace win)) |
||||||
|
(setq cyg (trim-trailing-whitespace cyg)) |
||||||
|
(cons win cyg)) |
||||||
|
(error "Cannot parse output from `mount': %s" line))) |
||||||
|
|
||||||
|
(defun cygwin-mount-parse-mount () |
||||||
|
"Parse buffer `cygwin-mount-buffername' and return alist of |
||||||
|
mount-points, sorted with longest \"device\" names first. For the |
||||||
|
format of this alist see `cygwin-mount-table'. Precondition of this |
||||||
|
function is current buffer must be the buffer named |
||||||
|
`cygwin-mount-buffername'." |
||||||
|
(if (equal (current-buffer) (get-buffer cygwin-mount-buffername)) |
||||||
|
(let ((case-fold-search t) |
||||||
|
mounts) |
||||||
|
(goto-char (point-min)) |
||||||
|
(while (not (eobp)) |
||||||
|
(let* ((parsed (cygwin-mount-parse-one-line |
||||||
|
(buffer-substring |
||||||
|
(progn (beginning-of-line) (point)) |
||||||
|
(progn (end-of-line) (point))))) |
||||||
|
(device (car parsed)) |
||||||
|
(direct (cdr parsed))) |
||||||
|
(setq mounts (cons (cons (file-name-as-directory device) |
||||||
|
(file-name-as-directory direct)) |
||||||
|
mounts)) |
||||||
|
(forward-line 1))) |
||||||
|
|
||||||
|
;; now sort the alist so that the longest directories come first. |
||||||
|
(setq mounts (sort mounts (function (lambda (pair1 pair2) |
||||||
|
(> (length (cdr pair1)) |
||||||
|
(length (cdr pair2)))))) ) |
||||||
|
mounts))) |
||||||
|
|
||||||
|
(defun cygwin-mount-sentinel (proc msg) |
||||||
|
"Process sentinel for PROC with MSG." |
||||||
|
(if (or (eq (process-status proc) 'exit) |
||||||
|
(eq (process-status proc) 'signal)) |
||||||
|
(let ((buf (get-buffer-create cygwin-mount-buffername))) |
||||||
|
(with-current-buffer buf |
||||||
|
(setq cygwin-mount-table--internal (cygwin-mount-parse-mount))) |
||||||
|
(kill-buffer buf) |
||||||
|
(message "Build of mount table completed")))) |
||||||
|
|
||||||
|
(defun cygwin-mount-build-table-internal () |
||||||
|
"Determine cygwin mount points. |
||||||
|
This function sets `cygwin-mount-table--internal' |
||||||
|
either synchronously or asynchronously \(see |
||||||
|
`cygwin-mount-build-mount-table-asynch'). If asynchronously then the set is |
||||||
|
really done by `cygwin-mount-sentinel'." |
||||||
|
(let ((fullname (cygwin-mount-get-full-progname cygwin-mount-program))) |
||||||
|
(if (null fullname) |
||||||
|
(error "Cannot find program '%s'. Check `cygwin-mount-cygwin-bin-directory'" |
||||||
|
cygwin-mount-program) |
||||||
|
(if cygwin-mount-build-mount-table-asynch |
||||||
|
;; asynchron building |
||||||
|
(let ((proc (start-process "mount" cygwin-mount-buffername fullname))) |
||||||
|
(set-process-sentinel proc 'cygwin-mount-sentinel) |
||||||
|
;; 2013-10-21, TunaFish5 (EmacsWiki): Use `set-process-query-on-exit-flag'. |
||||||
|
;; D. Adams: Use only if defined. Keep older code for older Emacs. |
||||||
|
(if (fboundp 'set-process-query-on-exit-flag) |
||||||
|
(set-process-query-on-exit-flag proc nil) |
||||||
|
(process-kill-without-query proc))) |
||||||
|
;; synchron building |
||||||
|
(let ((buf (get-buffer-create cygwin-mount-buffername))) |
||||||
|
(with-current-buffer buf |
||||||
|
(erase-buffer) |
||||||
|
(call-process fullname nil buf) |
||||||
|
(prog1 |
||||||
|
(setq cygwin-mount-table--internal (cygwin-mount-parse-mount)) |
||||||
|
(kill-buffer buf)))))))) |
||||||
|
|
||||||
|
(defun cygwin-mount-name-hook-function (operation &rest args) |
||||||
|
"Run OPERATION with ARGS." |
||||||
|
(let ((fn (get operation 'cygwin-mount-name))) |
||||||
|
(if fn (apply fn operation args) |
||||||
|
(cygwin-mount-run-real-handler operation args)))) |
||||||
|
|
||||||
|
(defun cygwin-mount-map-drive-hook-function (operation &rest args) |
||||||
|
"Run OPERATION with ARGS." |
||||||
|
(let ((fn (get operation 'cygwin-mount-map-drive))) |
||||||
|
(if fn (apply fn operation args) |
||||||
|
(cygwin-mount-run-real-handler operation args)))) |
||||||
|
|
||||||
|
(defun cygwin-mount-run-real-handler (operation args) |
||||||
|
"Run OPERATION with ARGS." |
||||||
|
(let ((inhibit-file-name-handlers |
||||||
|
(append '(cygwin-mount-name-hook-function |
||||||
|
cygwin-mount-map-drive-hook-function) |
||||||
|
(and (eq inhibit-file-name-operation operation) |
||||||
|
inhibit-file-name-handlers))) |
||||||
|
(inhibit-file-name-operation operation)) |
||||||
|
(apply operation args))) |
||||||
|
|
||||||
|
|
||||||
|
(defun cygwin-mount-name-expand (operation name &rest args) |
||||||
|
"Run OPERATION NAME with ARGS. |
||||||
|
first ARG is either nil or a file name" |
||||||
|
(when (and args (car args)) |
||||||
|
(setq args (copy-sequence args)) ; TODO: determine if this call is necessary |
||||||
|
(setcar args (cygwin-mount-substitute-longest-mount-name (car args)))) |
||||||
|
(cygwin-mount-run-real-handler |
||||||
|
operation |
||||||
|
(cons (cygwin-mount-substitute-longest-mount-name name) args))) |
||||||
|
|
||||||
|
(defun cygwin-mount-substitute-longest-mount-name (name) |
||||||
|
"Substitute NAME with mount device or return NAME." |
||||||
|
(and name |
||||||
|
(save-match-data |
||||||
|
(if (or (string-match "^//.+" name) (string-match "/\\[.+\\]" name)) |
||||||
|
;; Added by Klaus: if name beginns with "//" then it can never contain |
||||||
|
;; a cygwin mount point! Therefore we must not check for contained |
||||||
|
;; mount points because if / is mounted then this will always match |
||||||
|
;; and we get an incorrect substitution for network devices like |
||||||
|
;; //Host/path |
||||||
|
name |
||||||
|
(let ((mounts cygwin-mount-table--internal) |
||||||
|
(len (length (file-name-as-directory name))) |
||||||
|
match) |
||||||
|
(while mounts |
||||||
|
(let ((mount (file-name-as-directory (cdar mounts)))) |
||||||
|
(and (>= len (length mount)) |
||||||
|
(string= mount |
||||||
|
(file-name-as-directory |
||||||
|
(substring (file-name-as-directory name) |
||||||
|
0 (length mount)))) |
||||||
|
(or (null match) |
||||||
|
(> (length (cdar mounts)) (length (cdr match)))) |
||||||
|
(setq match (car mounts)))) |
||||||
|
(setq mounts (cdr mounts))) |
||||||
|
(if match |
||||||
|
(concat (file-name-as-directory (car match)) |
||||||
|
(if (>= (length (file-name-as-directory (cdr match))) len) |
||||||
|
"" |
||||||
|
(substring name (length (file-name-as-directory (cdr match)))))) |
||||||
|
name)))))) |
||||||
|
|
||||||
|
;; Added by Klaus |
||||||
|
(defconst cygwin-mount-cygwin-style1-regexp "^/[^:@]*$\\|^/|/[^/:]+\\(\\'\\|/\\)") |
||||||
|
|
||||||
|
;; This appears to work with ancient versions of cygwin, on which the |
||||||
|
;; cygwin path `//x' was shorthand for the Win32 path `x:'. |
||||||
|
(defconst cygwin-mount-cygwin-style2-regexp "^//[A-Za-z]/") |
||||||
|
|
||||||
|
;; will be set by `cygwin-mount-activate'. |
||||||
|
(defvar cygwin-mount-cygwin-style3-regexp nil) |
||||||
|
|
||||||
|
;; We cannot assume that NAME matched cygwin-mount-cygwin-style1-regexp, |
||||||
|
;; cygwin-mount-cygwin-style2-regexp nor cygwin-mount-cygwin-style3-regexp, |
||||||
|
;; because this function could be called with either argument to |
||||||
|
;; `expand-file-name', but only one argument to `expand-file-name' may |
||||||
|
;; have matched a regexp. |
||||||
|
;; For example, `(expand-file-name ".." "/cygdrive/c/")' will trigger |
||||||
|
;; `(cygwin-mount-convert-file-name "..")' and |
||||||
|
;; `(cygwin-mount-convert-file-name "/cygdrive/c/")' to be called. |
||||||
|
(defun cygwin-mount-convert-file-name ( name ) |
||||||
|
"Convert file NAME, to cygwin format. |
||||||
|
`//x/' to `x:/' and `/cygdrive/x/' to `x:/'. |
||||||
|
NOTE: \"/cygdrive/\" is only an example for the cygdrive-prefix \(see |
||||||
|
`cygwin-mount-cygdrive-prefix--internal')." |
||||||
|
(let ((cygdrive-prefix-len (length cygwin-mount-cygdrive-prefix--internal))) |
||||||
|
(save-match-data |
||||||
|
(cond ((string-match cygwin-mount-cygwin-style2-regexp name) |
||||||
|
(concat (substring name 2 3) ":" (substring name 3))) |
||||||
|
((string-match cygwin-mount-cygwin-style3-regexp name) |
||||||
|
(concat (substring name cygdrive-prefix-len |
||||||
|
(1+ cygdrive-prefix-len)) |
||||||
|
":" (substring name (1+ cygdrive-prefix-len) nil))) |
||||||
|
(t name))))) |
||||||
|
|
||||||
|
(defun cygwin-mount-map-drive (operation name &rest args) |
||||||
|
"Run OPERATION on cygwin NAME with ARGS. |
||||||
|
Map cygwin name to the dos-style \"[A-Za-z]:/\" and call |
||||||
|
OPERATION with the mapped filename\(s). NAME must have the format looks like |
||||||
|
\"^//[A-Za-z]/\" or \"/cygdrive/[A-Za-z]/\" here. Note that at least the first |
||||||
|
element of ARGS could be a filename too \(then it must have the same syntax |
||||||
|
like NAME!) which must be converted \(e.g. `expand-file-name' can be called |
||||||
|
with two filenames). |
||||||
|
NOTE: \"/cygdrive/\" is only an example for the cygdrive-prefix \(see |
||||||
|
`cygwin-mount-cygdrive-prefix--internal')." |
||||||
|
(cygwin-mount-run-real-handler |
||||||
|
operation |
||||||
|
(cons (cygwin-mount-convert-file-name name) |
||||||
|
(if (stringp (car args)) |
||||||
|
(cons (cygwin-mount-convert-file-name (car args)) |
||||||
|
(cdr args)) |
||||||
|
args)))) |
||||||
|
|
||||||
|
;;; TODO -- see if we need to do stuff for Tramp that is similar to |
||||||
|
;;; what we're about to do for ange-ftp. If so, perhaps we can use |
||||||
|
;;; `advice' to clean up those forms below whose comments describe |
||||||
|
;;; them as "real hacks". |
||||||
|
|
||||||
|
;;; ange-ftp |
||||||
|
(if (locate-library "ange-ftp") |
||||||
|
(require 'ange-ftp)) |
||||||
|
|
||||||
|
;;; save the original function definition of ange-ftp-run-real-handler |
||||||
|
(defconst cygwin-mount-original-ange-ftp-handler |
||||||
|
(if (featurep 'ange-ftp) |
||||||
|
(symbol-function 'ange-ftp-run-real-handler) |
||||||
|
nil)) |
||||||
|
|
||||||
|
;;; This version of ange-ftp-run-real-handler also inhibits the |
||||||
|
;;; cygwin file name expansion when we are doing ange-ftp expansion. |
||||||
|
;;; |
||||||
|
;;; This is a real hack. If the real definition of this function |
||||||
|
;;; changes, we have to modify this function |
||||||
|
(defun cygwin-mount-ange-ftp-run-real-handler (operation args) |
||||||
|
"Run OPERATION with ARGS." |
||||||
|
(let ((inhibit-file-name-handlers |
||||||
|
(append '(ange-ftp-hook-function |
||||||
|
ange-ftp-completion-hook-function |
||||||
|
cygwin-mount-name-hook-function |
||||||
|
cygwin-mount-map-drive-hook-function) |
||||||
|
(and (eq inhibit-file-name-operation |
||||||
|
operation) |
||||||
|
inhibit-file-name-handlers))) |
||||||
|
(inhibit-file-name-operation operation)) |
||||||
|
(apply operation args))) |
||||||
|
|
||||||
|
;; Added by Klaus |
||||||
|
(defvar cygwin-mount-activated nil) |
||||||
|
(defun cygwin-mount-activate () |
||||||
|
"Activate cygwin-mount- and cygwin-style-handling." |
||||||
|
(interactive) |
||||||
|
(if (not (eq system-type 'windows-nt)) |
||||||
|
(message "cygwin-mount is only available for Emacs for NT!") |
||||||
|
|
||||||
|
(unless cygwin-mount-activated |
||||||
|
;; initialize the internal variables |
||||||
|
|
||||||
|
(if (equal cygwin-mount-table t) |
||||||
|
(cygwin-mount-build-table-internal) |
||||||
|
(setq cygwin-mount-table--internal cygwin-mount-table)) |
||||||
|
(setq cygwin-mount-cygdrive-prefix--internal |
||||||
|
(cygwin-mount-get-cygdrive-prefix)) |
||||||
|
(setq cygwin-mount-cygwin-style3-regexp |
||||||
|
(concat "^" cygwin-mount-cygdrive-prefix--internal "[A-Za-z]/")) |
||||||
|
|
||||||
|
;; add the cygwin-filehandlers |
||||||
|
(or (assoc cygwin-mount-cygwin-style1-regexp file-name-handler-alist) |
||||||
|
(setq file-name-handler-alist |
||||||
|
(cons `(,cygwin-mount-cygwin-style1-regexp |
||||||
|
. cygwin-mount-name-hook-function) |
||||||
|
file-name-handler-alist))) |
||||||
|
|
||||||
|
(or (assoc cygwin-mount-cygwin-style2-regexp file-name-handler-alist) |
||||||
|
(setq file-name-handler-alist |
||||||
|
(cons `(,cygwin-mount-cygwin-style2-regexp |
||||||
|
. cygwin-mount-map-drive-hook-function) |
||||||
|
file-name-handler-alist))) |
||||||
|
(or (assoc cygwin-mount-cygwin-style3-regexp file-name-handler-alist) |
||||||
|
(setq file-name-handler-alist |
||||||
|
(cons `(,cygwin-mount-cygwin-style3-regexp |
||||||
|
. cygwin-mount-map-drive-hook-function) |
||||||
|
file-name-handler-alist))) |
||||||
|
|
||||||
|
;; add cygwin-properties |
||||||
|
(put 'substitute-in-file-name 'cygwin-mount-name |
||||||
|
'cygwin-mount-name-expand) |
||||||
|
(put 'expand-file-name 'cygwin-mount-name 'cygwin-mount-name-expand) |
||||||
|
(put 'substitute-in-file-name |
||||||
|
'cygwin-mount-map-drive 'cygwin-mount-map-drive) |
||||||
|
(put 'expand-file-name 'cygwin-mount-map-drive |
||||||
|
'cygwin-mount-map-drive) |
||||||
|
;; rebind ange-ftp-run-real-handler to our version |
||||||
|
(if (featurep 'ange-ftp) |
||||||
|
(fset 'ange-ftp-run-real-handler 'cygwin-mount-ange-ftp-run-real-handler)) |
||||||
|
|
||||||
|
(setq cygwin-mount-activated t)))) |
||||||
|
|
||||||
|
;; Added by Klaus |
||||||
|
(defun cygwin-mount-deactivate () |
||||||
|
"Deactivate cygwin-mount- and cygwin-style-handling." |
||||||
|
(interactive) |
||||||
|
(if (not (eq system-type 'windows-nt)) |
||||||
|
(message "cygwin-mount is only available for (X)Emacs for NT!") |
||||||
|
(unless (not cygwin-mount-activated) |
||||||
|
;; reset the internal variables |
||||||
|
(setq cygwin-mount-table--internal nil) |
||||||
|
|
||||||
|
(setq cygwin-mount-cygdrive-prefix--internal "") |
||||||
|
|
||||||
|
;; remove the cygwin-filehandlers |
||||||
|
(setq file-name-handler-alist |
||||||
|
(delete (assoc cygwin-mount-cygwin-style1-regexp file-name-handler-alist) |
||||||
|
file-name-handler-alist)) |
||||||
|
(setq file-name-handler-alist |
||||||
|
(delete (assoc cygwin-mount-cygwin-style2-regexp file-name-handler-alist) |
||||||
|
file-name-handler-alist)) |
||||||
|
(setq file-name-handler-alist |
||||||
|
(delete (assoc cygwin-mount-cygwin-style3-regexp file-name-handler-alist) |
||||||
|
file-name-handler-alist)) |
||||||
|
;; remove the cygwin properties |
||||||
|
(put 'substitute-in-file-name 'cygwin-mount-name nil) |
||||||
|
(put 'expand-file-name 'cygwin-mount-name nil) |
||||||
|
(put 'substitute-in-file-name 'cygwin-mount-map-drive nil) |
||||||
|
(put 'expand-file-name 'cygwin-mount-map-drive nil) |
||||||
|
;; rebind ange-ftp-run-real-handler to its original definition. |
||||||
|
(if (featurep 'ange-ftp) |
||||||
|
(fset 'ange-ftp-run-real-handler cygwin-mount-original-ange-ftp-handler)) |
||||||
|
(setq cygwin-mount-activated nil)))) |
||||||
|
|
||||||
|
(provide 'cygwin-mount) |
||||||
|
|
||||||
|
;;; cygwin-mount.el ends here |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,40 @@ |
|||||||
|
/* XPM */ |
||||||
|
static char * close_xpm[] = { |
||||||
|
"16 22 15 1", |
||||||
|
" c None", |
||||||
|
". c #848400", |
||||||
|
"+ c #E7E79C", |
||||||
|
"@ c #E7E794", |
||||||
|
"# c #DEDE8C", |
||||||
|
"$ c #ADAD39", |
||||||
|
"% c #ADAD42", |
||||||
|
"& c #B5B54A", |
||||||
|
"* c #B5B552", |
||||||
|
"= c #BDBD5A", |
||||||
|
"- c #9C9C29", |
||||||
|
"; c #A5A531", |
||||||
|
"> c #C6C663", |
||||||
|
", c #C6C66B", |
||||||
|
"' c #CECE73", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" .... ", |
||||||
|
".+@@#....... ", |
||||||
|
".....$%%&&*=. ", |
||||||
|
".-;;$%%&&*==. ", |
||||||
|
".;;$%%&&*===. ", |
||||||
|
".;$%%&&*===>. ", |
||||||
|
".$%%&&*===>,. ", |
||||||
|
".%%&&*===>,,. ", |
||||||
|
".%&&*===>,,'. ", |
||||||
|
"............. ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" "}; |
@ -0,0 +1,34 @@ |
|||||||
|
/* XPM */ |
||||||
|
static char * leaf_xpm[] = { |
||||||
|
"16 22 9 1", |
||||||
|
" c None", |
||||||
|
". c #424242", |
||||||
|
"+ c #949494", |
||||||
|
"@ c #9C9C9C", |
||||||
|
"# c #A5A5A5", |
||||||
|
"$ c #ADADAD", |
||||||
|
"% c #848484", |
||||||
|
"& c #B5B5B5", |
||||||
|
"* c #BDBDBD", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
"....... ", |
||||||
|
".++@@#.. ", |
||||||
|
".+@@##.$. ", |
||||||
|
".@@###.... ", |
||||||
|
".@%%%+%$&. ", |
||||||
|
".###$$$&&. ", |
||||||
|
".#%+%%%&*. ", |
||||||
|
".#$$$&&**. ", |
||||||
|
".$%%+%%**. ", |
||||||
|
".$$&&****. ", |
||||||
|
".$&&*****. ", |
||||||
|
".......... ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" "}; |
@ -0,0 +1,39 @@ |
|||||||
|
/* XPM */ |
||||||
|
static char * open_xpm[] = { |
||||||
|
"16 22 14 1", |
||||||
|
" c None", |
||||||
|
". c #848400", |
||||||
|
"+ c #D6D67B", |
||||||
|
"@ c #CECE7B", |
||||||
|
"# c #CECE73", |
||||||
|
"$ c #C6C66B", |
||||||
|
"% c #BDBD5A", |
||||||
|
"& c #BDBD52", |
||||||
|
"* c #ADAD39", |
||||||
|
"= c #ADAD42", |
||||||
|
"- c #B5B54A", |
||||||
|
"; c #C6C663", |
||||||
|
"> c #CECE6B", |
||||||
|
", c #A5A5C6", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" .... ", |
||||||
|
".+@@#..... ", |
||||||
|
".@@##$$%%&. ", |
||||||
|
".@#.......... ", |
||||||
|
".#.*==--&%%;;. ", |
||||||
|
".#.==--&%%;;. ", |
||||||
|
"..==--&%%;;$. ", |
||||||
|
"..=--&%%;;$. ", |
||||||
|
".=--&%%;;$>. ", |
||||||
|
"........... ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" ", |
||||||
|
" "}; |
@ -0,0 +1,89 @@ |
|||||||
|
;;; inheritenv.el --- Make temp buffers inherit buffer-local environment variables -*- lexical-binding: t; -*- |
||||||
|
|
||||||
|
;; Copyright (C) 2021 Steve Purcell |
||||||
|
|
||||||
|
;; Author: Steve Purcell <steve@sanityinc.com> |
||||||
|
;; URL: https://github.com/purcell/inheritenv |
||||||
|
;; Package-Version: 20210204.354 |
||||||
|
;; Package-Commit: c2c879acf89682559b157fb069e1da008f4912ea |
||||||
|
;; Package-Requires: ((emacs "24.4")) |
||||||
|
;; Version: 0.1-pre |
||||||
|
;; Keywords: unix |
||||||
|
|
||||||
|
;; This program 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. |
||||||
|
|
||||||
|
;; This program 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 this program. If not, see <https://www.gnu.org/licenses/>. |
||||||
|
|
||||||
|
;;; Commentary: |
||||||
|
|
||||||
|
;; Environment variables in Emacs can be set buffer-locally, like many |
||||||
|
;; Emacs preferences, which allows users to have different buffer-local |
||||||
|
;; paths for executables in different projects, specified by a |
||||||
|
;; ".dir-locals.el" file or via a "direnv" integration like |
||||||
|
;; envrc (see https://github.com/purcell/envrc). |
||||||
|
|
||||||
|
;; However, there's a fairly common pitfall when Emacs libraries run |
||||||
|
;; background processes on behalf of a user: many such libraries run |
||||||
|
;; processes in temporary buffers that do not inherit the calling |
||||||
|
;; buffer's environment. This can result in executables not being found, |
||||||
|
;; or the wrong versions of executables being picked up. |
||||||
|
|
||||||
|
;; An example is the Emacs built-in command |
||||||
|
;; `shell-command-to-string'. Whatever buffer-local `process-environment' |
||||||
|
;; (or `exec-path') the user has set, that command will always use the |
||||||
|
;; Emacs-wide default. This is *specified* behaviour, but not *expected* |
||||||
|
;; or *helpful*. |
||||||
|
|
||||||
|
;; `inheritenv' provides a couple of tools for dealing with this |
||||||
|
;; issue: |
||||||
|
|
||||||
|
;; 1. Library authors can wrap code that plans to execute processes in |
||||||
|
;; temporary buffers with the `inheritenv' macro. |
||||||
|
;; 2. End users can modify commands like `shell-command-to-string' using |
||||||
|
;; the `inheritenv-add-advice' macro. |
||||||
|
|
||||||
|
;;; Code: |
||||||
|
|
||||||
|
(require 'cl-lib) |
||||||
|
|
||||||
|
;;;###autoload |
||||||
|
(defun inheritenv-apply (func &rest args) |
||||||
|
"Apply FUNC such that the environment it sees will match the current value. |
||||||
|
This is useful if FUNC creates a temp buffer, because that will |
||||||
|
not inherit any buffer-local values of variables `exec-path' and |
||||||
|
`process-environment'. |
||||||
|
|
||||||
|
This function is designed for convenient use as an \"around\" advice. |
||||||
|
|
||||||
|
ARGS is as for ORIG." |
||||||
|
(cl-letf* (((default-value 'process-environment) process-environment) |
||||||
|
((default-value 'exec-path) exec-path)) |
||||||
|
(apply func args))) |
||||||
|
|
||||||
|
|
||||||
|
(defmacro inheritenv (&rest body) |
||||||
|
"Wrap BODY so that the environment it sees will match the current value. |
||||||
|
This is useful if BODY creates a temp buffer, because that will |
||||||
|
not inherit any buffer-local values of variables `exec-path' and |
||||||
|
`process-environment'." |
||||||
|
`(inheritenv-apply (lambda () ,@body))) |
||||||
|
|
||||||
|
|
||||||
|
(defmacro inheritenv-add-advice (func) |
||||||
|
"Advise function FUNC with `inheritenv-apply'. |
||||||
|
This will ensure that any buffers (including temporary buffers) |
||||||
|
created by FUNC will inherit the caller's environment." |
||||||
|
`(advice-add ,func :around 'inheritenv-apply)) |
||||||
|
|
||||||
|
|
||||||
|
(provide 'inheritenv) |
||||||
|
;;; inheritenv.el ends here |
@ -0,0 +1,276 @@ |
|||||||
|
;;; language-id.el --- Library to work with programming language identifiers -*- lexical-binding: t -*- |
||||||
|
|
||||||
|
;; Author: Lassi Kortela <lassi@lassi.io> |
||||||
|
;; URL: https://github.com/lassik/emacs-language-id |
||||||
|
;; Package-Version: 20220613.1156 |
||||||
|
;; Package-Commit: cbd5b8fffa8c09f86d8b77f8d3f5e6f4ccd82bc4 |
||||||
|
;; Version: 0.19 |
||||||
|
;; Package-Requires: ((emacs "24.3")) |
||||||
|
;; Keywords: languages util |
||||||
|
;; SPDX-License-Identifier: ISC |
||||||
|
|
||||||
|
;; This file is not part of GNU Emacs. |
||||||
|
|
||||||
|
;;; Commentary: |
||||||
|
|
||||||
|
;; language-id is a small, focused library that helps other Emacs |
||||||
|
;; packages identify the programming languages and markup languages |
||||||
|
;; used in Emacs buffers. The main point is that it contains an |
||||||
|
;; evolving table of language definitions that doesn't need to be |
||||||
|
;; replicated in other packages. |
||||||
|
|
||||||
|
;; Right now there is only one public function, `language-id-buffer'. |
||||||
|
;; It looks at the major mode and other variables and returns the |
||||||
|
;; language's GitHub Linguist identifier. We can add support for |
||||||
|
;; other kinds of identifiers if there is demand. |
||||||
|
|
||||||
|
;; This library does not do any statistical text matching to guess the |
||||||
|
;; language. |
||||||
|
|
||||||
|
;;; Code: |
||||||
|
|
||||||
|
(require 'cl-lib) |
||||||
|
|
||||||
|
(defvar language-id--file-name-extension nil |
||||||
|
"Internal variable for file name extension during lookup.") |
||||||
|
|
||||||
|
;; <https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml> |
||||||
|
(defconst language-id--definitions |
||||||
|
'( |
||||||
|
|
||||||
|
;;; Definitions that need special attention to precedence order. |
||||||
|
|
||||||
|
;; It is not uncommon for C++ mode to be used when writing Cuda. |
||||||
|
;; In this case, the only way to correctly identify Cuda is by |
||||||
|
;; looking at the extension. |
||||||
|
("Cuda" |
||||||
|
(c++-mode |
||||||
|
(language-id--file-name-extension ".cu")) |
||||||
|
(c++-mode |
||||||
|
(language-id--file-name-extension ".cuh"))) |
||||||
|
|
||||||
|
;; json-mode is derived from javascript-mode. |
||||||
|
("JSON5" |
||||||
|
(json-mode |
||||||
|
(language-id--file-name-extension ".json5")) |
||||||
|
(web-mode |
||||||
|
(web-mode-content-type "json") |
||||||
|
(web-mode-engine "none") |
||||||
|
(language-id--file-name-extension ".json5"))) |
||||||
|
("JSON" |
||||||
|
json-mode |
||||||
|
jsonian-mode |
||||||
|
(web-mode |
||||||
|
(web-mode-content-type "json") |
||||||
|
(web-mode-engine "none"))) |
||||||
|
|
||||||
|
;; php-mode is derived from c-mode. |
||||||
|
("PHP" php-mode) |
||||||
|
|
||||||
|
;; scss-mode is derived from css-mode. |
||||||
|
("SCSS" scss-mode) |
||||||
|
|
||||||
|
;; solidity-mode is derived from c-mode. |
||||||
|
("Solidity" solidity-mode) |
||||||
|
|
||||||
|
;; svelte-mode is derived from html-mode. |
||||||
|
("Svelte" |
||||||
|
svelte-mode |
||||||
|
(web-mode |
||||||
|
(web-mode-content-type "html") |
||||||
|
(web-mode-engine "svelte"))) |
||||||
|
|
||||||
|
;; terraform-mode is derived from hcl-mode. |
||||||
|
("Terraform" terraform-mode) |
||||||
|
|
||||||
|
;; TypeScript/TSX need to come before JavaScript/JSX because in |
||||||
|
;; web-mode we can tell them apart by file name extension only. |
||||||
|
;; |
||||||
|
;; This implies that we inconsistently classify unsaved temp |
||||||
|
;; buffers using TypeScript/TSX as JavaScript/JSX. |
||||||
|
("TSX" |
||||||
|
typescript-tsx-mode |
||||||
|
(web-mode |
||||||
|
(web-mode-content-type "jsx") |
||||||
|
(web-mode-engine "none") |
||||||
|
(language-id--file-name-extension ".tsx"))) |
||||||
|
("TypeScript" |
||||||
|
typescript-mode |
||||||
|
(web-mode |
||||||
|
(web-mode-content-type "javascript") |
||||||
|
(web-mode-engine "none") |
||||||
|
(language-id--file-name-extension ".ts"))) |
||||||
|
|
||||||
|
;; ReScript needs to come before Reason because in reason-mode |
||||||
|
;; we can tell them apart by file name extension only. |
||||||
|
("ReScript" |
||||||
|
(reason-mode |
||||||
|
(language-id--file-name-extension ".res"))) |
||||||
|
("ReScript" |
||||||
|
(reason-mode |
||||||
|
(language-id--file-name-extension ".resi"))) |
||||||
|
("Reason" reason-mode) |
||||||
|
|
||||||
|
;; vue-html-mode is derived from html-mode. |
||||||
|
("Vue" |
||||||
|
vue-mode |
||||||
|
vue-html-mode |
||||||
|
(web-mode |
||||||
|
(web-mode-content-type "html") |
||||||
|
(web-mode-engine "vue"))) |
||||||
|
|
||||||
|
;;; The rest of the definitions are in alphabetical order. |
||||||
|
|
||||||
|
("Assembly" asm-mode nasm-mode) |
||||||
|
("ATS" ats-mode) |
||||||
|
("Awk" awk-mode) |
||||||
|
("Bazel" bazel-mode) |
||||||
|
("BibTeX" bibtex-mode) |
||||||
|
("C" c-mode) |
||||||
|
("C#" csharp-mode) |
||||||
|
("C++" c++-mode) |
||||||
|
("Cabal Config" haskell-cabal-mode) |
||||||
|
("Clojure" clojurescript-mode clojurec-mode clojure-mode) |
||||||
|
("CMake" cmake-mode) |
||||||
|
("Common Lisp" lisp-mode) |
||||||
|
("Crystal" crystal-mode) |
||||||
|
("CSS" |
||||||
|
css-mode |
||||||
|
(web-mode |
||||||
|
(web-mode-content-type "css") |
||||||
|
(web-mode-engine "none"))) |
||||||
|
("Cuda" cuda-mode) |
||||||
|
("D" d-mode) |
||||||
|
("Dart" dart-mode) |
||||||
|
("Dhall" dhall-mode) |
||||||
|
("Dockerfile" dockerfile-mode) |
||||||
|
("EJS" |
||||||
|
(web-mode |
||||||
|
(web-mode-content-type "html") |
||||||
|
(web-mode-engine "ejs"))) |
||||||
|
("Elixir" elixir-mode) |
||||||
|
("Elm" elm-mode) |
||||||
|
("Emacs Lisp" emacs-lisp-mode) |
||||||
|
("Erlang" erlang-mode) |
||||||
|
("F#" fsharp-mode) |
||||||
|
("Fish" fish-mode) |
||||||
|
("Fortran" fortran-mode) |
||||||
|
("Fortran Free Form" f90-mode) |
||||||
|
("GLSL" glsl-mode) |
||||||
|
("Go" go-mode) |
||||||
|
("GraphQL" graphql-mode) |
||||||
|
("Haskell" haskell-mode) |
||||||
|
("HCL" hcl-mode) |
||||||
|
("HTML" |
||||||
|
html-helper-mode |
||||||
|
mhtml-mode |
||||||
|
html-mode |
||||||
|
nxhtml-mode |
||||||
|
(web-mode |
||||||
|
(web-mode-content-type "html") |
||||||
|
(web-mode-engine "none"))) |
||||||
|
("Java" java-mode) |
||||||
|
("JavaScript" |
||||||
|
(js-mode |
||||||
|
(flow-minor-mode nil)) |
||||||
|
(js2-mode |
||||||
|
(flow-minor-mode nil)) |
||||||
|
(js3-mode |
||||||
|
(flow-minor-mode nil)) |
||||||
|
(web-mode |
||||||
|
(web-mode-content-type "javascript") |
||||||
|
(web-mode-engine "none"))) |
||||||
|
("JSON" |
||||||
|
json-mode |
||||||
|
(web-mode |
||||||
|
(web-mode-content-type "json") |
||||||
|
(web-mode-engine "none"))) |
||||||
|
("Jsonnet" jsonnet-mode) |
||||||
|
("JSX" |
||||||
|
js2-jsx-mode |
||||||
|
jsx-mode |
||||||
|
rjsx-mode |
||||||
|
react-mode |
||||||
|
(web-mode |
||||||
|
(web-mode-content-type "jsx") |
||||||
|
(web-mode-engine "none"))) |
||||||
|
("Kotlin" kotlin-mode) |
||||||
|
("LaTeX" latex-mode) |
||||||
|
("Less" less-css-mode) |
||||||
|
("Literate Haskell" literate-haskell-mode) |
||||||
|
("Lua" lua-mode) |
||||||
|
("Markdown" gfm-mode markdown-mode) |
||||||
|
("Nix" nix-mode) |
||||||
|
("Objective-C" objc-mode) |
||||||
|
("OCaml" caml-mode tuareg-mode) |
||||||
|
("Perl" cperl-mode perl-mode) |
||||||
|
("Protocol Buffer" protobuf-mode) |
||||||
|
("PureScript" purescript-mode) |
||||||
|
("Python" python-mode) |
||||||
|
("R" |
||||||
|
ess-r-mode |
||||||
|
(ess-mode |
||||||
|
(ess-dialect "R"))) |
||||||
|
("Racket" racket-mode) |
||||||
|
("Ruby" enh-ruby-mode ruby-mode) |
||||||
|
("Rust" rust-mode rustic-mode) |
||||||
|
("Scala" scala-mode) |
||||||
|
("Scheme" scheme-mode) |
||||||
|
("Shell" sh-mode) |
||||||
|
("SQL" sql-mode) |
||||||
|
("Swift" swift-mode swift3-mode) |
||||||
|
("TOML" toml-mode conf-toml-mode) |
||||||
|
("V" v-mode) |
||||||
|
("Verilog" verilog-mode) |
||||||
|
("XML" |
||||||
|
nxml-mode |
||||||
|
xml-mode |
||||||
|
(web-mode |
||||||
|
(web-mode-content-type "xml") |
||||||
|
(web-mode-engine "none"))) |
||||||
|
("YAML" yaml-mode) |
||||||
|
("Zig" zig-mode)) |
||||||
|
"Internal table of programming language definitions.") |
||||||
|
|
||||||
|
(defun language-id--mode-match-p (mode) |
||||||
|
"Interal helper to match current buffer against MODE." |
||||||
|
(let ((mode (if (listp mode) mode (list mode)))) |
||||||
|
(cl-destructuring-bind (wanted-major-mode &rest variables) mode |
||||||
|
(and (derived-mode-p wanted-major-mode) |
||||||
|
(cl-every |
||||||
|
(lambda (variable) |
||||||
|
(cl-destructuring-bind (symbol wanted-value) variable |
||||||
|
(equal wanted-value |
||||||
|
(if (boundp symbol) (symbol-value symbol) nil)))) |
||||||
|
variables))))) |
||||||
|
|
||||||
|
(defun language-id-buffer () |
||||||
|
"Get GitHub Linguist language name for current buffer. |
||||||
|
|
||||||
|
Return the name of the programming language or markup language |
||||||
|
used in the current buffer. The name is a string from the GitHub |
||||||
|
Linguist language list. The language is determined by looking at |
||||||
|
the active `major-mode'. Some major modes support more than one |
||||||
|
language. In that case minor modes and possibly other variables |
||||||
|
are consulted to disambiguate the language. |
||||||
|
|
||||||
|
In addition to the modes bundled with GNU Emacs, many third-party |
||||||
|
modes are recognized. No statistical text matching or other |
||||||
|
heuristics are used in detecting the language. |
||||||
|
|
||||||
|
The language definitions live inside the language-id library and |
||||||
|
are updated in new releases of the library. |
||||||
|
|
||||||
|
If the language is not unambiguously recognized, the function |
||||||
|
returns nil." |
||||||
|
(let ((language-id--file-name-extension |
||||||
|
(downcase (file-name-extension (or (buffer-file-name) "") t)))) |
||||||
|
(cl-some (lambda (definition) |
||||||
|
(cl-destructuring-bind (language-id &rest modes) definition |
||||||
|
(when (cl-some #'language-id--mode-match-p modes) |
||||||
|
language-id))) |
||||||
|
language-id--definitions))) |
||||||
|
|
||||||
|
(provide 'language-id) |
||||||
|
|
||||||
|
;;; language-id.el ends here |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,25 @@ |
|||||||
|
;;; Custom keybindings made in minor mode so they won't be override by major modes. |
||||||
|
|
||||||
|
;;;###autoload |
||||||
|
(define-minor-mode my-keys-mode |
||||||
|
"Custom minor mode mainly to make keybindings." |
||||||
|
:lighter " MK" ; show chars on modeline. |
||||||
|
:init-value t ; set init-value to `t' to make it enabled in Fundamental mode. |
||||||
|
:keymap (let ((map (make-sparse-keymap))) |
||||||
|
(define-key map (kbd "M-h") 'windmove-left) |
||||||
|
(define-key map (kbd "M-l") 'windmove-right) |
||||||
|
(define-key map (kbd "M-j") 'windmove-down) |
||||||
|
(define-key map (kbd "M-k") 'windmove-up) |
||||||
|
; (define-key map (kbd "C-c C-n") 'tabbar-forward) |
||||||
|
; (define-key map (kbd "C-c C-p") 'tabbar-backward) |
||||||
|
map) |
||||||
|
;; set command as alt on Mac |
||||||
|
(when (eq system-type 'darwin) |
||||||
|
(setq mac-command-modifier 'meta))) |
||||||
|
|
||||||
|
;;;###autoload |
||||||
|
(define-globalized-minor-mode global-my-keys-mode my-keys-mode |
||||||
|
(lambda () (progn (my-keys-mode t) |
||||||
|
(column-number-mode t)))) |
||||||
|
|
||||||
|
(provide 'my-minor-mode) |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,278 @@ |
|||||||
|
;;; setup-cygwin.el --- Set up Emacs for using Cygwin |
||||||
|
;; |
||||||
|
;; Filename: setup-cygwin.el |
||||||
|
;; Description: |
||||||
|
;; Author: Markus Hoenika |
||||||
|
;; Maintainer: Drew Adams (concat "drew.adams" "@" "oracle" ".com") |
||||||
|
;; Copyright (C) 2004-2018, Drew Adams, all rights reserved. |
||||||
|
;; Created: Thu Jan 15 11:13:38 2004 |
||||||
|
;; Version: 0 |
||||||
|
;; Package-Requires: ((cygwin-mount "0")) |
||||||
|
;; Last-Updated: Mon Jan 1 15:39:51 2018 (-0800) |
||||||
|
;; By: dradams |
||||||
|
;; Update #: 185 |
||||||
|
;; URL: https://www.emacswiki.org/emacs/download/setup-cygwin.el |
||||||
|
;; Doc URL: https://www.emacswiki.org/emacs/NTEmacsWithCygwin |
||||||
|
;; Keywords: os, unix, cygwin |
||||||
|
;; Compatibility: GNU Emacs: 20.x, 21.x, 22.x, 23.x, 24.x, 25.x, 26.x |
||||||
|
;; |
||||||
|
;; Features that might be required by this library: |
||||||
|
;; |
||||||
|
;; `ange-ftp', `backquote', `comint', `cygwin-mount', `ring'. |
||||||
|
;; |
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||||
|
;; |
||||||
|
;;; Commentary: |
||||||
|
;; |
||||||
|
;; Set up Emacs for using Cygwin. From Markus Hoenika's paper "SGML |
||||||
|
;; for Windows NT" <hoenika_markus@compuserve.com> |
||||||
|
;; |
||||||
|
;; NOTE: |
||||||
|
;; |
||||||
|
;; When using precompiled GNU Emacs (all versions, at least 20-25) |
||||||
|
;; with a Cygwin installation with Cygwin1.dll version 1.7.11-1, you |
||||||
|
;; have trouble running bash in emacs. On `M-x shell` you get: |
||||||
|
;; |
||||||
|
;; bash: cannot set terminal process group (-1): |
||||||
|
;; Inappropriate ioctl for device |
||||||
|
;; bash: no job control in this shell |
||||||
|
;; |
||||||
|
;; This shell then is rather useless, because apart from the missing |
||||||
|
;; job control some commands called in that shell just hang. |
||||||
|
;; |
||||||
|
;; People on the Cygwin mailing list have apparently suggested that |
||||||
|
;; it is a GNU Emacs problem. This issue is still not resolved yet. |
||||||
|
;; |
||||||
|
;; Workarounds some people have tried: |
||||||
|
;; |
||||||
|
;; * Use Cygwin Emacs (package emacs-w32 uses the windows GUI, there |
||||||
|
;; are also X11 and console packages) |
||||||
|
;; |
||||||
|
;; * Don't upgrade Cygwin above Cygwin1.dll, version 1.7.9. |
||||||
|
;; |
||||||
|
;; See also https://www.emacswiki.org/emacs/NTEmacsWithCygwin. |
||||||
|
;; |
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||||
|
;; |
||||||
|
;;; Change Log: |
||||||
|
;; |
||||||
|
;; 2016/04/29 dadams |
||||||
|
;; Better defgroup. |
||||||
|
;; Added note to commentary about bash problem with Cygwin. |
||||||
|
;; 2016/01/15 dadams |
||||||
|
;; setcyg-dir-p: Return nil if arg is not a string. |
||||||
|
;; 2015/10/31 dadams |
||||||
|
;; buffer-file-coding-system: Use suggestions from Emacs bug #21780. |
||||||
|
;; 2014/01/30 dadams |
||||||
|
;; Added: setcyg-dir-p. |
||||||
|
;; cygwin-root-directory: Look for "C:/cygwin64/" first, then "C:/cygwin/". |
||||||
|
;; 2014/01/14 dadams |
||||||
|
;; Added: add-to-list definition with APPEND, for Emacs 20. |
||||||
|
;; 2013/06/02 dadams |
||||||
|
;; Set env var CYGWIN to nodosfilewarning, to workaround ediff-buffers problem with names of temp files. |
||||||
|
;; Set null-device to /dev/null. |
||||||
|
;; 2013/04/27 dadams |
||||||
|
;; Put Cygwin path stuff before the stuff from getenv. |
||||||
|
;; 2013/03/08 dadams |
||||||
|
;; Added: defgroup setup-cygwin, option cygwin-root-directory. |
||||||
|
;; Use cygwin-root-directory instead of hardcoding root dir. Thx to Gabor Vida. |
||||||
|
;; 2011/08/11 dadams |
||||||
|
;; Made settings that are based on Cygwin install directory conditional, per input from Tom Popovich. |
||||||
|
;; 2011/01/04 dadams |
||||||
|
;; Added autoload cookies for commands. |
||||||
|
;; 2009/10-15 dadams |
||||||
|
;; Set ediff-shell to shell-file-name. |
||||||
|
;; 2007/12/08 dadams |
||||||
|
;; Use absolute file name for shell-file-name. |
||||||
|
;; 2006/11/16 dadams |
||||||
|
;; Replace add-to-list by setq, for Emacs -q prior to Emacs 21. |
||||||
|
;; 2006/08/14 dadams |
||||||
|
;; Append, not prepend "c:/cygwin/usr/info/" to Info-default-directory-list. |
||||||
|
;; 2004/10/01 dadams |
||||||
|
;; Changed Info-directory-list to Info-default-directory-list |
||||||
|
;; |
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||||
|
;; |
||||||
|
;; This program 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 2, or (at your option) |
||||||
|
;; any later version. |
||||||
|
|
||||||
|
;; This program 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 this program; see the file COPYING. If not, write to |
||||||
|
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth |
||||||
|
;; Floor, Boston, MA 02110-1301, USA. |
||||||
|
;; |
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||||
|
;; |
||||||
|
;;; Code: |
||||||
|
|
||||||
|
(require 'cygwin-mount) |
||||||
|
|
||||||
|
(when (< emacs-major-version 21) |
||||||
|
(defun add-to-list (list-var element &optional append) |
||||||
|
"Add to the value of LIST-VAR the element ELEMENT if it isn't there yet. |
||||||
|
The test for presence of ELEMENT is done with `equal'. |
||||||
|
If ELEMENT is added, it is added at the beginning of the list, |
||||||
|
unless the optional argument APPEND is non-nil, in which case |
||||||
|
ELEMENT is added at the end. |
||||||
|
|
||||||
|
If you want to use `add-to-list' on a variable that is not defined |
||||||
|
until a certain package is loaded, you should put the call to `add-to-list' |
||||||
|
into a hook function that will be run only after loading the package. |
||||||
|
`eval-after-load' provides one way to do this. In some cases |
||||||
|
other hooks, such as major mode hooks, can do the job." |
||||||
|
(if (member element (symbol-value list-var)) |
||||||
|
(symbol-value list-var) |
||||||
|
(set list-var |
||||||
|
(if append |
||||||
|
(append (symbol-value list-var) (list element)) |
||||||
|
(cons element (symbol-value list-var))))))) |
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||||
|
|
||||||
|
(defgroup setup-cygwin nil |
||||||
|
"Set up Emacs to use Cygwin." |
||||||
|
:group 'files |
||||||
|
:group 'processes |
||||||
|
:link `(url-link :tag "Send Bug Report" |
||||||
|
,(concat "mailto:" "drew.adams" "@" "oracle" ".com?subject=\ |
||||||
|
setup-cygwin.el bug: \ |
||||||
|
&body=Describe bug here, starting with `emacs -Q'. \ |
||||||
|
Don't forget to mention your Emacs and library versions.")) |
||||||
|
:link '(url-link :tag "Download" "https://www.emacswiki.org/emacs/download/setup-cygwin.el") |
||||||
|
:link '(url-link :tag "Description" "https://www.emacswiki.org/emacs/NTEmacsWithCygwin") |
||||||
|
:link '(emacs-commentary-link :tag "Commentary" "setup-cygwin")) |
||||||
|
|
||||||
|
(defun setcyg-dir-p (directory) |
||||||
|
"Return DIRECTORY if DIRECTORY is a readable directory, nil otherwise." |
||||||
|
(and (stringp directory) (file-directory-p directory) (file-readable-p directory) directory)) |
||||||
|
|
||||||
|
(defcustom cygwin-root-directory (or (setcyg-dir-p "C:/cygwin64/") (setcyg-dir-p "C:/cygwin/")) |
||||||
|
"Root directory of Cygwin installation. |
||||||
|
It should have subdirectories `bin' and `usr/info'. |
||||||
|
Subdirectory `bin' should have file `bin/bash.exe'." |
||||||
|
:group 'setup-cygwin :type 'directory) |
||||||
|
|
||||||
|
(unless (setcyg-dir-p cygwin-root-directory) |
||||||
|
(error "Cannot find Cygwin. Please customize option `cygwin-root-directory'")) |
||||||
|
|
||||||
|
|
||||||
|
;;; Make Cygwin paths accessible |
||||||
|
(cygwin-mount-activate) |
||||||
|
|
||||||
|
;;; Follow Cygwin symlinks. |
||||||
|
;;; Handles old-style (text file) symlinks and new-style (.lnk file) symlinks. |
||||||
|
;;; (Non-Cygwin-symlink .lnk files, such as desktop shortcuts, are still loaded as such.) |
||||||
|
(defun follow-cygwin-symlink () |
||||||
|
"Follow Cygwin symlinks. |
||||||
|
Handles old-style (text file) and new-style (.lnk file) symlinks. |
||||||
|
\(Non-Cygwin-symlink .lnk files, such as desktop shortcuts, are still |
||||||
|
loaded as such.)" |
||||||
|
(save-excursion |
||||||
|
(goto-char 0) |
||||||
|
(if (looking-at |
||||||
|
"L\x000\x000\x000\x001\x014\x002\x000\x000\x000\x000\x000\x0C0\x000\x000\x000\x000\x000\x000\x046\x00C") |
||||||
|
(progn |
||||||
|
(re-search-forward |
||||||
|
"\x000\\([-A-Za-z0-9_\\.\\\\\\$%@(){}~!#^'`][-A-Za-z0-9_\\.\\\\\\$%@(){}~!#^'`]+\\)") |
||||||
|
(find-alternate-file (match-string 1))) |
||||||
|
(when (looking-at "!<symlink>") |
||||||
|
(re-search-forward "!<symlink>\\(.*\\)\0") |
||||||
|
(find-alternate-file (match-string 1)))))) |
||||||
|
(add-hook 'find-file-hooks 'follow-cygwin-symlink) |
||||||
|
|
||||||
|
;;; Use Unix-style line endings. |
||||||
|
;; Per Eli Z. https://debbugs.gnu.org/cgi/bugreport.cgi?bug=21780#40: |
||||||
|
;; |
||||||
|
;; $$$$$$ (setq-default buffer-file-coding-system 'undecided-unix) |
||||||
|
(setq-default buffer-file-coding-system (coding-system-change-eol-conversion |
||||||
|
(default-value 'buffer-file-coding-system) |
||||||
|
'unix)) |
||||||
|
|
||||||
|
;;; Use /dev/null, not NUL. |
||||||
|
(setq null-device "/dev/null") |
||||||
|
|
||||||
|
;;; Without this env var setting, Cygwin causes `ediff-buffers', at least, to raise an error. |
||||||
|
;;; Making this setting here might have no effect, as the env var is checked only by the first Cygwin process |
||||||
|
;;; invoked during your Windows session. For best results, set this env var globally, in Windows itself. |
||||||
|
;;; An alternative might be to use `cygpath' to change from MS Windows file names to POSIX. |
||||||
|
(setenv "CYGWIN" "nodosfilewarning") |
||||||
|
|
||||||
|
;;; Add Cygwin Info pages |
||||||
|
(add-to-list 'Info-default-directory-list (expand-file-name "usr/info" cygwin-root-directory) 'APPEND) |
||||||
|
|
||||||
|
;;; Use `bash' as the default shell in Emacs. |
||||||
|
(add-to-list 'exec-path (expand-file-name "bin" cygwin-root-directory)) |
||||||
|
(setq shell-file-name (expand-file-name "bin/bash.exe" cygwin-root-directory)) ; Subprocesses invoked by shell. |
||||||
|
(setenv "SHELL" shell-file-name) |
||||||
|
;; (setenv "PATH" (concat (getenv "PATH") ";" (expand-file-name "bin" cygwin-root-directory))) |
||||||
|
(setenv "PATH" (concat (expand-file-name "bin" cygwin-root-directory) ";" (getenv "PATH"))) |
||||||
|
(setq explicit-shell-file-name shell-file-name) ; Interactive shell |
||||||
|
(setq ediff-shell shell-file-name) ; Ediff shell |
||||||
|
(setq explicit-shell-args '("--login" "-i")) |
||||||
|
|
||||||
|
;;;;; (setq shell-command-switch "-ic") ; SHOULD THIS BE "-c" or "-ic"? |
||||||
|
(setq w32-quote-process-args ?\") ;; " @@@ IS THIS BETTER? ;@@@ WAS THIS BEFORE: (setq w32-quote-process-args t) |
||||||
|
|
||||||
|
;; These don't seem to be needed. |
||||||
|
;; They were recommended by http://www.khngai.com/emacs/cygwin.php |
||||||
|
;;;;; (add-hook 'comint-output-filter-functions |
||||||
|
;;;;; 'shell-strip-ctrl-m nil t) |
||||||
|
;;;;; ;; Removes unsightly ^M characters that would otherwise appear in output of java applications. |
||||||
|
;;;;; (add-hook 'comint-output-filter-functions |
||||||
|
;;;;; 'comint-watch-for-password-prompt nil t) |
||||||
|
;;;;; (setq explicit-shell-file-name "bash.exe") |
||||||
|
;;;;; ;; For subprocesses invoked via the shell |
||||||
|
;;;;; ;; (e.g., "shell -c command") |
||||||
|
;;;;; (setq shell-file-name explicit-shell-file-name) |
||||||
|
|
||||||
|
|
||||||
|
;;;###autoload |
||||||
|
(defun bash () |
||||||
|
"Start `bash' shell." |
||||||
|
(interactive) |
||||||
|
(let ((binary-process-input t) |
||||||
|
(binary-process-output nil)) |
||||||
|
(shell))) |
||||||
|
|
||||||
|
(setq process-coding-system-alist |
||||||
|
(cons '("bash" . (raw-text-dos . raw-text-unix)) process-coding-system-alist)) |
||||||
|
|
||||||
|
|
||||||
|
;; From: http://www.dotfiles.com/files/6/235_.emacs |
||||||
|
;;;###autoload |
||||||
|
(defun set-shell-bash() |
||||||
|
"Enable on-the-fly switching between the bash shell and DOS." |
||||||
|
(interactive) |
||||||
|
;; (setq binary-process-input t) |
||||||
|
(setq shell-file-name "bash") |
||||||
|
(setq shell-command-switch "-c") ; SHOULD IT BE (setq shell-command-switch "-ic")? |
||||||
|
(setq explicit-shell-file-name "bash") |
||||||
|
(setenv "SHELL" explicit-shell-file-name) |
||||||
|
;;;;;(setq explicit-sh-args '("-login" "-i")) ; Undefined? |
||||||
|
(setq w32-quote-process-args ?\") ;; " |
||||||
|
;;;;;(setq mswindows-quote-process-args t)) ; Undefined? |
||||||
|
) |
||||||
|
|
||||||
|
;;;###autoload |
||||||
|
(defun set-shell-cmdproxy() |
||||||
|
"Set shell to `cmdproxy'." |
||||||
|
(interactive) |
||||||
|
(setq shell-file-name "cmdproxy") |
||||||
|
(setq explicit-shell-file-name "cmdproxy") |
||||||
|
(setenv "SHELL" explicit-shell-file-name) |
||||||
|
;;;;;(setq explicit-sh-args nil) ; Undefined? |
||||||
|
(setq w32-quote-process-args nil)) |
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;; |
||||||
|
|
||||||
|
(provide 'setup-cygwin) |
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||||
|
;;; setup-cygwin.el ends here |
@ -0,0 +1,25 @@ |
|||||||
|
Set objShell = WScript.CreateObject("WScript.Shell") |
||||||
|
' objShell.Run "runemacs.exe -q --load E:\WorkSpace\Emacs\init.el", 0, false |
||||||
|
|
||||||
|
' 先获取vbs所在目录, 然后利用相对路径获取到Emacs初始文件 |
||||||
|
' 目录结构 |
||||||
|
' X:\BaiduSync\Emacs\init.el |
||||||
|
' X:\Software\Emacs\bin\runemacs.exe |
||||||
|
' X:\Software\Emacs\bin\emacs.vbs |
||||||
|
|
||||||
|
' 获取当前运行脚本(emacs.vbs)的所在路径 |
||||||
|
scriptPath = WScript.ScriptFullName |
||||||
|
|
||||||
|
' 根据脚本路径和约定的目录结构, 获取Emacs主程序及init.el文件路径 |
||||||
|
Set fso = WScript.CreateObject("Scripting.FileSystemObject") |
||||||
|
basePath = fso.GetParentFolderName(fso.GetParentFolderName(fso.getParentFolderName(scriptPath))) |
||||||
|
|
||||||
|
baiduSyncPath = fso.BuildPath(basePath, "BaiduSyncdisk") |
||||||
|
softwarePath = fso.BuildPath(basePath, "Software") |
||||||
|
|
||||||
|
emacsPath = fso.BuildPath(softwarePath, "Emacs\bin\runemacs.exe") |
||||||
|
initelPath = fso.BuildPath(baiduSyncPath, "Emacs\init.el") |
||||||
|
|
||||||
|
' 启动Emacs |
||||||
|
Set objShell = WScript.CreateObject("WScript.Shell") |
||||||
|
objShell.Run emacsPath & " -q --load " & initelPath, 0, false |
@ -0,0 +1,190 @@ |
|||||||
|
;;; -------------------- |
||||||
|
;; 界面定制 |
||||||
|
|
||||||
|
;; 禁用菜单栏、滚动条和工具栏 |
||||||
|
(menu-bar-mode -1) |
||||||
|
(scroll-bar-mode -1) |
||||||
|
(tool-bar-mode -1) |
||||||
|
|
||||||
|
;; 禁用启动首屏并设置最大化 |
||||||
|
(setq inhibit-startup-screen t) |
||||||
|
(toggle-frame-maximized) |
||||||
|
|
||||||
|
;; 全局高亮当前行 |
||||||
|
(global-hl-line-mode t) |
||||||
|
|
||||||
|
;; 高亮匹配括号 |
||||||
|
(show-paren-mode t) |
||||||
|
|
||||||
|
;; 获取当前显示器的DPI |
||||||
|
(defun my-dpi () |
||||||
|
(let* ((attrs (car (display-monitor-attributes-list))) |
||||||
|
(size (assoc 'mm-size attrs)) |
||||||
|
(sizex (cadr size)) |
||||||
|
(res (cdr (assoc 'geometry attrs))) |
||||||
|
(resx (- (caddr res) (car res))) |
||||||
|
dpi) |
||||||
|
(catch 'exit |
||||||
|
;; in terminal |
||||||
|
(unless sizex |
||||||
|
(throw 'exit 10)) |
||||||
|
;; on big screen |
||||||
|
(when (> sizex 1000) |
||||||
|
(throw 'exit 10)) |
||||||
|
;; DPI |
||||||
|
(* (/ (float resx) sizex) 25.4)))) |
||||||
|
|
||||||
|
;; 设置中英文字体大小,使两者字体宽度相等 |
||||||
|
;; shzhzhyiwezitidaxi, shlizhzitikuduxide |
||||||
|
(defun zos/font/seperate-font (default-size cjk-size high-dpi-cjk-size) |
||||||
|
(let* ((z/default-size default-size) |
||||||
|
; 判断DPI, 如果DPI<=120, 使用cjk-size(较小的值)作为cjk字体大小, 否则使用high-dpi-cjk-size(较大的值)作为cjk字体大小 |
||||||
|
(z/cjk-size (if (<= (my-dpi) 145) cjk-size high-dpi-cjk-size))) |
||||||
|
(progn |
||||||
|
;; 设置默认的字体大小,由于height表示 1/10pt,所以要*10 |
||||||
|
(set-face-attribute 'default nil |
||||||
|
:family "Sarasa Mono SC" |
||||||
|
:height (* z/default-size 10) |
||||||
|
:weight 'normal |
||||||
|
:width 'normal) |
||||||
|
(set-face-attribute 'fixed-pitch nil |
||||||
|
:family "Sarasa Mono SC") |
||||||
|
|
||||||
|
;; 给相应的字符集设置中文字体,这里的字体是冬青黑体简体中文 W3。 |
||||||
|
(dolist (charset '(han cjk-misc chinese-gbk)) |
||||||
|
(set-fontset-font "fontset-default" charset (font-spec :name "Sarasa Mono SC" :size z/cjk-size)))))) |
||||||
|
(zos/font/seperate-font 12 16 24) |
||||||
|
|
||||||
|
;; 设置默认编码 |
||||||
|
(prefer-coding-system 'utf-8) |
||||||
|
(set-default-coding-systems 'utf-8) |
||||||
|
(set-terminal-coding-system 'utf-8) |
||||||
|
(set-keyboard-coding-system 'utf-8) |
||||||
|
|
||||||
|
;; 设置主题 |
||||||
|
(load-theme 'wombat) |
||||||
|
|
||||||
|
;; 包仓库 |
||||||
|
; (require 'package) |
||||||
|
; (add-to-list 'package-archives |
||||||
|
; '("melpa-stable" . "https://stable.melpa.org/packages/")) |
||||||
|
; (package-initialize) |
||||||
|
|
||||||
|
|
||||||
|
;;; -------------------- |
||||||
|
;; 功能定制 |
||||||
|
|
||||||
|
;; 修改询问函数为 y or n |
||||||
|
(fset 'yes-or-no-p 'y-or-n-p) |
||||||
|
|
||||||
|
;; 不要自动补全和备份文件 |
||||||
|
(setq make-backup-files nil) |
||||||
|
(setq auto-save-default nil) |
||||||
|
(setq create-lockfiles nil) |
||||||
|
|
||||||
|
;; 粘贴的文字替换选中region而不是追加到region最后 |
||||||
|
(delete-selection-mode 1) |
||||||
|
|
||||||
|
;; 保存文件时删除尾部空行 |
||||||
|
(setq delete-traling-lines t) |
||||||
|
(add-hook 'before-save-hook 'delete-trailing-whitespace) |
||||||
|
|
||||||
|
;; 某些模式显示行号 |
||||||
|
(defun zos/enable-linum-mode () |
||||||
|
(linum-mode t)) |
||||||
|
(dolist (mode '(prog-mode-hook |
||||||
|
text-mode-hook)) |
||||||
|
(add-hook mode 'zos/enable-linum-mode)) |
||||||
|
|
||||||
|
;; 高级echo补全 |
||||||
|
(icomplete-mode t) |
||||||
|
|
||||||
|
;; minibuffer文件名补全忽略大小写 |
||||||
|
(setq read-file-name-completion-ignore-case t) |
||||||
|
|
||||||
|
;; dired 排序将 . 开头的文件排前面 |
||||||
|
(setq ls-lisp-UCA-like-collation nil) |
||||||
|
|
||||||
|
|
||||||
|
;;; -------------------- |
||||||
|
;; 快捷键定制 |
||||||
|
|
||||||
|
;; 窗口操作 M-h/j/k/l 上下左右移动焦点 |
||||||
|
(dolist (key-func-bind '(("M-h" . windmove-left) |
||||||
|
("M-l" . windmove-right) |
||||||
|
("M-j" . windmove-down) |
||||||
|
("M-k" . windmove-up))) |
||||||
|
(let ((key (car key-func-bind)) |
||||||
|
(func (cdr key-func-bind))) |
||||||
|
(global-set-key (kbd key) func))) |
||||||
|
|
||||||
|
(global-unset-key (kbd "C-M-l")) |
||||||
|
(global-set-key (kbd "C-M-l") 'format-all-buffer) |
||||||
|
|
||||||
|
;;; -------------------- |
||||||
|
;; 文件关联 |
||||||
|
;; (add-to-list 'auto-mode-alist |
||||||
|
;; ("\\.vbs\\'" . vbs-mode)) |
||||||
|
|
||||||
|
|
||||||
|
;;; -------------------- |
||||||
|
;; 扩展功能 |
||||||
|
|
||||||
|
;; 扩展目录 |
||||||
|
(let* ((z/arg-pos (seq-position command-line-args "--load")) |
||||||
|
(z/initel-path (if (number-or-marker-p z/arg-pos) (nth (+ z/arg-pos 1) command-line-args)))) |
||||||
|
(if (char-or-string-p z/initel-path) |
||||||
|
(progn |
||||||
|
(message z/initel-path) |
||||||
|
(add-to-list 'load-path (file-name-concat (file-name-directory z/initel-path) "elisp"))) |
||||||
|
)) |
||||||
|
|
||||||
|
;; Cygwin 配置 |
||||||
|
(setq cygwin-mount-cygwin-bin-directory "C:/cygwin64/bin") |
||||||
|
|
||||||
|
(if |
||||||
|
(and (require 'cygwin-mount nil t) (require 'setup-cygwin nil t)) |
||||||
|
(progn |
||||||
|
(add-to-list 'exec-path (expand-file-name "/stlink-1.7.0-x86_64-w64-mingw32/bin" cygwin-root-directory)) |
||||||
|
(setenv "PATH" (concat (expand-file-name "/stlink-1.7.0-x86_64-w64-mingw32/bin" cygwin-root-directory) ";" (getenv "PATH"))) |
||||||
|
(add-to-list 'exec-path (expand-file-name "/openocd-v0.11.0-i686-w64-mingw32/bin" cygwin-root-directory)) |
||||||
|
(setenv "PATH" (concat (expand-file-name "/openocd-v0.11.0-i686-w64-mingw32/bin" cygwin-root-directory) ";" (getenv "PATH"))) |
||||||
|
(add-to-list 'exec-path (expand-file-name "/gcc-arm-11.2-2022.02-mingw-w64-i686-arm-none-eabi/bin" cygwin-root-directory)) |
||||||
|
(setenv "PATH" (concat (expand-file-name "/gcc-arm-11.2-2022.02-mingw-w64-i686-arm-none-eabi/bin" cygwin-root-directory) ";" (getenv "PATH"))))) |
||||||
|
|
||||||
|
;; 文件浏览 |
||||||
|
(require 'neotree) |
||||||
|
|
||||||
|
;; 格式化 |
||||||
|
(require 'format-all) |
||||||
|
(defun z/format-all-enable () |
||||||
|
"Enable format-all on some mode" |
||||||
|
(progn |
||||||
|
(format-all-ensure-formatter) |
||||||
|
(format-all-mode))) |
||||||
|
|
||||||
|
(add-hook 'prog-mode-hook |
||||||
|
'z/format-all-enable) |
||||||
|
|
||||||
|
;; Latex格式化 |
||||||
|
(defun zos/latex/format-file () |
||||||
|
"在保存时格式化LaTeX文件" |
||||||
|
(interactive) |
||||||
|
(let ((latex-indent "d:/texlive/2021/bin/win32/latexindent.exe") |
||||||
|
(buffer-encoding buffer-file-coding-system) |
||||||
|
(filepath (buffer-file-name))) |
||||||
|
(call-process latex-indent nil "*scratch*" nil |
||||||
|
"-w" "-y=defaultIndent:' '" filepath) |
||||||
|
(let ((coding-system-for-read buffer-encoding)) |
||||||
|
(revert-buffer t t t)))) |
||||||
|
|
||||||
|
;; Markdown mode |
||||||
|
(require 'markdown-mode) |
||||||
|
(add-to-list 'process-coding-system-alist ; 修复prettier乱码问题 |
||||||
|
'("prettier" utf-8-auto)) |
||||||
|
|
||||||
|
(add-hook 'markdown-mode-hook |
||||||
|
'z/format-all-enable) |
||||||
|
|
||||||
|
;; YAML mode |
||||||
|
(require 'yaml-mode) |
Loading…
Reference in new issue