Commit master
authorFrançois Fleuret <francois@fleuret.org>
Sat, 7 Dec 2024 13:30:17 +0000 (14:30 +0100)
committerFrançois Fleuret <francois@fleuret.org>
Sat, 7 Dec 2024 13:30:17 +0000 (14:30 +0100)
emacs.el
goto-last-change.el [new file with mode: 0644]
media-mplayer.el

index 5d30a6e..930d739 100644 (file)
--- a/emacs.el
+++ b/emacs.el
 ;; Xft.antialias: true
 ;; Xft.rgba: rgb
 
 ;; Xft.antialias: true
 ;; Xft.rgba: rgb
 
-(set-frame-font "Inconsolata 14")
+(set-frame-font "Inconsolata 15")
 
 ;; (package-initialize)
 
 
 ;; (package-initialize)
 
+;;(set-face-attribute 'default nil :height 130)
+
+;;(set-default-font "Inconsolata 13")
 ;; (set-default-font "Bitstream vera sans mono 12")
 ;; (set-default-font "Liberation Mono-13")
 ;; (set-default-font "DejaVu sans mono 15")
 ;; (set-default-font "Bitstream vera sans mono 12")
 ;; (set-default-font "Liberation Mono-13")
 ;; (set-default-font "DejaVu sans mono 15")
@@ -63,8 +66,8 @@
 
 ;; Where I keep my own scripts
 
 
 ;; Where I keep my own scripts
 
-(add-to-list 'load-path "~/sources/gpl/elisp")
-(add-to-list 'load-path "~/sources/elisp")
+(add-to-list 'load-path "~/src/gpl/elisp")
+(add-to-list 'load-path "~/src/elisp")
 (add-to-list 'load-path "~/local/elisp")
 
 ;; No, I do not like menus
 (add-to-list 'load-path "~/local/elisp")
 
 ;; No, I do not like menus
@@ -349,7 +352,7 @@ load-warning buffer in case of failure."
 ;; What modes for what file extentions
 (add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))
 
 ;; What modes for what file extentions
 (add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))
 
-(add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode))
+;;(add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode))
 
 (require 'org-table)
 
 
 (require 'org-table)
 
@@ -363,8 +366,8 @@ load-warning buffer in case of failure."
 ;; (add-hook 'lua-mode-hook 'flyspell-prog-mode)
 (add-hook 'log-edit-mode-hook 'flyspell-mode)
 
 ;; (add-hook 'lua-mode-hook 'flyspell-prog-mode)
 (add-hook 'log-edit-mode-hook 'flyspell-mode)
 
-(add-hook 'markdown-mode-hook 'flyspell-mode)
-(add-hook 'markdown-mode-hook 'auto-fill-mode)
+;; (add-hook 'markdown-mode-hook 'flyspell-mode)
+;; (add-hook 'markdown-mode-hook 'auto-fill-mode)
 
 ;; I am a power-user
 
 
 ;; I am a power-user
 
@@ -628,7 +631,7 @@ load-warning buffer in case of failure."
 (defun ff/alsa-sound (file)
   "Plays a sound with ALSA."
   (interactive)
 (defun ff/alsa-sound (file)
   "Plays a sound with ALSA."
   (interactive)
-  (process-kill-without-query (start-process-shell-command "aplay"
+  (process-query-on-exit-flag (start-process-shell-command "aplay"
                                                            nil
                                                            "aplay" "-q" file)))
 
                                                            nil
                                                            "aplay" "-q" file)))
 
@@ -643,24 +646,26 @@ load-warning buffer in case of failure."
 ;; then uncommenting would be very counter-intuitive).
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 ;; then uncommenting would be very counter-intuitive).
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(defun ff/comment-and-go-down (arg)
-  "Comments and goes down ARG lines."
-  (interactive "p")
-  (condition-case nil
-      (comment-region (point-at-bol) (point-at-eol)) (error nil))
-  (next-line 1)
-  (if (> arg 1) (ff/comment-and-go-down (1- arg))))
-
-(defun ff/uncomment-and-go-up (arg)
-  "Uncomments and goes up ARG lines."
-  (interactive "p")
-  (condition-case nil
-      (uncomment-region (point-at-bol) (point-at-eol)) (error nil))
-  (next-line -1)
-  (if (> arg 1) (ff/uncomment-and-go-up (1- arg))))
+;; (defun ff/comment-and-go-down (arg)
+;;   "Comments and goes down ARG lines."
+;;   (interactive "p")
+;;   (condition-case nil
+;;       (comment-region (point-at-bol) (point-at-eol)) (error nil))
+;;   (next-line 1)
+;;   (if (> arg 1) (ff/comment-and-go-down (1- arg))))
+;; 
+;; (defun ff/uncomment-and-go-up (arg)
+;;   "Uncomments and goes up ARG lines."
+;;   (interactive "p")
+;;   (condition-case nil
+;;       (uncomment-region (point-at-bol) (point-at-eol)) (error nil))
+;;   (next-line -1)
+;;   (if (> arg 1) (ff/uncomment-and-go-up (1- arg))))
+;; 
+;; (define-key global-map [(shift down)] 'ff/comment-and-go-down)
+;; (define-key global-map [(shift up)] 'ff/uncomment-and-go-up)
 
 
-(define-key global-map [(shift down)] 'ff/comment-and-go-down)
-(define-key global-map [(shift up)] 'ff/uncomment-and-go-up)
+(define-key global-map [(shift down)] 'comment-line)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
@@ -669,7 +674,7 @@ load-warning buffer in case of failure."
   (interactive)
 
   (let ((b (get-buffer "*compilation*")))
   (interactive)
 
   (let ((b (get-buffer "*compilation*")))
-    (if b (show-buffer (split-window-right) b)
+    (if b (display-buffer b)
       (error "Cannot find a compilation buffer"))
     )
 )
       (error "Cannot find a compilation buffer"))
     )
 )
@@ -1040,7 +1045,7 @@ printer."
  )
 
 ;; Show the time, mail and stuff
  )
 
 ;; Show the time, mail and stuff
-(display-time)
+;; (display-time)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Moving through buffers
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Moving through buffers
@@ -1126,10 +1131,10 @@ In line mode: M-p previous line, M-n next line.")
     (term-set-escape-char ?\C-x)
 
     ;; I like the shell buffer and windows to be deleted when the
     (term-set-escape-char ?\C-x)
 
     ;; I like the shell buffer and windows to be deleted when the
-    ;; shell process terminates. It's a bit of a mess to acheive this.
+    ;; shell process terminates. It's a bit of a mess to achieve this.
 
     (let ((process (get-buffer-process (current-buffer))))
 
     (let ((process (get-buffer-process (current-buffer))))
-      (process-kill-without-query process)
+      (process-query-on-exit-flag process)
       (set-process-sentinel process
                             ;; 'ff/kill-associated-buffer-and-delete-windows
                             'ff/kill-associated-buffer
       (set-process-sentinel process
                             ;; 'ff/kill-associated-buffer-and-delete-windows
                             'ff/kill-associated-buffer
@@ -1173,9 +1178,9 @@ of commands in `ff/default-bash-commands' is used for auto-completion"
 (when (ff/load-or-alert "alarm-vc" t)
   (setq alarm-vc-mode-exceptions "^VM"))
 
 (when (ff/load-or-alert "alarm-vc" t)
   (setq alarm-vc-mode-exceptions "^VM"))
 
-(when (ff/load-or-alert "git")
-  (setq git-show-unknown nil)
-  )
+;; (when (ff/load-or-alert "git")
+  ;; (setq git-show-unknown nil)
+  ;; )
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Makes .sh and others files executable automagically
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Makes .sh and others files executable automagically
@@ -1242,9 +1247,13 @@ goback argument, go back where we were."
 (load "vc-git")
 
 (defun ff/git-pull-push (universal) (interactive "P")
 (load "vc-git")
 
 (defun ff/git-pull-push (universal) (interactive "P")
+       (message "black *.py ...")
+       (shell-command "black *.py" nil)
        (when universal (shell-command "git commit -a -m \"Update.\"" nil))
        (message "git pull / push ...")
        (when universal (shell-command "git commit -a -m \"Update.\"" nil))
        (message "git pull / push ...")
-       (async-shell-command "git remote get-url origin && git pull && git push" nil)
+       (shell-command "git pull && git push" nil)
+       ;;(async-shell-command "git remote get-url origin && git pull && git push" nil)
+       (message "All good captain")
        )
 
 (defun ff/git-pull () (interactive)
        )
 
 (defun ff/git-pull () (interactive)
@@ -1255,88 +1264,6 @@ goback argument, go back where we were."
 (define-key global-map [(control x) (v) (p)] 'ff/git-pull-push)
 (define-key global-map [(control x) (v) (P)] 'ff/git-pull)
 
 (define-key global-map [(control x) (v) (p)] 'ff/git-pull-push)
 (define-key global-map [(control x) (v) (P)] 'ff/git-pull)
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; The big stuff (bbdb, mailcrypt, etc.)
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(setq bbdb-file "~/private/bbdb")
-
-(when (file-exists-p bbdb-file)
-
-  ;; Failsafe version if we can't load bbdb
-  (defun ff/explicit-name (email) email)
-
-  (when (with-no-warnings (ff/load-or-alert "bbdb"))
-
-    (setq
-     ;; Stop asking (if not t or nil, will not ask)
-     bbdb-offer-save 'never
-     ;; I hate when bbdb decides to mess up my windows
-     bbdb-use-pop-up nil
-     ;; I have no problem with bbdb asking me if the sender email
-     ;; does not match exactly the address we have in the database
-     bbdb-quiet-about-name-mismatches 0
-     ;; I have european friends, too
-     bbdb-north-american-phone-numbers-p nil
-     ;; To cycle through all possible addresses
-     bbdb-complete-name-allow-cycling t
-     ;; Cycle with full names only, not through all net-addresses alone too
-     bbdb-dwim-net-address-allow-redundancy t
-     ;; Do not add new addresses automatically
-     bbdb-always-add-addresses nil
-     )
-
-    (defface ff/known-address-face
-      '((t (:foreground "blue2")))
-      "The face to display known mail identities.")
-
-    (defface ff/unknown-address-face
-      '((t (:foreground "gray50")))
-      "The face to display unknown mail identities.")
-
-    (defun ff/explicit-name (email)
-      "Returns a string identity for the first address in EMAIL. The
-identity is taken from bbdb if possible or from the address itself
-with mail-extract-address-components. The suffix \"& al.\" is added if
-there are more than one address.
-
-If no bbdb record is found, the name is propertized with the face
-ff/unknown-address-face. If a record is found and contains a note
-'face, the associated face is used, otherwise
-ff/known-address-face is used."
-
-      (and email
-           (let* ((data (mail-extract-address-components email))
-                  (name (car data))
-                  (net (cadr data))
-                  (record (bbdb-search-simple nil net)))
-
-             (concat
-
-              (condition-case nil
-                  (propertize (bbdb-record-name record)
-                              'face
-                              (or (cdr (assoc 'face
-                                              (bbdb-record-raw-notes record)))
-                                  'ff/known-address-face))
-                (error
-                 (propertize (or (and data (concat "<" net ">"))
-                                 "*undefined*")
-                             'face 'ff/unknown-address-face)
-                 ))
-              (if (string-match "," (mail-strip-quoted-names email)) " & al.")
-              )))
-      )
-
-    (ff/configure-faces '((ff/robot-address-face :foreground "green4")
-                          (ff/personal-address-face :foreground "dark magenta" :weight 'bold)
-                          (ff/important-address-face :foreground "red3"
-                                                     :weight 'bold
-                                                     )))
-
-    )
-  )
-
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; An encrypted file to put secure stuff (passwords, ...)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; An encrypted file to put secure stuff (passwords, ...)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1463,7 +1390,7 @@ universal argument starts xfig even if the .fig does not exist"
                                     (append '("xdvi-for-latex" nil "xdvi")
                                             ff/xdvi-for-latex-options
                                             (list dvi-name))))
                                     (append '("xdvi-for-latex" nil "xdvi")
                                             ff/xdvi-for-latex-options
                                             (list dvi-name))))
-          (process-kill-without-query xdvi-process))))
+          (process-query-on-exit-flag xdvi-process))))
     ))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1616,9 +1543,15 @@ universal argument starts xfig even if the .fig does not exist"
 \\usepackage{amsmath,amssymb,dsfont}
 \\usepackage[pdftex]{graphicx}
 \\usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue,citecolor=blue]{hyperref}
 \\usepackage{amsmath,amssymb,dsfont}
 \\usepackage[pdftex]{graphicx}
 \\usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue,citecolor=blue]{hyperref}
-\\usepackage{tikz}
 \\usepackage[round]{natbib}
 \\usepackage[round]{natbib}
-\\usepackage{cmbright}
+\\usepackage{tikz}
+\\usetikzlibrary{arrows,arrows.meta,calc}
+\\usetikzlibrary{patterns,backgrounds}
+\\usetikzlibrary{positioning,fit}
+\\usetikzlibrary{shapes.geometric,shapes.multipart}
+\\usetikzlibrary{patterns.meta,decorations.pathreplacing,calligraphy}
+\\usetikzlibrary{tikzmark}
+\\usetikzlibrary{decorations.pathmorphing}
 
 \\setlength{\\parindent}{0cm}
 \\setlength{\\parskip}{12pt}
 
 \\setlength{\\parindent}{0cm}
 \\setlength{\\parskip}{12pt}
@@ -1931,7 +1864,7 @@ and refilling all the paragraphs."
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-\\begin{frame}{")
+\\begin{frame}[fragile]{")
         (save-excursion (insert "}{}
 
 "))
         (save-excursion (insert "}{}
 
 "))
@@ -1939,7 +1872,7 @@ and refilling all the paragraphs."
 
     (insert "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 
     (insert "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-\\begin{frame}{")
+\\begin{frame}[fragile]{")
 
     (save-excursion (insert "}{}
 
 
     (save-excursion (insert "}{}
 
@@ -2353,7 +2286,14 @@ This may be a useful alternative binding for \\[delete-other-windows]
 ;; buffer, and to edit the .fig or bitmap image used to generate the
 ;; .eps at point
 
 ;; buffer, and to edit the .fig or bitmap image used to generate the
 ;; .eps at point
 
-(define-key global-map [f4] 'ff/run-viewer)
+(defun ff/speech-whisper () (interactive)
+       (shell-command
+        (concat "speech-whisper.sh " (if current-input-method "fr" "en"))
+        (current-buffer)
+        )
+)
+
+(define-key global-map [f4] 'ff/speech-whisper)
 
 ;; Closes the current \begin{}
 
 
 ;; Closes the current \begin{}
 
@@ -2433,20 +2373,24 @@ current buffer and deletes the current window if it's not the
 only one in the frame. If the buffer has to be kept, go to the
 next one. With universal argument, kill all killable buffers."
   (interactive "P")
 only one in the frame. If the buffer has to be kept, go to the
 next one. With universal argument, kill all killable buffers."
   (interactive "P")
-  (if universal
-      (let ((nb-killed 0))
-        (mapc (lambda (x)
-                (unless (string-match ff/kill-this-buffer-and-delete-window-exceptions
-                                      (buffer-name x))
-                  (kill-buffer x)
-                  (setq nb-killed (1+ nb-killed))
-                  ))
-              (buffer-list))
-        (message "Killed %d buffer%s" nb-killed (if (> nb-killed 1) "s" "")))
-    (if (string-match ff/kill-this-buffer-and-delete-window-exceptions (buffer-name))
-        (ff/next-buffer)
-      (kill-this-buffer)))
-  (unless (one-window-p t) (delete-window))
+  (unless (minibuffer-window-active-p (selected-window))
+    (if universal
+        (let ((nb-killed 0))
+          (mapc (lambda (x)
+                  (unless (string-match ff/kill-this-buffer-and-delete-window-exceptions
+                                        (buffer-name x))
+                    (kill-buffer x)
+                    (setq nb-killed (1+ nb-killed))
+                    ))
+                (buffer-list))
+          (message "Killed %d buffer%s" nb-killed (if (> nb-killed 1) "s" "")))
+      (if (string-match ff/kill-this-buffer-and-delete-window-exceptions (buffer-name))
+          (ff/next-buffer)
+        (let ((kill-buffer-query-functions nil))
+          (kill-this-buffer))
+        ))
+    (unless (one-window-p t) (delete-window))
+    )
   )
 
 (define-key global-map [(control backspace)] 'ff/kill-this-buffer-and-delete-window)
   )
 
 (define-key global-map [(control backspace)] 'ff/kill-this-buffer-and-delete-window)
@@ -2495,7 +2439,7 @@ next one. With universal argument, kill all killable buffers."
                               '(
                                 ff/file-not-remote-but-symlink
                                 "enotes$" "secure-notes$" "media-playlists$"
                               '(
                                 ff/file-not-remote-but-symlink
                                 "enotes$" "secure-notes$" "media-playlists$"
-                                "bbdb$"
+                                ;; "bbdb$"
                                 "svn-commit.tmp$" ".git/COMMIT_EDITMSG$"
                                 "\.bbl$" "\.aux$" "\.toc$"
                                 ))
                                 "svn-commit.tmp$" ".git/COMMIT_EDITMSG$"
                                 "\.bbl$" "\.aux$" "\.toc$"
                                 ))
@@ -2532,7 +2476,8 @@ next one. With universal argument, kill all killable buffers."
 
   (define-key global-map [(meta \\)] 'media)
 
 
   (define-key global-map [(meta \\)] 'media)
 
-  (setq media/expert t
+  (setq media/mplayer/executable "mpv"
+        media/expert t
         media/add-current-song-to-interrupted-when-killing t
         media/duration-to-history 30
         media/history-size 1000
         media/add-current-song-to-interrupted-when-killing t
         media/duration-to-history 30
         media/history-size 1000
@@ -2746,7 +2691,8 @@ with a time tag, and save this file"
          ;; (insert (format-time-string "%d.%m.%Y" (current-time))))
        )
 
          ;; (insert (format-time-string "%d.%m.%Y" (current-time))))
        )
 
-(define-key ff/map [(control g)] 'ff/git-status)
+(define-key ff/map [(control g)] 'magit)
+;;(define-key ff/map [(control g)] 'ff/git-status)
 ;; (define-key ff/map [(control w)] 'server-edit)
 (define-key ff/map [(control d)] 'ff/elisp-debug-on)
 ;; (define-key ff/map "d" 'diary)
 ;; (define-key ff/map [(control w)] 'server-edit)
 (define-key ff/map [(control d)] 'ff/elisp-debug-on)
 ;; (define-key ff/map "d" 'diary)
@@ -2772,7 +2718,7 @@ with a time tag, and save this file"
 (define-key ff/map "c" 'ff/count-char)
 (define-key ff/map [(control p)] 'ff/print-to-file)
 (define-key ff/map "P" 'ff/print-to-printer)
 (define-key ff/map "c" 'ff/count-char)
 (define-key ff/map [(control p)] 'ff/print-to-file)
 (define-key ff/map "P" 'ff/print-to-printer)
-(define-key ff/map [(control b)] 'bbdb)
+;; (define-key ff/map [(control b)] 'bbdb)
 (define-key ff/map "m" 'ff/selector-mail-from-bbdb)
 (define-key ff/map [(control m)] 'woman)
 (define-key ff/map "b" 'bookmark-jump)
 (define-key ff/map "m" 'ff/selector-mail-from-bbdb)
 (define-key ff/map [(control m)] 'woman)
 (define-key ff/map "b" 'bookmark-jump)
@@ -3003,3 +2949,21 @@ With argument ARG, do this that many times."
 ;; ;; Raises the window when the server is invoked
 
 ;; (add-hook 'server-switch-hook 'ff/raise-frame-and-give-focus)
 ;; ;; Raises the window when the server is invoked
 
 ;; (add-hook 'server-switch-hook 'ff/raise-frame-and-give-focus)
+
+(defun ff/black-current-file () (interactive)
+  (save-buffer)
+  (shell-command (concat "black " (buffer-file-name)))
+  (revert-buffer nil t)
+)
+
+(define-key ff/map [(control b)] 'ff/black-current-file)
+
+;; This is 2024 people, we cannot live in the past anymore
+
+(defun llm (&optional prompt) (interactive "MPrompt: ")
+       (insert
+        (shell-command-to-string
+         (format "curl -s --request POST --url http://localhost:8080/completion --header \"Content-Type: application/json\" --data '{\"prompt\": \"%s\", \"n_predict\": 128}' | jq -r \".content\"" prompt)
+         )
+        )
+       )
diff --git a/goto-last-change.el b/goto-last-change.el
new file mode 100644 (file)
index 0000000..6881576
--- /dev/null
@@ -0,0 +1,141 @@
+;;; goto-last-change.el --- Move point through buffer-undo-list positions -*-coding: 'raw-text'; coding: iso-8859-1;-*-
+
+;; Copyright © 2003 Kevin Rodgers
+
+;; Author: Kevin Rodgers <ihs_4664@yahoo.com>
+;; Created: 17 Jun 2003
+;; Version: $Revision: 1.2 $
+;; Keywords: convenience
+;; RCS: $Id: goto-last-change.el,v 1.2 2003/07/30 17:43:47 kevinr Exp kevinr $
+
+;; Contributors:
+;;   Attila Lendvai <attila.lendvai@gmail.com> (line distance and auto marks)
+
+;; 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 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, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; After installing goto-last-change.el in a `load-path' directory and
+;; compiling it with `M-x byte-compile-file', load it with
+;;     (require 'goto-last-change)
+;; or autoload it with
+;;     (autoload 'goto-last-change "goto-last-change"
+;;       "Set point to the position of the last change." t)
+;; 
+;; You may also want to bind a key to `M-x goto-last-change', e.g.
+;;     (global-set-key "\C-x\C-\\" 'goto-last-change)
+
+;; goto-last-change.el was written in response to to the following:
+;; 
+;; From: Dan Jacobson <jidanni@jidanni.org>
+;; Newsgroups: gnu.emacs.bug
+;; Subject: function to go to spot of last change
+;; Date: Sun, 15 Jun 2003 00:15:08 +0000 (UTC)
+;; Sender: news <news@main.gmane.org>
+;; Message-ID: <mailman.7910.1055637181.21513.bug-gnu-emacs@gnu.org>
+;; NNTP-Posting-Host: monty-python.gnu.org
+;; 
+;; 
+;; Why of course, a function to get the user to the spot of last changes
+;; in the current buffer(s?), that's what emacs must lack.
+;; 
+;; How many times have you found yourself mosying [<-not in spell
+;; checker!?] thru a file when you wonder, where the heck was I just
+;; editing?  Well, the best you can do is hit undo, ^F, and undo again,
+;; to get back.  Hence the "burning need" for the additional function,
+;; which you might name the-jacobson-memorial-function, due to its brilliance.
+;; -- 
+;; http://jidanni.org/ Taiwan(04)25854780
+
+;;; Code:
+(provide 'goto-last-change)
+
+(or (fboundp 'last)                    ; Emacs 20
+    (require 'cl))                     ; Emacs 19
+
+(defvar goto-last-change-undo nil
+  "The `buffer-undo-list' entry of the previous \\[goto-last-change] command.")
+(make-variable-buffer-local 'goto-last-change-undo)
+
+;;;###autoload
+(defun goto-last-change (&optional mark-point minimal-line-distance)
+  "Set point to the position of the last change.
+Consecutive calls set point to the position of the previous change.
+With a prefix arg (optional arg MARK-POINT non-nil), set mark so \
+\\[exchange-point-and-mark]
+will return point to the current position."
+  (interactive "P")
+  ;; (unless (buffer-modified-p)
+  ;;   (error "Buffer not modified"))
+  (when (eq buffer-undo-list t)
+    (error "No undo information in this buffer"))
+  (when mark-point
+    (push-mark))
+  (unless minimal-line-distance
+    (setq minimal-line-distance 10))
+  (let ((position nil)
+       (undo-list (if (and (eq this-command last-command)
+                           goto-last-change-undo)
+                      (cdr (memq goto-last-change-undo buffer-undo-list))
+                    buffer-undo-list))
+       undo)
+    (while (and undo-list
+                (or (not position)
+                    (eql position (point))
+                    (and minimal-line-distance
+                         ;; The first invocation always goes to the last change, subsequent ones skip
+                         ;; changes closer to (point) then minimal-line-distance.
+                         (memq last-command '(goto-last-change
+                                              goto-last-change-with-auto-marks))
+                         (< (count-lines (min position (point-max)) (point))
+                            minimal-line-distance))))
+      (setq undo (car undo-list))
+      (cond ((and (consp undo) (integerp (car undo)) (integerp (cdr undo)))
+            ;; (BEG . END)
+            (setq position (cdr undo)))
+           ((and (consp undo) (stringp (car undo))) ; (TEXT . POSITION)
+            (setq position (abs (cdr undo))))
+           ((and (consp undo) (eq (car undo) t))) ; (t HIGH . LOW)
+           ((and (consp undo) (null (car undo)))
+            ;; (nil PROPERTY VALUE BEG . END)
+            (setq position (cdr (last undo))))
+           ((and (consp undo) (markerp (car undo)))) ; (MARKER . DISTANCE)
+           ((integerp undo))           ; POSITION
+           ((null undo))               ; nil
+           (t (error "Invalid undo entry: %s" undo)))
+      (setq undo-list (cdr undo-list)))
+    (cond (position
+          (setq goto-last-change-undo undo)
+          (goto-char (min position (point-max))))
+         ((and (eq this-command last-command)
+               goto-last-change-undo)
+          (setq goto-last-change-undo nil)
+          (error "No further undo information"))
+         (t
+          (setq goto-last-change-undo nil)
+          (error "Buffer not modified")))))
+
+(defun goto-last-change-with-auto-marks (&optional minimal-line-distance)
+  "Calls goto-last-change and sets the mark at only the first invocations
+in a sequence of invocations."
+  (interactive "P")
+  (goto-last-change (not (or (eq last-command 'goto-last-change-with-auto-marks)
+                             (eq last-command t)))
+                    minimal-line-distance))
+
+;; (global-set-key "\C-x\C-\\" 'goto-last-change)
+
+;;; goto-last-change.el ends here
index 46acbb3..89b76e9 100644 (file)
 ;; Is it me, or the slave mode of mplayer is ugly to parse? Did I miss
 ;; something?
 
 ;; Is it me, or the slave mode of mplayer is ugly to parse? Did I miss
 ;; something?
 
+(defcustom media/mplayer/executable "mplayer"
+  "The name of the executable."
+  :type 'string
+  :group 'media)
+
 (defcustom media/mplayer/args nil
   "List of arguments for mplayer."
   :type 'list
 (defcustom media/mplayer/args nil
   "List of arguments for mplayer."
   :type 'list
@@ -283,7 +288,7 @@ load Emacs less. Nil means no timing."
         (apply
          'start-process
          (append
         (apply
          'start-process
          (append
-          '("mplayer" nil "mplayer" "-slave" "-quiet")
+          `("mplayer" nil ,media/mplayer/executable "-slave" "-quiet")
           media/mplayer/args
           (when (string-match  "\\(asx\\|m3u\\|pls\\|ram\\)$" media/mplayer/url)
             (if media/mplayer/capture-dir
           media/mplayer/args
           (when (string-match  "\\(asx\\|m3u\\|pls\\|ram\\)$" media/mplayer/url)
             (if media/mplayer/capture-dir