変数を切り替える簡単な方法


9

変数を切り替える簡単な方法があると便利です。これが私が心に留めていることです。

  • 「var切り替え」関数を呼び出します。
  • completing-read単一の値(ないリストや連想リスト)を持つ変数のみをリストする必要があります。それができるかどうかわかりません。tまたはのいずれかの値を持つ変数のみを一覧表示する場合は、さらに良いでしょうnilこれは不可能だと確信しています。
  • 次にt、現在の値がの場合、関数はvar値をに設定し、nil逆の場合も同様です。

問題は、これを行うelisp関数がすでにあるかどうかです。そうでない場合、およびカスタムソリューションでこの問題に対処したことがある場合は、その方法を確認したいと考えています。

更新:

ボーナス機能はcompleting-read、トグルのためにポイント(存在する場合)の下にシンボルを提案することです。

したがって、「toggle var」fnがにバインドされているC-c ~場合、使用量はと同じくらい短くなりC-c ~ RETます。


varを切り替える現在の手順は次のとおりです。

  • C-h v VAR、現在の変数値を取得します。
  • M-: (setq VAR toggled-value)

または

  • M-: (setq VAR (not VAR))

私はこのプロセスを高速化する方法を探しています(タイピングが少ない)。

回答:


4

ここに簡単な答えがあります-

(defun my-toggle-var (var)
  "..."
  (interactive
   (let* ((def  (variable-at-point))
          (def  (and def 
                     (not (numberp def))
                     (memq (symbol-value def) '(nil t))
                     (symbol-name def))))
     (list
      (completing-read
       "Toggle value of variable: "
       obarray (lambda (c)
                 (unless (symbolp c) (setq c  (intern c)))
                 (and (boundp c)  (memq (symbol-value c) '(nil t))))
       'must-confirm nil 'variable-name-history def))))
  (let ((sym  (intern var)))
    (set sym (not (symbol-value sym)))
    (message "`%s' is now `%s'" var (symbol-value sym))))

しかし、Iciclesを使用する場合icicle-toggle-optionは、コマンドだけを使用できます(ユーザーオプションだけでなく、変数が必要な場合は、前置引数に負の値を指定します)。

icicle-toggle-option is an interactive compiled Lisp function in
`icicles-cmd1.el'.

It is bound to menu-bar options icicles icicle-toggle-option.

(icicle-toggle-option)

Toggle option’s value.  This makes sense for binary (toggle) options.
By default, completion candidates are limited to user options that
have ‘boolean’ custom types.  However, there are many "binary" options
that allow other non-nil values than t.

You can use a prefix argument to change the set of completion
candidates, as follows:

 - With a non-negative prefix arg, all user options are candidates.
 - With a negative prefix arg, all variables are candidates.

Read input, then act on it.

Input-candidate completion and cycling are available.  While cycling,
these keys with prefix ‘C-’ are active:

‘C-mouse-2’, ‘C-return’ - Act on current completion candidate only
‘C-down’, ‘C-wheel-down’ - Move to next completion candidate and act
‘C-up’, ‘C-wheel-up’ - Move to previous completion candidate and act
‘C-next’  - Move to next apropos-completion candidate and act
‘C-prior’ - Move to previous apropos-completion candidate and act
‘C-end’   - Move to next prefix-completion candidate and act
‘C-home’  - Move to previous prefix-completion candidate and act
‘C-!’     - Act on *all* candidates, successively (careful!)

When candidate action and cycling are combined (e.g. ‘C-next’), user
option ‘icicle-act-before-cycle-flag’ determines which occurs first.

With prefix ‘C-M-’ instead of ‘C-’, the same keys (‘C-M-mouse-2’,
‘C-M-RET’, ‘C-M-down’, and so on) provide help about candidates.

Use ‘mouse-2’, ‘RET’, or ‘S-RET’ to finally choose a candidate, or
‘C-g’ to quit.

This is an Icicles command - see command ‘icicle-mode’.

ソリューションは変数を切り替えるのに最適で、最後に出力される確認メッセージが気に入っています。ただし、リストをブール変数のみに絞り込むわけではありません。そのため、つららのソースを調べる必要があると思いますよね?
Kaushal Modi 2015

質問を更新して、便利な機能を追加しました。デフォルトとしてシンボルポイントを選択します(ユーザーがを押すのを待つRET)。
Kaushal Modi

厳密tnil評価された変数が必要な場合は、更新されたバージョンを使用します。これにより、ポイントとして(ブール値)変数の名前もデフォルトとして取得されます。
2015

はい、一般化されたブール変数を処理する場合(つまり、non niltrueを意味する場合と同じようにt)、またはオプションまたは変数を使用するかどうかを選択できるようにする場合は、Iciclesコードを参照してください。
2015

3
(defun toggle-variable (variable)
  (interactive
   (let ((v (variable-at-point))
         val)
     (setq val (completing-read (if (symbolp v)
                                    (format
                                     "Toggle variable (default %s (= %s)): " v (symbol-value v))
                                  "Toggle variable: ")
                                obarray
                                'boundp
                                t nil nil
                                (if (symbolp v) (symbol-name v))))
     (list (if (equal val "")
               v (intern val)))))
  (set variable (not (symbol-value variable)))
  (message "%s toggled (= %s)" variable (symbol-value variable)))

あなたが舵をインストールしている場合は、コマンドを使用することができhelm-apropos、それを

  • すべての変数の補完インターフェースを提供する
  • 変数がある場合は、その時点で変数を選択できます
  • 変数の値を変更するアクションを提供します(ミニバッファーに新しい値を挿入する必要があります)

利点は、変数のdoc-stringを検索して、helm-aproposセッション内でその値を変更できることです。


2

試してみてくださいLispyの-はsetqをポイントまたはでトグル変数にORA-カスタムsetqの完了で変数を設定するには、私の設定から:

(defun ora-custom-setq ()
  "Set a custom variable, with completion."
  (interactive)
  (let ((sym (intern
              (ivy-read "Variable: "
                        (counsel-variable-list))))
        sym-type
        cands)
    (when (and (boundp sym)
               (setq sym-type (get sym 'custom-type)))
      (cond
        ((and (consp sym-type)
              (memq (car sym-type) '(choice radio)))
         (setq cands (mapcar #'lispy--setq-doconst (cdr sym-type))))
        ((eq sym-type 'boolean)
         (setq cands
               '(("nil" . nil) ("t" . t))))
        (t
         (error "Unrecognized custom type")))
      (let ((res (ivy-read (format "Set (%S): " sym) cands)))
        (when res
          (setq res
                (if (assoc res cands)
                    (cdr (assoc res cands))
                  (read res)))
          (eval `(setq ,sym ,res)))))))

変数の現在の値が何であるかを示すとよいでしょう(特にnilまたはtに設定する場合)。または、現在の値がtの場合(およびその逆)、ツタの「ドロップダウン」のデフォルト値をnilに設定できますか?
Kaushal Modi

質問を更新して、便利な機能を追加しました。デフォルトとしてシンボルポイントを選択します(ユーザーがを押すのを待つRET)。
Kaushal Modi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.