From 598e0522de924a50ea9c640955daab8512029eb4 Mon Sep 17 00:00:00 2001
From: gramanas <anastasis.gramm2@gmail.com>
Date: Tue, 9 Oct 2018 20:53:30 +0300
Subject: Better list

---
 README.html        | 284 ++++++++++++++++++++++++++++-------------------------
 README.org         |  18 +++-
 src/actionhelper.c |  21 ++--
 src/actionparser.c |   8 +-
 src/actions.c      |  37 ++++++-
 src/actions.h      |   5 +-
 src/dblayer.c      |  36 ++++---
 src/dblayer.h      |   2 +-
 8 files changed, 248 insertions(+), 163 deletions(-)

diff --git a/README.html b/README.html
index 2180663..45839fd 100644
--- a/README.html
+++ b/README.html
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2018-10-08 Mon 23:46 -->
+<!-- 2018-10-09 Tue 20:53 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>&lrm;</title>
@@ -232,35 +232,35 @@ for the JavaScript code in this tag.
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents">
 <ul>
-<li><a href="#org1c6aa01">ck</a></li>
-<li><a href="#orgbf1d4c5">build it</a>
+<li><a href="#org06be2ec">ck</a></li>
+<li><a href="#orgdd738de">build it</a>
 <ul>
-<li><a href="#org8edf2df">requirements</a></li>
-<li><a href="#org30b18cc">compiler</a></li>
-<li><a href="#org28e3d41">make</a></li>
+<li><a href="#org00d5007">requirements</a></li>
+<li><a href="#org0c0a491">compiler</a></li>
+<li><a href="#org7ba7a71">make</a></li>
 </ul>
 </li>
-<li><a href="#orgcd61fbc">for devs</a>
+<li><a href="#org5cb365e">for devs</a>
 <ul>
-<li><a href="#org713cf8f">CMake options</a></li>
-<li><a href="#orga6955dd">tests</a>
+<li><a href="#org148ba3a">CMake options</a></li>
+<li><a href="#org20e80d6">tests</a>
 <ul>
-<li><a href="#org6219fcc">run tests</a></li>
-<li><a href="#orgd4349ab">test suite</a></li>
+<li><a href="#org75775b9">run tests</a></li>
+<li><a href="#orgf7207a9">test suite</a></li>
 </ul>
 </li>
 </ul>
 </li>
-<li><a href="#org1d127b7">manual</a>
+<li><a href="#org3401884">manual</a>
 <ul>
-<li><a href="#orge5785e3">ck configuration</a></li>
-<li><a href="#orga717caf">Actions</a>
+<li><a href="#org41c11d4">ck configuration</a></li>
+<li><a href="#org72890ad">Actions</a>
 <ul>
-<li><a href="#org29304ac">init</a></li>
-<li><a href="#org8841e7c">add</a></li>
-<li><a href="#orgc9a5e19">list</a></li>
-<li><a href="#org73e5182">search</a></li>
-<li><a href="#org9b41294">edit</a></li>
+<li><a href="#org3b0ec54">init</a></li>
+<li><a href="#orgc9498d4">add</a></li>
+<li><a href="#orge78ef4d">list</a></li>
+<li><a href="#org914dcb8">search</a></li>
+<li><a href="#orga1030cc">edit</a></li>
 </ul>
 </li>
 </ul>
@@ -269,22 +269,22 @@ for the JavaScript code in this tag.
 </div>
 </div>
 <p align="center"><img src="res/logo.png" width="30%" height="30%" /></p>
-<div id="outline-container-org1c6aa01" class="outline-2">
-<h2 id="org1c6aa01">ck</h2>
-<div class="outline-text-2" id="text-org1c6aa01">
+<div id="outline-container-org06be2ec" class="outline-2">
+<h2 id="org06be2ec">ck</h2>
+<div class="outline-text-2" id="text-org06be2ec">
 <p>
 <b>The Config Keeper</b>
 </p>
 </div>
 </div>
 
-<div id="outline-container-orgbf1d4c5" class="outline-2">
-<h2 id="orgbf1d4c5">build it</h2>
-<div class="outline-text-2" id="text-orgbf1d4c5">
+<div id="outline-container-orgdd738de" class="outline-2">
+<h2 id="orgdd738de">build it</h2>
+<div class="outline-text-2" id="text-orgdd738de">
 </div>
-<div id="outline-container-org8edf2df" class="outline-3">
-<h3 id="org8edf2df">requirements</h3>
-<div class="outline-text-3" id="text-org8edf2df">
+<div id="outline-container-org00d5007" class="outline-3">
+<h3 id="org00d5007">requirements</h3>
+<div class="outline-text-3" id="text-org00d5007">
 <ul class="org-ul">
 <li>clang (llvm) or gcc (gnu)</li>
 <li>cmake</li>
@@ -293,31 +293,31 @@ for the JavaScript code in this tag.
 </div>
 </div>
 
-<div id="outline-container-org30b18cc" class="outline-3">
-<h3 id="org30b18cc">compiler</h3>
-<div class="outline-text-3" id="text-org30b18cc">
+<div id="outline-container-org0c0a491" class="outline-3">
+<h3 id="org0c0a491">compiler</h3>
+<div class="outline-text-3" id="text-org0c0a491">
 <div class="org-src-container">
-<pre class="src src-sh">&gt; export <span style="color: #ffac4a;">CC</span>=clang
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">or</span>
-&gt; export <span style="color: #ffac4a;">CC</span>=gcc
+<pre class="src src-sh">&gt; export <span style="color: #baba36;">CC</span>=clang
+<span style="color: #656565;"># </span><span style="color: #757575;">or</span>
+&gt; export <span style="color: #baba36;">CC</span>=gcc
 </pre>
 </div>
 </div>
 </div>
 
-<div id="outline-container-org28e3d41" class="outline-3">
-<h3 id="org28e3d41">make</h3>
-<div class="outline-text-3" id="text-org28e3d41">
+<div id="outline-container-org7ba7a71" class="outline-3">
+<h3 id="org7ba7a71">make</h3>
+<div class="outline-text-3" id="text-org7ba7a71">
 <div class="org-src-container">
-<pre class="src src-sh"><span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">clone the repo</span>
+<pre class="src src-sh"><span style="color: #656565;"># </span><span style="color: #757575;">clone the repo</span>
 &gt; cd ~/code; git clone https://gitlab.com/grm-grm/ck
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">make a build directory and enter it</span>
-&gt; mkdir ~/ck_build; <span style="color: #ff0066;">cd</span> ~/ck_build;
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">run cmake</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">make a build directory and enter it</span>
+&gt; mkdir ~/ck_build; <span style="color: #528fd1;">cd</span> ~/ck_build;
+<span style="color: #656565;"># </span><span style="color: #757575;">run cmake</span>
 &gt; cmake ~/code/ck
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">run make</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">run make</span>
 &gt; make
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">run ck</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">run ck</span>
 &gt; ./ck
 </pre>
 </div>
@@ -325,21 +325,21 @@ for the JavaScript code in this tag.
 </div>
 </div>
 
-<div id="outline-container-orgcd61fbc" class="outline-2">
-<h2 id="orgcd61fbc">for devs</h2>
-<div class="outline-text-2" id="text-orgcd61fbc">
+<div id="outline-container-org5cb365e" class="outline-2">
+<h2 id="org5cb365e">for devs</h2>
+<div class="outline-text-2" id="text-org5cb365e">
 </div>
-<div id="outline-container-org713cf8f" class="outline-3">
-<h3 id="org713cf8f">CMake options</h3>
-<div class="outline-text-3" id="text-org713cf8f">
+<div id="outline-container-org148ba3a" class="outline-3">
+<h3 id="org148ba3a">CMake options</h3>
+<div class="outline-text-3" id="text-org148ba3a">
 <p>
 cmake accepts the following options:
 </p>
 <div class="org-src-container">
-<pre class="src src-cmake"><span style="color: #63de5d;">option</span>(CK_ASAN <span style="color: #E6DB74;">"Build with asan"</span>)
-<span style="color: #63de5d;">option</span>(CK_DEBUG <span style="color: #E6DB74;">"Build with debug symbols"</span>)
-<span style="color: #63de5d;">option</span>(CK_TESTS <span style="color: #E6DB74;">"Make the tests"</span>)
-<span style="color: #63de5d;">option</span>(CK_SHARED <span style="color: #E6DB74;">"Build with shared lib"</span>)
+<pre class="src src-cmake"><span style="color: #6aaf50;">option</span>(CK_ASAN <span style="color: #bdbc61;">"Build with asan"</span>)
+<span style="color: #6aaf50;">option</span>(CK_DEBUG <span style="color: #bdbc61;">"Build with debug symbols"</span>)
+<span style="color: #6aaf50;">option</span>(CK_TESTS <span style="color: #bdbc61;">"Make the tests"</span>)
+<span style="color: #6aaf50;">option</span>(CK_SHARED <span style="color: #bdbc61;">"Build with shared lib"</span>)
 </pre>
 </div>
 
@@ -356,24 +356,24 @@ Just build with address sanitizer enabled like so:
 llvm has better asan than gcc, so I use that.
 </p>
 <div class="org-src-container">
-<pre class="src src-sh"><span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">clone the repo</span>
+<pre class="src src-sh"><span style="color: #656565;"># </span><span style="color: #757575;">clone the repo</span>
 &gt; cd ~/code; git clone https://gitlab.com/grm-grm/ck
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">make a build directory and enter it</span>
-&gt; mkdir ~/ck_build; <span style="color: #ff0066;">cd</span> ~/ck_build;
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">run cmake</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">make a build directory and enter it</span>
+&gt; mkdir ~/ck_build; <span style="color: #528fd1;">cd</span> ~/ck_build;
+<span style="color: #656565;"># </span><span style="color: #757575;">run cmake</span>
 &gt; cmake -DCK_ASAN=1 -DCK_DEBUG=1 -DCK_TESTS=1 ~/code/ck
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">run make</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">run make</span>
 &gt; make
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">run ck</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">run ck</span>
 &gt; ./ck
 </pre>
 </div>
 </div>
 </div>
 
-<div id="outline-container-orga6955dd" class="outline-3">
-<h3 id="orga6955dd">tests</h3>
-<div class="outline-text-3" id="text-orga6955dd">
+<div id="outline-container-org20e80d6" class="outline-3">
+<h3 id="org20e80d6">tests</h3>
+<div class="outline-text-3" id="text-org20e80d6">
 <p>
 The testing "suite" is a bash script that runs regression
 and unit tests. Regression tests are under the <code>tests/</code> directory
@@ -382,9 +382,9 @@ under <code>unit/</code> directory and test the code.
 </p>
 </div>
 
-<div id="outline-container-org6219fcc" class="outline-4">
-<h4 id="org6219fcc">run tests</h4>
-<div class="outline-text-4" id="text-org6219fcc">
+<div id="outline-container-org75775b9" class="outline-4">
+<h4 id="org75775b9">run tests</h4>
+<div class="outline-text-4" id="text-org75775b9">
 <p>
 First make sure you build ck with the <code>-DCK_TESTS=1</code> option. Then
 go to the build directory and type:
@@ -396,9 +396,9 @@ go to the build directory and type:
 </div>
 </div>
 
-<div id="outline-container-orgd4349ab" class="outline-4">
-<h4 id="orgd4349ab">test suite</h4>
-<div class="outline-text-4" id="text-orgd4349ab">
+<div id="outline-container-orgf7207a9" class="outline-4">
+<h4 id="orgf7207a9">test suite</h4>
+<div class="outline-text-4" id="text-orgf7207a9">
 <div class="org-src-container">
 <pre class="src src-sh">$ ./test-ck -h
 ck test suite
@@ -416,9 +416,9 @@ flags:
 </div>
 </div>
 </div>
-<div id="outline-container-org1d127b7" class="outline-2">
-<h2 id="org1d127b7">manual</h2>
-<div class="outline-text-2" id="text-org1d127b7">
+<div id="outline-container-org3401884" class="outline-2">
+<h2 id="org3401884">manual</h2>
+<div class="outline-text-2" id="text-org3401884">
 <p>
 ck's goal is to assist with the configuration file management.
 To that end it tries to provides a cli interface that is pretty straight-forward
@@ -429,30 +429,31 @@ and intuitive.
 Example usage:
 </p>
 <div class="org-src-container">
-<pre class="src src-sh"><span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">initialize new ck</span>
-$ ck init /path_to/where_you_want/your_configs/to_be <span style="color: #E6DB74; font-weight: bold;">\</span>
+<pre class="src src-sh"><span style="color: #656565;"># </span><span style="color: #757575;">initialize new ck</span>
+$ ck init /path_to/where_you_want/your_configs/to_be <span style="color: #bdbc61;">\</span>
   /path_to/the_secret/directory
 
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">add emacs configs</span>
-<span style="color: #6A6D70;">## </span><span style="color: #6A6D70;">primary config</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">add emacs configs</span>
+<span style="color: #656565;">## </span><span style="color: #757575;">primary config</span>
 $ ck add emacs ~/.emacs.d/orgconf.org -p
-<span style="color: #6A6D70;">## </span><span style="color: #6A6D70;">secret config, with passwords and naughty words</span>
+<span style="color: #656565;">## </span><span style="color: #757575;">secret config, with passwords and naughty words</span>
 $ ck add emacs ~/.emacs.d/accounts.org -s
-<span style="color: #6A6D70;">## </span><span style="color: #6A6D70;">and another one for emacs</span>
+<span style="color: #656565;">## </span><span style="color: #757575;">and another one for emacs</span>
 $ ck add emacs ~/.emacs.d/init.el
 
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">add tmux config</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">add tmux config</span>
 $ ck add tmux ~/.tmux.conf -p
 
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">list the configs</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">list the configs</span>
 $ ck list tree
 $ ck list paths -t lisp
 $ ck list programs -t python
+$ ck list -p emacs
 
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">search the configs</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">search the configs</span>
 $ ck search search-term
-$ ck search <span style="color: #E6DB74;">"\"search term with spaces\""</span>
-$ ck search <span style="color: #E6DB74;">"\("</span> <span style="color: #6A6D70;">#</span><span style="color: #6A6D70;">escape symbols</span>
+$ ck search <span style="color: #bdbc61;">"\"search term with spaces\""</span>
+$ ck search <span style="color: #bdbc61;">"\("</span> <span style="color: #656565;">#</span><span style="color: #757575;">escape symbols</span>
 </pre>
 </div>
 
@@ -468,9 +469,9 @@ of flags one has to pass to ck.
 </p>
 </div>
 
-<div id="outline-container-orge5785e3" class="outline-3">
-<h3 id="orge5785e3">ck configuration</h3>
-<div class="outline-text-3" id="text-orge5785e3">
+<div id="outline-container-org41c11d4" class="outline-3">
+<h3 id="org41c11d4">ck configuration</h3>
+<div class="outline-text-3" id="text-org41c11d4">
 <p>
 ck uses sqlite to index the configuration files. The init
 action creates a <b>.ck</b> directory (under $HOME)
@@ -498,13 +499,13 @@ directory of your choice.
 Usage:
 </p>
 <div class="org-src-container">
-<pre class="src src-sh">$ ck config ~/ ... <span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">the default behaviour</span>
+<pre class="src src-sh">$ ck config ~/ ... <span style="color: #656565;"># </span><span style="color: #757575;">the default behaviour</span>
 
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">/someplace/else must exist or</span>
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">the action following it must be init</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">/someplace/else must exist or</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">the action following it must be init</span>
 $ ck conf /someplace/else ... 
 
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">same thing</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">same thing</span>
 $ ck c /someplace/else ... 
 $ ck -c /someplace/else ... 
 </pre>
@@ -512,13 +513,13 @@ $ ck -c /someplace/else ...
 </div>
 </div>
 
-<div id="outline-container-orga717caf" class="outline-3">
-<h3 id="orga717caf">Actions</h3>
-<div class="outline-text-3" id="text-orga717caf">
+<div id="outline-container-org72890ad" class="outline-3">
+<h3 id="org72890ad">Actions</h3>
+<div class="outline-text-3" id="text-org72890ad">
 </div>
-<div id="outline-container-org29304ac" class="outline-4">
-<h4 id="org29304ac">init</h4>
-<div class="outline-text-4" id="text-org29304ac">
+<div id="outline-container-org3b0ec54" class="outline-4">
+<h4 id="org3b0ec54">init</h4>
+<div class="outline-text-4" id="text-org3b0ec54">
 <p>
 or i or -i
 </p>
@@ -540,17 +541,17 @@ Use init to initialize a new ck database.
 Usage:
 </p>
 <div class="org-src-container">
-<pre class="src src-sh"><span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">initialize new ck</span>
-$ ck init /path_to/where_you_want/your_configs/to_be <span style="color: #E6DB74; font-weight: bold;">\</span>
+<pre class="src src-sh"><span style="color: #656565;"># </span><span style="color: #757575;">initialize new ck</span>
+$ ck init /path_to/where_you_want/your_configs/to_be <span style="color: #bdbc61;">\</span>
   /path_to/the_secret/directory
 </pre>
 </div>
 </div>
 </div>
 
-<div id="outline-container-org8841e7c" class="outline-4">
-<h4 id="org8841e7c">add</h4>
-<div class="outline-text-4" id="text-org8841e7c">
+<div id="outline-container-orgc9498d4" class="outline-4">
+<h4 id="orgc9498d4">add</h4>
+<div class="outline-text-4" id="text-orgc9498d4">
 <p>
 or a or -a
 </p>
@@ -584,24 +585,33 @@ sure to use the same name.</li>
 Usage:
 </p>
 <div class="org-src-container">
-<pre class="src src-sh"><span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">add config to ck</span>
+<pre class="src src-sh"><span style="color: #656565;"># </span><span style="color: #757575;">add config to ck</span>
 $ ck add program_name config_path [-s] [-p]
 </pre>
 </div>
 </div>
 </div>
 
-<div id="outline-container-orgc9a5e19" class="outline-4">
-<h4 id="orgc9a5e19">list</h4>
-<div class="outline-text-4" id="text-orgc9a5e19">
+<div id="outline-container-orge78ef4d" class="outline-4">
+<h4 id="orge78ef4d">list</h4>
+<div class="outline-text-4" id="text-orge78ef4d">
 <p>
 or ls or l or -l
 </p>
 
 <p>
-List can show the <b>paths</b> or the <b>programs</b> that ck keeps track of.
+List stuff ck knows about.
 </p>
 
+<p>
+You can use the keywords:
+</p>
+<ul class="org-ul">
+<li><b>paths</b>: to print all the paths ck tracks</li>
+<li><b>programs</b>: to print all the programs ck tracks</li>
+<li><b>-p progName</b>: (without the "&lt;&gt;") to print the paths of a specific program</li>
+</ul>
+
 <p>
 With the flag <b>-t</b> and then one of the follwing types one can change
 the way the list is printed:
@@ -614,7 +624,7 @@ the way the list is printed:
 
 <p>
 Using the keyword <b>tree</b> ck can list the configurations under their
-corresponding program.
+corresponding program, in a treelike structure.
 </p>
 
 <p>
@@ -622,24 +632,34 @@ Passing the <b>-a</b> flag will enable the listing of config attributes (secret
 It is best used with tree or plain paths.
 </p>
 
+<p>
+With the keyword <b>ckconf</b> ck will list it's own configuration values (in ckrc).
+</p>
+
 <p>
 Usage:
 </p>
 <div class="org-src-container">
-<pre class="src src-sh"><span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">list tree structure, with attributes</span>
+<pre class="src src-sh"><span style="color: #656565;"># </span><span style="color: #757575;">list tree structure, with attributes</span>
 $ ck list tree -a
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">list paths in python</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">list paths in python</span>
 $ ck l paths -t python
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">list programs in lisp</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">list programs in lisp</span>
 $ ck ls programs -t lisp
+<span style="color: #656565;"># </span><span style="color: #757575;">list emacs' configurations [with attributes]</span>
+$ ck ls -p emacs [-a]
+<span style="color: #656565;"># </span><span style="color: #757575;">list bash configurations in lisp</span>
+$ ck ls -p bash -t lisp
+<span style="color: #656565;"># </span><span style="color: #757575;">list ck configuration</span>
+$ ck -l ckconf
 </pre>
 </div>
 </div>
 </div>
 
-<div id="outline-container-org73e5182" class="outline-4">
-<h4 id="org73e5182">search</h4>
-<div class="outline-text-4" id="text-org73e5182">
+<div id="outline-container-org914dcb8" class="outline-4">
+<h4 id="org914dcb8">search</h4>
+<div class="outline-text-4" id="text-org914dcb8">
 <p>
 or s or -s
 </p>
@@ -660,13 +680,13 @@ To search for terms with spaces you have to put them in quotes.
 Usage:
 </p>
 <div class="org-src-container">
-<pre class="src src-sh"><span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">search for parenthesis</span>
-$ ck search <span style="color: #E6DB74;">\(</span>
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">search term with spaces</span>
-$ ck search <span style="color: #E6DB74;">"This is a space"</span>
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">both</span>
-$ ck search <span style="color: #E6DB74;">"(add 2 4)"</span>
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">and a normal one</span>
+<pre class="src src-sh"><span style="color: #656565;"># </span><span style="color: #757575;">search for parenthesis</span>
+$ ck search <span style="color: #bdbc61;">\(</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">search term with spaces</span>
+$ ck search <span style="color: #bdbc61;">"This is a space"</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">both</span>
+$ ck search <span style="color: #bdbc61;">"(add 2 4)"</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">and a normal one</span>
 $ ck search alias
 </pre>
 </div>
@@ -677,20 +697,20 @@ a different pattern matching program you can do it like so:
 </p>
 
 <div class="org-src-container">
-<pre class="src src-sh"><span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">with xargs</span>
-$ ck ls paths | xargs grep -E <span style="color: #E6DB74;">'A|B'</span>
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">or in bash</span>
-$ for i<span style="color: #ff0066;"> in</span> $(ck ls paths); <span style="color: #ff0066;">do</span> grep -E <span style="color: #E6DB74;">'A|B'</span> $<span style="color: #ffac4a;">i</span>; <span style="color: #ff0066;">done</span>
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">or in zsh</span>
-$ for i ($(ck ls paths)) grep -E <span style="color: #E6DB74;">'A|B'</span> $<span style="color: #ffac4a;">i</span>
+<pre class="src src-sh"><span style="color: #656565;"># </span><span style="color: #757575;">with xargs</span>
+$ ck ls paths | xargs grep -E <span style="color: #bdbc61;">'A|B'</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">or in bash</span>
+$ for i<span style="color: #5180b3;"> in</span> $(ck ls paths); <span style="color: #5180b3;">do</span> grep -E <span style="color: #bdbc61;">'A|B'</span> $<span style="color: #baba36;">i</span>; <span style="color: #5180b3;">done</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">or in zsh</span>
+$ for i ($(ck ls paths)) grep -E <span style="color: #bdbc61;">'A|B'</span> $<span style="color: #baba36;">i</span>
 </pre>
 </div>
 </div>
 </div>
 
-<div id="outline-container-org9b41294" class="outline-4">
-<h4 id="org9b41294">edit</h4>
-<div class="outline-text-4" id="text-org9b41294">
+<div id="outline-container-orga1030cc" class="outline-4">
+<h4 id="orga1030cc">edit</h4>
+<div class="outline-text-4" id="text-orga1030cc">
 <p>
 or e or -e
 </p>
@@ -719,17 +739,17 @@ print the avaliable configurations and exit.
 Usage:
 </p>
 <div class="org-src-container">
-<pre class="src src-sh"><span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">suppose this is our ck instance</span>
+<pre class="src src-sh"><span style="color: #656565;"># </span><span style="color: #757575;">suppose this is our ck instance</span>
 $ ck list tree -a
 emacs:
 |- init.el
 |- accounts.el [s]
 |- orgconf.org [p]
 
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">edit the primary emacs config</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">edit the primary emacs config</span>
 $ ck edit emacs
 
-<span style="color: #6A6D70;"># </span><span style="color: #6A6D70;">edit a specific emacs config, other than the primary</span>
+<span style="color: #656565;"># </span><span style="color: #757575;">edit a specific emacs config, other than the primary</span>
 $ ck edit emacs accounts.el
 </pre>
 </div>
@@ -739,7 +759,7 @@ $ ck edit emacs accounts.el
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2018-10-08 Mon 23:46</p>
+<p class="date">Created: 2018-10-09 Tue 20:53</p>
 <p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
diff --git a/README.org b/README.org
index 446ff02..c03a093 100644
--- a/README.org
+++ b/README.org
@@ -112,6 +112,7 @@ Example usage:
   $ ck list tree
   $ ck list paths -t lisp
   $ ck list programs -t python
+  $ ck list -p emacs
 
   # search the configs
   $ ck search search-term
@@ -200,7 +201,12 @@ Usage:
 *** list
 or ls or l or -l
 
-List can show the *paths* or the *programs* that ck keeps track of.
+List stuff ck knows about.
+
+You can use the keywords:
+- *paths*: to print all the paths ck tracks
+- *programs*: to print all the programs ck tracks
+- *-p progName*: (without the "<>") to print the paths of a specific program
 
 With the flag *-t* and then one of the follwing types one can change
 the way the list is printed:
@@ -209,11 +215,13 @@ the way the list is printed:
 - *lisp*: print like a lisp list
 
 Using the keyword *tree* ck can list the configurations under their
-corresponding program.
+corresponding program, in a treelike structure.
 
 Passing the *-a* flag will enable the listing of config attributes (secret or primary). 
 It is best used with tree or plain paths.
 
+With the keyword *ckconf* ck will list it's own configuration values (in ckrc).
+
 Usage:
 #+BEGIN_SRC sh
   # list tree structure, with attributes
@@ -222,6 +230,12 @@ Usage:
   $ ck l paths -t python
   # list programs in lisp
   $ ck ls programs -t lisp
+  # list emacs' configurations [with attributes]
+  $ ck ls -p emacs [-a]
+  # list bash configurations in lisp
+  $ ck ls -p bash -t lisp
+  # list ck configuration
+  $ ck -l ckconf
 #+END_SRC
 
 *** search
diff --git a/src/actionhelper.c b/src/actionhelper.c
index 3e898af..582333e 100644
--- a/src/actionhelper.c
+++ b/src/actionhelper.c
@@ -149,15 +149,12 @@ void add_make_link(const AddOpt *opt, const Conf *conf) {
   }
 }
 
-int edit_make_options(cklist *args) {
-  UNUSED(args);
-}
-
 ListOpt list_make_options(cklist *args) {
   list_rewind(args);
   ListOpt listOpt = {
     ._lt = LT_NONE,
     ._lst = LST_PLAIN,
+    .pName = NULL,
     .attr = 0,
     .err = 0
   };
@@ -195,8 +192,21 @@ ListOpt list_make_options(cklist *args) {
       else if (strcmp(list_get(args), "tree") == 0) {
         listOpt._lt = LT_TREE;
       }
+      else if (strcmp(list_get(args), "ckconf") == 0) {
+        listOpt._lt = LT_CKCONF;
+      }
+      else if (strcmp(list_get(args), "-p") == 0) {
+        if (list_next(args)) {
+          listOpt._lt = LT_PROG_CONFS;
+          listOpt.pName = list_get(args);
+        }
+        else {
+          listOpt.err = 1;
+          break;
+        }
+      }
       else {
-	listOpt.err = 1;
+        listOpt.err = 1;
       }
     } while(list_next(args));
   }
@@ -240,7 +250,6 @@ void print_LIST_result(int err) {
   if (!err) {
     return;
   }
-  ERR("Wrong list arguments");
 }
 
 void print_SEARCH_result(int err) {
diff --git a/src/actionparser.c b/src/actionparser.c
index 7c1186a..1da1d2f 100644
--- a/src/actionparser.c
+++ b/src/actionparser.c
@@ -130,7 +130,7 @@ int parse_EDIT(UserOpt *opt) {
 
 int parse_LIST(UserOpt *opt) {
   /* List expects a maximum of than 3 arguments */
-  if (optNum <= pos || optNum > pos + 4) {
+  if (optNum <= pos || optNum > pos + 5) {
     opt->err = PERR_LIST_WRONG;
     return -1;
   }
@@ -329,13 +329,13 @@ void print_parser_error(UserOpt *opt) {
     sprintf(errStr, "Add config \nUsage: %s ProgramName ConfigPath [-s](secret) [-p](primary)", names);
     break;
   case PERR_DEL_WRONG:
-    sprintf(errStr, "Delete config or program\nUsage: %s ....", names);
+    sprintf(errStr, "Delete config or program\nUsage: %s {ProgramName} | {-c ConfigPath (as shown by ck list)}", names);
     break;
   case PERR_EDIT_WRONG:
     sprintf(errStr, "Edit config with $EDITOR (%s)\nUsage: %s ProgramName [configBasename]", getenv("EDITOR"), names);
     break;
   case PERR_LIST_WRONG:
-    sprintf(errStr, "List programs, configs and more\nUsage: %s value-to-list (or tree) [-t list-type] [-a]", names);
+    sprintf(errStr, "List programs, configs and more\nUsage: %s {programs|paths|-p ProgramName} [-t list-type] | {tree | ckconf} [-a]", names);
     break;
   case PERR_SEARCH_WRONG:
     sprintf(errStr, "Search through the configs with grep\nUsage: %s search-term", names);
@@ -344,7 +344,7 @@ void print_parser_error(UserOpt *opt) {
     sprintf(errStr, "Usage: ........");
     break;
   }
-  ERR("%s", errStr);
+  HELP("%s", errStr);
 }
 
 void print_parser_help() {
diff --git a/src/actions.c b/src/actions.c
index 4ff6816..1b4c9b5 100644
--- a/src/actions.c
+++ b/src/actions.c
@@ -134,8 +134,11 @@ int run_EDIT(UserOpt *opt, Conf *conf) {
       /* If the program has many configs */
       else {
         HELP("Ambiguous config. Please type the config name after the program.");
-        cklist *paths = list_make_new();
-        edit_get_avaliable_paths(&db, paths, pName);
+        char name[STR_M] = "";
+        strcat(name, pName);
+        strcat(name, ":");
+        cklist *paths = list_make_and_add(name);
+        get_program_paths(&db, paths, pName, 1, 0);
         list_print(paths);
         list_free(paths);
         goto error;
@@ -147,8 +150,11 @@ int run_EDIT(UserOpt *opt, Conf *conf) {
     char *cName = list_get(opt->args);
     if (edit_get_config(&db, pName, confName, cName, &secret)) {
       ERR("Program %s doesn't have a config named %s", pName, cName);
-      cklist *paths = list_make_new();
-      edit_get_avaliable_paths(&db, paths, pName);
+      char name[STR_M] = "";
+      strcat(name, pName);
+      strcat(name, ":");
+      cklist *paths = list_make_and_add(name);
+      get_program_paths(&db, paths, pName, 1, 0);
       list_print(paths);
       list_free(paths);
       goto error;
@@ -171,7 +177,6 @@ int run_EDIT(UserOpt *opt, Conf *conf) {
 }
 
 int run_LIST(UserOpt *opt, Conf *conf) {
-  UNUSED(conf);
   DB db = open_DB(opt);
   if (db.ptr == NULL) {
     if (db.error == SQL_ERR_NO_TABLES) {
@@ -186,6 +191,7 @@ int run_LIST(UserOpt *opt, Conf *conf) {
   if (listOpt.err) {
     goto error;
   }
+  char tmp[STR_L] = "";
   switch(listOpt._lt) {
   case LT_PATH:
     list_get_paths(&db, the_list, listOpt.attr);
@@ -197,6 +203,27 @@ int run_LIST(UserOpt *opt, Conf *conf) {
     list_get_path_program_tree(&db, the_list, listOpt.attr);
     list_print(the_list);
     goto close;
+  case LT_CKCONF:
+    strcat(tmp, "ck configuration directory path: ");
+    strcat(tmp, opt->confDir);
+    list_add(the_list, tmp);
+#define X(var, str, name)                       \
+    strcpy(tmp, "");                            \
+    strcat(tmp, name);                          \
+    strcat(tmp, ": ");                          \
+    strcat(tmp, conf->var);                     \
+    list_add(the_list, tmp);
+    CONFIG_VARIABLES_TABLE;
+#undef X
+    list_print(the_list);
+    goto close;
+  case LT_PROG_CONFS:
+    if (!program_exists(&db, listOpt.pName)) {
+      ERR("Program %s doesn't exist in the database.", listOpt.pName);
+      goto error;
+    }
+    get_program_paths(&db, the_list, listOpt.pName, 0, listOpt.attr);
+    break;
   case LT_NONE:
     goto error;
   }
diff --git a/src/actions.h b/src/actions.h
index c9da4fb..624ae30 100644
--- a/src/actions.h
+++ b/src/actions.h
@@ -56,10 +56,12 @@ struct DelOptions {
 
 typedef enum ListTypes ListType;
 enum ListTypes {
+  LT_NONE,
   LT_PATH,
   LT_PROGRAM,
   LT_TREE,
-  LT_NONE,
+  LT_CKCONF,
+  LT_PROG_CONFS
 };
 
 typedef enum ListShowTypes ListShowType;
@@ -73,6 +75,7 @@ typedef struct ListOptions ListOpt;
 struct ListOptions {
   ListType _lt;
   ListShowType _lst;
+  char *pName;
   int attr;
   int err;
 };
diff --git a/src/dblayer.c b/src/dblayer.c
index 4290a7a..973d561 100644
--- a/src/dblayer.c
+++ b/src/dblayer.c
@@ -478,9 +478,10 @@ int edit_get_config(DB *db, const char *pName, char *ret, const char *cName, int
     sqlite3_finalize(stmt);
     return flag;
   }
+  return -1;
 }
 
-int edit_get_avaliable_paths(DB *db, cklist *ckl, const char* pName) {
+int get_program_paths(DB *db, cklist *ckl, const char* pName, int bname, int attr) {
   int pid = get_program_id(db, pName);
   /* error */
   if (pid == -2) {
@@ -493,6 +494,10 @@ int edit_get_avaliable_paths(DB *db, cklist *ckl, const char* pName) {
     int rc;
 
     char selection[STR_M] = COL_CONFIG_PATH;
+    strcat(selection, ",");
+    strcat(selection, COL_CONFIG_SECRET);
+    strcat(selection, ",");
+    strcat(selection, COL_CONFIG_PRIMARY);
     char condition[STR_M] = TBL_PROGRAM;
     strcat(condition, ".");
     strcat(condition, COL_PROGRAM_ID);
@@ -506,21 +511,32 @@ int edit_get_avaliable_paths(DB *db, cklist *ckl, const char* pName) {
       return -2;
     }
 
-    char name[STR_M] = "";
-    strcat(name, pName);
-    strcat(name, ":");
-    list_add(ckl, name);
     while (sqlite3_step(stmt) == SQLITE_ROW) {
       char *tmp = strdup((char *)sqlite3_column_text(stmt, 0));
       char entry[STR_M] = "";
-      strcat(entry, "|- ");
-      strcat(entry, basename(tmp));
+      if (bname) {
+        strcat(entry, basename(tmp));
+      }
+      else {
+        strcat(entry, tmp);
+      }
+      if (attr) {
+        /* secret */
+        if (sqlite3_column_int(stmt, 1)) {
+          strcat(entry, " [s]");
+        }
+        /* primary */
+        if (sqlite3_column_int(stmt, 2)) {
+          strcat(entry, " [p]");
+        }
+      }
       list_add(ckl, entry);
       free(tmp);
     }
     sqlite3_finalize(stmt);
     return 0;
   }
+  return -1;
 }
 
 int list_get_paths(DB *db, cklist *ckl, int attr) {
@@ -732,15 +748,11 @@ int get_program_relations(DB *db, int pid) {
 
 int get_config_number(DB *db, char* pName) {
   int pid = get_program_id(db, pName);
-  /* error */
-  if (pid == -2) {
-    return -1;
-  }
-
   /* program exists */
   if (pid > -1) {
     return get_program_relations(db, pid);
   }
+  return -1;
 }
 
 /* Removes the relationship of `cid` with the corresponding program.
diff --git a/src/dblayer.h b/src/dblayer.h
index 05ba5bd..c99f143 100644
--- a/src/dblayer.h
+++ b/src/dblayer.h
@@ -43,6 +43,7 @@ extern DB open_DB(const UserOpt *opt);
 
 extern void close_DB(DB *db);
 extern int program_exists(DB *db, const char *pName);
+extern int get_program_paths(DB *db, cklist *ckl, const char* pName, int basename, int attr);
 
 /********/
 /* init */
@@ -66,7 +67,6 @@ extern int add_transaction_try(DB *db, const AddOpt * const opt);
 extern int edit_get_prime_config_from_program(DB *db, char *pName, char *ret, int *secret);
 extern int get_config_number(DB *db, char *pName);
 extern int edit_get_config(DB *db, const char *pName, char *ret, const char *cName, int *sec);
-extern int edit_get_avaliable_paths(DB *db, cklist *ckl, const char* pName);
 
 /********/
 /* list */
-- 
cgit v1.2.3