emacs - add .mm file for objec mode
[dotfiles.git] / emacs.d / config.org
index b176144..5b24108 100644 (file)
@@ -1666,13 +1666,21 @@ here on Mac, just use "open" commands to pen =.pdf=,  =.html= and image files
 #+END_SRC
 
 * Completion
-company mode and company-statistics
+** company mode and company-statistics
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package company
     :ensure t
     :diminish company-mode
     :init (setq company-idle-delay 0.1)
+    (setq company-selection-wrap-around t)
     :config
+    (define-key company-active-map (kbd "M-n") nil)
+    (define-key company-active-map (kbd "M-p") nil)
+    (define-key company-active-map (kbd "C-n") #'company-select-next)
+    (define-key company-active-map (kbd "C-p") #'company-select-previous)
+     ;; should map both (kbd "TAB") and [tab],https://github.com/company-mode/company-mode/issues/75
+    (define-key company-active-map (kbd "TAB") #'company-complete-selection)
+    (define-key company-active-map [tab] #'company-complete-selection)
     (global-company-mode))
 
   (use-package company-statistics
@@ -1681,6 +1689,116 @@ company mode and company-statistics
     (company-statistics-mode))
 #+END_SRC
 
+** YASnippet
+*** yasnippet
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package yasnippet
+    :ensure t
+    :defer t
+    :init
+    (add-hook 'prog-mode-hook #'yas-minor-mode)
+    :config
+    (yas-reload-all))
+#+END_SRC
+
+
+** company and yasnippet
+Add yasnippet as the company candidates
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  ;Add yasnippet support for all company backends
+  ;https://github.com/syl20bnr/spacemacs/pull/179
+  (defvar company-mode/enable-yas t
+    "Enable yasnippet for all backends.")
+
+  (defun company-mode/backend-with-yas (backend)
+    (if (or (not company-mode/enable-yas) (and (listp backend) (member 'company-yasnippet backend)))
+        backend
+      (append (if (consp backend) backend (list backend))
+              '(:with company-yasnippet))))
+
+  (setq company-backends (mapcar #'company-mode/backend-with-yas company-backends))
+#+END_SRC
+
+Refer, [[http://emacs.stackexchange.com/questions/7908/how-to-make-yasnippet-and-company-work-nicer][how-to-make-yasnippet-and-company-work-nicer]]
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (defun check-expansion ()
+    (save-excursion
+      (if (looking-at "\\_>") t
+        (backward-char 1)
+        (if (looking-at "\\.") t
+          (backward-char 1)
+          (if (looking-at "->") t nil)))))
+
+  (defun do-yas-expand ()
+    (let ((yas/fallback-behavior 'return-nil))
+      (yas/expand)))
+
+  (defun tab-indent-or-complete ()
+    (interactive)
+    (cond
+     ((minibufferp)
+      (minibuffer-complete))
+     (t
+      (indent-for-tab-command)
+      (if (or (not yas/minor-mode)
+              (null (do-yas-expand)))
+          (if (check-expansion)
+              (progn
+                (company-manual-begin)
+                (if (null company-candidates)
+                    (progn
+                      (company-abort)
+                      (indent-for-tab-command)))))))))
+
+  (defun tab-complete-or-next-field ()
+    (interactive)
+    (if (or (not yas/minor-mode)
+            (null (do-yas-expand)))
+        (if company-candidates
+            (company-complete-selection)
+          (if (check-expansion)
+              (progn
+                (company-manual-begin)
+                (if (null company-candidates)
+                    (progn
+                      (company-abort)
+                      (yas-next-field))))
+            (yas-next-field)))))
+
+  (defun expand-snippet-or-complete-selection ()
+    (interactive)
+    (if (or (not yas/minor-mode)
+            (null (do-yas-expand))
+            (company-abort))
+        (company-complete-selection)))
+
+  (defun abort-company-or-yas ()
+    (interactive)
+    (if (null company-candidates)
+        (yas-abort-snippet)
+      (company-abort)))
+
+  '
+  ;; (require 'company)
+  ;; (require 'yasnippet)
+
+
+  ;; (global-set-key [tab] 'tab-indent-or-complete)
+  ;; (global-set-key (kbd "TAB") 'tab-indent-or-complete)
+  ;; (global-set-key [(control return)] 'company-complete-common)
+
+  ;; (define-key company-active-map [tab] 'expand-snippet-or-complete-selection)
+  ;; (define-key company-active-map (kbd "TAB") 'expand-snippet-or-complete-selection)
+
+  ;; (define-key yas-minor-mode-map [tab] nil)
+  ;; (define-key yas-minor-mode-map (kbd "TAB") nil)
+
+  ;; (define-key yas-keymap [tab] 'tab-complete-or-next-field)
+  ;; (define-key yas-keymap (kbd "TAB") 'tab-complete-or-next-field)
+  ;; (define-key yas-keymap [(control tab)] 'yas-next-field)
+  ;; (define-key yas-keymap (kbd "C-g") 'abort-company-or-yas)
+#+END_SRC
+
 * Libs
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package s
@@ -1803,6 +1921,9 @@ C/C++ ide tools
           (list c-mode-map
                 c++-mode-map
                 objc-mode-map))
+
+  ;; objective c
+  (add-to-list 'auto-mode-alist '("\\.mm\\'" . objc-mode))
 #+END_SRC
 
 *** irony
@@ -1871,10 +1992,13 @@ irony-company
     :config
     (add-to-list 'company-c-headers-path-system "/usr/include/c++/4.2.1/"))
 
-  (with-eval-after-load 'company
-    (add-to-list 'company-backends 'company-irony)
-    (add-to-list 'company-backends 'company-c-headers))
+  ;; (with-eval-after-load 'company
+  ;;   (add-to-list 'company-backends 'company-irony)
+  ;;   (add-to-list 'company-backends 'company-c-headers))
 
+  (with-eval-after-load 'company
+    (push  '(company-irony :with company-yasnippet) company-backends)
+    (push  '(company-c-headers :with company-yasnippet) company-backends))
 
   (with-eval-after-load 'flycheck
     (add-hook 'flycheck-mode-hook #'flycheck-irony-setup))
@@ -1886,17 +2010,6 @@ irony-company
     :ensure t)
 #+END_SRC
 
-*** yasnippet
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (use-package yasnippet
-    :ensure t
-    :defer t
-    :init
-    (add-hook 'prog-mode-hook #'yas-minor-mode)
-    :config
-    (yas-reload-all))
-#+END_SRC
-
 *** gtags
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package ggtags
@@ -1924,7 +2037,6 @@ irony-company
   (global-semantic-idle-scheduler-mode 1)
 
   (semantic-mode 1)
-
 #+END_SRC
 
 *** google C style