#+TITLE: SQL layer #+TAGS: dsl|layer|programming [[file:img/sql.png]] * Table of Contents :TOC_5_gh:noexport: - [[#description][Description]] - [[#features][Features:]] - [[#install][Install]] - [[#sql-keywords-capitalization][SQL Keywords Capitalization]] - [[#sql-interactive-mode][SQL Interactive Mode]] - [[#blacklisting-keywords][Blacklisting keywords]] - [[#auto-indent][Auto-Indent]] - [[#key-bindings][Key bindings]] - [[#highlighting][Highlighting]] - [[#inferior-process-interactions-sqli][Inferior Process Interactions (SQLi)]] - [[#send-sql-queries-to-sqli][Send SQL queries to SQLi:]] - [[#sqli-buffer][SQLi buffer]] - [[#code-formatting][Code Formatting]] * Description This layer adds support for a wide range of SQL dialects to Spacemacs. ** Features: - Syntax highlighting for the following SQL dialects - ANSI - DB2 - Informix - Ingres - Interbase - Linter - Microsoft - MySQL - Oracle - Postgres - Solid - SQLite - Sybase - Vertica - Syntax-checking via [[https://github.com/purcell/sqlint][sqlint]] for ANSI SQL. - Format code with =sqlfmt= - Snippet insertion for the more general SQL constructs. - REPL support via =SQLi= buffer. - Automatic capitalization of keywords. * Install To use this configuration layer, add it to your =~/.spacemacs=. You will need to add =sql= to the existing =dotspacemacs-configuration-layers= list in this file. For syntax-checking you also need to install [[https://www.ruby-lang.org/en/about/][ruby]] as well as =sqlint=. #+BEGIN_SRC ruby gem install sqlint #+END_SRC ** SQL Keywords Capitalization SQL, by convention, uses upper-case keywords, although lower-case works just as well. As humans, the separation between upper-case and lower-case helps scan and parse the code much more quickly. To install [[https://github.com/Trevoke/sqlup-mode.el][sqlup-mode]] which enables auto capitalization in =sql mode= set the variable =sql-capitalize-keywords= to =t=. #+BEGIN_SRC emacs-lisp (setq-default dotspacemacs-configuration-layers '( (sql :variables sql-capitalize-keywords t))) #+END_SRC *** SQL Interactive Mode If you want capitalization only in =sql-mode= and not in =sql-interactive-mode= you can set the variable =sql-capitalize-keywords-disable-interactive= to =t=. *** Blacklisting keywords [[https://github.com/Trevoke/sqlup-mode.el][sqlup-mode]] can be configured to ignore certain keywords. For example if you use =name= as column name it would be annoying to have it upcased. You can prevent this behaviour by setting the variable =sql-capitalize-keywords-blacklist= to a list with keywords to ignore, e.g. #+BEGIN_SRC emacs-lisp (setq-default dotspacemacs-configuration-layers '( (sql :variables sql-capitalize-keywords t sql-capitalize-keywords-blacklist '("name" "varchar")))) #+END_SRC This layer is blacklisting =name= by default as it is a very common name for column and NAME is non-reserved SQL keyword. ** Auto-Indent This mode use [[https://github.com/alex-hhh/emacs-sql-indent][sql-indent]] to indent the code. You can check the package's README to adjust the rules. If that's not what you want, you can also disable auto-indent by setting the variable =sql-auto-indent= to =nil=. #+BEGIN_SRC emacs-lisp (setq-default dotspacemacs-configuration-layers '( (sql :variables sql-auto-indent nil))) #+END_SRC * Key bindings ** Highlighting | Key binding | Description | |-------------+-----------------------------------| | ~SPC m h k~ | select a SQL dialect to highlight | ** Inferior Process Interactions (SQLi) | Key binding | Description | |-------------+-----------------------------| | ~SPC m b b~ | show the SQLi buffer name | | ~SPC m b s~ | set the SQLi buffer | | ~SPC m l a~ | List all objects | | ~SPC m l t~ | list all objects in a table | *** Send SQL queries to SQLi: | Key binding | Description | |-------------+---------------------------------------------------------------------------------------| | ~SPC m s b~ | Send the whole buffer to the SQLi buffer | | ~SPC m s B~ | Send the whole buffer to the SQLi buffer and switch to it in =insert state= | | ~SPC m s i~ | Start the SQLi process | | ~SPC m s f~ | Send the paragraph around point to the SQLi buffer | | ~SPC m s F~ | Send the paragraph around point to the SQLi buffer and switch to it in =insert state= | | ~SPC m s q~ | Prompt for a string to send to the SQLi buffer | | ~SPC m s Q~ | Prompt for a string to send to the SQLi buffer and switch to it in =insert state= | | ~SPC m s r~ | Send the selected region to the SQLi buffer | | ~SPC m s R~ | Send the selected region to the SQLi buffer and switch to it in =insert state= | ** SQLi buffer | Key binding | Description | |-------------+--------------------------------------------------------------| | ~SPC m b r~ | rename buffer (follow up in the SQL buffer with ~SPC m b s~) | | ~SPC m b S~ | save the current connection | ** Code Formatting | ~SPC m = c~ | capitalize SQL keywords in region (if capitalize is enabled) |