aboutsummaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/init-ccc.el25
-rw-r--r--modules/init-crystal.el16
-rw-r--r--modules/init-diminish.el17
-rw-r--r--modules/init-dokuwiki.el12
-rw-r--r--modules/init-ecb.el29
-rw-r--r--modules/init-editing-utils.el69
-rw-r--r--modules/init-editorconfig.el16
-rw-r--r--modules/init-elpa.el41
-rw-r--r--modules/init-emmet-mode.el18
-rw-r--r--modules/init-flycheck.el35
-rw-r--r--modules/init-git.el103
-rw-r--r--modules/init-gui.el68
-rw-r--r--modules/init-html.el24
-rw-r--r--modules/init-icons.el28
-rw-r--r--modules/init-indent-guides.el18
-rw-r--r--modules/init-less.el15
-rw-r--r--modules/init-markdown.el37
-rw-r--r--modules/init-modeline.el54
-rw-r--r--modules/init-neotree.el90
-rw-r--r--modules/init-nginx.el15
-rw-r--r--modules/init-nlinum.el106
-rw-r--r--modules/init-php.el29
-rw-r--r--modules/init-pkgbuild.el10
-rw-r--r--modules/init-python.el43
-rw-r--r--modules/init-rainbow.el17
-rw-r--r--modules/init-ready.el18
-rw-r--r--modules/init-sass.el14
-rw-r--r--modules/init-scss.el14
-rw-r--r--modules/init-security.el22
-rw-r--r--modules/init-theme.el17
-rw-r--r--modules/init-utils.el31
-rw-r--r--modules/init-web-mode.el20
-rw-r--r--modules/init-whitespace.el12
-rw-r--r--modules/init-yaml.el11
-rw-r--r--modules/lib/myemacs.el37
-rw-r--r--modules/lib/sachachua.el39
36 files changed, 1170 insertions, 0 deletions
diff --git a/modules/init-ccc.el b/modules/init-ccc.el
new file mode 100644
index 0000000..6733f3e
--- /dev/null
+++ b/modules/init-ccc.el
@@ -0,0 +1,25 @@
+;;; init-ccc.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+
+;;----------------------------------------------------------------------------
+;; c++ Mode
+;;----------------------------------------------------------------------------
+(add-hook 'c++-mode-hook
+ (lambda ()
+ (setq indent-tabs-mode t)
+ (setq c-basic-offset 4)
+ (setq tab-width 4)))
+
+;; This is my default indent.
+;; After moving the cursor to line 2 I see that the relevant symbol is comment-intro.
+(c-set-offset 'comment-intro 6)
+
+(provide 'init-ccc)
+
+;; Local Variables:
+;; byte-compile-warnings: (not free-vars)
+;; End:
+;;; init-ccc.el ends here
diff --git a/modules/init-crystal.el b/modules/init-crystal.el
new file mode 100644
index 0000000..462b902
--- /dev/null
+++ b/modules/init-crystal.el
@@ -0,0 +1,16 @@
+;;; init-crystal.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+
+;;----------------------------------------------------------------------------
+;; Crystal Mode
+;;----------------------------------------------------------------------------
+(use-package crystal-mode
+ :mode ("\\.cr\\'" . crystal-mode))
+
+(provide 'init-crystal)
+
+;; End:
+;;; init-crystal.el ends here
diff --git a/modules/init-diminish.el b/modules/init-diminish.el
new file mode 100644
index 0000000..1968f0d
--- /dev/null
+++ b/modules/init-diminish.el
@@ -0,0 +1,17 @@
+;;; init-diminish.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;----------------------------------------------------------------------------
+;; Diminish - is minor modes with no modeline display
+;;----------------------------------------------------------------------------
+(use-package diminish)
+
+;; Hide undo-tree-mode
+(diminish 'undo-tree-mode)
+
+(provide 'init-diminish)
+
+;; End:
+;;; init-diminish.el ends here
diff --git a/modules/init-dokuwiki.el b/modules/init-dokuwiki.el
new file mode 100644
index 0000000..40762a5
--- /dev/null
+++ b/modules/init-dokuwiki.el
@@ -0,0 +1,12 @@
+;;; init-dokuwiki.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;; dokuwiki-mode
+(use-package dokuwiki-mode)
+
+(provide 'init-dokuwiki)
+
+;; End:
+;;; init-dokuwiki.el ends here
diff --git a/modules/init-ecb.el b/modules/init-ecb.el
new file mode 100644
index 0000000..865b206
--- /dev/null
+++ b/modules/init-ecb.el
@@ -0,0 +1,29 @@
+;;; init-ecb.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;----------------------------------------------------------------------------
+;; ECB
+;;----------------------------------------------------------------------------
+(use-package ecb
+ :config
+ (custom-set-variables '(ecb-options-version "2.50"))
+ (setq-default ecb-tip-of-the-day nil)
+ (setq ecb-examples-bufferinfo-buffer-name nil)
+
+ (defun ecb-toggle ()
+ (interactive)
+ (if ecb-minor-mode
+ (ecb-deactivate)
+ (ecb-activate)))
+ (global-set-key [f2] 'ecb-toggle)
+
+ )
+
+(provide 'init-ecb)
+
+;; Local Variables:
+;; byte-compile-warnings: (not free-vars)
+;; End:
+;;; init-ecb.el ends here
diff --git a/modules/init-editing-utils.el b/modules/init-editing-utils.el
new file mode 100644
index 0000000..b789d2c
--- /dev/null
+++ b/modules/init-editing-utils.el
@@ -0,0 +1,69 @@
+;;; init-editing-utils.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+
+;;----------------------------------------------------------------------------
+;; Remove whitespaces
+;;----------------------------------------------------------------------------
+;; Delete trailing whitespace before saving fil → all modes
+;; (add-hook 'before-save-hook 'delete-trailing-whitespace)
+
+;; Delete-trailing-whitespace-when-saving-except-certain-modes
+(add-hook 'before-save-hook
+ (lambda ()
+ (unless (eq major-mode 'diff-mode)
+ (delete-trailing-whitespace))))
+;;----------------------------------------------------------------------------
+;; Automatic pairs open symbols (, {, [...
+;; Disable for default.
+;; Uncomment the next 4 lines if you want to enable the pairs-mode
+;;(when (fboundp 'electric-pair-mode)
+;; (electric-pair-mode))
+;;(when (eval-when-compile (version< "24.4" emacs-version))
+;; (electric-indent-mode 1))
+
+;; Active auto-revert-mode that automatically reloads modified files out of Emacs.
+;; It is very useful to see logs (like auto-revert-tail-mode) among many other cases.
+(global-auto-revert-mode)
+(setq global-auto-revert-non-file-buffers t
+ auto-revert-verbose nil)
+
+;;----------------------------------------------------------------------------
+;; Show matching parens
+;;----------------------------------------------------------------------------
+(show-paren-mode 1)
+
+;;----------------------------------------------------------------------------
+;; More useful things - only one line
+;;----------------------------------------------------------------------------
+(set-default 'truncate-lines t)
+(setq show-trailing-whitespace nil)
+
+;;----------------------------------------------------------------------------
+;; Some basic preferences
+;;----------------------------------------------------------------------------
+(setq-default
+ indent-tabs-mode nil)
+
+;;----------------------------------------------------------------------------
+;; Undo-tree
+;;----------------------------------------------------------------------------
+(use-package undo-tree
+ :diminish undo-tree-mode
+ :config
+ (progn
+ (global-undo-tree-mode)
+ (setq undo-tree-visualizer-timestamps nil)
+ (setq undo-tree-visualizer-diff nil)))
+
+;;----------------------------------------------------------------------------
+(load-file "~/.emacs.d/modules/lib/myemacs.el")
+
+(provide 'init-editing-utils)
+
+;; Local Variables:
+;; byte-compile-warnings: (not free-vars)
+;; End:
+;;; init-editing-utils.el ends here
diff --git a/modules/init-editorconfig.el b/modules/init-editorconfig.el
new file mode 100644
index 0000000..614dcce
--- /dev/null
+++ b/modules/init-editorconfig.el
@@ -0,0 +1,16 @@
+;;; init-editorconfig.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;----------------------------------------------------------------------------
+;; EditorConfig
+;;----------------------------------------------------------------------------
+(use-package editorconfig
+ :config
+ (editorconfig-mode 1))
+
+(provide 'init-editorconfig)
+
+;; End:
+;;; init-editorconfig.el ends here
diff --git a/modules/init-elpa.el b/modules/init-elpa.el
new file mode 100644
index 0000000..51f29c8
--- /dev/null
+++ b/modules/init-elpa.el
@@ -0,0 +1,41 @@
+;;; init-elpa.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;; Find and load the correct package.el
+;; =====================================================
+;; use-package → https://github.com/jwiegley/use-package
+;; =====================================================
+(require 'package)
+
+;; Repositories
+;; ================
+(setq package-archives
+ '(("melpa" . "https://melpa.org/packages/")
+ ;;("melpa-stable" . "https://stable.melpa.org/packages/")
+ ("gnu" . "https://elpa.gnu.org/packages/")
+ ("org" . "https://orgmode.org/elpa/")))
+
+(setq package-archive-priorities
+ '(("melpa" . 4)
+ ("melpa-stable" . 0)
+ ("gnu" . 1)
+ ("org" . 3)))
+;; =================
+(package-initialize)
+
+(unless (package-installed-p 'use-package)
+ (package-refresh-contents)
+ (package-install 'use-package))
+
+(require 'use-package)
+(setq use-package-always-ensure t)
+;; =====================================================
+;; End use-package
+;; =====================================================
+
+(provide 'init-elpa)
+
+;; End:
+;;; init-elpa.el ends here
diff --git a/modules/init-emmet-mode.el b/modules/init-emmet-mode.el
new file mode 100644
index 0000000..565266b
--- /dev/null
+++ b/modules/init-emmet-mode.el
@@ -0,0 +1,18 @@
+;;; init-emmet-mode.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;; emmet-mode
+(use-package emmet-mode
+ ;; Enable for only languages
+ :init
+ (add-hook 'sgml-mode-hook 'emmet-mode) ;; Auto-start on any markup modes
+ (add-hook 'web-mode-hook 'emmet-mode) ;; enable Emmet on web-mode
+ (add-hook 'css-mode-hook 'emmet-mode) ;; enable Emmet's css abbreviation.
+)
+
+(provide 'init-emmet-mode)
+
+;; End:
+;;; init-emmet-mode.el ends here
diff --git a/modules/init-flycheck.el b/modules/init-flycheck.el
new file mode 100644
index 0000000..e4d383e
--- /dev/null
+++ b/modules/init-flycheck.el
@@ -0,0 +1,35 @@
+;;; init-flycheck.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+
+(use-package flycheck
+ ;; Enable for only languages
+ :init
+ ;; (add-hook 'after-init-hook 'global-flycheck-mode)
+ (add-hook 'c++-mode-hook 'flycheck-mode)
+ ;; (add-hook 'emacs-lisp-mode-hook 'flycheck-mode)
+ (add-hook 'html-mode-hook 'flycheck-mode)
+ (add-hook 'js-mode-hook 'flycheck-mode)
+ (add-hook 'web-mode-hook 'flycheck-mode)
+ (add-hook 'sh-mode-hook 'flycheck-mode)
+ :config
+ ;; support web-mode with PHP
+ (flycheck-define-checker mix-php
+ "A PHP syntax checker using the PHP command line interpreter.
+ See URL `https://php.net/manual/en/features.commandline.php'."
+ :command ("php" "-l" "-d" "error_reporting=E_ALL" "-d" "display_errors=1"
+ "-d" "log_errors=0" source)
+ :error-patterns
+ ((error line-start (or "Parse" "Fatal" "syntax") " error" (any ":" ",") " "
+ (message) " in " (file-name) " on line " line line-end))
+ :modes (php-mode php+-mode web-mode))
+
+ (add-to-list 'flycheck-checkers 'mix-php)
+ )
+
+(provide 'init-flycheck)
+
+;; End:
+;;; init-flycheck.el ends here
diff --git a/modules/init-git.el b/modules/init-git.el
new file mode 100644
index 0000000..7e96247
--- /dev/null
+++ b/modules/init-git.el
@@ -0,0 +1,103 @@
+;;; init-git.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+(setq vc-follows-symlinks t
+ find-file-visit-truename t
+ vc-handled-backends nil)
+
+(if (display-graphic-p)
+ (use-package git-gutter-fringe
+ :ensure t
+ :config
+ (global-git-gutter-mode t)
+ (setq-default fringes-outside-margins t)
+ (setq-default left-fringe-width 10)
+ (setq indicate-empty-lines nil)
+ (set-face-foreground 'git-gutter-fr:modified "purple")
+ (set-face-foreground 'git-gutter-fr:added "green")
+ (set-face-foreground 'git-gutter-fr:deleted "red")
+
+ (defun my-reshape-git-gutter (gutter)
+ "Re-shape gutter for `ivy-read'."
+ (let* ((linenum-start (aref gutter 3))
+ (linenum-end (aref gutter 4))
+ (target-line "")
+ (target-linenum 1)
+ (tmp-line "")
+ (max-line-length 0))
+ (save-excursion
+ (while (<= linenum-start linenum-end)
+ (with-no-warnings
+ (goto-line linenum-start))
+ (setq tmp-line (replace-regexp-in-string "^[ \t]*" ""
+ (buffer-substring (line-beginning-position)
+ (line-end-position))))
+ (when (> (length tmp-line) max-line-length)
+ (setq target-linenum linenum-start)
+ (setq target-line tmp-line)
+ (setq max-line-length (length tmp-line)))
+
+ (setq linenum-start (1+ linenum-start))))
+ ;; build (key . linenum-start)
+ (cons (format "%s %d: %s"
+ (if (eq 'deleted (aref gutter 1)) "-" "+")
+ target-linenum target-line)
+ target-linenum)))
+
+ (defun my-goto-git-gutter ()
+ (interactive)
+ (if git-gutter-fr:diffinfos
+ (ivy-read "git-gutters-fr:"
+ (mapcar 'my-reshape-git-gutter git-gutter-fr:diffinfos)
+ :action (lambda (e)
+ ;; ivy9+ keep `(car e)'
+ ;; ivy8- strip the `(car e)'
+ ;; we handle both data structure
+ (unless (numberp e) (setq e (cdr e)))
+ (with-no-warnings
+ (goto-line e))))
+ (message "NO git-gutters-fringe!")))))
+
+(use-package gitconfig-mode
+ :ensure t
+ :mode ("/\\.?git/?config$"
+ "/\\.gitmodules$")
+ :init (add-hook 'gitconfig-mode-hook 'flyspell-mode))
+
+(use-package gitignore-mode
+ :ensure t
+ :mode ("/\\.gitignore$"
+ "/\\.git/info/exclude$"
+ "/git/ignore$"))
+
+(use-package gitattributes-mode
+ :ensure t
+ :defer t)
+
+(use-package git-timemachine
+ :ensure t
+ :commands git-timemachine
+ :bind (:map git-timemachine-mode
+ ("c" . git-timemachine-show-current-revision)
+ ("b" . git-timemachine-switch-branch)))
+
+;;; smerge-mode video explain https://emacsgifs.github.io/public/videos/758861381898637313.mp4
+(use-package smerge-mode
+ :ensure t
+ :config
+ (defun enable-smerge-maybe ()
+ (when (and buffer-file-name (vc-backend buffer-file-name))
+ (save-excursion
+ (goto-char (point-min))
+ (when (re-search-forward "^<<<<<<< " nil t)
+ (smerge-mode +1)))))
+ (add-hook 'buffer-list-update-hook #'enable-smerge-maybe))
+
+(provide 'init-git)
+
+;; Local Variables:
+;; byte-compile-warnings: (not free-vars)
+;; End:
+;;; init-git.el ends here
diff --git a/modules/init-gui.el b/modules/init-gui.el
new file mode 100644
index 0000000..9bd32a5
--- /dev/null
+++ b/modules/init-gui.el
@@ -0,0 +1,68 @@
+;;; init-gui.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;-----------------------
+;; Remove some GUI stuff
+;;-----------------------
+(setq use-file-dialog nil)
+(setq use-dialog-box nil)
+(setq inhibit-startup-screen t)
+(setq inhibit-startup-echo-area-message t)
+(tool-bar-mode 0)
+(set-scroll-bar-mode nil)
+(menu-bar-mode 0)
+(setq make-backup-files nil) ; stop creating backup~ files
+(setq auto-save-default nil) ; stop creating #autosave# files
+
+;;----------------------------------------------------------------------------
+;; Editor configuration
+;;----------------------------------------------------------------------------
+(setq indicate-empty-lines t)
+
+(let ((no-border '(internal-border-width . 0)))
+ (add-to-list 'default-frame-alist no-border)
+ (add-to-list 'initial-frame-alist no-border))
+
+(setq frame-title-format
+ '((:eval (if (buffer-file-name)
+ (abbreviate-file-name (buffer-file-name))
+ "%b"))))
+;; Non-zero values for `line-spacing' can mess up ansi-term and co,
+;; so we zero it explicitly in those cases.
+(add-hook 'term-mode-hook
+ (lambda ()
+ (setq line-spacing 0)))
+
+;; Font theme (Monospace, or DejaVu Sans Mono if Monospace is not
+;; present)
+(condition-case nil
+ (set-frame-font "Hack-9")
+ ;; (set-frame-font "Monospace-9")
+ ;; (set-frame-font "Anonymous Pro-10")
+ (error (set-frame-font "DejaVu Sans Mono-10")))
+
+;;----------------------------------------------------------------------------
+;; Configure keys
+;;----------------------------------------------------------------------------
+(global-unset-key (kbd "C-z")) ; Stops C-z from minimizing window
+(global-set-key (kbd "M-0") (lambda () (interactive) (modify-frame-parameters nil '((alpha . 100))))) ; M-0 standard visibility
+(global-set-key (kbd "<f11>") 'myemacs/toggle-fullscreen) ; F11 FullScreen
+(global-set-key (kbd "s-C-+") 'sacha/increase-font-size) ; C-+ increase font size
+(global-set-key (kbd "s-C--") 'sacha/decrease-font-size) ; C-- decrease font size
+(global-set-key (kbd "<f12>") 'revert-buffer-no-confirm)
+(global-set-key (kbd "s-h") 'global-hl-line-mode) ; Highlight current line
+
+
+;;----------------------------------------------------------------------------
+;; clock
+;;----------------------------------------------------------------------------
+
+(setq display-time-day-and-date t)
+(display-time)
+
+(provide 'init-gui)
+
+;; End:
+;;; init-gui.el ends here
diff --git a/modules/init-html.el b/modules/init-html.el
new file mode 100644
index 0000000..45e1131
--- /dev/null
+++ b/modules/init-html.el
@@ -0,0 +1,24 @@
+;;; init-html.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;
+;; HTML Mode
+;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(add-hook 'html-mode-hook
+ (lambda ()
+ ;; Default indentation is usually 2 spaces, changing to 4.
+ (set (make-local-variable 'sgml-basic-offset) 4)))
+
+;; highlight-indent-guides-mode
+(add-hook 'html-mode-hook 'highlight-indent-guides-mode)
+
+(provide 'init-html)
+
+;; Local Variables:
+;; byte-compile-warnings: (not free-vars)
+;; End:
+;;; init-html.el ends here
diff --git a/modules/init-icons.el b/modules/init-icons.el
new file mode 100644
index 0000000..ff2d81f
--- /dev/null
+++ b/modules/init-icons.el
@@ -0,0 +1,28 @@
+;;; init-icons.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+
+;;----------------------------------
+;; All-the-icons
+;;----------------------------------
+(use-package all-the-icons)
+
+;;----------------------------------
+;; Fonts - connecting with neotree
+;;---------------------------------
+(if (file-exists-p "~/.local/share/fonts/all-the-icons.ttf")
+ (message "the icons are installed :)")
+ (setq neotree-mode-hook 'all-the-icons-install-fonts)
+ )
+
+;; fix performace
+(setq inhibit-compacting-font-caches t)
+
+(provide 'init-icons)
+
+;; Local Variables:
+;; byte-compile-warnings: (not free-vars)
+;; End:
+;;; init-icons.el ends here
diff --git a/modules/init-indent-guides.el b/modules/init-indent-guides.el
new file mode 100644
index 0000000..ced3ad0
--- /dev/null
+++ b/modules/init-indent-guides.el
@@ -0,0 +1,18 @@
+;;; init-indent-guides.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+
+;; This minor mode highlights indentation levels via font-lock
+
+(use-package highlight-indent-guides
+ :config
+ (setq highlight-indent-guides-method 'character)
+ ;; Indent character samples: fill, column or character
+ (setq highlight-indent-guides-method 'character))
+
+(provide 'init-indent-guides)
+
+;; End:
+;;; init-indent-guides.el ends here
diff --git a/modules/init-less.el b/modules/init-less.el
new file mode 100644
index 0000000..5579f18
--- /dev/null
+++ b/modules/init-less.el
@@ -0,0 +1,15 @@
+;;; init-less.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;----------------------------------------------------------------------------
+;; Less Mode
+;;----------------------------------------------------------------------------
+(use-package less-css-mode
+ :mode ("\\.less\\'" . less-css-mode))
+
+(provide 'init-less)
+
+;; End:
+;;; init-less.el ends here
diff --git a/modules/init-markdown.el b/modules/init-markdown.el
new file mode 100644
index 0000000..b7032db
--- /dev/null
+++ b/modules/init-markdown.el
@@ -0,0 +1,37 @@
+;;; init-markdown.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+(use-package markdown-mode
+ :mode (("\\.markdown\\'" . markdown-mode)
+ ("\\.md\\'" . markdown-mode))
+
+ :config
+ ;;----------------------------------------------------------------------------
+ ;; Generated HTML 5 and UTF-8 with Markdown
+ ;;----------------------------------------------------------------------------
+ (eval-after-load "markdown-mode"
+ '(defalias 'markdown-add-xhtml-header-and-footer 'as/markdown-add-xhtml-header-and-footer))
+
+ (defun as/markdown-add-xhtml-header-and-footer (title)
+ "Wrap XHTML header and footer with given TITLE around current buffer."
+ (goto-char (point-min))
+ (insert "<!DOCTYPE html>\n"
+ "<html>\n"
+ "<head>\n<title>")
+ (insert title)
+ (insert "</title>\n")
+ (insert "<meta charset=\"utf-8\" />\n")
+ (when (> (length markdown-css-paths) 0)
+ (insert (mapconcat 'markdown-stylesheet-link-string markdown-css-paths "\n")))
+ (insert "\n</head>\n\n"
+ "<body>\n\n")
+ (goto-char (point-max))
+ (insert "\n"
+ "</body>\n"
+ "</html>\n")))
+
+(provide 'init-markdown)
+
+;;; init-markdown.el ends here
diff --git a/modules/init-modeline.el b/modules/init-modeline.el
new file mode 100644
index 0000000..4444a09
--- /dev/null
+++ b/modules/init-modeline.el
@@ -0,0 +1,54 @@
+;;; init-modeline.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;----------------------------------------------------------------------------
+;; Modeline configuration
+;;----------------------------------------------------------------------------
+
+(use-package smart-mode-line)
+(use-package smart-mode-line-powerline-theme)
+(use-package sml-modeline
+ :config
+ ;; Show number of occurrences when searching
+ (setq sml/theme 'powerline)
+
+ (setq sml/no-confirm-load-theme t)
+ (setq sml/shorten-modes t)
+ ;; Show EOL mode
+ (setq sml/show-eol t)
+ ;; Show remote buffers
+ (setq sml/show-remote t)
+
+ (sml/setup)
+ (add-to-list 'sml/replacer-regexp-list '("^~/Proyectos/git/" ":Git:") t)
+ (add-to-list 'sml/replacer-regexp-list '("^~/www/" ":www:") t)
+
+ (sml-modeline-mode t))
+(use-package anzu
+ :config
+ (custom-set-variables
+ '(anzu-search-threshold 1000)
+ '(anzu-replace-threshold 1000)
+ '(anzu-deactivate-region t)
+ '(anzu-input-idle-delay 0.1)
+ '(anzu-replace-to-string-separator " => "))
+ (global-anzu-mode +1)
+ (set-face-attribute 'anzu-mode-line nil
+ :foreground "yellow" :weight 'bold)
+
+ (define-key isearch-mode-map [remap isearch-query-replace] #'anzu-isearch-query-replace)
+ (define-key isearch-mode-map [remap isearch-query-replace-regexp] #'anzu-isearch-query-replace-regexp)
+
+ ;;----------------------------------------------------------------------------
+ ;; Keyboard shortcuts in Anzu Mode
+ ;;----------------------------------------------------------------------------
+ (global-set-key (kbd "M-%") 'anzu-query-replace)
+ (global-set-key (kbd "s-<SPC>") 'anzu-query-replace))
+
+(load-file "~/.emacs.d/modules/lib/myemacs.el")
+(provide 'init-modeline)
+
+;; End:
+;;; init-modeline.el ends here
diff --git a/modules/init-neotree.el b/modules/init-neotree.el
new file mode 100644
index 0000000..ff38aa8
--- /dev/null
+++ b/modules/init-neotree.el
@@ -0,0 +1,90 @@
+;;; init-neotree.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;-----------------------------------
+;; Neotree - NerdTree for Vim
+;;-----------------------------------
+
+(use-package shrink-path
+ :ensure t)
+
+(use-package neotree
+ :ensure t
+ :commands (neotree-show
+ neotree-hide
+ neotree-toggle
+ neotree-dir
+ neotree-find
+ neo-global--with-buffer
+ neo-global--window-exists-p)
+ :bind (([f8] . neotree-toggle)
+ (:map neotree-mode-map
+ ("<C-return>" . neotree-change-root)
+ ("C" . neotree-change-root)
+ ("c" . neotree-create-node)
+ ("+" . neotree-create-node)
+ ("d" . neotree-delete-node)
+ ("r" . neotree-rename-node)))
+ :config
+ (setq neo-create-file-auto-open nil
+ neo-auto-indent-point nil
+ neo-autorefresh t
+ neo-smart-open t
+ neo-mode-line-type 'none
+ neo-window-width 25
+ neo-show-updir-line nil
+ neo-theme (if (display-graphic-p) 'icons 'arrow)
+ neo-banner-message nil
+ neo-confirm-create-file #'off-p
+ neo-confirm-create-directory #'off-p
+ neo-show-hidden-files nil
+ neo-keymap-style 'concise
+ neo-hidden-regexp-list
+ '(;; vcs folders
+ "^\\.\\(git\\|hg\\|svn\\)$"
+ ;; compiled files
+ "\\.\\(pyc\\|o\\|elc\\|lock\\|css.map\\)$"
+ ;; generated files, caches or local pkgs
+ "^\\(node_modules\\|vendor\\|.\\(project\\|cask\\|yardoc\\|sass-cache\\)\\)$"
+ ;; org-mode folders
+ "^\\.\\(sync\\|export\\|attach\\)$"
+ "~$"
+ "^#.*#$"))
+
+ (when (bound-and-true-p winner-mode)
+ (push neo-buffer-name winner-boring-buffers))
+
+ (defun shrink-root-entry (node)
+ "shrink-print pwd in neotree"
+ (insert (propertize (concat (shrink-path-dirs node) "\n") 'face `(:inherit (,neo-root-dir-face)))))
+
+ (advice-add #'neo-buffer--insert-root-entry :override #'shrink-root-entry))
+
+(defun neotree-project-dir-toggle ()
+ "Open NeoTree using the project root, using find-file-in-project or the current buffer directory."
+ (interactive)
+ (let ((project-dir
+ (ignore-errors
+ ;;; Pick one: projectile or find-file-in-project
+ (projectile-project-root)))
+ (file-name (buffer-file-name))
+ (neo-smart-open t))
+ (if (and (fboundp 'neo-global--window-exists-p)
+ (neo-global--window-exists-p))
+ (neotree-hide)
+ (progn
+ (neotree-show)
+ (if project-dir
+ (neotree-dir project-dir))
+ (if file-name
+ (neotree-find file-name))))))
+
+
+(provide 'init-neotree)
+
+;; Local Variables:
+;; byte-compile-warnings: (not free-vars)
+;; End:
+;;; init-neotree.el ends here
diff --git a/modules/init-nginx.el b/modules/init-nginx.el
new file mode 100644
index 0000000..bc8cdad
--- /dev/null
+++ b/modules/init-nginx.el
@@ -0,0 +1,15 @@
+;;; init-nginx.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;---------------------------
+;; Nginx Mode
+;;---------------------------
+(use-package nginx-mode
+ :mode ("/nginx/sites-\\(?:available\\|enabled\\)/" . nginx-mode))
+
+(provide 'init-nginx)
+
+;; End:
+;;; init-nginx.el ends here
diff --git a/modules/init-nlinum.el b/modules/init-nlinum.el
new file mode 100644
index 0000000..be26193
--- /dev/null
+++ b/modules/init-nlinum.el
@@ -0,0 +1,106 @@
+;;; init-nlinum.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;----------------------------------------------------------------------------
+;; Line numbers
+;;----------------------------------------------------------------------------
+;; Linum snippets from: https://www.emacswiki.org/emacs/LineNumbers
+(use-package nlinum
+ :config
+ (add-hook 'find-file-hook (lambda () (linum-mode 1)))
+ (linum-mode)
+ (setq global-linum-mode t))
+
+(use-package linum)
+(use-package hl-line)
+
+(defface my-linum-hl
+ `((t :inherit linum :background ,(face-background 'hl-line nil t)))
+ "Face for the current line number."
+ :group 'linum)
+(add-hook 'linum-before-numbering-hook 'my-linum-get-format-string)
+
+(defun my-linum-get-format-string ()
+ "Format the string of the column in the buffer.
+It helps to show the numbering plus a separation bar."
+ (let* ((width (1+ (length (number-to-string
+ (count-lines (point-min) (point-max))))))
+ (format (concat "%" (number-to-string width) "d \u2502")))
+ (setq my-linum-format-string format)))
+
+(defvar my-linum-current-line-number 0)
+
+(defun my-linum-format (line-number)
+ "Defines LINE-NUMBER the numbering format of each.
+this helps maintain the format in the numbering"
+ (propertize (format my-linum-format-string line-number) 'face
+ (if (eq line-number my-linum-current-line-number)
+ 'my-linum-hl
+ 'linum)))
+(setq linum-format 'my-linum-format)
+
+(defadvice linum-update (around my-linum-update)
+ "Defines LINUM-UPDATE for update lines.
+this helps maintain the format in the numbering"
+ (let ((my-linum-current-line-number (line-number-at-pos)))
+ ad-do-it))
+(ad-activate 'linum-update)
+
+(defvar *linum-mdown-line* nil)
+
+(defun line-at-click ()
+ "Funtions for position lines.
+this helps maintain the move visual."
+ (save-excursion
+ (let ((click-y (cdr (cdr (mouse-position))))
+ (line-move-visual-store line-move-visual))
+ (setq line-move-visual t)
+ (goto-char (window-start))
+
+ (with-no-warnings
+ (next-line (1- click-y)))
+
+ (setq line-move-visual line-move-visual-store)
+ ;; If you are using tabbar substitute the next line with
+ ;; (line-number-at-pos))))
+ (1+ (line-number-at-pos)))))
+
+(defun md-select-linum ()
+ "Funtions for position lines.
+this helps maintain the move visual."
+ (interactive)
+ (with-no-warnings
+ (goto-line (line-at-click)))
+ (set-mark (point))
+ (setq *linum-mdown-line*
+ (line-number-at-pos)))
+
+(defun mu-select-linum ()
+ "Funtions for position lines.
+this helps maintain the move visual."
+ (interactive)
+ (when *linum-mdown-line*
+ (let (mu-line)
+ ;; (goto-line (line-at-click))
+ (setq mu-line (line-at-click))
+ (with-no-warnings
+ (goto-line (max *linum-mdown-line* mu-line)))
+
+ (set-mark (line-end-position))
+ (with-no-warnings
+ (goto-line (min *linum-mdown-line* mu-line)))
+ (setq *linum-mdown*
+ nil))))
+
+(global-set-key (kbd "<left-margin> <down-mouse-1>") 'md-select-linum)
+(global-set-key (kbd "<left-margin> <mouse-1>") 'mu-select-linum)
+(global-set-key (kbd "<left-margin> <drag-mouse-1>") 'mu-select-linum)
+
+(provide 'init-nlinum)
+
+;; Local Variables:
+;; byte-compile-warnings: (not free-vars)
+;; End:
+;;; init-nlinum.el ends here
diff --git a/modules/init-php.el b/modules/init-php.el
new file mode 100644
index 0000000..b81e5b8
--- /dev/null
+++ b/modules/init-php.el
@@ -0,0 +1,29 @@
+;;; init-php.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+(use-package php-refactor-mode
+ :after (php-mode)
+ :mode ("\\.php\\'" . php-mode)
+ :config
+ (add-hook 'php-mode-hook 'php-refactor-mode))
+
+(use-package php-mode
+ :ensure t)
+
+(use-package company-php
+ :ensure t
+ :config
+ (defun cfg:php-mode-hook ()
+ (interactive)
+ (require 'company-php)
+ (company-mode t)
+ (add-to-list 'company-backends 'company-ac-php-backend))
+
+ (add-hook 'php-mode-hook 'cfg:php-mode-hook))
+
+(add-hook 'php-mode-hook (lambda () (subword-mode 1)))
+
+(provide 'init-php)
+;;; init-php.el ends here
diff --git a/modules/init-pkgbuild.el b/modules/init-pkgbuild.el
new file mode 100644
index 0000000..427e442
--- /dev/null
+++ b/modules/init-pkgbuild.el
@@ -0,0 +1,10 @@
+;;; init-pkgbuild.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+(use-package pkgbuild-mode
+ :mode ("/PKGBUILD$" . pkgbuild-mode))
+
+(provide 'init-pkgbuild)
+;;; init-pkgbuild.el ends here
diff --git a/modules/init-python.el b/modules/init-python.el
new file mode 100644
index 0000000..cbce258
--- /dev/null
+++ b/modules/init-python.el
@@ -0,0 +1,43 @@
+;;; init-python.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;----------------------------------------------------------------------------
+;; Python Mode
+;;----------------------------------------------------------------------------
+(add-hook 'python-mode-hook
+ (lambda ()
+ (setq indent-tabs-mode nil)
+ (setq python-indent-guess-indent-offset nil)
+ (setq python-indent-offset 4)))
+
+
+;;----------------------------------------------------------------------------
+;; Jedi - Python auto-completion for Emacs
+;;----------------------------------------------------------------------------
+(use-package jedi)
+(setq auto-mode-alist
+ (append '(("SConstruct\\'" . python-mode)
+ ("SConscript\\'" . python-mode))
+ auto-mode-alist))
+
+(use-package pip-requirements)
+(defun my/python-mode-stuff ()
+ "Jedi make everything a lot easier for everybody!.
+It's helps prepare jedi in Emacs."
+ (jedi:setup)
+ (define-key python-mode-map (kbd "C-]") 'jedi:goto-definition) ;goto define
+ (local-set-key (kbd "<f1>") 'jedi:show-doc)
+ (setq jedi:complete-on-dot t) ; optional
+ )
+;; Added Jedi-mode to python-mode
+(add-hook 'python-mode-hook 'my/python-mode-stuff)
+;; M-x jedi:install-server
+
+(provide 'init-python)
+
+;; Local Variables:
+;; byte-compile-warnings: (not free-vars)
+;; End:
+;;; init-python.el ends here
diff --git a/modules/init-rainbow.el b/modules/init-rainbow.el
new file mode 100644
index 0000000..52db71e
--- /dev/null
+++ b/modules/init-rainbow.el
@@ -0,0 +1,17 @@
+;;; init-rainbow.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;; rainbow-mode
+(use-package rainbow-mode
+ :init
+ (add-hook 'css-mode-hook 'rainbow-mode)
+ (add-hook 'sass-mode-hook 'rainbow-mode)
+ (add-hook 'scss-mode-hook 'rainbow-mode)
+ (add-hook 'less-mode-hook 'rainbow-mode)
+ (add-hook 'web-mode-hook 'rainbow-mode)
+ (add-hook 'html-mode-hook 'rainbow-mode))
+
+(provide 'init-rainbow)
+;;; init-rainbow.el ends here
diff --git a/modules/init-ready.el b/modules/init-ready.el
new file mode 100644
index 0000000..dba8a0f
--- /dev/null
+++ b/modules/init-ready.el
@@ -0,0 +1,18 @@
+;;; init-ready.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;-------------------------
+;; Emacs Ready :)
+;;-------------------------
+(add-hook 'emacs-startup-hook
+ (lambda ()
+ (message "Emacs ready in %s with %d garbage collections."
+ (format "%.2f seconds"
+ (float-time
+ (time-subtract after-init-time before-init-time)))
+ gcs-done)))
+
+(provide 'init-ready)
+;;; init-ready.el ends here
diff --git a/modules/init-sass.el b/modules/init-sass.el
new file mode 100644
index 0000000..cd9c878
--- /dev/null
+++ b/modules/init-sass.el
@@ -0,0 +1,14 @@
+;;; init-sass.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;----------------------------------------------------------------------------
+;; Sass Mode
+;;----------------------------------------------------------------------------
+(use-package sass-mode
+ :mode ("\\.sass\\'" . sass-mode))
+
+(provide 'init-sass)
+
+;;; init-sass.el ends here
diff --git a/modules/init-scss.el b/modules/init-scss.el
new file mode 100644
index 0000000..76cb770
--- /dev/null
+++ b/modules/init-scss.el
@@ -0,0 +1,14 @@
+;;; init-scss.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;----------------------------------------------------------------------------
+;; Scss Mode
+;;----------------------------------------------------------------------------
+(use-package scss-mode
+ :mode ("\\.scss\\'" . scss-mode))
+
+(provide 'init-scss)
+
+;;; init-scss.el ends here
diff --git a/modules/init-security.el b/modules/init-security.el
new file mode 100644
index 0000000..68b1eb6
--- /dev/null
+++ b/modules/init-security.el
@@ -0,0 +1,22 @@
+;;; init-security.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;---------------------------------------------------------------------------------------------
+;; Security. Check https://web.archive.org/web/20170413150436/https://ogbe.net/emacsconfig.html
+;;---------------------------------------------------------------------------------------------
+(setq tls-checktrust t)
+(setq gnutls-verify-error t)
+(let ((trustfile "/etc/ssl/cert.pem"))
+ (setq tls-program
+ `(,(format "gnutls-cli --x509cafile %s -p %%p %%h" trustfile)
+ ,(format "openssl s_client -connect %%h:%%p -CAfile %s -no_ssl2 -ign_eof" trustfile)))
+ (setq gnutls-trustfiles (list trustfile)))
+
+(provide 'init-security)
+
+;; Local Variables:
+;; byte-compile-warnings: (not free-vars)
+;; End:
+;;; init-security.el ends here
diff --git a/modules/init-theme.el b/modules/init-theme.el
new file mode 100644
index 0000000..379b294
--- /dev/null
+++ b/modules/init-theme.el
@@ -0,0 +1,17 @@
+;;; init-theme.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+(use-package sublime-themes
+ :config
+ (load-theme 'spolsky t)
+ ;; Fix linum current-line highlight. Doesn't looks good with this theme
+ (defface my-linum-hl
+ '((t :background "gray30" :foreground "gold"))
+ "Face for the currently active Line number"
+ :group 'linum))
+
+(provide 'init-theme)
+
+;;; init-theme.el ends here
diff --git a/modules/init-utils.el b/modules/init-utils.el
new file mode 100644
index 0000000..ffcdd9f
--- /dev/null
+++ b/modules/init-utils.el
@@ -0,0 +1,31 @@
+;;; init-utils.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;; Loads functions from libs
+(defun load-directory (dir)
+ "Load functions from the libs DIR.
+read the .el files"
+ (let ((load-it (lambda (f)
+ (load-file (concat (file-name-as-directory dir) f)))
+ ))
+ (mapc load-it (directory-files dir nil "\\.el$"))))
+
+;; Load lib functions
+(load-directory (expand-file-name "~/.emacs.d/modules/lib/" user-emacs-directory))
+
+;; This is borrowed from https://github.com/purcell/emacs.d/blob/master/lisp/init-utils.el by Steve Purcell but I have added some stuff.
+(if (fboundp 'with-eval-after-load)
+ (defalias 'after-load 'with-eval-after-load)
+ (defmacro after-load (feature &rest body)
+ "After FEATURE is loaded, evaluate BODY."
+ (declare (indent defun))
+ `(eval-after-load, feature
+ '(progn ,@body))))
+
+;; Elapsed time
+(load-file "~/.emacs.d/modules/lib/myemacs.el")
+
+(provide 'init-utils)
+;;; init-utils.el ends here
diff --git a/modules/init-web-mode.el b/modules/init-web-mode.el
new file mode 100644
index 0000000..ae3be70
--- /dev/null
+++ b/modules/init-web-mode.el
@@ -0,0 +1,20 @@
+;;; init-web-mode.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+(use-package web-mode
+ :mode (("\\.html?\\'" . web-mode)
+ ("\\.djhtml\\'" . web-mode)
+ ("\\.tpl\\'" . web-mode)
+ ("\\.jsp\\'" . web-mode)
+ ("\\.gsp\\'" . web-mode)
+ ("\\.ctp\\'" . web-mode))
+ :config
+ ;; web-modeの設定
+ (setq web-mode-enable-current-element-highlight t)
+ (set-face-background 'web-mode-current-element-highlight-face "#a3a3a3")
+ )
+
+(provide 'init-web-mode)
+;;; init-web-mode.el ends here
diff --git a/modules/init-whitespace.el b/modules/init-whitespace.el
new file mode 100644
index 0000000..573dbb9
--- /dev/null
+++ b/modules/init-whitespace.el
@@ -0,0 +1,12 @@
+;;; init-whitespace.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;;----------------------------------------------------------------------------
+;; Whitespace Mode | tool
+;;----------------------------------------------------------------------------
+(use-package whitespace-cleanup-mode)
+
+(provide 'init-whitespace)
+;;; init-whitespace.el ends here
diff --git a/modules/init-yaml.el b/modules/init-yaml.el
new file mode 100644
index 0000000..47c533c
--- /dev/null
+++ b/modules/init-yaml.el
@@ -0,0 +1,11 @@
+;;; init-yaml.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;
+
+;;; Code:
+;; yaml-mode
+(use-package yaml-mode
+ :mode ("\\.yml\\'" . yaml-mode))
+
+(provide 'init-yaml)
+;;; init-yaml.el ends here
diff --git a/modules/lib/myemacs.el b/modules/lib/myemacs.el
new file mode 100644
index 0000000..1800e97
--- /dev/null
+++ b/modules/lib/myemacs.el
@@ -0,0 +1,37 @@
+;;; myemacs.el --- .Emacs Configuration -*- lexical-binding: t -*-
+;;; Commentary:
+;;; myemacs reloj
+
+;;; Code:
+;;----------------------------------------------------------------------------
+;; Some cool functions
+;;----------------------------------------------------------------------------
+;; These functions are made by me (Quitter: @heckyel) or
+;; heavily modified by me
+
+;;----------------------------------------------------------------------------
+;; Toggles fullscreen
+;;----------------------------------------------------------------------------
+(defun myemacs/toggle-fullscreen ()
+ "Return a message string if the current doc string is invalid."
+ (interactive)
+ (x-send-client-message nil 0 nil "_NET_WM_STATE" 32
+ '(2 "_NET_WM_STATE_FULLSCREEN" 0)))
+
+;;----------------------------------------------------------------------------
+;; Runtime Emacs
+;;----------------------------------------------------------------------------
+(defun elapsed-time ()
+ "Return a message string if the current doc string is invalid.
+Emacs runtime: See the following URL for more details.
+https://emacs.stackexchange.com/questions/13535/function-to-get-init-el-file-loading-times-multiple-times?rq=1"
+ (let ((elapsed (float-time (time-subtract (current-time)
+ emacs-start-time))))
+ (message "[STARTUP] Loading %s ... done (%.3fs)" load-file-name elapsed)))
+
+(provide 'myemacs)
+
+;; Local Variables:
+;; byte-compile-warnings: (not free-vars)
+;; End:
+;;; myemacs.el ends here
diff --git a/modules/lib/sachachua.el b/modules/lib/sachachua.el
new file mode 100644
index 0000000..c862223
--- /dev/null
+++ b/modules/lib/sachachua.el
@@ -0,0 +1,39 @@
+;; Increase-decrease functions from Sacha Chua
+(defun sacha/increase-font-size ()
+ (interactive)
+ (set-face-attribute 'default
+ nil
+ :height
+ (ceiling (* 1.10
+ (face-attribute 'default :height)))))
+(defun sacha/decrease-font-size ()
+ (interactive)
+ (set-face-attribute 'default
+ nil
+ :height
+ (floor (* 0.9
+ (face-attribute 'default :height)))))
+
+;; Not original from Sacha. Taken from: http://emacsredux.com/blog/2013/05/22/smarter-navigation-to-the-beginning-of-a-line/
+(defun sacha/smarter-move-beginning-of-line (arg)
+ "Move point back to indentation of beginning of line.
+
+Move point to the first non-whitespace character on this line.
+If point is already there, move to the beginning of the line.
+Effectively toggle between the first non-whitespace character and
+the beginning of the line.
+
+If ARG is not nil or 1, move forward ARG - 1 lines first. If
+point reaches the beginning or end of the buffer, stop there."
+ (interactive "^p")
+ (setq arg (or arg 1))
+
+ ;; Move lines first
+ (when (/= arg 1)
+ (let ((line-move-visual nil))
+ (forward-line (1- arg))))
+
+ (let ((orig-point (point)))
+ (back-to-indentation)
+ (when (= orig-point (point))
+ (move-beginning-of-line 1))))