Doom Emacs

Thanks hlissner for bringing https://github.com/hlissner/doom-emacs

Completion in buffer

Doom comes with company

The need

I want to bring back C-n in emacs that looks like vim

Setup package

(use-package! company
  :config
  ;; disable auto popup after x seconds
  (setq company-idle-delay nil
        ;; allow code completion inside comments and string (took 5hours to figure out...)
        company-dabbrev-code-everywhere t)
  (define-key company-active-map (kbd "<tab>") #'company-complete-common)
  ;; you can use space to complete word
  (define-key company-active-map (kbd "SPC") #'company-complete-selection))

Setup C-n

(map! :i  "C-n" #'+company/dabbrev
      :i  "C-p" #'+company/dabbrev-code-previous)

I want a space after pressing… space

;; Add a space
(defun company-after-completion-hook (&rest _ignored)
  (just-one-space))

(add-hook! 'company-completion-finished-hook #'company-after-completion-hook)

Enjoy

2020-01-03 14:36

Emacs

Nouvelle année. Nouveau défi : Après 7 ans de Vim, je regarde ce que propose Emacs.

Liste en vrac des trouvailles.

Comment implementer vim-commentary

Ma premiere commande ajouté/créé :

(evil-define-key 'normal 'global (kbd "gcc") 'comment-line)

Et ca fonctionne !!

Le must, pour trouver ‘comment-line j’ai juste fait M-x comment puis tab et j’ai vu les possibilité.

Bon, finalement, j’ai installé le package evil-commentary car il gere vraiment le mouvement.

how to install :

M-x package-install RET evil-commentary

;; then, inside ~/.emacs.d/init.el
(evil-commentary-mode)

Comment reproduire l’excellent vim-skip dans emacs ?

J’ai toujours utilisé vim-skip qui permet d’avancer moitié par moitié en appuyant sur s.

Je ne trouve pas d’equivallent evil-skip

elisp me semble très bien foutu.

15 minutes apres :

(defun middle-of-line-forward ()
  "Put cursor at the middle of the rest of the line. try to mimic vim-skip s"
  (interactive)
  (goto-char (/ (+ (point) (point-at-eol)) 2)))

(defun middle-of-line-backward ()
  "Put cursor at the middle of the beginning of the line. try to mimic vim-skip S"
  (interactive)
  (goto-char (/ (+ (point) (point-at-bol)) 2)))

(define-key evil-normal-state-map (kbd "s") 'middle-of-line-forward)
(define-key evil-normal-state-map (kbd "S") 'middle-of-line-backward)

ET CA MARCHE !

DU PREMIER COUP !

Mind blown.

Afficher / voir les fonctions / trouver la source d inspiration :

M-x RET find-function RET what-line

Et soudain, vous voyez :

(defun what-line ()
  "Print the current buffer line number and narrowed line number of point."
  (interactive)
  (let ((start (point-min))
	(n (line-number-at-pos)))
    (if (= start 1)
	(message "Line %d" n)
      (save-excursion
	(save-restriction
	  (widen)
	  (message "line %d (narrowed line %d)"
		   (+ n (line-number-at-pos start) -1) n))))))

Avoir le meme comportement que …

Vim:

set scrolloff=3

Emacs :

(custom-set-variables
 '(hscroll-margin 15)
 '(hscroll-step 1)
 '(scroll-conservatively 10000)
 '(scroll-margin 3)
 '(scroll-step 1))

Vim :

set nowrapscan

Emacs :

(custom-set-variables
 '(evil-search-wrap nil))

Remember last location in file

vim :

augroup lastlocation
  autocmd!
  autocmd bufreadpost * if line("'\"") > 0 && line("'\"") <= line("$") | execute "normal! g'\"" | endif
augroup end

emacs :

(custom-set-variables
 '(save-place-mode t))

Activate mouse in terminal

vim :

if has('mouse')
  set mouse=a
endif

emacs :

(custom-set-variables
 '(xterm-mouse-mode t))

Tout semble exister, tout semble clair.

En écrivant ce post, j’ai vu des trailing whitespace.

Pour les effacer

Sous vim : :%s/\s\+$//e

Sous emacs : M-x delete-trailing-whitespace (bien sur, en faisant tab tout le long)

Liens

Install

On va au plus simple, on oublie leiningen, boot au java -cp ….

On install les clojure tools https://clojure.org/guides/getting_started

curl -O https://download.clojure.org/install/linux-install-1.10.0.442.sh
chmod +x linux-install-1.10.0.442.sh
sudo ./linux-install-1.10.0.442.sh

(Répeter l’operation avec les nouveaux liens pour une upgrade)

Tout marche ?

clj --help

Usage: clojure [dep-opt*] [init-opt*] [main-opt] [arg*]
       clj     [dep-opt*] [init-opt*] [main-opt] [arg*]

Le fichier

;cat hello.clj

(ns simplest.clojure.code
  (:gen-class))

(defn hello-world []
  (println "Hello World"))

(hello-world)

Run

clj hello.clj
Hello World

Merci au revoir….

Better

Ça fonctionne. Mais on peut faire mieux.

Je déteste ces fichiers de code qui se lance juste parce qu’on les ‘charges’. Je veux que tout soit fonction.

;cat hello.clj

(ns simplest.clojure.code
  (:gen-class))

(defn hello-world []
  (println "Hello World"))

(defn -main [& args]
  (hello-world))

Il ne se passe rien :

clj hello.clj

Normal, rien n’oblige à lancer la fonction -main. Il faut l’appeler de cette facon :

clj --init hello.clj --main simplest.clojure.code
Hello World
  • -i: l’input
  • –main “Call the -main function from namespace” Donc il faut lui passer le namespace

C’est beaucoup mieux. Maiiiiiiiis contraignant.

On peut définir le tout avec un project.clj, mais la on sort du cadre du ‘simplest clojure’.

2017-10-05 10:54

2017-10-02 09:16

Mise en situation

En ce moment, on m’impose d’utiliser Gerrit. Pire, on m’impose, pour résoudre un bug ou une feature de ne faire qu’un commit.

TLDR

git checkout -b ma-feature
git commit -m "foo"
git commit -m "Splendid commit message"
# ....

git checkout --detach
git rebase -i master # use pick, squash, fixup
git push origin HEAD:refs/for/master
git checkout -

Solution

Commiter autant que je veux sur ma branche. Tout squash en un sur une branch anonyme.

Process

On veut la feature BONJOUR

On se met bien

git checkout master
git pull
git checkout -b feature-bonjour

On code

git commit -m 'first commit'
# git commit -m
# ...

La feature est prete

On edit le dernier commit !

Pourquoi ? Pour avoir un joli message, sur notre branche, au cas où des modifs sont demandées après la review.

git commit --amend

On squash, loin de notre branche préférée

Donc en gros,

On se met sur une branche anonyme,

on rebase en :

  • gardant le premier commit,
  • fixup tous les suivants,
  • squash le dernier (pour récupérer le joli message bien formatté)
# Branch anonyme
git checkout --detach

git rebase -i master

# On edite de la sorte
pick e21512bd881e9eb183eafc81738e0e817ddcaa52 first commit
fixup dbd709da1e78fcd4c3a700583c6fed514bb55011 second commit
fixup 8e7a606fd6797f8a52e83a08378e70d0eb26a151 very big big commit
squash 3fd93497ec8741d960b69e2d651e31339f5517ab Feature bonjour: foo bar baz done

Tout est en un seul HORRIBLE commit en haut de master. Pour s’en convaincre

git log -2

Everything is presque done

C’est gerrit, on push d’un certaine façon

git push origin HEAD:refs/for/master

Un petit git checkout - pour retourner sur la branche feature-bonjour et eviter de faire des ajouts sur cette branche qui va disparaitre.

Tout n’est pas parfait

Des modif’ sont demandées ou conflit avec origin/master pas de panique.

On part de l’idée que personne n’a ajouté de code sur votre commit gerrit :

On retourne sur sa branche, on met à jour

git checkout feature-bonjour
git fetch
# On aime etre à jour
git rebase origin/master
# On bosse
git commit -m 'Forgot one case'

Maintenant on se retrouve à l’etape # On squash avec un commit en plus. Donc le rebase va ressembler à ca :

# Branch anonyme
git checkout --detach

git rebase -i master

# On edite de la sorte
pick e21512bd881e9eb183eafc81738e0e817ddcaa52 first commit
fixup dbd709da1e78fcd4c3a700583c6fed514bb55011 second commit
fixup 8e7a606fd6797f8a52e83a08378e70d0eb26a151 very big big commit
squash 3fd93497ec8741d960b69e2d651e31339f5517ab Feature bonjour: foo bar baz done
fixup 1943dbfe09c9076bca44e91943dbfe09c9076bca Forgot one case

Hé oui, on ‘squash’ le joli message bien formatté, mais on ‘fixup’ le dernier commit car on n’a pas besoin du message

On met à jour gerrit (chez moi, 11003, pas chez vous !)

git push origin HEAD:refs/changes/11003
# on evite les betises
git checkout -

Enjoy la mocheté du un seul commit.

HELP, j’ai tout perdu mes commits

Cherchez de l’aide autour de git reflog <- tous vos commits s’y trouvent