Reworking some evil keys that conflict by default.
Oh, and adding the evil-text-object designed for Python code.
This commit is contained in:
		
							parent
							
								
									85a1446ca4
								
							
						
					
					
						commit
						608ab39e07
					
				
					 2 changed files with 49 additions and 25 deletions
				
			
		| 
						 | 
					@ -390,12 +390,20 @@ Can we change Evil at this point? Some tips:
 | 
				
			||||||
      (let ((mode (make-symbol (format "%s-mode" name))))
 | 
					      (let ((mode (make-symbol (format "%s-mode" name))))
 | 
				
			||||||
        (add-to-list 'evil-emacs-state-modes mode)))
 | 
					        (add-to-list 'evil-emacs-state-modes mode)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ;; Use escape to get out of visual mode, eh?
 | 
					    ;; Use escape to get out of visual mode, but hitting v again expands the selection.
 | 
				
			||||||
    (evil-define-key 'visual global-map (kbd "v") 'er/expand-region)
 | 
					    (evil-define-key 'visual global-map (kbd "v") 'er/expand-region)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (evil-mode))
 | 
					    (evil-mode))
 | 
				
			||||||
#+END_SRC
 | 
					#+END_SRC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					While I’m pretty good with the VIM keybindings, I would like to play around with the text objects and how it compares to others (including the surround), for instance:
 | 
				
			||||||
 | 
					  - ~diw~ :: deletes a word, but can be anywhere in it, while ~de~ deletes to the end of the word.
 | 
				
			||||||
 | 
					  - ~daw~ :: deletes a word, plus the surrounding space, but not punctuation.
 | 
				
			||||||
 | 
					  - ~xi,w~ :: changes a word that is snake or camel-cased, as in programming languages. The ~x~ can be ~c~ to change, ~d~ to delete, ~y~ to copy, etc.
 | 
				
			||||||
 | 
					  - ~xis~ :: changes a /sentence,/ and if ~i~ is ~a~, it gets rid of the surrounding whitespace as well. Probably ~das~ and ~cis~.
 | 
				
			||||||
 | 
					  - ~xip~ :: changes a /paragraph/.
 | 
				
			||||||
 | 
					  - Surrounding punctuation, like quotes, parenthesis, brackets, etc. Also work, so ~ci)~ changes all the parameters to a function call.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Using the key-chord project allows me to make Escape be on two key combo presses on both sides of my keyboard:
 | 
					Using the key-chord project allows me to make Escape be on two key combo presses on both sides of my keyboard:
 | 
				
			||||||
#+BEGIN_SRC emacs-lisp
 | 
					#+BEGIN_SRC emacs-lisp
 | 
				
			||||||
(use-package key-chord
 | 
					(use-package key-chord
 | 
				
			||||||
| 
						 | 
					@ -901,7 +909,7 @@ The [[https://github.com/oantolin/embark/][embark]] project offers /actions/ on
 | 
				
			||||||
#+END_SRC
 | 
					#+END_SRC
 | 
				
			||||||
** Evil Snipe
 | 
					** Evil Snipe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Doom introduced me to [[https://github.com/hlissner/evil-snipe][evil-snipe]] which is similar to =f= and =t=, but does two characters, and can, when configured, search more than the current line:
 | 
					Doom introduced me to [[https://github.com/hlissner/evil-snipe][evil-snipe]] which is similar to =f= and =t=, but does two characters, and can, when configured, search more than the current line. When I use it, I stop and analyze to see the two characters to work on, so I’ve changed from the default, single ~s~, to ~g s~ so as not to get it confused with the =evil-surround=.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#+BEGIN_SRC emacs-lisp
 | 
					#+BEGIN_SRC emacs-lisp
 | 
				
			||||||
  (use-package evil-snipe
 | 
					  (use-package evil-snipe
 | 
				
			||||||
| 
						 | 
					@ -909,45 +917,53 @@ Doom introduced me to [[https://github.com/hlissner/evil-snipe][evil-snipe]] whi
 | 
				
			||||||
    :init
 | 
					    :init
 | 
				
			||||||
    (setq evil-snipe-scope 'visible)
 | 
					    (setq evil-snipe-scope 'visible)
 | 
				
			||||||
    :config
 | 
					    :config
 | 
				
			||||||
    (evil-define-key '(normal motion operator visual)
 | 
					    (evil-define-key '(normal motion operator visual) global-map
 | 
				
			||||||
      "s" #'evil-snipe-s
 | 
					      "gs" #'evil-snipe-s
 | 
				
			||||||
      "S" #'evil-snipe-S)
 | 
					      "gS" #'evil-snipe-S))
 | 
				
			||||||
    (evil-snipe-mode +1))
 | 
					 | 
				
			||||||
#+END_SRC
 | 
					#+END_SRC
 | 
				
			||||||
 | 
					 | 
				
			||||||
It highlights all potential matches, use ~;~ to skip to the next match, and ~,~ to jump back.
 | 
					It highlights all potential matches, use ~;~ to skip to the next match, and ~,~ to jump back.
 | 
				
			||||||
** Evil Surround
 | 
					** Evil Surround
 | 
				
			||||||
I like both [[https://github.com/emacs-evil/evil-surround][evil-surround]] and Henrik's [[https://github.com/hlissner/evil-snipe][evil-snipe]], however, they both start with ~s~, and conflict, and getting them to work together means I have to remember when does ~s~ call sniper and when calls surround. As an original Emacs person, I am not bound by that key history, but I do need them consistent:
 | 
					I like both [[https://github.com/emacs-evil/evil-surround][evil-surround]] and Henrik's [[https://github.com/hlissner/evil-snipe][evil-snipe]], however, they both start with ~s~, and conflict, and getting them to work together means I have to remember when does ~s~ call sniper and when calls surround. As an original Emacs person, I am not bound by that key history, but I do need them consistent, so I’m choosing the ~s~ to be /surround/.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#+BEGIN_SRC emacs-lisp
 | 
					#+BEGIN_SRC emacs-lisp
 | 
				
			||||||
  (use-package evil-surround
 | 
					  (use-package evil-surround
 | 
				
			||||||
    :after evil-snipe
 | 
					    :after evil-snipe
 | 
				
			||||||
    :config
 | 
					    :config
 | 
				
			||||||
    (evil-define-key '(normal motion operator visual) evil-surround-mode-map
 | 
					    (push '(?\" . ("“" . "”")) evil-surround-pairs-alist)
 | 
				
			||||||
      "z" 'evil-surround-edit
 | 
					    (push '(?\' . ("‘" . "’")) evil-surround-pairs-alist)
 | 
				
			||||||
      "Z" 'evil-Surround-edit)
 | 
					    (push '(?\` . ("`" . "'")) evil-surround-pairs-alist)
 | 
				
			||||||
 | 
					    (push '(?b . ("*" . "*")) evil-surround-pairs-alist)
 | 
				
			||||||
 | 
					    (push '(?* . ("*" . "*")) evil-surround-pairs-alist)
 | 
				
			||||||
 | 
					    (push '(?i . ("/" . "/")) evil-surround-pairs-alist)
 | 
				
			||||||
 | 
					    (push '(?/ . ("/" . "/")) evil-surround-pairs-alist)
 | 
				
			||||||
 | 
					    (push '(?= . ("=" . "=")) evil-surround-pairs-alist)
 | 
				
			||||||
 | 
					    (push '(?~ . ("~" . "~")) evil-surround-pairs-alist)
 | 
				
			||||||
    :hook (text-mode . evil-surround-mode))  ; Don't globally use it on Magit, et. al
 | 
					    :hook (text-mode . evil-surround-mode))  ; Don't globally use it on Magit, et. al
 | 
				
			||||||
#+END_SRC
 | 
					#+END_SRC
 | 
				
			||||||
Notes:
 | 
					Notes:
 | 
				
			||||||
  - ~cz'"~ :: to convert surrounding single quote string to double quotes.
 | 
					  - ~cs({~ :: to convert surrounding parens to curly braces.
 | 
				
			||||||
  - ~dz"~ :: to delete the surrounding double quotes.
 | 
					  - ~ds"~ :: to delete the surrounding *double* quotes.
 | 
				
			||||||
  - ~yze"~ :: puts single quotes around the next word.
 | 
					  - ~yse"~ :: puts double quotes around the next word… but only if you are at the beginning of the word, otherwise,
 | 
				
			||||||
  - ~yZ$<p>~ :: surrouds the line with HTML =<p>= tag (with extra carriage returns).
 | 
					  - ~ysiw'~ :: puts single quotes around the word, no matter where the point is positioned.
 | 
				
			||||||
 | 
					  - ~yS$<p>~ :: surrouds the line with HTML =<p>= tag (with extra carriage returns).
 | 
				
			||||||
  - ~(~ :: puts spaces /inside/ the surrounding parens, but ~)~ doesn't. Same with ~[~ and ~]~.
 | 
					  - ~(~ :: puts spaces /inside/ the surrounding parens, but ~)~ doesn't. Same with ~[~ and ~]~.
 | 
				
			||||||
** Jump, Jump, Jump!
 | 
					** Jump, Jump, Jump!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
While I grew up on =Control S=, I am liking the /mental model/ associated with the [[https://github.com/abo-abo/avy][avy project]] that allows a /jump/ among matches across all visible windows. I use the ~F18~ key on my keyboard that should be easy to use.
 | 
					While I grew up on =Control S=, I am liking the /mental model/ associated with the [[https://github.com/abo-abo/avy][avy project]] that allows a /jump/ among matches across all visible windows. I use the ~F18~ key on my keyboard that should be easy to use, but ~g o~ seems obvious.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#+BEGIN_SRC emacs-lisp
 | 
					#+BEGIN_SRC emacs-lisp
 | 
				
			||||||
(use-package avy
 | 
					  (use-package avy
 | 
				
			||||||
  :init
 | 
					    :init
 | 
				
			||||||
  (setq avy-all-windows t
 | 
					    (setq avy-all-windows t
 | 
				
			||||||
        avy-single-candidate-jump t
 | 
					          avy-single-candidate-jump t
 | 
				
			||||||
        avy-orders-alist
 | 
					          avy-orders-alist
 | 
				
			||||||
        '((avy-goto-char . avy-order-closest)
 | 
					          '((avy-goto-char . avy-order-closest)
 | 
				
			||||||
          (avy-goto-word-0 . avy-order-closest)))
 | 
					            (avy-goto-word-0 . avy-order-closest)))
 | 
				
			||||||
  :config (ha-leader "j" '("jump" . avy-goto-char-timer))
 | 
					    :config (ha-leader "j" '("jump" . avy-goto-char-timer))
 | 
				
			||||||
  :bind ("<f18>" . avy-goto-char-timer))
 | 
					    (evil-define-key '(normal motion operator visual) global-map
 | 
				
			||||||
 | 
					      "go" #'avy-goto-char-timer)
 | 
				
			||||||
 | 
					      :bind ("<f18>" . avy-goto-char-timer))
 | 
				
			||||||
#+END_SRC
 | 
					#+END_SRC
 | 
				
			||||||
*Note:* The links should be shorter near the point as opposed to starting from the top of the window.
 | 
					*Note:* The links should be shorter near the point as opposed to starting from the top of the window.
 | 
				
			||||||
** Miscellaneous Keys
 | 
					** Miscellaneous Keys
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -84,6 +84,14 @@ use_python() {
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					** Editing Python Code
 | 
				
			||||||
 | 
					Let’s integrate this [[https://github.com/wbolster/evil-text-object-python][Python support for evil-text-object]] project:
 | 
				
			||||||
 | 
					#+BEGIN_SRC emacs-lisp
 | 
				
			||||||
 | 
					  (use-package evil-text-object-python
 | 
				
			||||||
 | 
					     :hook python-mode . evil-text-object-python-add-bindings)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#+END_SRC
 | 
				
			||||||
 | 
					This allows me to delete a Python “block” using ~dal~.
 | 
				
			||||||
** Docker Environment
 | 
					** Docker Environment
 | 
				
			||||||
Docker really allows you to isolate your project's environment. The downside is that you are using Docker and probably a bloated container. On my work laptop, a Mac, this creates a behemoth virtual machine that immediately spins the fans like a wind tunnel.
 | 
					Docker really allows you to isolate your project's environment. The downside is that you are using Docker and probably a bloated container. On my work laptop, a Mac, this creates a behemoth virtual machine that immediately spins the fans like a wind tunnel.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue