(defun fcuny/switch-to-scratch () "Switch to scratch, grab the region if it's active." (interactive) (let ((contents (and (region-active-p) (buffer-substring (region-beginning) (region-end))))) (switch-to-buffer "*scratch*") (if contents (progn (goto-char (buffer-end 1)) (insert contents))))) (defun fcuny/rename-this-buffer-and-file () "Renames current buffer and file it is visiting." (interactive) (let ((name (buffer-name)) (filename (buffer-file-name)) (read-file-name-function 'read-file-name-default)) (if (not (and filename (file-exists-p filename))) (error "Buffer '%s' is not visiting a file!" name) (let ((new-name (read-file-name "New name: " filename))) (cond ((get-buffer new-name) (error "A buffer named '%s' already exists!" new-name)) (t (rename-file filename new-name 1) (rename-buffer new-name) (set-visited-file-name new-name) (set-buffer-modified-p nil) (message "File '%s' successfully renamed to '%s'" name (file-name-nondirectory new-name)))))))) (defun fcuny/visit-term-buffer () "Create or visit a terminal buffer." (interactive) (if (not (get-buffer "*ansi-term*")) (progn (split-window-sensibly (selected-window)) (other-window 1) (ansi-term (getenv "SHELL"))) (switch-to-buffer-other-window "*ansi-term*"))) ;; this functions are to make it easy to work with `pants' (defvar fcuny/build-command "cd ~/src/source && ./pants --no-colors" "Command to use to execute the target") (defvar fcuny/build-file "BUILD" "Name of the file containing our build targets") (defun fcuny/--find-directory-containing-build-file (file) "Find the directory containing the build file." (let ((root nil) try) (while (not (or root (null file) (string-match locate-dominating-stop-dir-regexp file))) (setq try (if (stringp fcuny/build-file) (file-exists-p (expand-file-name fcuny/build-file file)))) (cond (try (setq root file)) ((equal file (setq file (file-name-directory (directory-file-name file)))) (setq file nil)))) (and root (expand-file-name (file-name-as-directory root))))) (defun fcuny/--build-action (target) (compile (format "%s binary %s" fcuny/build-command target))) (defun fcuny/--build-target-list (file) "Generate a list of existing targets" (let ((build-command (format "%s list %s:" fcuny/build-command file)) targets target) (with-temp-buffer (insert (shell-command-to-string build-command)) (goto-char (point-min)) (while (re-search-forward "^\\(.+\\)$" nil t) (setq target (match-string 1)) (unless (or (save-excursion (goto-char (match-beginning 0)) (forward-line -1) (looking-at "^# Not a target:")) (string-match "^\\." target)) (push target targets)))) (helm (helm :sources `((name . "Targets") (candidates . ,targets) (action . fcuny/build-action)))))) (defun fcuny/find-build-file () "Find the build file and if it exists, open it." (interactive) (let ((build-file (fcuny/--find-directory-containing-build-file (file-name-directory (buffer-file-name))))) (if build-file (find-file (concat build-file fcuny/build-file)) (error "Could not find %s" fcuny/build-file)))) (defun fcuny/build-run-target () "List the targets for a BUILD file." (interactive) (let ((build-file (fcuny/--find-directory-containing-build-file (file-name-directory (buffer-file-name))))) (if build-file (fcuny/--build-target-list build-file) (error "Could not find %s" fcuny/build-file)))) (provide 'core-defun)