質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Q&A

解決済

1回答

249閲覧

emacsでalt+n(or p)で現在行を上下するようにしたい

ruei

総合スコア284

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

0グッド

0クリップ

投稿2018/11/04 19:07

編集2018/11/05 03:45

emacsでalt+pを押すと、現在行が上の行に持ち上がり、alt+nを押すと下の行に下がるようにしたいです。
この機能を実現しようとQiitaから拝借した下のコードを.emacsに貼っているのですが、微妙に自分が思っている動作と異なります。
alt+nを押すと現在行が下の行とswapされて、自分の希望通りなのですが、
alt+pを押すと、現在行が上の行とswapされて、カーソルは現在行の一つ上の行に移ってしまいます。
つまり、alt+nを連打すると、現在行がどんどん下に移動するのですが、alt+pを連打すると、現在行は1行上に移動し、カーソルはその上の行に移動するので、置いてきぼりになってしまい、現在行をどんどん上に持っていくことができません。

改善方法が分かる方ご教示ください

emacs

1(defun move-line-down () 2 (interactive) 3 (let ((col (current-column))) 4 (unless (eq col 0) 5 (move-to-column 0)) 6 (save-excursion 7 (forward-line) 8 (transpose-lines 1)) 9 (forward-line))) 10 11(defun move-line-up () 12 (interactive) 13 (let ((col (current-column))) 14 (unless (eq col 0) 15 (move-to-column 0)) 16 (save-excursion 17 (forward-line) 18 (transpose-lines -1)) 19 (forward-line -1))) 20

emacs23.3.1, emacs23.4.1の場合、

1 2 3 *4 5

となっているときに(*部分にカーソルがあるとしています)alt+pを押すと、

1 *2 4 3 5

となってしまいます。

emacs24.4.1の場合は

1 2 *4 3 5

となり、こちらが望んでいる動作です。

emacs23.3.1の時だけ動作が変になってしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

alt+pを連打すると、現在行は1行上に移動し、カーソルはその上の行に移動するので、置いてきぼり(註:何が置いてきぼり?)になってしまい、現在行をどんどん上に持っていくことができません。

確認しましたが、再現しません。

aaa bbbb ccccc *dddddd eeeeeee

上記のようなテキストがあり、今dの行にカーソルがあるとします。(*で表しています)

一回M-Pを実行すると、dの行とcの行が入れ替わり、カーソルは3行めに移動します。

aaa bbbb *dddddd ccccc eeeeeee

もう一度M-Pすると、以下のようになります。

aaa *dddddd bbbb ccccc eeeeeee

Emacs-Lispの記載としては、妥当なように思いますが、rueiさん的にはどのように動作するのがお望みでしょうか。


追記:

なるほど、emacsのバージョンによって動作が異なる、と。
それでは、ちょっとダサいですが、回避策としてemacsのバージョンによって動作を切り替える、としてみてはいかがでしょうか。

Lisp

1(defun move-line-up () 2 (interactive) 3 (let ((col (current-column))) 4 (unless (eq col 0) 5 (move-to-column 0)) 6 (save-excursion 7 (forward-line) 8 (transpose-lines -1)) 9 (if (>= emacs-major-version 24) ;; emacsのバージョンが24以上であるときだけ 10 (forward-line -1)) ;; 1行手前に移動する 11 ))

投稿2018/11/05 01:36

編集2018/11/05 04:52
kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruei

2018/11/05 03:46

ありがとうございます。emacs23.3.1の場合だけ、動作がくるって、kaztoさんの示してくれたような挙動になりません。質問欄に追記しました。
kazto

2018/11/05 04:54

追記しました。当方にemacs23の環境がないため、動作確認は出来ていません。 うまく行かないようでしたらお知らせください。
ruei

2018/11/05 06:57

できました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問