你们平时移动光标最常用的命令是什么?

作为VIm/Emacs新手,我平时都是h/j/k/l C-n/p/f/b 移动光标,效率感觉不高。

之前看一些包作者的演示视频里很少看到连续移动的光标,看起来都是跳来跳去的(还不是M-f/b那种,是跳很远一下跳到目的地)。

你们平时用什么命令在文本里跳来跳去啊?

1 个赞

我用触控板啊。

DeepinScreenshot_select-area_20180420074922

看了下自己的按键频率,用得最多的还是h/j/k/l,感觉需要优化一下了。

不得不说在英文里,光标跳转有天然的优势,而vim比emacs更加擅长移动光标。

在emacs里倒是有一些光标跳转的方法,说不上哪个最常用,想用哪个就用哪个,觉得用的烦了就换一个呗。

参考:

在Emacs里跳转光标

avy

能在视野内的英文字母、中文汉字之间跳转光标。

paredit https://www.emacswiki.org/emacs/ParEdit 能在lisp类型的代码块内部、外部跳转光标。

内置的标记功能

能在历史标记之间跳转光标。 这个可能是所说的“跳很远一下跳到目的地”。

内置的查找功能

能在全文之间跳转光标。

内置的跳转功能

,如你所说,能在窗口与窗口、页与页、段与段、句与句、词与词、字与字之间跳转光标。

2 个赞

Evil的normal模式下面:

跟到开头跟结尾: gg/G

然后向前和向后翻一页: C-d/C-u

{d}w, f, t用来在单行之间跳跃

配合 swiper 基本上可以解决大部分移动光标的问题。

对于混用emacs 和evil 的我来说:

  • C-a 跳到行首
  • C-e 跳到行尾
  • M-< 跳到buffer 开头
  • M-> 跳到buffer 结尾
  • C-d 向下翻半页
  • C-u 向上翻半页
  • e/E 向后移动一个word/(把标点记入word)
  • b/B 向前移动一个word/(把标点记入word)
  • j/k 上下一行 基本的操作已经满足了。
1 个赞
  1. evil-avy-goto-char-2
  2. evil-avy-goto-line
  3. evil-find-char
  4. evil-forward-section-begin / evil-backward-section-begin
1 个赞

M-g M-g

  • emacs 经典

    • 以行/列为单位移动 C-f/b/p/n
    • 以词为单位移动 M-f/b
    • 以段落为单位移动
    • 行首/行尾 C-a/e
    • 至特定位置 goto-char
    • 翻页
  • evil

    • 以行/列为单位移动 hjkl
    • 以词为单位移动 ewb
    • 以段落为单位移动
    • 行首/行尾 $^
    • 前进/后退至下一个特定字符 tf
    • 至特定行 :
    • 翻页
  • smartparens (以 sexp 为单位移动)

    • 前/后 sexp
    • 内/外 sexp
  • avy (跨行、窗口移动)

    • 屏幕上任意字符
    • 屏幕上任意单词
    • 屏幕上任意行
1 个赞

老奶奶都不服,就服你


看了一圈,发现大家用的也都是那些常用的移动命令,可能还是要根据情景具体分析。 @twlz0ne 总结的很棒,我觉得大概是

  1. 普通移动
  2. 跳词,行首/尾,段落,文件首尾
  3. 跳括号/大括号
  4. 任意位置(avy/goto-char)
  5. 搜索

从操作速度最快速到最慢,但同时准确度/距离递减。

我对第三项了解不多,除了smart-paren以外有什么好的工具/命令吗?

1 个赞
  • Emacs 自带的移动光标的命令
  • Isearch
  • 触摸板

啊!这难道就是sublime text和atom等不给默认的光标移动绑快捷键的原因?!我每次用那些,很痛苦的一点就是得自己绑一个,但同时总破坏一些原生键,比较难受。

goto-char这玩意儿真有人用么,这个。。。。唉,给个使用心得让我理解下它的使用哲学

(不是avy的,这个我不懂,是helm党,最近在linux本子上尝试aboabo全家桶中,才上手ivy三件套)

如果开发环境和 Emacs 集成的好的话,是用不到 goto-char 的,直接点 link 跳转。

1 个赞

常见的翻页就不说了 ,

我最常用的是自定义的e 和v , 按symbol 前进后退,

;; e ,r 移动
(define-key evil-normal-state-map "e" 'evil-forward-symbol-begin)
(define-key evil-normal-state-map "r" 'evil-forward-symbol-end)
;; (define-key evil-normal-state-map "E" 'evil-forward-symbol-end)
(define-key evil-normal-state-map "v" 'evil-backward-symbol-begin)
;; (define-key evil-normal-state-map ";" 'evil-repeat-find-char-or-evil-backward-symbol-begin)
(define-key evil-normal-state-map "R" 'evil-backward-symbol-end)

(define-key evil-visual-state-map "e" 'evil-forward-symbol-begin)
(define-key evil-visual-state-map "r" 'evil-forward-symbol-end)
;; (define-key evil-visual-state-map "E" 'evil-forward-symbol-end)
(define-key evil-visual-state-map "v" 'evil-backward-symbol-begin)
(define-key evil-visual-state-map "R" 'evil-backward-symbol-end)


;; de dr
(define-key evil-motion-state-map "e" 'evil-forward-symbol-end)
(define-key evil-motion-state-map "r" 'evil-backward-symbol-begin)
;; dae die
(define-key evil-outer-text-objects-map "e" 'evil-a-symbol)
(define-key evil-inner-text-objects-map "e" 'evil-inner-symbol)


;;;###autoload
(evil-define-motion evil-forward-symbol-begin(count)
  "Move to the end of the COUNT-th next symbol."
  ;; :jump t
  :type exclusive
  (evil-signal-at-bob-or-eob count)
  (evil-forward-beginning 'evil-symbol count)
  (let ((sym (thing-at-point 'evil-symbol)))
    (while (and sym (not (string-match "\\<" sym)))
      (evil-forward-beginning 'evil-symbol 1)
      (setq sym (thing-at-point 'evil-symbol))
      )
    )
  )

;;;###autoload
(evil-define-motion evil-backward-symbol-begin(count)
  "Move to the end of the COUNT-th next symbol."
  ;; :jump t
  :type exclusive
  ;; (evil-signal-at-bob-or-eob count)
  ;; (forward-evil-symbol count)
  (evil-backward-beginning 'evil-symbol count)
  (let ((sym (thing-at-point 'evil-symbol)))
    (while (and sym (not (string-match "\\<" sym)))
      (evil-backward-beginning 'evil-symbol 1)
      (setq sym (thing-at-point 'evil-symbol)))))


;;;###autoload
(evil-define-motion evil-forward-symbol-end(count)
  "Move to the end of the COUNT-th next symbol."
  ;; :jump t
  :type exclusive
  (evil-signal-at-bob-or-eob count)
  (forward-evil-symbol count)

  ;; (let ((sym (thing-at-point 'evil-symbol)))
  ;;   (while (and sym (not (string-match "^\\<" sym)))
  ;;     (evil-forward-end 'evil-symbol 1)
  ;;     (setq sym (thing-at-point 'evil-symbol))
  ;;     )
  ;;   )
  )

;;;###autoload
(evil-define-motion evil-backward-symbol-end(count)
  "Move to the end of the COUNT-th next symbol."
  ;; :jump t
  :type exclusive
  (evil-signal-at-bob-or-eob count)
  (evil-backward-end 'symbol count)
  (let ((sym (thing-at-point 'evil-symbol)))
    (while (and sym (not (string-match "\\<" sym)))
      (evil-backward-end 'evil-symbol 1)
      (setq sym (thing-at-point 'evil-symbol))
      )
    )
)

1 个赞

指點杆(逃…

这么搞的动机是啥?换句话说默认的web哪些痛点?


我以前用过小红点,但是用过mac的触控板就回不去了 :smile:

真有,我把这玩意儿绑到了 f ,近的用 hjklweb,远的用这个

說笑的, 指點杆現在只有在non-chrome/chromium, non-vim/evil環境下用, 個人還是比較喜歡gui的, 所以文件管理器之類的用的比較多. 不過用vim/emacs前的確用指點杆編輯比較多.

另一點窩現在指點杆用的比較少的原因是linux下沒有針對hp elitebook指點杆的驅動, 導致移動阻力大很多, tp就有. 不過幸虧窩經常也有針對手指/小臂的鍛鍊(單手懸吊之類)