;;; ravi-init-function.el --- functionality ;; Copyright (C) 2013 ;; Author: ;; Keywords: ;; 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 . ;;; Commentary: ;; Enable functionality ;;; Code: ;; Enable emacs functionality that is disabled by default (setq disabled-command-function nil) ;(setq enable-recursive-minibuffers t) ;; Use emacsclient from other programs (require 'server) (unless (server-running-p) (server-start)) ;; Stolen from prelude (defadvice server-visit-files (before parse-numbers-in-lines (files proc &optional nowait) activate) "Open file with emacsclient with cursors positioned on requested line. Most of console-based utilities prints filename in format 'filename:linenumber'. So you may wish to open filename in that format. Just call: emacsclient filename:linenumber and file 'filename' will be opened and cursor set on line 'linenumber'" (ad-set-arg 0 (mapcar (lambda (fn) (let ((name (car fn))) (if (string-match "^\\(.*?\\):\\([0-9]+\\)\\(?::\\([0-9]+\\)\\)?$" name) (cons (match-string 1 name) (cons (string-to-number (match-string 2 name)) (string-to-number (or (match-string 3 name) "")))) fn))) files))) (use-package edit-server :if window-system :commands edit-server-start :init (if after-init-time (edit-server-start) (add-hook 'after-init-hook #'(lambda() (edit-server-start)))) :config (setq edit-server-new-frame-alist '((name . "Edit with Emacs FRAME") ;; (top . 200) ;; (left . 200) (width . 150) (height . 50) (minibuffer . t) (menu-bar-lines . t) (window-system . x)))) ;; Combined launcher and toggle-maps (defun ravi/setup-toggle-launcher-map () (bind-keys :map ctl-x-map :prefix-map ravi/setup-toggle-launcher-map :prefix-docstring "Launcher/toggle map" :prefix "t" ;; Toggles ("c" . column-number-mode) ("e" . toggle-debug-on-error) ("f" . auto-fill-mode) ("l" . toggle-truncate-lines) ("q" . toggle-debug-on-quit) ;; Generalized version of `read-only-mode'. ("r" . dired-toggle-read-only) ("w" . whitespace-mode) ;; Launchers ("P" . package-list-packages) ("p" . proced) ("d" . ediff-buffers) ("F" . find-dired)) (autoload 'dired-toggle-read-only "dired" nil t) ;; (add-to-list 'guide-key/guide-key-sequence "C-x t") ) (ravi/setup-toggle-launcher-map) ;; Start something going on saving a file (use-package firestarter :config (progn (firestarter-mode 1)) :diminish firestarter-mode) (defun ravi/find-path-name-relative-to-project-root () "Find path of current buffer file relative to project root" (interactive) (let* ((root-dir (and (buffer-file-name) (or (and (fboundp 'magit-get-top-dir) (magit-get-top-dir)) (and (fboundp 'vc-root-dir) (vc-root-dir)) (locate-dominating-file (buffer-file-name) ".git") (locate-dominating-file (buffer-file-name) dir-locals-file)))) (relative-name (and root-dir (file-relative-name (buffer-file-name) root-dir)))) relative-name)) (defun ravi/apply-shell-command-relative-to-project (command-template) "Apply shell command relative to project COMMAND-TEMPLATE should be a string with the following substitutions allowed: %p: full path to file name %r: path relative to project root %f: file name %N: unquoted relative path name (should be used extremely carefully) " (interactive "sEnter command template: ") (let* ((path (shell-quote-argument (or (buffer-file-name) ""))) (rel-name (ravi/find-path-name-relative-to-project-root)) (rel-path (shell-quote-argument (or rel-name ""))) (file (shell-quote-argument (file-name-nondirectory (or path "")))) (cmd (and rel-name (format-spec command-template (format-spec-make ?p path ?r rel-path ?f file ?N rel-name))))) (if cmd (shell-command cmd) (if (not (buffer-file-name)) (message "Not in a file buffer") (message "Unable to find project root"))))) (defvar ravi/shell-command-relative nil "Variable to set in `dir-locals-file' for use with `ravi/apply-shell-command-relative-to-project-auto'. See `ravi/apply-shell-command-relative-to-project' for more details.") (defun ravi/apply-shell-command-relative-to-project-auto () "Apply shell command relative to project from variable `ravi/shell-command-relative'. See `ravi/apply-shell-command-relative-to-project' for more details. " (interactive) (when (and (stringp ravi/shell-command-relative) (> (length ravi/shell-command-relative) 0)) (ravi/apply-shell-command-relative-to-project ravi/shell-command-relative))) (use-package shell-command+ :bind ("M-!" . shell-command+)) (use-package envrc :config (envrc-global-mode)) (provide 'ravi-init-function) ;;; ravi-init-function.el ends here