On Tue, Apr 28, 2009 at 8:21 AM, Martin Apel &lt;<a href="mailto:martin.apel@simpack.de">martin.apel@simpack.de</a>&gt; wrote:<br>&gt; Bill Hoffman wrote:<br>&gt;&gt; Martin Apel wrote:<br>&gt;&gt;<br>&gt;&gt;&gt; Hi all,<br>

&gt;&gt;&gt;<br>&gt;&gt;&gt; Inspired by the Emacs command cperl-perldoc-at-point I wrote a little<br>&gt;&gt;&gt; command to show the CMake documentation of the command on which the<br>&gt;&gt;&gt; cursor is currently positioned. It will open another buffer and show the<br>

&gt;&gt;&gt; documentation generated from &quot;cmake --help-command &lt;command&gt;&quot; in that<br>&gt;&gt;&gt; buffer. I found it very useful during creating CMakeLists.txt files.<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; Bill, maybe it makes sense to integrate this into cmake-mode.el?<br>

&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; Looks neat.  Is there a better way in emacs to set the path to CMake?<br>&gt;&gt; On many systems I do not put cmake into the PATH.<br>&gt;&gt;<br>&gt;&gt; -Bill<br>&gt;&gt;<br>

&gt;&gt;<br>&gt; You could probably make it a variable, which would be settable through<br>&gt; the customize interface of Emacs. I will look into it<br>&gt; and repost it, when it&#39;s done.<br>&gt;<br>&gt; Martin<br>&gt;<br>

<br>This is pretty lean.  I wrote something similar that I was testing.<br><br>Some features:<br><br>1. Provides a default argument, but allows you type in something different.<br>2. Maintains a history of the arguments you have given.<br>

3. Allows you to run an arbitrary cmake command and put the output into a named buffer.<br>4. Runs the cmake command in the back.<br>5. cmake executable is a customized variable.<br><br>James<br><br><span style="font-family: courier new,monospace;">(defun cmake-find-word ()</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">  &quot;Finds the word on your cursor.&quot;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  (interactive)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">  (let (word)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    (save-excursion</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">      ;; Find the end of the word</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">      (forward-word)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">      (let ((end (point)))</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        ;; Find the beginning</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">        (backward-word)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        ;; Set the word</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">        (setq word (buffer-substring-no-properties (point) end))</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        )</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">      )</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    )</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">  )</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">(defcustom cmake-mode-cmake-executable &quot;cmake&quot;<br>

  &quot;*The name of the cmake executable.<br>This can be either absolute or looked up on `exec-path&#39;.&quot;<br>  ;; Don&#39;t use (file :must-match t).  It doesn&#39;t know about `exec-path&#39;.<br>  :type &#39;file<br>

  :group &#39;cmake)<br><br>(defun cmake-command-run (type &amp;optional topic)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  &quot;Runs the command cmake with the arguments specified.  The</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">optional argument topic will be appended to the argument list.&quot;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  (interactive &quot;s&quot;)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">  (let* ((bufname (concat &quot;*CMake&quot; type (if topic &quot;-&quot;) topic &quot;*&quot;))</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">         (buffer  (get-buffer bufname))</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">         )</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    (if buffer</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">        (display-buffer buffer &#39;not-this-window)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">      ;; Buffer doesn&#39;t exist.  Create it and fill it</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">      (setq buffer (generate-new-buffer bufname))</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">      (setq command (concat cmake-mode-cmake-executable &quot; &quot; type &quot; &quot; topic))<br>

</span><span style="font-family: courier new,monospace;">     (message &quot;Running %s&quot; command)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">      (shell-command command buffer)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">      ;; Save the original window, so that we can come back to it later.</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">      ;; save-excursion doesn&#39;t seem to work for this.</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">      (setq window (selected-window))</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">      ;; We need to select it so that we can apply special modes to it</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">      (select-window (display-buffer buffer &#39;not-this-window))</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">      (cmake-mode)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">      (toggle-read-only t)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">      ;; Restore the original window</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">      (select-window window)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">      )</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    )</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  )</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">(defun cmake-help-list-commands ()</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  &quot;Prints out a list of the cmake commands.&quot;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">  (interactive)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  (cmake-command-run &quot;--help-command-list&quot;)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">  )</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">(defvar cmake-help-command-history nil &quot;Topic read history.&quot;)</span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">(defun cmake-get-topic (type)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  &quot;Gets the topic from the minibuffer input.  The default is the word the cursor is on.&quot;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">  (interactive)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  (let* ((default-entry (cmake-find-word))</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">         (input (read-string</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                 (format &quot;CMake %s (default %s): &quot; type default-entry) ; prompt</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">                 nil ; initial input</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                 &#39;cmake-help-command-history ; command history</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">                 default-entry ; default-value</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                 )))</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    (if (string= input &quot;&quot;)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        (error &quot;No argument given&quot;)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">      input))</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  )</span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">(defun cmake-help-command ()</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">  &quot;Prints out the help message corresponding to the command the cursor is on.&quot;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  (interactive)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">  (setq command (cmake-get-topic &quot;command&quot;))</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  (cmake-command-run &quot;--help-command&quot; (downcase command))</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">  )</span><br>