42049
helm により変数 `gap` に `dansely`，`loosely` またはブランク `""` を代入し，変数 `type` に
`dotted`，`dashed`，`dash dot` または `dash dot dot` を代入して，変数 `gap` がブランクでないときには
`gap` と `type` の間に半角空白 `" "` を挟んで，ブランクのときには結果的に変数 `type` だけバッファにインサートする関数
`helm-tikz-line-dash` を作りたく思い次のようにしてみました．

```

    (defun helm-tikz-line-dash ()
      (interactive)
      (let ((gap (helm :sources '(helm-tikz-line-dash-gap--source)
                       :buffer "*helm TikZ Dashline Gap*"))
            (type (helm :sources '(helm-tikz-line-dash-type--source)
                       :buffer "*helm TikZ Dashline Type*")))
           (insert (concat gap (if (> (length gap) 0) " ") type))))
    
    (defvar helm-tikz-line-dash-gap--source
      (helm-build-sync-source "TikZ Dash Line Gap"
        :candidates '("densely" "loosely")
        :migemo t))
    
    (defvar helm-tikz-line-dash-type--source
      (helm-build-sync-source "TikZ Dash Line Type"
        :candidates '("dotted" "dashed" "dash dot" "dash dot dot")
        :migemo t))
    
```

そしてこれらを評価し `helm-tikz-line-dash` を実行してみると，確かに Gap と Type は helm
により聞いてくるのですがその選択結果は直接バッファに書き込まれ `let` における変数 `gap`，`type` はいずれもブランク `""`
になっているようです．  
(これは `if` 文の第3引数に `"?"` を追加して ? が最後にバッファにインサートされることにより確認しました)

このコードを2変数 `gap`，`type` に helm から選択したアイテムを代入させるにはどのように修正したらよいのでしょうか？  
よろしくお願いします．

`helm-tikz-line-dash-gap--source` において `:candidates` を `'("densely " "loosely
")` に変更することによりこの場合は目的を達成できますが，helm を用いて変数に値を代入する方法が知りたいです．
CC BY-SA 3.0
2018-02-25T10:48:20.327
41996
2020-05-16T22:58:46.890
2020-05-16T22:58:46.890
19110
27509
question
emacs elisp
helm を用いて 変数に値を代入するには
次のように `:action` に `(lambda (candidate) (format "%s" candidate))` を加えることにより
**正しい指定法かどうかわかりませんが**
とりあえず思い通りの動作になることを確認しました．やりたいことに割りに冗長で他によりよい方法があると思いますので質問は続けます．

```

    (defvar helm-tikz-line-dash-gap--source
      (helm-build-sync-source "TikZ Dashline Gap"
        :candidates '("densely" "loosely")
        :migemo t
        :action (lambda (candidate) (format "%s" candidate))))
    (defvar helm-tikz-line-dash-type--source
      (helm-build-sync-source "TikZ Dashline Type"
        :candidates '("dotted" "dashed" "dash dot" "dash dot dot")
        :migemo t
        :action (lambda (candidate) (format "%s" candidate))))
    (defun helm-tikz-line-dash ()
      (interactive)
      (let ((gap (helm :sources '(helm-tikz-line-dash-gap--source)
                       :buffer "*helm TikZ Dashline Gap*"))
            (type (helm :sources '(helm-tikz-line-dash-type--source)
                        :buffer "*helm TikZ Dashline Type*")))
        (insert (concat gap (if (> (length gap) 0) " ") type))))
    
```
CC BY-SA 3.0
2018-02-27T22:25:51.770
42049
2018-02-27T22:25:51.770
27509
41996
answer